Files
GTI_GERENCIADOR_FISCAL/fiscal/central/tests/test_reference_registry.py
T
gti d21a9d1140 Add 'fiscal/' from commit '102ba84500dbd9655a0471288c3e278652593ca9'
git-subtree-dir: fiscal
git-subtree-mainline: d95165fc8f
git-subtree-split: 102ba84500
2026-09-29 14:43:23 -03:00

92 lines
4.9 KiB
Python

"""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"}