Skip to content

Run the core#52 conformance fixtures in CI; bump dependencies - #65

Merged
cuibonobo merged 1 commit into
mainfrom
claude/issue-32-implementation-ga6esf
Aug 18, 2026
Merged

Run the core#52 conformance fixtures in CI; bump dependencies#65
cuibonobo merged 1 commit into
mainfrom
claude/issue-32-implementation-ga6esf

Conversation

@cuibonobo

Copy link
Copy Markdown
Member

Summary

Closes the last open item on #32. PR #64 adopted @haverstack/conformance-fixtures as a devDependency but only read the fixture data by hand ("the tests here are hand-written... rather than a generic fixture-iterating harness"). #32's work item was to actually import and run the fixtures in CI as the acceptance gate for the sync batch — this PR does that.

  • tests/conformance.test.ts iterates the shared fixture arrays (discovery, create/query/patch/delete/undelete, associations, permissions, the version/restore/migrate lifecycle, and error responses) against this server's real HTTP surface — not a mocked transport. Server-generated values (ids, timestamps, opaque pagination cursors) are never deep-equated against the fixtures' illustrative placeholders; assertions target the documented status code and the contract-relevant fields, the same granularity @haverstack/adapter-api's own consumption of these fixtures uses on the other side of the wire.
  • Each describe block ends with a coverage test: every fixture in the block's imported array must be either dispatched or named in a SKIPPED set with a reason. A handful are skipped — the attachment carve-out/reconveyance scenarios (exercised by hand in tests/routes/attachments.test.ts instead), a corrupted stored snapshot (can't be produced through the ordinary write API), and a query-timeout bound this server doesn't implement (a real, separately-tracked gap). Everything else is dispatched. This is what makes it an acceptance gate rather than a snapshot of today's fixture list: bump the package and any new/renamed fixture fails loudly until someone decides how to handle it.

Found and fixed along the way: POST /types called adapter.saveType() directly, bypassing the schema-drift check that only lives in Stack.defineType() — so redefining an existing type non-additively silently succeeded instead of returning 409 schema_drift. Routed the handler through defineType() instead; existing /types tests still pass unchanged.

Dependencies

Bumped @haverstack/conformance-fixtures to the now-published 0.2.0, and updated the rest of the tree within existing major versions only — no major-version jumps (several are available: @hono/node-server 1→2, eslint 9→10, typescript 5→7, vitest 2→4, pino 9→10, @types/node 22→26 — left alone as a separate, larger decision):

package before after
@haverstack/conformance-fixtures ^0.1.0 ^0.2.0
hono ^4.6.0 ^4.13.3
@hono/node-server ^1.13.7 ^1.19.17
pino ^9.5.0 ^9.14.0
pino-pretty ^13.0.0 ^13.1.3
eslint ^9.0.0 ^9.39.5
@eslint/js ^10.0.0 ^10.0.1
eslint-config-prettier ^10.0.0 ^10.1.8
typescript-eslint ^8.0.0 ^8.67.0
prettier ^3.0.0 ^3.9.6
tsx ^4.19.0 ^4.23.12
@types/node ^22.0.0 ^22.20.1

Test plan

  • pnpm typecheck
  • pnpm lint
  • pnpm format:check
  • pnpm test — 215/215 passing (48 new conformance tests, no regressions)

Generated by Claude Code

Issue #32's last open work item was importing and running
@haverstack/conformance-fixtures as the acceptance gate for the sync
batch — PR #64 adopted the package as a devDependency but only used it
for reference, leaving the fixtures themselves unexercised.

tests/conformance.test.ts iterates the fixture arrays (discovery,
records CRUD, query envelope, patch/delete/undelete, associations,
permissions, the version/restore/migrate lifecycle, and error
responses) against this server's real HTTP surface, asserting the
documented status codes and contract-relevant fields rather than
deep-equating server-generated ids/timestamps/cursors against the
fixtures' illustrative placeholders. Each describe block's coverage
test fails if core adds or renames a fixture this file hasn't been
told about, so new fixtures can't go silently unexercised. A few
fixtures needing scaffolding this harness doesn't build (attachment
carve-out reconveyance, a corrupted stored snapshot, a query-timeout
bound the server doesn't implement) are named in per-block SKIPPED
sets with reasons instead of being silently dropped.

Running the fixtures surfaced a real gap: POST /types called
adapter.saveType() directly, bypassing the schema-drift check that
only lives in Stack.defineType(). Fixed by routing through
defineType() instead, so redefining an existing type non-additively
now correctly returns 409 schema_drift.

Also bumped @haverstack/conformance-fixtures to the now-published
0.2.0 and updated the rest of the dependency tree within existing
major versions (hono, @hono/node-server, pino, pino-pretty, eslint,
typescript-eslint, prettier, tsx, @types/node) — no major-version
jumps.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QejGigAtq61ZKuwq3738t2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants