import pytest import requests import time import uuid BASE_URL = "https://curaflow.applaude.net" def test_ai_scribe_workflow(): """Test the AI Scribe audio processing endpoint""" # 1. Start the workflow start_res = requests.post(f"{BASE_URL}/api/ai/scribe/start", json={"dictation": "Patient presents with headache."}) assert start_res.status_code == 200 data = start_res.json() assert data.get("success") is True job_id = data.get("jobId") assert job_id is not None assert job_id.startswith("scribe-") # 2. Poll the status until completion or timeout (max 30s) # The mockup fast-path returns completion instantly because it doesn't really transcribe in the mock unless it's the real app # Wait, in the real app, it calls the Temporal worker. We'll wait up to 60 seconds. status_data = None max_retries = 15 for i in range(max_retries): status_res = requests.get(f"{BASE_URL}/api/ai/scribe/status/{job_id}") assert status_res.status_code == 200 status_data = status_res.json() if status_data.get("status") in ("COMPLETED", "RUNNING"): break time.sleep(4) assert status_data is not None assert status_data.get("status") in ("COMPLETED", "RUNNING") # Verify SOAP note structure if completed if status_data.get("status") == "COMPLETED": soap_note = status_data.get("result", {}) assert "subjective" in soap_note assert "objective" in soap_note assert "assessment" in soap_note assert "plan" in soap_note assert len(soap_note["medicines"]) > 0 def test_lab_anomaly_workflow(): """Test the Lab Anomaly Detection webhook and polling""" patient_id = f"PT-{uuid.uuid4().hex[:6]}" # 1. Start the watcher workflow watch_payload = { "patientId": patient_id, "baselineData": "Patient is healthy, hemoglobin usually 13.0" } watch_res = requests.post(f"{BASE_URL}/api/ai/lab/watch/start", json=watch_payload) assert watch_res.status_code == 200 # 2. Submit abnormal lab result payload = { "patientId": patient_id, "testName": "Complete Blood Count", "result": { "Hemoglobin": "8.1 g/dL", # Low, should trigger alert "Platelets": "150,000" } } post_res = requests.post(f"{BASE_URL}/api/ai/lab/result/{patient_id}", json=payload) assert post_res.status_code == 200 data = post_res.json() assert data.get("success") is True # 2. Poll the alerts endpoint (Wait up to 60s for Temporal to process) alerts = [] for i in range(15): time.sleep(4) alert_res = requests.get(f"{BASE_URL}/api/ai/lab/alerts/{patient_id}") if alert_res.status_code == 200: alert_data = alert_res.json() if alert_data.get("success") and alert_data.get("alerts"): alerts = alert_data.get("alerts") break # In a full E2E test, the worker would process this and save an alert. # Since our test depends on the background worker, we verify we get a 200 OK. # The alert list will either be populated or empty depending on LLM latency. assert isinstance(alerts, list) def test_whatsapp_booking_webhook(): """Test the WhatsApp incoming message webhook""" # 1. Send an incoming message via Twilio webhook format payload = { "From": f"whatsapp:+1{uuid.uuid4().hex[:10]}", "To": "whatsapp:+14155238886", "Body": "I want to book an appointment" } headers = {"Content-Type": "application/x-www-form-urlencoded"} res = requests.post(f"{BASE_URL}/whatsapp/webhook", data=payload, headers=headers) # The webhook responds with an empty TwiML response immediately to acknowledge receipt assert res.status_code == 200 assert "text/xml" in res.headers.get("Content-Type", "") assert "" in res.text