dodil/erp-brick-gl

DODIL ERP brick: general ledger

tests/test_schema.py

"""schema.sql and the tables in infrastructure/tables.py are one column model: they must not drift."""
import pathlib
import re

from brick_gl.infrastructure.tables import md

SRC = pathlib.Path(__file__).resolve().parents[1] / "src" / "brick_gl"


def expected_columns(sql: str) -> dict:
    """table -> [column], as a schema file declares it (erp_platform.migrate's reading, without a BUCKET)."""
    out = {}
    for name, body in re.findall(r"CREATE TABLE IF NOT EXISTS (\w+) \(\n(.*?)\n\);", sql, re.S):
        lines = [ln.strip() for ln in body.splitlines()]
        out[name] = [ln.split()[0] for ln in lines if ln and not ln.startswith(("PRIMARY KEY", "--"))]
    return out


def test_schema_sql_is_the_tables():
    declared = expected_columns((SRC / "schema.sql").read_text())
    assert declared == {t.name: [c.name for c in t.columns] for t in md.sorted_tables}


def test_the_migrations_create_the_same_tables():
    up = {}
    for m in sorted((SRC / "migrations").glob("*/up.sql")):
        up |= expected_columns(m.read_text())
    assert {t.name for t in md.sorted_tables} <= set(up)


def test_the_generated_files_are_current():
    import subprocess
    import sys
    out = subprocess.run([sys.executable, str(SRC.parents[1] / "scripts" / "gen_schema.py"), "--check"], capture_output=True, text=True)
    assert out.returncode == 0, out.stdout