fed8b2eed7
Backend release / release (push) Waiting to run
Bandit Security Scan / bandit_scan (push) Waiting to run
Build and push multi-arch DocsGPT Docker image / build (linux/amd64, ubuntu-latest, amd64) (push) Waiting to run
Build and push multi-arch DocsGPT Docker image / build (linux/arm64, ubuntu-24.04-arm, arm64) (push) Waiting to run
Build and push multi-arch DocsGPT Docker image / manifest (push) Blocked by required conditions
Build and push DocsGPT FE Docker image for development / build (linux/amd64, ubuntu-latest, amd64) (push) Waiting to run
Build and push DocsGPT FE Docker image for development / build (linux/arm64, ubuntu-24.04-arm, arm64) (push) Waiting to run
Build and push DocsGPT FE Docker image for development / manifest (push) Blocked by required conditions
Python linting / ruff (push) Waiting to run
Run python tests with pytest / Run tests and count coverage (3.12) (push) Waiting to run
React Widget Build / build (push) Waiting to run
78 lines
2.2 KiB
Python
78 lines
2.2 KiB
Python
"""Migration round-trip test for 0023_wiki_pages."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
from sqlalchemy import text
|
|
|
|
|
|
pytestmark = pytest.mark.integration
|
|
|
|
|
|
def _alembic_ini() -> Path:
|
|
return Path(__file__).resolve().parents[3] / "application" / "alembic.ini"
|
|
|
|
|
|
def _run_alembic(url: str, *args: str) -> None:
|
|
subprocess.check_call(
|
|
[sys.executable, "-m", "alembic", "-c", str(_alembic_ini()), *args],
|
|
timeout=60,
|
|
env={**os.environ, "POSTGRES_URI": url},
|
|
)
|
|
|
|
|
|
def _alembic_heads(url: str) -> list[str]:
|
|
out = subprocess.check_output(
|
|
[sys.executable, "-m", "alembic", "-c", str(_alembic_ini()), "heads"],
|
|
timeout=60,
|
|
env={**os.environ, "POSTGRES_URI": url},
|
|
text=True,
|
|
)
|
|
return [line for line in out.splitlines() if line.strip()]
|
|
|
|
|
|
def _alembic_version(conn) -> str:
|
|
return conn.execute(text("SELECT version_num FROM alembic_version")).scalar()
|
|
|
|
|
|
def _table_exists(conn, table: str) -> bool:
|
|
row = conn.execute(
|
|
text(
|
|
"SELECT 1 FROM information_schema.tables "
|
|
"WHERE table_name = :t AND table_schema = 'public'"
|
|
),
|
|
{"t": table},
|
|
).fetchone()
|
|
return row is not None
|
|
|
|
|
|
_0023 = "0023_wiki_pages"
|
|
_0022 = "0022_source_config"
|
|
|
|
|
|
class TestMigration0023RoundTrip:
|
|
def test_single_head(self, pg_engine):
|
|
url = pg_engine.url.render_as_string(hide_password=False)
|
|
assert len(_alembic_heads(url)) == 1
|
|
|
|
def test_head_has_wiki_pages_table(self, pg_engine):
|
|
with pg_engine.connect() as conn:
|
|
assert _alembic_version(conn) >= _0023
|
|
assert _table_exists(conn, "wiki_pages")
|
|
|
|
def test_downgrade_drops_then_upgrade_restores(self, pg_engine):
|
|
url = pg_engine.url.render_as_string(hide_password=False)
|
|
_run_alembic(url, "downgrade", _0022)
|
|
with pg_engine.connect() as conn:
|
|
assert _alembic_version(conn) == _0022
|
|
assert not _table_exists(conn, "wiki_pages")
|
|
_run_alembic(url, "upgrade", "head")
|
|
with pg_engine.connect() as conn:
|
|
assert _alembic_version(conn) >= _0023
|
|
assert _table_exists(conn, "wiki_pages")
|