diff --git a/tests/test_fusion.py b/tests/test_fusion.py index 86ef434..84c84c3 100644 --- a/tests/test_fusion.py +++ b/tests/test_fusion.py @@ -499,7 +499,11 @@ class TestDPSelectionPropagation: """Vérifie que dp_selection est propagée depuis le dossier source du DP retenu.""" def test_dp_selection_propagated_multi_dossier(self): - """Fusion 2 dossiers : dp_selection vient du dossier dont le DP est retenu.""" + """Fusion 2 dossiers : Trackare prioritaire à spécificité égale. + + K85.1 et K80.2 ont la même spécificité (4 chars), donc le bonus + Trackare l'emporte. dp_selection est recréée pour le DP retenu. + """ sel = DPSelection( chosen_index=0, chosen_term="Pancréatite aiguë biliaire", @@ -523,14 +527,13 @@ class TestDPSelectionPropagation: cim10_suggestion="K80.2"), ) result = merge_dossiers([d1, d2]) - # DP = K85.1 (plus spécifique) → dp_selection propagée depuis d1 - assert result.diagnostic_principal.cim10_suggestion == "K85.1" + # Trackare gagne à spécificité égale + assert result.diagnostic_principal.cim10_suggestion == "K80.2" assert result.dp_selection is not None - assert result.dp_selection.chosen_code == "K85.1" - assert result.dp_selection.verdict == "CONFIRMED" + assert result.dp_selection.chosen_code == "K80.2" - def test_dp_selection_none_when_no_source(self): - """Si aucun dossier n'a de dp_selection, le fusionné non plus.""" + def test_dp_selection_synthetic_when_no_source(self): + """Si aucun dossier n'a de dp_selection, la fusion en crée une synthétique.""" d1 = DossierMedical( diagnostic_principal=Diagnostic(texte="HTA", cim10_suggestion="I10"), ) @@ -538,7 +541,9 @@ class TestDPSelectionPropagation: diagnostic_principal=Diagnostic(texte="HTA", cim10_suggestion="I10"), ) result = merge_dossiers([d1, d2]) - assert result.dp_selection is None + assert result.dp_selection is not None + assert result.dp_selection.chosen_code == "I10" + assert result.dp_selection.reason == "DP fusion (synthétique)" def test_dp_selection_single_dossier(self): """Dossier unique : dp_selection est conservée via model_copy.""" @@ -558,11 +563,15 @@ class TestDPSelectionPropagation: assert result.dp_selection.verdict == "REVIEW" def test_dp_selection_preserves_evidence_reason_verdict(self): - """Fusion multi-docs : evidence, reason et verdict sont préservés intégralement.""" + """Fusion multi-docs : dp_selection du CRH préservée quand CRH est plus spécifique. + + I26.99 (5 chars) > I80.2 (4 chars) → CRH gagne par spécificité malgré + le bonus Trackare. La dp_selection originale est alors propagée intacte. + """ sel = DPSelection( chosen_index=0, chosen_term="Embolie pulmonaire", - chosen_code="I26.9", + chosen_code="I26.99", verdict="CONFIRMED", confidence="high", evidence=[ @@ -572,7 +581,7 @@ class TestDPSelectionPropagation: ], reason="Écart score 5.0 >= seuil 3.0", candidates=[ - DPCandidate(index=0, term="Embolie pulmonaire", code="I26.9", + DPCandidate(index=0, term="Embolie pulmonaire", code="I26.99", section_strength=2, confidence="high", score=9.0, score_details={"section": 2, "confidence": 3, "diag_section_bonus": 4}), DPCandidate(index=1, term="Thrombose veineuse", code="I80.2", @@ -582,7 +591,7 @@ class TestDPSelectionPropagation: ) d1 = DossierMedical( document_type="crh", - diagnostic_principal=Diagnostic(texte="Embolie pulmonaire", cim10_suggestion="I26.9"), + diagnostic_principal=Diagnostic(texte="Embolie pulmonaire", cim10_suggestion="I26.99"), dp_selection=sel, ) d2 = DossierMedical( @@ -591,6 +600,8 @@ class TestDPSelectionPropagation: ) result = merge_dossiers([d1, d2]) + # CRH gagne par spécificité (I26.99 > I80.2) + assert result.diagnostic_principal.cim10_suggestion == "I26.99" assert result.dp_selection is not None rs = result.dp_selection # Verdict/confidence/reason intacts