File size: 6,593 Bytes
cb505ff
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
import os
import sqlite3
import tempfile
import pytest
from src.tools.fhir_memory import (
    save_patient,
    create_session,
    save_observation,
    get_observations_by_patient,
    get_patient_summary_fhir,
    save_chat_as_fhir,
    get_chat_history_by_session,
    get_sessions_by_patient,
    get_medications_by_patient,
    save_medication,
    ingest_fhir_bundle
)
import src.tools.dietary_tools as dietary_tools
from src.tools.web_tools import search_web

def test_fhir_save_patient(clean_db):
    patient_id = "test-p1"
    name = "Alice Smith"
    
    res = save_patient.invoke({"patient_id": patient_id, "name": name})
    assert "Successfully saved" in res
    
    # Check mock DB state
    db_patient = clean_db.db["patients"][patient_id]
    assert db_patient["id"] == patient_id
    assert db_patient["resource"]["name"][0]["text"] == name

def test_fhir_session_creation(clean_db):
    patient_id = "test-p2"
    # Ensure patient exists
    save_patient.invoke({"patient_id": patient_id, "name": "Bob"})
    
    session_id = create_session.invoke({"patient_id": patient_id, "title": "Diet Consult"})
    assert session_id is not None
    
    sessions = get_sessions_by_patient.invoke({"patient_id": patient_id})
    assert len(sessions) == 1
    assert sessions[0]["id"] == session_id
    assert sessions[0]["title"] == "Diet Consult"

def test_fhir_observation_saving(clean_db):
    patient_id = "test-p3"
    
    # Save observation
    res = save_observation.invoke({
        "patient_id": patient_id,
        "value": 95.5,
        "unit": "mg/dL",
        "display": "Glucose",
        "loinc_code": "2339-0"
    })
    assert "Successfully saved" in res
    
    # Retrieve and check
    obs = get_observations_by_patient.invoke({"patient_id": patient_id})
    assert isinstance(obs, list)
    assert len(obs) == 1
    assert obs[0]["valueQuantity"]["value"] == 95.5
    assert obs[0]["subject"]["reference"] == f"Patient/{patient_id}"

def test_fhir_chat_persistence(clean_db):
    patient_id = "test-p4"
    session_id = "session-1"
    messages = [
        {"role": "user", "content": "How are you?"},
        {"role": "assistant", "content": "I am a chatbot."}
    ]
    
    res = save_chat_as_fhir.invoke({
        "patient_id": patient_id,
        "messages": messages,
        "session_id": session_id
    })
    assert "Successfully saved" in res
    
    history = get_chat_history_by_session.invoke({"session_id": session_id})
    assert len(history) == 1
    assert history[0]["resourceType"] == "Communication"
    assert "user: How are you?" in history[0]["payload"][0]["contentString"]

def test_fhir_medications(clean_db):
    patient_id = "test-p5"
    
    res = save_medication.invoke({
        "patient_id": patient_id,
        "medication_name": "Metformin",
        "dosage": "500mg",
        "frequency": "twice daily"
    })
    assert "Successfully saved" in res
    
    meds = get_medications_by_patient.invoke({"patient_id": patient_id})
    assert len(meds) == 1
    assert meds[0]["resourceType"] == "MedicationRequest"
    assert meds[0]["medication"]["coding"][0]["display"] == "Metformin"

def test_ingest_fhir_bundle(clean_db):
    bundle = {
        "resourceType": "Bundle",
        "entry": [
            {
                "resource": {
                    "resourceType": "Patient",
                    "id": "bundle-p1",
                    "name": [{"text": "Bundle Patient"}]
                }
            },
            {
                "resource": {
                    "resourceType": "Observation",
                    "id": "bundle-o1",
                    "subject": {"reference": "Patient/bundle-p1"},
                    "valueQuantity": {"value": 120},
                    "code": {"coding": [{"display": "Systolic BP"}]}
                }
            }
        ]
    }
    
    res = ingest_fhir_bundle.invoke({"bundle": bundle})
    assert "Successfully ingested 2 resources" in res
    
    patient = clean_db.db["patients"].get("bundle-p1")
    assert patient["resource"]["name"][0]["text"] == "Bundle Patient"

def test_dietary_search_guidelines():
    res = dietary_tools.search_guidelines.invoke({"query": "diabetes"})
    assert "guidelines" in res
    assert "Mock Vector DB Guideline" in res

def test_dietary_nutritional_database():
    # Test case when database does not exist
    old_path = dietary_tools.DB_PATH
    dietary_tools.DB_PATH = "nonexistent_db_file.db"
    res_none = dietary_tools.get_nutritional_data.invoke({"food_name": "Apple"})
    assert "not found" in res_none

    # Test case when database exists
    # Create a temporary SQLite database
    temp_db_fd, temp_db_path = tempfile.mkstemp()
    try:
        conn = sqlite3.connect(temp_db_path)
        cursor = conn.cursor()
        cursor.execute("""
            CREATE TABLE nutritional_data (
                food_name TEXT,
                calories INTEGER,
                protein REAL,
                carbs REAL,
                fat REAL,
                fiber REAL,
                vitamins TEXT
            )
        """)
        cursor.execute("""
            INSERT INTO nutritional_data VALUES (
                'Apple', 52, 0.3, 14.0, 0.2, 2.4, 'Vitamin C'
            )
        """)
        conn.commit()
        conn.close()

        # Update DB_PATH to point to the temporary database
        dietary_tools.DB_PATH = temp_db_path
        
        # Test finding food item
        res_found = dietary_tools.get_nutritional_data.invoke({"food_name": "Apple"})
        assert "Nutritional data found" in res_found
        assert "Apple: 52 kcal" in res_found
        assert "Protein: 0.3g" in res_found

        # Test finding non-existent food item
        res_missing = dietary_tools.get_nutritional_data.invoke({"food_name": "Banana"})
        assert "No nutritional data found for 'Banana'" in res_missing
    finally:
        os.close(temp_db_fd)
        os.remove(temp_db_path)
        # Restore DB_PATH
        dietary_tools.DB_PATH = old_path

def test_web_search():
    res = search_web("diabetes symptoms")
    assert "Diabetes symptoms" in res
    assert "Common symptoms of diabetes." in res
    assert "https://example.com/diabetes" in res


def test_fhir_tools_reject_missing_required_identity(clean_db):
    with pytest.raises(Exception):
        get_observations_by_patient.invoke({})


def test_fhir_bundle_rejects_missing_entries(clean_db):
    result = ingest_fhir_bundle.invoke({"bundle": {"resourceType": "Bundle"}})

    assert result == "Successfully ingested 0 resources from FHIR Bundle."