"""Tests pour le module de sévérité heuristique (CMA/CMS).""" import pytest from src.config import Diagnostic from src.medical.severity import ( evaluate_severity, enrich_dossier_severity, _detect_severity_markers, _is_heuristic_cma, ) class TestDetectSeverityMarkers: def test_severe_markers(self): niveau, marqueurs = _detect_severity_markers("Pancréatite aiguë sévère") assert niveau == "severe" assert any(m in ("severe", "aigue") for m in marqueurs) def test_moderate_markers(self): niveau, marqueurs = _detect_severity_markers("Insuffisance rénale modérée") assert niveau == "modere" assert "modere" in marqueurs or "moderee" in marqueurs def test_mild_markers(self): niveau, marqueurs = _detect_severity_markers("Anémie chronique bénigne") assert niveau == "leger" assert any(m in ("chronique", "benin", "benigne") for m in marqueurs) def test_no_markers(self): niveau, marqueurs = _detect_severity_markers("Hypertension artérielle") assert niveau == "non_evalue" assert marqueurs == [] def test_severe_overrides_mild(self): """Si 'sévère' et 'chronique' sont présents, 'severe' l'emporte.""" niveau, marqueurs = _detect_severity_markers("Insuffisance cardiaque chronique décompensée") assert niveau == "severe" class TestHeuristicCMA: def test_e11_is_cma(self): assert _is_heuristic_cma("E11.9") is True def test_i48_is_cma(self): assert _is_heuristic_cma("I48.9") is True def test_a41_is_cma(self): assert _is_heuristic_cma("A41.9") is True def test_k85_not_cma(self): assert _is_heuristic_cma("K85.1") is False def test_i10_not_cma(self): assert _is_heuristic_cma("I10") is False def test_empty(self): assert _is_heuristic_cma("") is False assert _is_heuristic_cma(None) is False class TestEvaluateSeverity: def test_cma_code_detected(self): diag = Diagnostic(texte="Diabète type 2", cim10_suggestion="E11.9") info = evaluate_severity(diag) assert info.est_cma_probable is True def test_non_cma_code(self): diag = Diagnostic(texte="Pancréatite aiguë biliaire", cim10_suggestion="K85.1") info = evaluate_severity(diag) assert info.est_cma_probable is False def test_severity_from_text(self): diag = Diagnostic(texte="Sepsis sévère", cim10_suggestion="A41.9") info = evaluate_severity(diag) assert info.niveau_severite == "severe" assert info.est_cma_probable is True def test_combined_text_and_dict_label(self): """Le label du dictionnaire CIM-10 enrichit la détection de sévérité.""" diag = Diagnostic(texte="Embolie pulmonaire", cim10_suggestion="I26.9") info = evaluate_severity(diag) assert info.est_cma_probable is True class TestEnrichDossierSeverity: def test_enriches_das_in_place(self): dp = Diagnostic(texte="Pancréatite aiguë biliaire", cim10_suggestion="K85.1") das = [ Diagnostic(texte="Fibrillation auriculaire", cim10_suggestion="I48.9"), Diagnostic(texte="Obésité", cim10_suggestion="E66.0"), ] alertes = enrich_dossier_severity(dp, das) # I48.9 = CMA probable assert das[0].est_cma is True assert das[0].niveau_severite is not None # E66.0 = non CMA assert das[1].est_cma is None # Au moins une alerte CMA assert any("CMA" in a for a in alertes) def test_dp_severity_set(self): dp = Diagnostic(texte="Sepsis sévère", cim10_suggestion="A41.9") alertes = enrich_dossier_severity(dp, []) assert dp.niveau_severite == "severe" assert dp.est_cma is True