import sqlite3 import importlib def _columns(db_file): conn = sqlite3.connect(db_file) cols = {r[1] for r in conn.execute("PRAGMA table_info(projects)")} conn.close() return cols def test_migration_adds_columns_and_is_idempotent(tmp_path, monkeypatch): db_file = tmp_path / "seismo_fleet.db" conn = sqlite3.connect(db_file) conn.execute("CREATE TABLE projects (id TEXT PRIMARY KEY, name TEXT)") conn.commit() conn.close() monkeypatch.chdir(tmp_path) # migration resolves data/ relative to cwd (tmp_path / "data").mkdir() (tmp_path / "data" / "seismo_fleet.db").write_bytes(db_file.read_bytes()) mod = importlib.import_module("backend.migrate_add_project_portal_auth") mod.migrate() cols = _columns(tmp_path / "data" / "seismo_fleet.db") assert {"portal_enabled", "portal_password_hash", "portal_link_token"} <= cols mod.migrate() # second run must not raise assert {"portal_enabled", "portal_password_hash", "portal_link_token"} <= _columns(tmp_path / "data" / "seismo_fleet.db")