import sqlite3 import unittest from backend.app.schema_migrations import run_schema_migrations class SchemaMigrationTests(unittest.TestCase): def setUp(self) -> None: self.conn = sqlite3.connect(":memory:") self.conn.execute( "CREATE TABLE users (id INTEGER PRIMARY KEY, username TEXT NOT NULL UNIQUE, password_hash TEXT, role TEXT, created_at TEXT)" ) self.conn.execute( "CREATE TABLE signup_invites (id INTEGER PRIMARY KEY, code TEXT NOT NULL UNIQUE, created_at TEXT, updated_at TEXT)" ) self.conn.execute("CREATE TABLE portal_items (id INTEGER PRIMARY KEY, kind TEXT, updated_at TEXT)") self.conn.execute("CREATE TABLE requests_cache (request_id INTEGER PRIMARY KEY, created_at TEXT)") def tearDown(self) -> None: self.conn.close() def test_migrations_are_versioned_and_idempotent(self) -> None: self.assertEqual(run_schema_migrations(self.conn), [1]) self.assertEqual(run_schema_migrations(self.conn), []) user_columns = {row[1] for row in self.conn.execute("PRAGMA table_info(users)")} self.assertIn("auth_version", user_columns) self.assertIn("email", user_columns) request_columns = {row[1] for row in self.conn.execute("PRAGMA table_info(requests_cache)")} self.assertIn("requested_by_id", request_columns) applied = self.conn.execute("SELECT version, name FROM schema_migrations").fetchall() self.assertEqual(applied, [(1, "legacy_columns_and_indexes")]) if __name__ == "__main__": unittest.main()