import json import shutil from recap.cases import load_case def test_load_case_with_only_fhir(tmp_path): case = tmp_path / "tiny" case.mkdir() (case / "manifest.json").write_text(json.dumps({ "id": "tiny", "display_name": "Tiny Test", "fhir_bundle": "fhir.json", "docs": [], "images": [], "demo_questions": [], })) shutil.copy("tests/fixtures/tiny_fhir.json", case / "fhir.json") p = load_case(str(tmp_path), "tiny") assert p.id == "tiny" assert p.display_name == "Tiny Test" # manifest override wins assert len(p.events) > 0 def test_load_case_pulls_display_name_from_fhir_when_manifest_omits_it(tmp_path): """Minimal manifest — name, age, gender all come from the FHIR Patient resource.""" case = tmp_path / "auto" case.mkdir() (case / "manifest.json").write_text(json.dumps({ "id": "auto", "fhir_bundle": "fhir.json", "demo_questions": [], })) shutil.copy("tests/fixtures/tiny_fhir.json", case / "fhir.json") p = load_case(str(tmp_path), "auto") assert p.display_name.startswith("Jane Doe") # from FHIR Patient.name assert p.age is not None and p.age >= 60 assert p.gender == "female" def test_load_case_with_pdf_docs(tmp_path): case = tmp_path / "tiny" case.mkdir() (case / "docs").mkdir() shutil.copy("tests/fixtures/tiny_lab.pdf", case / "docs" / "lab.pdf") (case / "manifest.json").write_text(json.dumps({ "id": "tiny", "display_name": "Tiny", "fhir_bundle": None, "docs": [{ "file": "docs/lab.pdf", "date": "2022-03-14", "category": "lab", "title": "Renal panel", }], "images": [], "demo_questions": [], })) p = load_case(str(tmp_path), "tiny") pdf_events = [e for e in p.events if e.source == "lab.pdf"] assert len(pdf_events) == 1 assert pdf_events[0].category == "lab" assert "Creatinine" in pdf_events[0].body def test_load_case_with_images(tmp_path): case = tmp_path / "tiny" case.mkdir() (case / "images").mkdir() from PIL import Image Image.new("RGB", (10, 10), "white").save(case / "images" / "fundus.png") (case / "manifest.json").write_text(json.dumps({ "id": "tiny", "display_name": "Tiny", "fhir_bundle": None, "docs": [], "images": [{ "file": "images/fundus.png", "date": "2023-04-01", "category": "scan", "title": "Fundus photo", }], "demo_questions": [], })) p = load_case(str(tmp_path), "tiny") assert len(p.events) == 1 assert p.events[0].category == "scan" assert p.events[0].source == "fundus.png" def test_load_case_events_chronologically_orderable(tmp_path): """Multi-source case (FHIR + PDF + image) yields a sortable timeline.""" case = tmp_path / "tiny" case.mkdir() (case / "docs").mkdir() (case / "images").mkdir() shutil.copy("tests/fixtures/tiny_fhir.json", case / "fhir.json") shutil.copy("tests/fixtures/tiny_lab.pdf", case / "docs" / "lab.pdf") from PIL import Image Image.new("RGB", (10, 10), "white").save(case / "images" / "fundus.png") (case / "manifest.json").write_text(json.dumps({ "id": "tiny", "display_name": "Tiny", "fhir_bundle": "fhir.json", "docs": [{ "file": "docs/lab.pdf", "date": "2022-03-14", "category": "lab", "title": "Lab", }], "images": [{ "file": "images/fundus.png", "date": "2023-04-01", "category": "scan", "title": "Fundus", }], "demo_questions": [], })) p = load_case(str(tmp_path), "tiny") sorted_dates = sorted(e.date for e in p.events) assert sorted_dates == [e.date for e in sorted(p.events, key=lambda e: e.date)]