BytecodeApps/docverse-api
0
1import pytest2from app.services.risk_engine import RiskEngine, SeverityLevels3 4@pytest.fixture5def risk_engine():6 # Initialize with mock patient history if needed later7 return RiskEngine(patient_history={})8 9def test_hemoglobin_critical_low(risk_engine):10 """ Test that Hemoglobin < 7 triggers an EMERGENCY flag. """11 results = risk_engine.evaluate_lab_results([12 {'test': 'hemoglobin', 'value': 6.5, 'unit': 'g/dL'}13 ])14 15 assert len(results) == 116 assert results[0]["severity"] == SeverityLevels.EMERGENCY17 assert "critically low" in results[0]["description"].lower()18 19def test_hemoglobin_high_risk(risk_engine):20 """ Test that Hemoglobin between 7 and 12 triggers a HIGH risk flag. """21 risk_engine.flags = [] # Reset state22 results = risk_engine.evaluate_lab_results([23 {'test': 'hemoglobin', 'value': 10.5, 'unit': 'g/dL'}24 ])25 26 assert len(results) == 127 assert results[0]["severity"] == SeverityLevels.HIGH28 assert "below normal range" in results[0]["description"].lower()29 30def test_ldl_high_risk(risk_engine):31 """ Test that LDL > 160 triggers a HIGH flag. """32 risk_engine.flags = []33 results = risk_engine.evaluate_lab_results([34 {'test': 'ldl cholesterol', 'value': 165, 'unit': 'mg/dL'}35 ])36 37 assert len(results) == 138 assert results[0]["severity"] == SeverityLevels.HIGH39 assert "significantly elevated" in results[0]["description"].lower()40 41def test_potassium_emergencies(risk_engine):42 """ Test Potassium limits for EMERGENCY flags. (>6.0 or <3.0) """43 risk_engine.flags = []44 45 # Test High Potassium46 results_high = risk_engine.evaluate_lab_results([47 {'test': 'potassium', 'value': 6.8, 'unit': 'mEq/L'}48 ])49 assert len(results_high) == 150 assert results_high[0]["severity"] == SeverityLevels.EMERGENCY51 assert "critically high" in results_high[0]["description"].lower()52 53 risk_engine.flags = []54 55 # Test Low Potassium56 results_low = risk_engine.evaluate_lab_results([57 {'test': 'potassium', 'value': 2.8, 'unit': 'mEq/L'}58 ])59 assert len(results_low) == 160 assert results_low[0]["severity"] == SeverityLevels.EMERGENCY61 assert "critically low" in results_low[0]["description"].lower()62 63def test_medication_duplicates(risk_engine):64 """ Test that duplicate medications are flagged. """65 risk_engine.flags = []66 results = risk_engine.evaluate_medications([67 {'drug': 'Lisinopril', 'class': 'ACE Inhibitor'},68 {'drug': 'lisinopril', 'class': 'ACE Inhibitor'} # Lowercase duplicate69 ])70 71 assert len(results) == 172 assert results[0]["severity"] == SeverityLevels.MEDIUM73 assert "duplicate" in results[0]["description"].lower()74 75def test_severe_drug_interactions(risk_engine):76 """ Test specific hardcoded severe interactions (e.g. Sildenafil + Nitrates). """77 risk_engine.flags = []78 results = risk_engine.evaluate_medications([79 {'drug': 'Sildenafil', 'class': 'PDE5 Inhibitor'},80 {'drug': 'Isosorbide', 'class': 'Nitrate'}81 ])82 83 assert len(results) == 184 assert results[0]["severity"] == SeverityLevels.EMERGENCY85 assert "severe drug interaction" in results[0]["description"].lower()86 87def test_advisory_disclaimer_presence():88 """ Ensure the Risk Engine always appends the medical disclaimer to actions. """89 engine = RiskEngine({})90 results = engine.evaluate_lab_results([91 {'test': 'potassium', 'value': 6.8, 'unit': 'mEq/L'}92 ])93 94 assert "does not constitute medical advice" in results[0]["disclaimer"].lower()95 