From 4412512d4bf84cb05581795b59054fa4823edecd Mon Sep 17 00:00:00 2001 From: Domi31tls Date: Tue, 30 Jun 2026 10:34:11 +0200 Subject: [PATCH] =?UTF-8?q?test(gui):=20v=C3=A9rifier=20chaque=20branche?= =?UTF-8?q?=20de=20classify=5Ferror=5Fcode=20+=20anti-d=C3=A9rive=20(E2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- gui_v6/processing_runner.py | 5 +++++ tests/unit/test_gui_v6_processing_runner.py | 25 +++++++++++++++++++++ 2 files changed, 30 insertions(+) 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