diff --git a/CHANGELOG.md b/CHANGELOG.md index 26eed9d..6d18b63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 documented ways to reach either database; none of them print a password or a credential-bearing URL. +### Fixed + +- **Migration round-trip tests leave `core_api_test` at head** (core-api T-14) — every + round-trip test in `tests/test_book_migration.py`, `tests/test_scribe_migration.py` and + `tests/test_tenants_migration.py` now ends on `upgrade head` rather than its own + revision, so a full suite run leaves the test database at head instead of one or two + migrations behind it. + ## [1.15.0] - 2026-10-19 ### Added diff --git a/tests/test_book_migration.py b/tests/test_book_migration.py index 736fece..9a93dbe 100644 --- a/tests/test_book_migration.py +++ b/tests/test_book_migration.py @@ -65,8 +65,8 @@ class TestMigration005RoundTrip: assert not await _table_exists(test_database_url, "book_events") assert not await _table_exists(test_database_url, "book_tenant_counters") - # Leave the schema at head for the rest of the suite. - up = run_alembic(test_database_url, "upgrade", "005") + # Leave the schema at head for the rest of the suite (core-api T-14). + up = run_alembic(test_database_url, "upgrade", "head") assert up.returncode == 0, up.stderr assert await _table_exists(test_database_url, "book_records") assert await _table_exists(test_database_url, "book_events") diff --git a/tests/test_scribe_migration.py b/tests/test_scribe_migration.py index 34a07b6..7f58b44 100644 --- a/tests/test_scribe_migration.py +++ b/tests/test_scribe_migration.py @@ -120,8 +120,8 @@ class TestMigration006RoundTrip: # a downgrade of 006 — proves 006 only touches its own tables. assert await _table_exists(test_database_url, "book_records") - # Leave the schema at head for the rest of the suite. - up = run_alembic(test_database_url, "upgrade", "006") + # Leave the schema at head for the rest of the suite (core-api T-14). + up = run_alembic(test_database_url, "upgrade", "head") assert up.returncode == 0, up.stderr assert await _table_exists(test_database_url, "scribe_addresses") assert await _table_exists(test_database_url, "scribe_messages") diff --git a/tests/test_tenants_migration.py b/tests/test_tenants_migration.py index 8d82429..1a3c5e1 100644 --- a/tests/test_tenants_migration.py +++ b/tests/test_tenants_migration.py @@ -67,8 +67,8 @@ class TestMigration007RoundTrip: assert await _table_exists(test_database_url, "book_records") assert await _table_exists(test_database_url, "scribe_addresses") - # Leave the schema at head for the rest of the suite. - up = run_alembic(test_database_url, "upgrade", "007") + # Leave the schema at head for the rest of the suite (core-api T-14). + up = run_alembic(test_database_url, "upgrade", "head") assert up.returncode == 0, up.stderr assert await _table_exists(test_database_url, "tenants") assert await _table_exists(test_database_url, "tenant_consumers") @@ -224,8 +224,8 @@ class TestMigration008RoundTrip: assert await _table_exists(test_database_url, "tenant_consumers") assert await _table_exists(test_database_url, "tenants") - # Leave the schema at head for the rest of the suite. - up = run_alembic(test_database_url, "upgrade", "008") + # Leave the schema at head for the rest of the suite (core-api T-14). + up = run_alembic(test_database_url, "upgrade", "head") assert up.returncode == 0, up.stderr found = await _scalar( test_database_url, @@ -312,7 +312,10 @@ class TestMigration008DataStep: down = run_alembic(test_database_url, "downgrade", "007") assert down.returncode == 0, down.stderr - up = run_alembic(test_database_url, "upgrade", "008") + # Upgrade through to head (core-api T-14) — migrations 009/010 touch + # neither this table nor this column, so the assertion below still + # proves 008's data step alone. + up = run_alembic(test_database_url, "upgrade", "head") assert up.returncode == 0, up.stderr found = await _scalar( test_database_url, @@ -356,7 +359,9 @@ class TestMigration008DataStep: ) ) - up = run_alembic(test_database_url, "upgrade", "008") + # Upgrade through to head (core-api T-14) — same reasoning as + # test_is_a_noop_when_claude_ai_is_absent above. + up = run_alembic(test_database_url, "upgrade", "head") assert up.returncode == 0, up.stderr found = await _scalar( @@ -380,3 +385,22 @@ class TestMigration008DataStep: ) ) await engine.dispose() + + +class TestSchemaEndsAtHeadAfterTheMigrationSuite: + """core-api T-14 regression guard: every round-trip test above (and in + test_book_migration.py / test_scribe_migration.py, which this file's + alphabetically-later collection runs after) must leave `core_api_test` + at head, not on its own revision. This class is the last one defined in + the last-collected migration test file, and its check is a bare + `current` — no `upgrade head` of its own — so a round-trip test that + regresses to ending on its own revision again shows up here as "not + head" rather than being silently repaired by this very check.""" + + @pytest.mark.asyncio + async def test_schema_is_at_head(self, test_database_url): + result = run_alembic(test_database_url, "current") + assert result.returncode == 0, result.stderr + assert "(head)" in result.stdout, ( + f"core_api_test is not at head after the migration suite: {result.stdout!r}" + )