M12b: category contract v2 on the server (schema 2, fourteen defaults, finer import mapping)
- migrations/0002_categories_v2.sql, byte-identical to contracts/schema/migrations/0002_categories_v2.sql (SPEC §14.1.1), with an identity test; SCHEMA_VERSION = 2 (E-1 reports it, the importer's check follows). - Seed test on a fresh database (the fourteen rows of AC-7.2, server_version 11 to 14) and an upgrade test of a v1 database in use (0001 applied through the migrator, then users, a custom, a renamed and an archived default, an account, a recurring template, expenses): every earlier row unchanged, the four rows above the old sequence, foreign_key_check empty, schema_version 2, a pull from the old cursor returns exactly the four rows. - DefaultCategoryKey with the fourteen keys (wire enum and contracts/openapi.yaml); icons 33 and colours 14 (§9.7) in validation. - The two category examples M12a held back (E-26 response-default, sync/pull-page-categories-v2) and its contracts-check patch for them and the enum. - Importer: splitwise_categories.csv per the §10.8 v0.8 table (D-053), DEFAULT_KEYS of fourteen, synthetic fixtures for the finer mapping (Insurance/Försäkringar to insurance among them), a schema-1 refusal test. - Test harnesses seed users at server_version 15/16 (after the fourteen seeds); pull counts 10 -> 14. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TQd3pEP9UeN2uifbHknQ7B
This commit is contained in:
@@ -58,6 +58,7 @@ fn check(name: &str, example: &Value) -> bool {
|
||||
"E-24-patch-category/response.json" => Category,
|
||||
"E-25-archive-category/response.json" => Category,
|
||||
"E-26-unarchive-category/response.json" => Category,
|
||||
"E-26-unarchive-category/response-default.json" => Category,
|
||||
"E-27-delete-category/response.json" => Category,
|
||||
"E-28-create-recurring-template/request.json" => CreateRecurringTemplateRequest,
|
||||
"E-28-create-recurring-template/response.json" => RecurringTemplate,
|
||||
@@ -71,6 +72,7 @@ fn check(name: &str, example: &Value) -> bool {
|
||||
"E-33-settlement-proposal/response.json" => ProposalResponse,
|
||||
"sync/pull-empty-page.json" => SyncPullResponse,
|
||||
"sync/pull-page.json" => SyncPullResponse,
|
||||
"sync/pull-page-categories-v2.json" => SyncPullResponse,
|
||||
"sync/push-request.json" => SyncPushRequest,
|
||||
"sync/push-request-delete.json" => SyncPushRequest,
|
||||
"sync/push-request-rejections.json" => SyncPushRequest,
|
||||
|
||||
Reference in New Issue
Block a user