curaflow/test_e2e.js

162 lines
5.6 KiB
JavaScript

const fs = require('fs');
const path = require('path');
const BASE_URL = 'http://curaflow.applaude.net';
// Helper function to make requests
async function makeRequest(endpoint, method = 'GET', body = null, token = null) {
const headers = {
'Accept': 'application/json'
};
if (body) {
headers['Content-Type'] = 'application/json';
}
if (token) {
headers['Authorization'] = `Bearer ${token}`;
}
const options = {
method,
headers
};
if (body) {
options.body = JSON.stringify(body);
}
try {
const response = await fetch(`${BASE_URL}${endpoint}`, options);
let data = null;
const contentType = response.headers.get('content-type');
if (contentType && contentType.includes('application/json')) {
data = await response.json();
} else {
data = await response.text();
}
return {
status: response.status,
data
};
} catch (err) {
return {
status: 500,
data: err.message
};
}
}
async function runTests() {
console.log("==========================================");
console.log("🏥 CURAFLOW COMPREHENSIVE E2E TEST SUITE");
console.log("==========================================\n");
let allPassed = true;
let tokens = {};
function assert(condition, message) {
if (!condition) {
console.log(`❌ FAIL: ${message}`);
allPassed = false;
} else {
console.log(`✅ PASS: ${message}`);
}
}
// --- 1. TEST AUTHENTICATION ---
console.log("--- 1. Testing Authentication ---");
const roles = ['doctor', 'lab', 'pharmacy', 'admin', 'reception'];
for (const role of roles) {
const res = await makeRequest('/api/auth/login', 'POST', { username: role, password: 'password123' });
assert(res.status === 200 && res.data.success, `Login as ${role}`);
if (res.data.success) {
tokens[role] = res.data.token;
}
}
console.log("");
// --- 2. TEST OPD QUEUE ---
console.log("--- 2. Testing OPD Queue & Booking ---");
const testPatient = {
name: "E2E Test Patient",
age: 45,
phone: "whatsapp:+919999999999"
};
const bookRes = await makeRequest('/api/opd/book', 'POST', {
name: testPatient.name,
contact: testPatient.phone,
date: "2026-10-10",
time: "10:30"
});
assert(bookRes.status === 200 && bookRes.data.success, "Book OPD Appointment");
const queueRes = await makeRequest('/api/opd/queue');
assert(queueRes.status === 200 && Array.isArray(queueRes.data.queue), "Fetch OPD Queue");
const isInQueue = queueRes.data.queue.some(p => p.patientName === testPatient.name);
assert(isInQueue, "Patient appears in OPD Queue");
console.log("");
// --- 3. TEST DOCTOR PRESCRIPTION ---
console.log("--- 3. Testing Doctor Prescription & Labs ---");
const patientId = `PT-${Math.floor(Math.random() * 10000)}`;
const rxRes = await makeRequest('/api/rx/generate', 'POST', {
patientId: patientId,
doctorId: "DR-TEST",
medicines: [
{ name: "Paracetamol", dosage: "500mg", frequency: "1-0-1", duration: "5 Days", qty: 10 }
],
diagnosis: "Viral Fever",
labTests: [
{ testName: "Complete Blood Count", instructions: "Fasting" }
]
});
assert(rxRes.status === 200 && rxRes.data.success, "Generate Prescription & Lab Order");
console.log("");
// --- 4. TEST PHARMACY ---
console.log("--- 4. Testing Pharmacy ---");
const pharmRes = await makeRequest('/api/pharmacy/prescriptions');
assert(pharmRes.status === 200 && Array.isArray(pharmRes.data.prescriptions), "Fetch Pending Prescriptions");
// Attempt fulfillment if we got an Rx ID earlier
if (rxRes.data.success && rxRes.data.data && rxRes.data.data.id) {
const fulfillRes = await makeRequest('/api/pharmacy/fulfill', 'POST', {
rxId: rxRes.data.data.id
});
assert(fulfillRes.status === 200 && fulfillRes.data.success, "Fulfill Prescription & Generate Bill");
}
console.log("");
// --- 5. TEST LAB ANOMALY DETECTION (TEMPORAL INTEGRATION) ---
console.log("--- 5. Testing Lab Anomaly Detection (AI Engine) ---");
console.log("Note: This invokes the Temporal Worker and LLM which may take 60+ seconds.");
const labProcessRes = await makeRequest('/api/lab/process', 'POST', {
patientId: patientId,
testName: "Complete Blood Count",
results: {
"Hemoglobin": "8.2 g/dL", // Low! Should trigger anomaly
"Platelets": "150,000 /mcL"
}
});
assert(labProcessRes.status === 200 && labProcessRes.data.success, "Submit Lab Results (Start Temporal Workflow)");
// Polling for the AI Alert (Wait a few seconds for the worker to process it if we were on GPT-4,
// but local 3B model takes ~60-90s, so we'll just check if the endpoint is responsive)
const alertRes = await makeRequest(`/api/ai/lab/alerts/${patientId}`);
assert(alertRes.status === 200 && alertRes.data.success, "Poll Lab Alerts Endpoint");
console.log("");
console.log("==========================================");
if (allPassed) {
console.log("🎉 ALL TESTS PASSED SUCCESSFULLY! THE APP IS FULLY FUNCTIONAL.");
} else {
console.log("⚠️ SOME TESTS FAILED. PLEASE REVIEW THE LOGS ABOVE.");
}
console.log("==========================================\n");
}
runTests();