recap / tests /test_ingestion_fhir.py
afif-ahmed's picture
deploy: sync from fe7cce1
ba54ea9 verified
from datetime import datetime, timezone
from recap.ingestion.fhir import load_bundle, load_demographics
FIXTURE = "tests/fixtures/tiny_fhir.json"
def test_loads_observation_as_lab_event():
events = load_bundle(FIXTURE, source_id="tiny_fhir.json")
labs = [e for e in events if e.category == "lab"]
assert len(labs) == 1
assert "Creatinine" in labs[0].title
assert "1.4" in labs[0].title or "1.4" in labs[0].body
assert labs[0].date == datetime.fromisoformat("2022-03-14T10:00:00+00:00")
def test_loads_encounter_as_visit_event():
events = load_bundle(FIXTURE, source_id="tiny_fhir.json")
visits = [e for e in events if e.category == "visit"]
assert len(visits) == 1
assert "Nephrology" in visits[0].title
def test_loads_medication_as_med_event():
events = load_bundle(FIXTURE, source_id="tiny_fhir.json")
meds = [e for e in events if e.category == "med"]
assert len(meds) == 1
assert "Lisinopril" in meds[0].title
def test_loads_condition_as_diagnosis_event():
events = load_bundle(FIXTURE, source_id="tiny_fhir.json")
dx = [e for e in events if e.category == "diagnosis"]
assert len(dx) == 1
assert "Chronic kidney disease" in dx[0].title
assert dx[0].metadata["clinical_status"] == "active"
def test_loads_procedure_as_procedure_event():
events = load_bundle(FIXTURE, source_id="tiny_fhir.json")
procs = [e for e in events if e.category == "procedure"]
assert len(procs) == 1
assert "Renal ultrasound" in procs[0].title
def test_loads_diagnostic_report_as_report_event():
events = load_bundle(FIXTURE, source_id="tiny_fhir.json")
reports = [e for e in events if e.category == "report"]
assert len(reports) == 1
assert "metabolic panel" in reports[0].title.lower()
assert "stage 3 CKD" in reports[0].body
def test_events_are_chronologically_orderable():
events = load_bundle(FIXTURE, source_id="tiny_fhir.json")
sorted_events = sorted(events, key=lambda e: e.date)
assert [e.id for e in sorted_events] == [e.id for e in sorted(events, key=lambda e: e.date)]
def test_load_demographics_extracts_name_age_gender():
demo = load_demographics(FIXTURE)
assert demo is not None
# Trailing digits ("Jane45 Doe123") stripped for display
assert demo.display_name.startswith("Jane Doe")
assert demo.gender == "female"
# Born 1957 → age depends on current date but should be > 60
assert demo.age is not None and demo.age >= 60
def test_load_demographics_returns_none_if_no_patient_resource(tmp_path):
import json
p = tmp_path / "no_patient.json"
p.write_text(json.dumps({"resourceType": "Bundle", "entry": []}))
assert load_demographics(str(p)) is None