| 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 |
| |
| assert demo.display_name.startswith("Jane Doe") |
| assert demo.gender == "female" |
| |
| 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 |
|
|