"""Migration boundary: legacy formulas become curated evidence or session proposals.""" import hashlib from tht.evidence import formula_store from tht.evidence.authoring import normalize_source_text from tht.evidence.canonical import CuratedEvidence from tht.evidence.formula_store import ConceptFormula def test_reviewed_formula_migration_has_deterministic_provenance_hash(): formula = ConceptFormula( concept="fascia pediatrica", columns=["clinical.patient.birth_date"], sql="CASE WHEN age < 18 THEN 'pediatrica' ELSE 'adulta' END", status="reviewed", sources=["Regola clinica approvata dal gruppo pediatrico."], ) original_source = """--- concept: fascia pediatrica columns: [clinical.patient.birth_date] status: reviewed sources: - Regola clinica approvata dal gruppo pediatrico. --- CASE WHEN age < 18 THEN 'pediatrica' ELSE 'adulta' END """ first = formula_store.legacy_formula_to_curated( formula, legacy_path="formulas/fascia-pediatrica-1.sql.md", source_content=original_source, ) second = formula_store.legacy_formula_to_curated( formula, legacy_path="formulas/fascia-pediatrica-1.sql.md", source_content=original_source, ) assert isinstance(first, CuratedEvidence) assert isinstance(second, CuratedEvidence) assert first.provenance.source_sha256 == second.provenance.source_sha256 expected = hashlib.sha256(normalize_source_text(original_source).encode("utf-8")).hexdigest() assert first.provenance.source_sha256 == f"sha256:{expected}" def test_reviewed_formula_without_original_source_fails_closed(): formula = ConceptFormula( concept="fascia pediatrica", columns=["clinical.patient.birth_date"], sql="CASE WHEN age < 18 THEN 'pediatrica' ELSE 'adulta' END", status="reviewed", sources=["Regola clinica approvata dal gruppo pediatrico."], ) outcome = formula_store.legacy_formula_to_curated( formula, legacy_path="formulas/fascia-pediatrica-1.sql.md", ) assert outcome.code == "legacy_formula_requires_manual_review" assert outcome.problems == ("original_source_required",) def test_reviewed_formula_without_verified_supporting_excerpts_fails_closed(): formula = ConceptFormula( concept="fascia pediatrica", columns=["clinical.patient.birth_date"], sql="CASE WHEN age < 18 THEN 'pediatrica' ELSE 'adulta' END", status="reviewed", sources=["Nota non presente nel sorgente originale."], ) original_source = """--- concept: fascia pediatrica columns: [clinical.patient.birth_date] status: reviewed sources: - >- Nota non presente nel sorgente originale. --- CASE WHEN age < 18 THEN 'pediatrica' ELSE 'adulta' END """ outcome = formula_store.legacy_formula_to_curated( formula, legacy_path="formulas/fascia-pediatrica-1.sql.md", source_content=original_source, ) assert outcome.code == "legacy_formula_requires_manual_review" assert outcome.problems == ("supporting_excerpt_unverified",) def test_reviewed_formula_without_provenance_notes_fails_closed(): formula = ConceptFormula( concept="fascia pediatrica", columns=["clinical.patient.birth_date"], sql="CASE WHEN age < 18 THEN 'pediatrica' ELSE 'adulta' END", status="reviewed", sources=[], ) outcome = formula_store.legacy_formula_to_curated( formula, legacy_path="formulas/fascia-pediatrica-1.sql.md", source_content=formula.dump(), ) assert outcome.code == "legacy_formula_requires_manual_review" assert outcome.problems == ("supporting_excerpts_required",) def test_reviewed_formula_must_match_the_original_source_record(): formula = ConceptFormula( concept="fascia pediatrica", columns=["clinical.patient.birth_date"], sql="CASE WHEN age < 18 THEN 'pediatrica' ELSE 'adulta' END", status="reviewed", sources=["Regola clinica approvata dal gruppo pediatrico."], ) different_source = ConceptFormula( concept=formula.concept, columns=formula.columns, sql="CASE WHEN age < 16 THEN 'pediatrica' ELSE 'adulta' END", status=formula.status, sources=formula.sources, ).dump() outcome = formula_store.legacy_formula_to_curated( formula, legacy_path="formulas/fascia-pediatrica-1.sql.md", source_content=different_source, ) assert outcome.code == "legacy_formula_requires_manual_review" assert outcome.problems == ("original_source_mismatch",) def test_incompatible_reviewed_legacy_formula_fails_closed_with_the_original_record(): formula = ConceptFormula( concept="ablazione", columns=["testo"], sql="SELECT 2", status="reviewed", sources=["legacy manual"], ) outcome = formula_store.legacy_formula_to_curated( formula, legacy_path="formulas/ablazione-2.sql.md", ) assert outcome.code == "legacy_formula_requires_manual_review" assert outcome.legacy_path == "formulas/ablazione-2.sql.md" assert outcome.formula == formula