Files
aivanov_CIM/tests/test_cim11_mapper.py
2026-03-05 01:20:14 +01:00

212 lines
6.2 KiB
Python

"""
Tests pour le mapper CIM-10 / CIM-11.
Exigences: 24.6, 28.1, 28.2
"""
import pytest
from pathlib import Path
from pipeline_mco_pmsi.referentiels.cim11_mapper import CIM11Mapper, CIM11Mapping
@pytest.fixture
def cim11_mapper(tmp_path):
"""Crée un CIM11Mapper avec des mappings de test."""
# Créer un fichier de mapping de test
mappings_dir = tmp_path / "mappings"
mappings_dir.mkdir(parents=True, exist_ok=True)
mapping_file = mappings_dir / "test_mappings.yaml"
mapping_content = """mappings:
- cim10_code: "A00.0"
cim10_label: "Choléra à Vibrio cholerae 01, biovar cholerae"
cim11_codes: ["1A00.0"]
cim11_labels: ["Cholera due to Vibrio cholerae O1, biovar cholerae"]
mapping_type: "exact"
notes: null
- cim10_code: "K29.0"
cim10_label: "Gastrite aiguë hémorragique"
cim11_codes: ["DA40.0"]
cim11_labels: ["Acute haemorrhagic gastritis"]
mapping_type: "exact"
notes: null
- cim10_code: "E11"
cim10_label: "Diabète sucré non insulino-dépendant"
cim11_codes: ["5A11", "5A10.1"]
cim11_labels: ["Type 2 diabetes mellitus", "Type 2 diabetes mellitus with complications"]
mapping_type: "multiple"
notes: "Mapping multiple"
"""
with open(mapping_file, "w", encoding="utf-8") as f:
f.write(mapping_content)
# Créer le mapper et importer les mappings
mapper = CIM11Mapper(mappings_dir=str(mappings_dir))
mapper.import_atih_mappings("test_mappings.yaml")
return mapper
def test_import_atih_mappings(cim11_mapper):
"""
Test que l'import des mappings ATIH fonctionne correctement.
Exigence: 28.1
"""
# Vérifier que les mappings ont été importés
assert len(cim11_mapper.cim10_to_cim11) == 3, "3 mappings devraient être importés"
# Vérifier qu'un mapping spécifique existe
assert "A00.0" in cim11_mapper.cim10_to_cim11
assert "K29.0" in cim11_mapper.cim10_to_cim11
assert "E11" in cim11_mapper.cim10_to_cim11
def test_get_cim11_equivalent_exact_mapping(cim11_mapper):
"""
Test la récupération d'un équivalent CIM-11 pour un mapping exact.
Exigence: 28.1
"""
mapping = cim11_mapper.get_cim11_equivalent("A00.0")
assert mapping is not None, "Le mapping devrait exister"
assert mapping.cim10_code == "A00.0"
assert mapping.cim11_codes == ["1A00.0"]
assert mapping.mapping_type == "exact"
def test_get_cim11_equivalent_multiple_mapping(cim11_mapper):
"""
Test la récupération d'un équivalent CIM-11 pour un mapping multiple.
Exigence: 28.1
"""
mapping = cim11_mapper.get_cim11_equivalent("E11")
assert mapping is not None
assert len(mapping.cim11_codes) == 2, "Le mapping devrait avoir 2 codes CIM-11"
assert "5A11" in mapping.cim11_codes
assert "5A10.1" in mapping.cim11_codes
assert mapping.mapping_type == "multiple"
def test_get_cim11_equivalent_no_mapping(cim11_mapper):
"""
Test la récupération d'un équivalent CIM-11 pour un code inexistant.
Exigence: 28.1
"""
mapping = cim11_mapper.get_cim11_equivalent("Z99.9")
assert mapping is None, "Aucun mapping ne devrait exister pour ce code"
def test_get_cim10_equivalents(cim11_mapper):
"""
Test la récupération des équivalents CIM-10 d'un code CIM-11 (mapping inverse).
Exigence: 28.2
"""
cim10_codes = cim11_mapper.get_cim10_equivalents("1A00.0")
assert len(cim10_codes) == 1, "Un code CIM-10 devrait être trouvé"
assert "A00.0" in cim10_codes
def test_get_cim10_equivalents_multiple(cim11_mapper):
"""
Test la récupération des équivalents CIM-10 pour un code CIM-11 avec mapping multiple.
Exigence: 28.2
"""
# Le code CIM-11 "5A11" devrait pointer vers "E11"
cim10_codes = cim11_mapper.get_cim10_equivalents("5A11")
assert "E11" in cim10_codes
def test_bidirectional_mapping(cim11_mapper):
"""
Test que les mappings bidirectionnels fonctionnent correctement.
Exigences: 28.1, 28.2
"""
# CIM-10 → CIM-11
mapping = cim11_mapper.get_cim11_equivalent("K29.0")
assert mapping is not None
cim11_code = mapping.cim11_codes[0]
assert cim11_code == "DA40.0"
# CIM-11 → CIM-10 (inverse)
cim10_codes = cim11_mapper.get_cim10_equivalents(cim11_code)
assert "K29.0" in cim10_codes
def test_search_cim11_by_label(cim11_mapper):
"""
Test la recherche de codes CIM-11 par libellé.
Exigence: 28.1
"""
results = cim11_mapper.search_cim11_by_label("Gastrite")
assert len(results) > 0, "Des résultats devraient être trouvés"
assert any(r.cim10_code == "K29.0" for r in results), "K29.0 devrait être dans les résultats"
def test_get_mapping_statistics(cim11_mapper):
"""
Test le calcul des statistiques sur les mappings.
Exigence: 28.1
"""
stats = cim11_mapper.get_mapping_statistics()
assert stats["total_mappings"] == 3
assert stats["exact_mappings"] == 2
assert stats["multiple_mappings"] == 1
def test_export_mappings_yaml(cim11_mapper, tmp_path):
"""
Test l'export des mappings au format YAML.
Exigence: 28.1
"""
output_file = "exported_mappings.yaml"
cim11_mapper.export_mappings(output_file, format="yaml")
# Vérifier que le fichier a été créé
output_path = Path(cim11_mapper.mappings_dir) / output_file
assert output_path.exists(), "Le fichier exporté devrait exister"
def test_export_mappings_json(cim11_mapper, tmp_path):
"""
Test l'export des mappings au format JSON.
Exigence: 28.1
"""
output_file = "exported_mappings.json"
cim11_mapper.export_mappings(output_file, format="json")
# Vérifier que le fichier a été créé
output_path = Path(cim11_mapper.mappings_dir) / output_file
assert output_path.exists(), "Le fichier exporté devrait exister"
def test_import_nonexistent_file(tmp_path):
"""
Test que l'import d'un fichier inexistant lève une erreur.
Exigence: 28.1
"""
mapper = CIM11Mapper(mappings_dir=str(tmp_path))
with pytest.raises(FileNotFoundError):
mapper.import_atih_mappings("nonexistent.yaml")