test(gui): vérifier chaque branche de classify_error_code + anti-dérive (E2)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-30 10:34:11 +02:00
parent 952a1c6ca0
commit 4412512d4b
2 changed files with 30 additions and 0 deletions

View File

@@ -101,6 +101,11 @@ def classify_error_code(exc: Exception) -> str:
if name == "EngineUnavailableError": if name == "EngineUnavailableError":
return "ner_unavailable" return "ner_unavailable"
msg = str(exc) 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: if "quarantaine" in msg:
return "quarantined" return "quarantined"
if "Aucune sortie" in msg: if "Aucune sortie" in msg:

View File

@@ -303,3 +303,28 @@ def test_success_doc_has_no_error_fields(tmp_path):
doc = summary.documents[0] doc = summary.documents[0]
assert doc.status == "success" assert doc.status == "success"
assert doc.error_type is None and doc.error_code is None 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