from __future__ import annotations import os import subprocess import sys import unittest from importlib.util import find_spec from pathlib import Path REPO_ROOT = Path(__file__).resolve().parents[4] BACKEND_ROOT = REPO_ROOT / "apps" / "backend" sys.path.insert(0, str(BACKEND_ROOT)) class PostgresAlembicMigrationIntegrationTest(unittest.TestCase): def test_alembic_upgrade_head_creates_schema_on_configured_postgres(self) -> None: dsn = os.environ.get("PIPELINE_TEST_DATABASE_DSN") if not dsn: self.skipTest("PIPELINE_TEST_DATABASE_DSN is not set") if not dsn.startswith(("postgresql://", "postgres://")): self.skipTest("Postgres DSN is required for Alembic migration test") if find_spec("alembic") is None: self.skipTest("alembic is not installed") env = os.environ.copy() env["DATABASE_URL"] = dsn subprocess.run( [sys.executable, "-m", "alembic", "upgrade", "head"], cwd=REPO_ROOT, env=env, check=True, ) from src.domain.schema import CORE_TABLES from src.infrastructure.repositories import open_backend_repository repository = open_backend_repository(dsn) self.assertTrue(set(CORE_TABLES).issubset(repository.schema.list_tables())) if __name__ == "__main__": unittest.main()