Lung-Cancer-Risk-Diagnosis-Assistant / testing /test_session_manager.py
fatimaxa's picture
Upload 112 files
00bd0c6 verified
import pytest
from session_management.session_manager import SessionManager
@pytest.fixture
def manager():
"""Creates SessionManager in test mode (uses Test_PatientDB) for each test."""
sm = SessionManager(test_mode=True)
sm.db.clear_db()
yield sm
sm.db.clear_db()
@pytest.fixture
def patient(manager):
"""Create a test patient and return their pid."""
pid = manager.db.create_patient("Test Patient", "2000-01-01", "F")
return pid
@pytest.fixture
def session(manager, patient):
"""Start a session for the test patient and return (sid, pid)."""
sid = manager.start_session(patient)
return sid, patient
#─────── SESSION LIFECYCLE ────────────────────────────────────────────────────────────────────────────────
class TestSessionLifecycle:
def test_start_session_returns_sid(self, manager, patient):
sid = manager.start_session(patient)
assert sid is not None
def test_start_session_creates_active_session(self, manager, patient):
sid = manager.start_session(patient)
assert sid in manager.active_sessions
def test_start_session_stores_correct_patient_id(self, manager, patient):
sid = manager.start_session(patient)
state = manager.get_session(sid)
assert state.patient_id == patient
def test_get_session_returns_state(self, manager, session):
sid, _ = session
state = manager.get_session(sid)
assert state is not None
def test_get_session_invalid_id_returns_none(self, manager):
assert manager.get_session(9999) is None
def test_end_session_removes_from_active_sessions(self, manager, session):
sid, _ = session
manager.end_session(sid)
assert sid not in manager.active_sessions
def test_end_session_persists_symptoms_to_db(self, manager, session):
sid, pid = session
manager.add_validated_evidence(sid, symptoms=["persistent cough"])
manager.end_session(sid)
evidence = manager.db.get_patient_evidence(pid)
assert "persistent cough" in evidence["symptoms"]
def test_end_session_persists_risk_factors_to_db(self, manager, session):
sid, pid = session
manager.add_validated_evidence(sid, risk_factors=["tobacco smoking"])
manager.end_session(sid)
evidence = manager.db.get_patient_evidence(pid)
assert "tobacco smoking" in evidence["risk_factors"]
def test_end_session_persists_imaging_to_db(self, manager, session):
sid, pid = session
manager.add_validated_evidence(sid, imaging_detections=["pleural effusion"])
manager.end_session(sid)
evidence = manager.db.get_patient_evidence(pid)
assert "pleural effusion" in evidence["image_detections"]
def test_multiple_sessions_are_independent(self, manager, patient):
sid1 = manager.start_session(patient)
sid2 = manager.start_session(patient)
assert sid1 != sid2
assert sid1 in manager.active_sessions
assert sid2 in manager.active_sessions
#─────── EVIDENCE β€” TEXT, IMAGING, PATIENT RECORDS ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
class TestEvidenceManagement:
def test_add_text_evidence_to_current_loop(self, manager, session):
sid, _ = session
manager.add_text_evidence(sid, ["cough", "fatigue"])
evidence = manager.get_current_loop_evidence(sid)
assert "cough" in evidence["text_evidence"]
assert "fatigue" in evidence["text_evidence"]
def test_add_imaging_evidence_to_current_loop(self, manager, session):
sid, _ = session
manager.add_imaging_evidence(sid, ["lung opacity"])
evidence = manager.get_current_loop_evidence(sid)
assert "lung opacity" in evidence["imaging_evidence"]
def test_add_patient_records_evidence_to_current_loop(self, manager, session):
sid, _ = session
manager.add_patient_records_evidence(sid, ["tobacco smoking"])
evidence = manager.get_current_loop_evidence(sid)
assert "tobacco smoking" in evidence["patient_records"]
def test_add_validated_evidence_symptoms(self, manager, session):
sid, _ = session
manager.add_validated_evidence(sid, symptoms=["haemoptysis"])
validated = manager.get_validated_evidence(sid)
assert "haemoptysis" in validated["symptoms"]
def test_add_validated_evidence_risk_factors(self, manager, session):
sid, _ = session
manager.add_validated_evidence(sid, risk_factors=["asbestos"])
validated = manager.get_validated_evidence(sid)
assert "asbestos" in validated["risk_factors"]
def test_add_validated_evidence_imaging(self, manager, session):
sid, _ = session
manager.add_validated_evidence(sid, imaging_detections=["consolidation"])
validated = manager.get_validated_evidence(sid)
assert "consolidation" in validated["imaging_detections"]
def test_add_validated_evidence_accumulates_across_calls(self, manager, session):
sid, _ = session
manager.add_validated_evidence(sid, symptoms=["cough"])
manager.add_validated_evidence(sid, symptoms=["weight loss"])
validated = manager.get_validated_evidence(sid)
assert "cough" in validated["symptoms"]
assert "weight loss" in validated["symptoms"]
def test_add_validated_evidence_no_duplicates_in_session(self, manager, session):
sid, _ = session
manager.add_validated_evidence(sid, symptoms=["cough"])
manager.add_validated_evidence(sid, symptoms=["cough"])
validated = manager.get_validated_evidence(sid)
assert validated["symptoms"].count("cough") == 1
#──────── COMBINED EVIDENCE ────────────────────────────────────────────────────────────────────────────────────────────────────
class TestCombinedEvidence:
def test_get_combined_current_loop_evidence(self, manager, session):
sid, _ = session
manager.add_text_evidence(sid, ["cough"])
manager.add_imaging_evidence(sid, ["lung opacity"])
manager.add_patient_records_evidence(sid, ["tobacco smoking"])
combined = manager.get_combined_current_loop_evidence(sid)
assert "cough" in combined
assert "lung opacity" in combined
assert "tobacco smoking" in combined
def test_get_combined_session_evidence_no_duplicates(self, manager, session):
sid, _ = session
manager.add_validated_evidence(sid, symptoms=["cough"])
combined = manager.get_combined_session_evidence(sid, ["cough"])
assert combined.count("cough") == 1
def test_get_combined_session_evidence_merges_existing_and_validated(self, manager, session):
sid, _ = session
manager.add_validated_evidence(sid, symptoms=["weight loss"])
combined = manager.get_combined_session_evidence(sid, ["cough"])
assert "cough" in combined
assert "weight loss" in combined
#──────── CLEAR CURRENT LOOP EVIDENCE ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
class TestClearEvidence:
def test_clear_removes_text_evidence(self, manager, session):
sid, _ = session
manager.add_text_evidence(sid, ["cough"])
manager.clear_current_loop_evidence(sid)
evidence = manager.get_current_loop_evidence(sid)
assert len(evidence["text_evidence"]) == 0
def test_clear_removes_imaging_evidence(self, manager, session):
sid, _ = session
manager.add_imaging_evidence(sid, ["lung opacity"])
manager.clear_current_loop_evidence(sid)
evidence = manager.get_current_loop_evidence(sid)
assert len(evidence["imaging_evidence"]) == 0
def test_clear_preserves_patient_records(self, manager, session):
sid, _ = session
manager.add_patient_records_evidence(sid, ["tobacco smoking"])
manager.clear_current_loop_evidence(sid)
evidence = manager.get_current_loop_evidence(sid)
assert "tobacco smoking" in evidence["patient_records"]
#──────── RISK ASSIGNMENT ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
class TestRiskAssignment:
def test_assign_risk_sets_risk_level(self, manager, session):
sid, _ = session
manager.assign_risk(sid, "7")
state = manager.get_session(sid)
assert state.risk_level == "7"
def test_assign_risk_sets_flag(self, manager, session):
sid, _ = session
manager.assign_risk(sid, "7")
state = manager.get_session(sid)
assert state.is_risk_assigned is True
def test_assign_risk_can_be_updated(self, manager, session):
sid, _ = session
manager.assign_risk(sid, "3")
manager.assign_risk(sid, "6")
state = manager.get_session(sid)
assert state.risk_level == "6"
#──────── X-RAY EVIDENCE ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
class TestXray:
def test_add_xray_sets_path(self, manager, session):
sid, _ = session
manager.add_xray(sid, "/path/xray.jpg")
state = manager.get_session(sid)
assert state.x_ray_image_file == "/path/xray.jpg"
def test_add_xray_sets_uploaded_flag(self, manager, session):
sid, _ = session
manager.add_xray(sid, "/path/xray.jpg")
state = manager.get_session(sid)
assert state.x_ray_uploaded is True
#───── PATIENT EVIDENCE RETRIEVAL ───────────────────────────────────────────────────────────────────────────────
class TestGetPatientEvidence:
def test_get_patient_evidence_empty_for_new_patient(self, manager, patient):
evidence = manager.get_patient_evidence(patient)
assert evidence["symptoms"] == []
assert evidence["risk_factors"] == []
assert evidence["imaging"] == []
def test_get_patient_evidence_reflects_persisted_data(self, manager, session):
sid, pid = session
manager.add_validated_evidence(sid, symptoms=["cough"])
manager.end_session(sid)
evidence = manager.get_patient_evidence(pid)
assert "cough" in evidence["symptoms"]
#─────── HAS SUFFICIENT EVIDENCE ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
class TestHasSufficientEvidence:
def test_sufficient_evidence_true(self, manager):
assert manager.has_sufficient_evidence(["cough", "fever", "jaundice", "lower back pain"]) is True
def test_sufficient_evidence_exact_minimum(self, manager):
assert manager.has_sufficient_evidence(["cough", "fever", "jaundice"]) is True
def test_sufficient_evidence_false(self, manager):
assert manager.has_sufficient_evidence(["cough", "fever"]) is False
def test_sufficient_evidence_empty(self, manager):
assert manager.has_sufficient_evidence([]) is False