- 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>
95 lines
2.7 KiB
Python
95 lines
2.7 KiB
Python
"""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
|