feat: CODE_CORRECTIONS 12 règles déterministes + sentinel REJECT
- CODE_CORRECTIONS passe de 1 à 12 règles (corrections + rejets) - REJECT_SENTINEL pour codes trop vagues (R69, R69.8, Z53.9, D71.9) ou inexistants - Corrections : J96.0→J96.00, I50.9→I50.1 (IC gauche), N17.9→N17.0 (NTA), E11.9→E11.65 (DT2 insuline), K92.2→K92.0 (hématémèse), G40.9→G40.3 (épilepsie) - _apply_code_corrections() gère REJECT : DP→None, DAS→supprimé + alerte - 21 tests paramétrés (corrections, rejets, non-corrections) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -8,6 +8,8 @@ from src.medical.das_filter import (
|
||||
correct_known_miscodes,
|
||||
expand_medical_abbreviations,
|
||||
SEMANTIC_REDUNDANCIES,
|
||||
CODE_CORRECTIONS,
|
||||
REJECT_SENTINEL,
|
||||
)
|
||||
|
||||
|
||||
@@ -330,3 +332,88 @@ class TestExpandMedicalAbbreviations:
|
||||
def test_unknown_unchanged(self):
|
||||
"""Texte non-abréviation reste inchangé."""
|
||||
assert expand_medical_abbreviations("Pancréatite aiguë") == "Pancréatite aiguë"
|
||||
|
||||
|
||||
class TestCodeCorrectionsStructure:
|
||||
"""Vérifie le format et la complétude de CODE_CORRECTIONS."""
|
||||
|
||||
def test_has_12_rules(self):
|
||||
assert len(CODE_CORRECTIONS) == 12
|
||||
|
||||
def test_all_rules_have_required_fields(self):
|
||||
for code, rule in CODE_CORRECTIONS.items():
|
||||
assert "correct_code" in rule, f"{code}: manque 'correct_code'"
|
||||
assert "condition_texte" in rule, f"{code}: manque 'condition_texte'"
|
||||
assert "reason" in rule, f"{code}: manque 'reason'"
|
||||
|
||||
|
||||
class TestCodeCorrectionsParametrized:
|
||||
"""Tests paramétrés pour les 12 règles CODE_CORRECTIONS."""
|
||||
|
||||
# --- Corrections (code → code) ---
|
||||
|
||||
def test_d55_9_anemie(self):
|
||||
assert correct_known_miscodes("D55.9", "Anémie") == "D64.9"
|
||||
|
||||
def test_j96_0_insuf_resp(self):
|
||||
assert correct_known_miscodes("J96.0", "Insuffisance respiratoire aiguë") == "J96.00"
|
||||
|
||||
def test_i50_9_ic_gauche(self):
|
||||
assert correct_known_miscodes("I50.9", "Insuffisance cardiaque gauche") == "I50.1"
|
||||
|
||||
def test_i50_9_oap(self):
|
||||
assert correct_known_miscodes("I50.9", "OAP") == "I50.1"
|
||||
|
||||
def test_n17_9_nta(self):
|
||||
assert correct_known_miscodes("N17.9", "Nécrose tubulaire aiguë") == "N17.0"
|
||||
|
||||
def test_n17_9_nta_abbreviation(self):
|
||||
assert correct_known_miscodes("N17.9", "NTA") == "N17.0"
|
||||
|
||||
def test_e11_9_diabete_insuline(self):
|
||||
assert correct_known_miscodes("E11.9", "Diabète traité par insuline") == "E11.65"
|
||||
|
||||
def test_k92_2_hematemese(self):
|
||||
assert correct_known_miscodes("K92.2", "Hématémèse") == "K92.0"
|
||||
|
||||
def test_g40_9_epilepsie(self):
|
||||
assert correct_known_miscodes("G40.9", "Épilepsie") == "G40.3"
|
||||
|
||||
# --- Rejets (REJECT_SENTINEL) ---
|
||||
|
||||
def test_r69_reject(self):
|
||||
assert correct_known_miscodes("R69", "Maladie SAI") == REJECT_SENTINEL
|
||||
|
||||
def test_r69_8_reject(self):
|
||||
assert correct_known_miscodes("R69.8", "Quelque chose") == REJECT_SENTINEL
|
||||
|
||||
def test_z53_9_reject(self):
|
||||
assert correct_known_miscodes("Z53.9", "Procédure non effectuée") == REJECT_SENTINEL
|
||||
|
||||
def test_d71_9_reject(self):
|
||||
assert correct_known_miscodes("D71.9", "Anomalie leucocytes") == REJECT_SENTINEL
|
||||
|
||||
def test_b96_9_reject_agent_bacterien(self):
|
||||
assert correct_known_miscodes("B96.9", "Agent bactérien") == REJECT_SENTINEL
|
||||
|
||||
def test_b96_9_no_reject_specific(self):
|
||||
"""B96.9 avec texte spécifique → pas de rejet."""
|
||||
assert correct_known_miscodes("B96.9", "Staphylococcus aureus") is None
|
||||
|
||||
# --- Non-correction quand le texte ne matche pas ---
|
||||
|
||||
def test_d55_9_qualified_no_correction(self):
|
||||
assert correct_known_miscodes("D55.9", "Anémie hémolytique") is None
|
||||
|
||||
def test_i50_9_unqualified_no_correction(self):
|
||||
"""I50.9 sans mention IC gauche → pas de correction."""
|
||||
assert correct_known_miscodes("I50.9", "Insuffisance cardiaque") is None
|
||||
|
||||
def test_e11_9_no_insuline_no_correction(self):
|
||||
assert correct_known_miscodes("E11.9", "Diabète de type 2") is None
|
||||
|
||||
def test_g40_9_qualified_no_correction(self):
|
||||
assert correct_known_miscodes("G40.9", "Épilepsie focale") is None
|
||||
|
||||
def test_unknown_code_no_correction(self):
|
||||
assert correct_known_miscodes("Z99.0", "Test") is None
|
||||
|
||||
Reference in New Issue
Block a user