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