feat: Phase 4 — viewer enrichi, non-cumul CCAM, fusion multi-PDFs + rebuild FAISS (21 141 vecteurs)
- Viewer : badges compteurs (DAS, actes, alertes, CMA), raisonnement LLM pliable, regroupement CCAM, navigation patient, alertes NON-CUMUL en rouge - Non-cumul CCAM : 3 règles heuristiques (même base, même regroupement/jour, paires incompatibles) - Fusion multi-PDFs : merge_dossiers() avec priorité Trackare, spécificité CIM-10, déduplication, champ source_files - Index FAISS reconstruit : 21 141 vecteurs (CCAM dict 8 257 + CIM-10 alpha 306) - 192 tests unitaires passent Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
94
tests/test_viewer.py
Normal file
94
tests/test_viewer.py
Normal file
@@ -0,0 +1,94 @@
|
||||
"""Tests pour le viewer Flask."""
|
||||
|
||||
import pytest
|
||||
|
||||
from src.viewer.app import create_app, compute_group_stats, severity_badge
|
||||
from src.config import DossierMedical, Diagnostic, ActeCCAM
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def app():
|
||||
app = create_app()
|
||||
app.config["TESTING"] = True
|
||||
return app
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def client(app):
|
||||
return app.test_client()
|
||||
|
||||
|
||||
class TestGroupStats:
|
||||
def test_group_stats(self):
|
||||
items = [
|
||||
{
|
||||
"dossier": DossierMedical(
|
||||
diagnostics_associes=[
|
||||
Diagnostic(texte="HTA", cim10_suggestion="I10"),
|
||||
Diagnostic(texte="Diabète", cim10_suggestion="E11.9", est_cma=True),
|
||||
],
|
||||
actes_ccam=[
|
||||
ActeCCAM(texte="Cholé", code_ccam_suggestion="HMFC004"),
|
||||
],
|
||||
alertes_codage=["Alerte 1", "Alerte 2"],
|
||||
),
|
||||
},
|
||||
{
|
||||
"dossier": DossierMedical(
|
||||
diagnostics_associes=[
|
||||
Diagnostic(texte="Obésité", cim10_suggestion="E66.0"),
|
||||
],
|
||||
actes_ccam=[
|
||||
ActeCCAM(texte="TDM", code_ccam_suggestion="ZCQK002"),
|
||||
],
|
||||
alertes_codage=[],
|
||||
),
|
||||
},
|
||||
]
|
||||
stats = compute_group_stats(items)
|
||||
assert stats["das_count"] == 3
|
||||
assert stats["actes_count"] == 2
|
||||
assert stats["alertes_count"] == 2
|
||||
assert stats["cma_count"] == 1
|
||||
|
||||
def test_group_stats_empty(self):
|
||||
stats = compute_group_stats([])
|
||||
assert stats["das_count"] == 0
|
||||
assert stats["alertes_count"] == 0
|
||||
|
||||
|
||||
class TestSeverityBadgeFilter:
|
||||
def test_severe(self):
|
||||
result = severity_badge("severe")
|
||||
assert "Sévère" in result
|
||||
assert "#dc2626" in result
|
||||
|
||||
def test_modere(self):
|
||||
result = severity_badge("modere")
|
||||
assert "Modéré" in result
|
||||
|
||||
def test_leger(self):
|
||||
result = severity_badge("leger")
|
||||
assert "Léger" in result
|
||||
|
||||
def test_none(self):
|
||||
result = severity_badge(None)
|
||||
assert result == ""
|
||||
|
||||
def test_unknown(self):
|
||||
result = severity_badge("inconnu")
|
||||
assert result == ""
|
||||
|
||||
|
||||
class TestIndexPageLoads:
|
||||
def test_index_page_loads(self, client):
|
||||
response = client.get("/")
|
||||
assert response.status_code == 200
|
||||
assert b"Dossiers" in response.data
|
||||
|
||||
|
||||
class TestDetailPageLoads:
|
||||
def test_detail_page_404(self, client):
|
||||
"""Un fichier inexistant retourne 404."""
|
||||
response = client.get("/dossier/nonexistent.json")
|
||||
assert response.status_code == 404
|
||||
Reference in New Issue
Block a user