diff --git a/gui_v6/processing_runner.py b/gui_v6/processing_runner.py index 7f9455d..3ce8530 100644 --- a/gui_v6/processing_runner.py +++ b/gui_v6/processing_runner.py @@ -101,6 +101,11 @@ def classify_error_code(exc: Exception) -> str: if name == "EngineUnavailableError": return "ner_unavailable" msg = str(exc) + # ⚠ ANTI-DÉRIVE : ces littéraux DOIVENT rester synchronisés avec les messages + # produits par `_engine_result_error` ci-dessus ("Document mis en quarantaine :" + # et "Aucune sortie PDF anonymisée produite."). Si l'un est reformulé sans + # mettre à jour l'autre, l'erreur retombe silencieusement en 'processing_error' + # (couvert par les tests test_classify_error_code_*). if "quarantaine" in msg: return "quarantined" if "Aucune sortie" in msg: diff --git a/tests/unit/test_gui_v6_processing_runner.py b/tests/unit/test_gui_v6_processing_runner.py index 8afc1b1..e2d4a40 100644 --- a/tests/unit/test_gui_v6_processing_runner.py +++ b/tests/unit/test_gui_v6_processing_runner.py @@ -303,3 +303,28 @@ def test_success_doc_has_no_error_fields(tmp_path): doc = summary.documents[0] assert doc.status == "success" assert doc.error_type is None and doc.error_code is None + + +# -- classification d'erreur : une assertion par branche (mapping vérifié) - + +def test_classify_error_code_ner_unavailable(): + from gui_v6.processing_runner import classify_error_code + from gui_v6.engine_bridge import EngineUnavailableError # import the REAL class + # importing the real class means a future rename breaks this test (intended guard) + assert classify_error_code(EngineUnavailableError("modèle indispo")) == "ner_unavailable" + + +def test_classify_error_code_quarantined(): + from gui_v6.processing_runner import classify_error_code + assert classify_error_code(RuntimeError("Document mis en quarantaine : texte trop court")) == "quarantined" + + +def test_classify_error_code_no_output(): + from gui_v6.processing_runner import classify_error_code + assert classify_error_code(RuntimeError("Aucune sortie PDF anonymisée produite")) == "no_output" + + +def test_classify_error_code_processing_error_default(): + from gui_v6.processing_runner import classify_error_code, _ERROR_CODES + assert classify_error_code(ValueError("patient Dupont")) == "processing_error" + assert classify_error_code(ValueError("x")) in _ERROR_CODES