Files

105 lines
4.5 KiB
Python

"""Missão 6 — Bloco A: Testes de Higiene (Migrations e Inventário dos 9 Datasets)."""
from pathlib import Path
from alembic.config import Config
from alembic.script import ScriptDirectory
ROOT = Path(__file__).resolve().parents[2]
def test_alembic_master_head_is_single():
"""Garante que na branch master o alembic possui uma única head: 0035_cfop_ippt_write_mode."""
cfg = Config(str(ROOT / "central" / "alembic.ini"))
script = ScriptDirectory.from_config(cfg)
heads = script.get_heads()
assert heads == ["0035_cfop_ippt_write_mode"], f"Esperado head única 0035, obtido: {heads}"
def test_migration_0035_chains_to_0034_and_0033_is_gone():
"""Garante que 0035 encadeia exatamente em 0034 e que a numeração antiga (0033) não existe mais.
Historicamente (Missão 8) este teste lia o arquivo via `git show
feature/cfop-ippt-write:...` para confirmar a correção *antes* do merge
daquela branch em master. A branch foi mesclada integralmente (0
commits exclusivos — confirmado na auditoria de consolidação do
monorepo) e master já carrega o resultado correto diretamente em
`central/alembic/versions/`, então a checagem passou a ler o estado
versionado atual em vez de depender de uma ref Git externa — necessário
para o teste funcionar também num clone que não tenha essa branch (como
o monorepo). A invariante validada é a mesma de antes.
"""
versions_dir = ROOT / "central" / "alembic" / "versions"
current = (versions_dir / "0035_cfop_ippt_write_mode.py").read_text(encoding="utf-8")
assert 'revision = "0035_cfop_ippt_write_mode"' in current
assert 'down_revision = "0034_reference_data_registry"' in current
assert not (versions_dir / "0033_cfop_ippt_write_mode.py").exists(), "Migração 0033 não deve mais existir"
def test_inventory_9_datasets_coverage():
"""Garante que os 9 datasets existentes no Hub estão integralmente catalogados."""
from central.app.datasets.inventory import DATASET_INVENTORY_9
kinds = [item.kind for item in DATASET_INVENTORY_9]
expected_kinds = ["NCM", "TIPI_IPI", "CEST", "BA_ST_MVA", "NFE_MOC_TABLES", "CFOP", "FCP", "ANP", "NCM_UTRIB"]
assert kinds == expected_kinds
for item in DATASET_INVENTORY_9:
assert item.name
assert item.provider
assert item.source_url.startswith("http")
assert item.version_label
assert item.expected_rows_approx > 0
assert item.act
assert item.validity_info
assert item.coverage
assert item.licence_terms
def test_sync_inventory_to_registry_and_listing():
"""Garante que datasets ACTIVE são reconhecidos pelo Reference Data Registry."""
from central.app.datasets.inventory import sync_inventory_to_registry
from central.app.reference_registry import list_registry, diff_against_vigente
from central.app.models import Dataset
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
from central.app.models import Base
engine = create_engine("sqlite:///:memory:")
Base.metadata.create_all(engine)
with Session(engine) as session:
# Cadastrar dataset com status antigo ACTIVE (sem licence_terms)
ds = Dataset(
kind="NCM", provider="Siscomex", sha256="abc123hash",
version_label="2026-09-28", act="", source_url="https://portalunico.siscomex.gov.br",
status="ACTIVE", record_count=15156,
)
session.add(ds)
session.commit()
# Antes do sync, campos novos eram vazios
assert ds.licence_terms is None
# Executar sincronização
stats = sync_inventory_to_registry(session)
assert stats["active_found"] == 1
assert stats["updated"] == 1
assert ds.licence_terms is not None
assert ds.act == "Resolução Gecex / MDIC"
# Listagem do registry deve listar datasets ACTIVE
listed = list_registry(session)
assert len(listed) == 1
assert listed[0].kind == "NCM"
# Diff contra DRAFT deve encontrar o ACTIVE como vigente
draft = Dataset(
kind="NCM", provider="Siscomex", sha256="diff123hash",
version_label="2026-10-01", act="Nova Resolução", source_url="url",
status="DRAFT", record_count=15200,
)
session.add(draft)
session.commit()
diff = diff_against_vigente(session, draft)
assert diff["current_vigente"] is not None
assert diff["current_vigente"]["sha256"] == "abc123hash"
assert diff["record_count_delta"] == 15200 - 15156