fix: corriger 3 tests fusion alignés sur la logique Trackare > CRH

Les tests supposaient que le CRH gagnait à spécificité égale — en réalité
le bonus Trackare l'emporte (codage DIM établissement prioritaire).
Aussi : dp_selection synthétique créée par fusion quand aucun source n'existe.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
dom
2026-03-08 13:09:59 +01:00
parent 1da45b7c8a
commit 0bfc1a9d6e

View File

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