from pathlib import Path import aiosqlite from porchlight.store.sqlite.migrations import run_migrations MIGRATIONS_DIR = ( Path(__file__).resolve().parent.parent.parent / "src" / "porchlight" / "store" / "sqlite" / "migrations" ) async def test_run_migrations_applies_initial() -> None: async with aiosqlite.connect(":memory:") as db: await db.execute("PRAGMA foreign_keys=ON") count = await run_migrations(db, MIGRATIONS_DIR) assert count == 2 async with db.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='users'") as cursor: row = await cursor.fetchone() assert row is not None async def test_run_migrations_skips_already_applied() -> None: async with aiosqlite.connect(":memory:") as db: await db.execute("PRAGMA foreign_keys=ON") first_count = await run_migrations(db, MIGRATIONS_DIR) second_count = await run_migrations(db, MIGRATIONS_DIR) assert first_count == 2 assert second_count == 0 async def test_run_migrations_creates_all_tables() -> None: async with aiosqlite.connect(":memory:") as db: await db.execute("PRAGMA foreign_keys=ON") await run_migrations(db, MIGRATIONS_DIR) async with db.execute("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name") as cursor: tables = [row[0] async for row in cursor] assert "users" in tables assert "user_groups" in tables assert "webauthn_credentials" in tables assert "password_credentials" in tables assert "magic_links" in tables assert "user_consents" in tables assert "_migrations" in tables