"""Schema-drift guard: the DB-vs-code head check behind /health/ready and the startup log. Regression cover for the outage where the backend image shipped ahead of an un-applied migration and every trees query 500'd.""" from sqlalchemy import text from app.core.schema_version import db_heads, expected_heads, schema_is_current def test_expected_heads_is_a_single_known_head(): heads = expected_heads() # Linear migration history → exactly one head, and it's a real revision id. assert len(heads) == 1 assert all(h and isinstance(h, str) for h in heads) async def test_schema_is_current_detects_drift(db_session): conn = await db_session.connection() # The test DB is built from create_all (no alembic_version table), so it is # not Alembic-managed and the check stays quiet — treated as current. await conn.execute(text("DROP TABLE IF EXISTS alembic_version")) assert await db_heads(conn) is None ok, _, _ = await schema_is_current(conn) assert ok is True # Stamp an old/wrong revision → drift detected. await conn.execute(text("CREATE TABLE alembic_version (version_num varchar(32) NOT NULL)")) await conn.execute(text("INSERT INTO alembic_version (version_num) VALUES ('0000deadbeef')")) ok, db, expected = await schema_is_current(conn) assert ok is False assert db == frozenset({"0000deadbeef"}) # Stamp the code's real head → current again. head = next(iter(expected)) await conn.execute(text("DELETE FROM alembic_version")) await conn.execute(text("INSERT INTO alembic_version (version_num) VALUES (:h)"), {"h": head}) ok, _, _ = await schema_is_current(conn) assert ok is True # Leave no alembic_version behind for other tests. await conn.execute(text("DROP TABLE IF EXISTS alembic_version"))