"""Migration 027 — additive §22 M3 schema (projects.type/initial_state, the deployment singleton, cached_rfcs review columns). No table rebuilds in Plan A.""" from __future__ import annotations import tempfile from pathlib import Path from app import db from app.config import Config def _fresh_config() -> Config: tmp = Path(tempfile.mkdtemp(prefix="mig027-")) / "t.db" return Config( gitea_url="x", gitea_bot_user="x", gitea_bot_token="x", gitea_org="x", registry_repo="registry", oauth_client_id="x", oauth_client_secret="x", app_url="x", secret_key="x", database_path=tmp, owner_gitea_login="x", webhook_secret="x", ) def test_027_adds_project_type_and_initial_state(): cfg = _fresh_config() db.run_migrations(cfg) conn = db.connect(cfg.database_path) cols = {r["name"]: r for r in conn.execute("PRAGMA table_info(projects)")} assert "type" in cols and cols["type"]["dflt_value"] == "'document'" assert "initial_state" in cols and cols["initial_state"]["dflt_value"] == "'super-draft'" conn.close() def test_027_creates_deployment_singleton(): cfg = _fresh_config() db.run_migrations(cfg) conn = db.connect(cfg.database_path) rows = list(conn.execute("SELECT id FROM deployment")) assert [r["id"] for r in rows] == [1] try: conn.execute("INSERT INTO deployment (id) VALUES (2)") raised = False except Exception: raised = True assert raised conn.close() def test_027_adds_review_columns_to_cached_rfcs(): cfg = _fresh_config() db.run_migrations(cfg) conn = db.connect(cfg.database_path) cols = {r["name"] for r in conn.execute("PRAGMA table_info(cached_rfcs)")} assert {"unreviewed", "reviewed_at", "reviewed_by"} <= cols conn.close()