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

353 lines
9.1 KiB
Python

"""
Tests for CodeMapper.
Validates: Requirements 13.2, 13.3
"""
import pytest
from datetime import datetime
from pathlib import Path
import tempfile
import yaml
from src.pipeline_mco_pmsi.referentiels import CodeMapper, CodeMapping
def test_code_mapper_initialization():
"""Test CodeMapper initialization."""
mapper = CodeMapper()
assert mapper.mappings_dir is not None
assert len(mapper.cim10_mappings) == 0
assert len(mapper.ccam_mappings) == 0
def test_add_mapping():
"""
Test adding a code mapping.
Validates: Requirement 13.2
"""
mapper = CodeMapper()
mapping = CodeMapping(
obsolete_code="J45.0",
current_code="J45.00",
obsolete_label="Asthme à prédominance allergique",
current_label="Asthme à prédominance allergique, non précisé",
effective_date=datetime(2024, 1, 1),
reason="split",
notes="Code divisé"
)
mapper.add_mapping(mapping, "cim10")
assert "J45.0" in mapper.cim10_mappings
assert mapper.cim10_mappings["J45.0"].current_code == "J45.00"
def test_map_obsolete_code():
"""
Test mapping an obsolete code to current code.
Validates: Requirement 13.2
"""
mapper = CodeMapper()
mapping = CodeMapping(
obsolete_code="J45.0",
current_code="J45.00",
obsolete_label="Asthme",
current_label="Asthme précisé",
effective_date=datetime(2024, 1, 1),
reason="split"
)
mapper.add_mapping(mapping, "cim10")
# Map obsolete code
current = mapper.map_code("J45.0", "cim10")
assert current == "J45.00"
# Current code returns None
current = mapper.map_code("J45.00", "cim10")
assert current is None
def test_add_alias():
"""
Test adding a code alias.
Validates: Requirement 13.3
"""
mapper = CodeMapper()
mapper.add_alias("K29.70", "K29.7", "cim10")
assert "K29.70" in mapper.cim10_aliases
assert mapper.cim10_aliases["K29.70"] == "K29.7"
def test_map_alias_code():
"""
Test mapping an alias code to canonical code.
Validates: Requirement 13.3
"""
mapper = CodeMapper()
mapper.add_alias("K29.70", "K29.7", "cim10")
# Map alias
canonical = mapper.map_code("K29.70", "cim10")
assert canonical == "K29.7"
def test_is_obsolete():
"""Test checking if a code is obsolete."""
mapper = CodeMapper()
mapping = CodeMapping(
obsolete_code="J45.0",
current_code="J45.00",
obsolete_label="Asthme",
current_label="Asthme précisé",
effective_date=datetime(2024, 1, 1),
reason="split"
)
mapper.add_mapping(mapping, "cim10")
assert mapper.is_obsolete("J45.0", "cim10") is True
assert mapper.is_obsolete("J45.00", "cim10") is False
def test_get_mapping_info():
"""Test getting detailed mapping information."""
mapper = CodeMapper()
mapping = CodeMapping(
obsolete_code="J45.0",
current_code="J45.00",
obsolete_label="Asthme",
current_label="Asthme précisé",
effective_date=datetime(2024, 1, 1),
reason="split",
notes="Test note"
)
mapper.add_mapping(mapping, "cim10")
info = mapper.get_mapping_info("J45.0", "cim10")
assert info is not None
assert info.current_code == "J45.00"
assert info.reason == "split"
assert info.notes == "Test note"
def test_track_label_change():
"""
Test tracking label changes.
Validates: Requirement 13.3
"""
mapper = CodeMapper()
mapper.track_label_change(
code="K29.7",
old_label="Gastrite, sans précision",
new_label="Gastrite non précisée",
referentiel_type="cim10",
effective_date=datetime(2024, 1, 1)
)
history = mapper.get_label_history("K29.7", "cim10")
assert len(history) == 1
assert history[0]["old_label"] == "Gastrite, sans précision"
assert history[0]["new_label"] == "Gastrite non précisée"
def test_load_mappings_yaml(tmp_path):
"""
Test loading mappings from YAML file.
Validates: Requirement 13.2
"""
# Create test mapping file
mapping_file = tmp_path / "test_mappings.yaml"
data = {
"referentiel_type": "cim10",
"mappings": [
{
"obsolete_code": "J45.0",
"current_code": "J45.00",
"obsolete_label": "Asthme",
"current_label": "Asthme précisé",
"effective_date": "2024-01-01T00:00:00",
"reason": "split",
"notes": "Test"
}
],
"aliases": [
{"alias": "K29.70", "canonical": "K29.7"}
]
}
with open(mapping_file, "w") as f:
yaml.dump(data, f)
mapper = CodeMapper()
count = mapper.load_mappings("cim10", mapping_file)
assert count == 1
assert "J45.0" in mapper.cim10_mappings
assert "K29.70" in mapper.cim10_aliases
def test_save_mappings_yaml(tmp_path):
"""Test saving mappings to YAML file."""
mapper = CodeMapper()
mapping = CodeMapping(
obsolete_code="J45.0",
current_code="J45.00",
obsolete_label="Asthme",
current_label="Asthme précisé",
effective_date=datetime(2024, 1, 1),
reason="split"
)
mapper.add_mapping(mapping, "cim10")
mapper.add_alias("K29.70", "K29.7", "cim10")
# Save to file
output_file = tmp_path / "output_mappings.yaml"
mapper.save_mappings("cim10", output_file)
assert output_file.exists()
# Load and verify
with open(output_file, "r") as f:
data = yaml.safe_load(f)
assert data["referentiel_type"] == "cim10"
assert len(data["mappings"]) == 1
assert len(data["aliases"]) == 1
def test_get_statistics():
"""Test getting mapping statistics."""
mapper = CodeMapper()
# Add multiple mappings with different reasons
mapper.add_mapping(
CodeMapping(
obsolete_code="J45.0",
current_code="J45.00",
obsolete_label="Asthme",
current_label="Asthme précisé",
effective_date=datetime(2024, 1, 1),
reason="split"
),
"cim10"
)
mapper.add_mapping(
CodeMapping(
obsolete_code="I25.1",
current_code="I25.10",
obsolete_label="Cardiopathie",
current_label="Cardiopathie précisée",
effective_date=datetime(2024, 1, 1),
reason="split"
),
"cim10"
)
mapper.add_mapping(
CodeMapping(
obsolete_code="K29.0",
current_code="K29.00",
obsolete_label="Gastrite",
current_label="Gastrite aiguë",
effective_date=datetime(2024, 1, 1),
reason="renamed"
),
"cim10"
)
mapper.add_alias("K29.70", "K29.7", "cim10")
stats = mapper.get_statistics("cim10")
assert stats["total_mappings"] == 3
assert stats["total_aliases"] == 1
assert stats["mappings_by_reason"]["split"] == 2
assert stats["mappings_by_reason"]["renamed"] == 1
def test_ccam_mappings():
"""Test CCAM code mappings."""
mapper = CodeMapper()
mapping = CodeMapping(
obsolete_code="YYYY001",
current_code="YYYY002",
obsolete_label="Ancien acte",
current_label="Nouvel acte",
effective_date=datetime(2025, 1, 1),
reason="renamed"
)
mapper.add_mapping(mapping, "ccam")
assert "YYYY001" in mapper.ccam_mappings
assert mapper.map_code("YYYY001", "ccam") == "YYYY002"
assert mapper.is_obsolete("YYYY001", "ccam") is True
def test_multiple_label_changes():
"""Test tracking multiple label changes for same code."""
mapper = CodeMapper()
# First change
mapper.track_label_change(
code="K29.7",
old_label="Gastrite",
new_label="Gastrite, sans précision",
referentiel_type="cim10",
effective_date=datetime(2023, 1, 1)
)
# Second change
mapper.track_label_change(
code="K29.7",
old_label="Gastrite, sans précision",
new_label="Gastrite non précisée",
referentiel_type="cim10",
effective_date=datetime(2024, 1, 1)
)
history = mapper.get_label_history("K29.7", "cim10")
assert len(history) == 2
assert history[0]["effective_date"] == "2023-01-01T00:00:00"
assert history[1]["effective_date"] == "2024-01-01T00:00:00"
def test_load_nonexistent_file():
"""Test loading from nonexistent file raises error."""
mapper = CodeMapper()
with pytest.raises(FileNotFoundError):
mapper.load_mappings("cim10", Path("/nonexistent/file.yaml"))
def test_unsupported_file_format(tmp_path):
"""Test loading unsupported file format raises error."""
mapper = CodeMapper()
bad_file = tmp_path / "test.txt"
bad_file.write_text("test")
with pytest.raises(ValueError, match="Unsupported file format"):
mapper.load_mappings("cim10", bad_file)