"""Missão 5 / Fase 1: Reference Data Registry - DRAFT-first ingestion, admin approval, diff summary. Never auto-activates (unlike the 9 legacy dataset kinds in central/app/datasets/service.py, which this module never touches).""" from sqlalchemy import create_engine, select from sqlalchemy.orm import Session from sqlalchemy.pool import StaticPool from central.app.models import Base, Dataset from central.app.reference_registry import RegistryError, approve_draft, diff_against_vigente, list_registry, register_draft, reject_draft def engine(): e = create_engine("sqlite://", connect_args={"check_same_thread": False}, poolclass=StaticPool) Base.metadata.create_all(e) return e def test_register_draft_never_auto_activates(): with Session(engine()) as s: d = register_draft(s, kind="NCM", provider="Siscomex", source_url="https://x", sha256="a" * 64, version_label="v1", record_count=15156) assert d.status == "DRAFT" assert s.scalar(select(Dataset).where(Dataset.kind == "NCM", Dataset.status == "VIGENTE")) is None def test_resubmitting_the_same_sha256_returns_the_existing_row_not_a_duplicate(): with Session(engine()) as s: d1 = register_draft(s, kind="NCM", provider="Siscomex", source_url="https://x", sha256="a" * 64, version_label="v1", record_count=15156) d2 = register_draft(s, kind="NCM", provider="Siscomex", source_url="https://x", sha256="a" * 64, version_label="v1-again", record_count=99999) assert d1.id == d2.id and d2.version_label == "v1" # untouched, not overwritten by the resubmission assert len(list(s.scalars(select(Dataset)))) == 1 def test_approve_promotes_to_vigente_and_supersedes_the_previous_one(): with Session(engine()) as s: first = register_draft(s, kind="NCM", provider="Siscomex", source_url="https://x", sha256="a" * 64, version_label="v1", record_count=100) approve_draft(s, first.id, admin_name="admin1") assert s.get(Dataset, first.id).status == "VIGENTE" second = register_draft(s, kind="NCM", provider="Siscomex", source_url="https://x", sha256="b" * 64, version_label="v2", record_count=101) diff = diff_against_vigente(s, second) assert diff["current_vigente"]["version_label"] == "v1" and diff["record_count_delta"] == 1 and not diff["is_first_version"] approve_draft(s, second.id, admin_name="admin2") assert s.get(Dataset, first.id).status == "OBSOLETO" assert s.get(Dataset, second.id).status == "VIGENTE" assert s.get(Dataset, second.id).approved_by == "admin2" def test_approve_refuses_a_dataset_with_parse_errors(): with Session(engine()) as s: d = register_draft(s, kind="NCM", provider="Siscomex", source_url="https://x", sha256="a" * 64, version_label="v1", record_count=1, parse_errors={"MINIMUM_ENTRIES": "too few"}) try: approve_draft(s, d.id, admin_name="admin1") assert False, "expected RegistryError" except RegistryError as e: assert "parse errors" in str(e) assert s.get(Dataset, d.id).status == "DRAFT" def test_approve_refuses_a_non_draft_dataset(): with Session(engine()) as s: d = register_draft(s, kind="NCM", provider="Siscomex", source_url="https://x", sha256="a" * 64, version_label="v1", record_count=1) approve_draft(s, d.id, admin_name="admin1") try: approve_draft(s, d.id, admin_name="admin2") assert False, "expected RegistryError" except RegistryError as e: assert "only a DRAFT" in str(e) def test_reject_never_touches_the_current_vigente(): with Session(engine()) as s: first = register_draft(s, kind="NCM", provider="Siscomex", source_url="https://x", sha256="a" * 64, version_label="v1", record_count=1) approve_draft(s, first.id, admin_name="admin1") bad = register_draft(s, kind="NCM", provider="Siscomex", source_url="https://x", sha256="b" * 64, version_label="v2-bad", record_count=1) reject_draft(s, bad.id, admin_name="admin2") assert s.get(Dataset, bad.id).status == "REJECTED" assert s.get(Dataset, first.id).status == "VIGENTE" def test_diff_against_vigente_for_the_first_ever_version_of_a_kind(): with Session(engine()) as s: d = register_draft(s, kind="CEST", provider="Confaz", source_url="https://x", sha256="c" * 64, version_label="v1", record_count=1051) diff = diff_against_vigente(s, d) assert diff["is_first_version"] is True and diff["current_vigente"] is None def test_list_registry_orders_by_kind_then_newest_first(): with Session(engine()) as s: register_draft(s, kind="NCM", provider="Siscomex", source_url="https://x", sha256="a" * 64, version_label="v1", record_count=1) register_draft(s, kind="CEST", provider="Confaz", source_url="https://x", sha256="c" * 64, version_label="v1", record_count=1) rows = list_registry(s) assert {r.kind for r in rows} == {"NCM", "CEST"}