"""L1: session-local Formula proposals and their reviewer decisions.""" from datetime import UTC, datetime from tht.decisions import DecisionRecord from tht.evidence.session import project_session from tht.session.models import SchemaLinking def test_concept_formula_decision_types_exist(): import typing from tht.decisions import DecisionType args = typing.get_args(DecisionType) assert "concept_formula_approved" in args assert "concept_formula_rejected" in args def test_session_formula_proposal_is_versioned_and_is_not_published_evidence(tmp_path): linking = SchemaLinking( question="Conta i pazienti pediatrici", concept_formulas=[{ "concept": "fascia pediatrica", "columns": ["clinical.patient.birth_date"], "sql": "CASE WHEN age < 18 THEN 'pediatrica' ELSE 'adulta' END", "sources": ["Sintetizzata nella sessione"], }], ) decisions = [DecisionRecord( seq=9, ts=datetime(2026, 8, 25, tzinfo=UTC), type="concept_formula_approved", subject="phase:4", detail="fascia pediatrica", )] projected = project_session(decisions, linking, tmp_path / "evidence") assert projected == [{ "schema_version": 1, "kind": "formula_proposal", "publication": "session_only", "concept": "fascia pediatrica", "columns": ["clinical.patient.birth_date"], "sql": "CASE WHEN age < 18 THEN 'pediatrica' ELSE 'adulta' END", "sources": ["Sintetizzata nella sessione"], "decision_seq": 9, }] def test_session_formula_proposals_require_an_unretracted_positive_f4_decision(tmp_path): linking = SchemaLinking( question="Conta i pazienti pediatrici", concept_formulas=[ {"concept": "approvata", "columns": [], "sql": "1", "sources": []}, {"concept": "rifiutata", "columns": [], "sql": "2", "sources": []}, {"concept": "indecisa", "columns": [], "sql": "3", "sources": []}, ], ) decisions = [ DecisionRecord( seq=3, ts=datetime(2026, 8, 25, tzinfo=UTC), type="concept_formula_approved", subject="phase:4", detail="approvata", ), DecisionRecord( seq=4, ts=datetime(2026, 8, 25, tzinfo=UTC), type="concept_formula_rejected", subject="phase:4", detail="rifiutata", ), ] projected = project_session(decisions, linking, tmp_path / "evidence") assert [(proposal["concept"], proposal["decision_seq"]) for proposal in projected] == [ ("approvata", 3), ]