refactor: DRY auth path, fix Sprintf/RE2 bugs; real integration tests only
Why --- - Sprintf(*p.Title) fed the title as a format string — % in titles broke the String() method; also panicked on nil Title. - internal/applications.buildSummary used RE2-unsupported `(?= ...)` lookahead inside regexp.MustCompile, panicking the first time the applications-sync path was exercised on Go 1.23+. - Query() duplicated the auth-expiry check inline while ensureToken() already handled it — two code paths drifted. - Request.Debug split Query() into two branches that both unmarshalled into the same target value. Dead code. - httptest fixtures that emulated OnlyOffice endpoints were lying to us: they passed locally yet never caught a single real protocol regression. What ---- - Project.String(): nil-safe, no Sprintf format-string interpretation. - buildSummary regex: RE2-safe non-capturing trailing delimiter `(?:\n## |$)` replaces the lookahead. - Query() routes through ensureToken(); body marshalling factored into an unexported requestBodyReader(). Debug flag retained for backwards compatibility, documented as a no-op, to be removed at next major. - Dropped Debug: true stray flags in GetTasks/UpdateProjectTask. - Deleted httptest-based OnlyOffice mocks. unit_test.go is now pure Go (parsers, helpers, env aliases, ctx cancellation against an unroutable address). client_test.go is `//go:build integration` and runs against a real OnlyOffice, skipping cleanly without ONLYOFFICE_URL/USER/PASS. - AGENTS.md + .cursor/rules/no-synthetic-mocks.mdc document the new testing policy. Verified -------- - `go test ./...` green (15 unit tests across package + internal). - `go test -tags=integration ./...` green against live office.produktor.io (5 integration tests: auth, projects, lifecycle, calendar+CRM read, task list). - inventar-sync smoke dry-run against live OO project 33 + Gitea found 30 tasks, 0 mutations. Made-with: Cursor
This commit is contained in:
@@ -6,6 +6,38 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [0.3.2] - 2026-04-24
|
||||
|
||||
### Fixed
|
||||
|
||||
- `Project.String()` no longer interprets the title as a format string
|
||||
(`fmt.Sprintf(*p.Title)`) and is now nil-safe on a zero-value `Project`.
|
||||
- `internal/applications.buildSummary` no longer panics at regex compile time
|
||||
on Go 1.23+ — the previous `(?= ...)` lookahead is replaced with an RE2-safe
|
||||
non-capturing trailing delimiter.
|
||||
|
||||
### Changed
|
||||
|
||||
- `Client.Query` now routes token acquisition through the shared
|
||||
`ensureToken` path instead of duplicating the auth-expiry check inline.
|
||||
- Request body marshalling is consolidated into an unexported
|
||||
`requestBodyReader` helper (DRY; no change to the public surface).
|
||||
- The `Request.Debug` field is preserved for backwards compatibility but no
|
||||
longer changes behaviour — both branches used to unmarshal into the same
|
||||
target value. We'll remove the field in a future major release.
|
||||
|
||||
### Tests
|
||||
|
||||
- Deleted `httptest.NewServer` fixtures that emulated OnlyOffice protocol
|
||||
endpoints. Replaced them with:
|
||||
- pure-Go unit tests in `unit_test.go` (no network);
|
||||
- real integration tests in `client_test.go` guarded by
|
||||
`//go:build integration`. Run with
|
||||
`go test -tags=integration ./...`. Tests skip cleanly when
|
||||
`ONLYOFFICE_URL/USER/PASS` (or aliases) are absent.
|
||||
- New policy documented in `AGENTS.md` and
|
||||
`.cursor/rules/no-synthetic-mocks.mdc`.
|
||||
|
||||
## [0.3.1] - 2026-04-24
|
||||
|
||||
### Added
|
||||
|
||||
Reference in New Issue
Block a user