234 lines
8.6 KiB
Python
234 lines
8.6 KiB
Python
#!/usr/bin/env python
|
|
"""
|
|
Test script for HIS Integration with all patient types
|
|
|
|
Tests the new HISPatientDataView endpoint with all 4 patient types:
|
|
1. Inpatient (PatientType: "1")
|
|
2. OPD (PatientType: "2" or "O")
|
|
3. EMS/Emergency (PatientType: "3" or "E")
|
|
4. Day Case (PatientType: "4" or "D")
|
|
"""
|
|
import os
|
|
import sys
|
|
import django
|
|
import json
|
|
from datetime import datetime, timedelta
|
|
|
|
# Setup Django
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.dev')
|
|
django.setup()
|
|
|
|
from django.test import Client
|
|
from apps.organizations.models import Hospital
|
|
from apps.surveys.models import SurveyTemplate, SurveyInstance, SurveyStatus
|
|
from apps.organizations.models import Patient
|
|
|
|
|
|
def parse_date(date_obj: datetime) -> str:
|
|
"""Format date as DD-Mon-YYYY HH:MM"""
|
|
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
|
|
return f"{date_obj.day:02d}-{months[date_obj.month-1]}-{date_obj.year} {date_obj.hour:02d}:{date_obj.minute:02d}"
|
|
|
|
|
|
def create_test_his_data(patient_type: str, patient_name: str, is_discharged: bool = True) -> dict:
|
|
"""Create test HIS patient data"""
|
|
dob = datetime.now() - timedelta(days=30*365) # 30 years old
|
|
admit_date = datetime.now() - timedelta(hours=5)
|
|
discharge_date = admit_date + timedelta(hours=4) if is_discharged else None
|
|
|
|
hospital = Hospital.objects.filter(status='active').first()
|
|
hospital_name = hospital.name if hospital else "Test Hospital"
|
|
|
|
his_data = {
|
|
"FetchPatientDataTimeStampList": [{
|
|
"Type": "Patient Demographic details",
|
|
"PatientID": "TEST-001",
|
|
"AdmissionID": f"ADM-{patient_type}",
|
|
"HospitalID": "1",
|
|
"HospitalName": hospital_name,
|
|
"PatientType": patient_type,
|
|
"AdmitDate": parse_date(admit_date),
|
|
"DischargeDate": parse_date(discharge_date) if discharge_date else None,
|
|
"RegCode": "TEST.12345678",
|
|
"SSN": "1234567890",
|
|
"PatientName": patient_name,
|
|
"GenderID": "1",
|
|
"Gender": "Male",
|
|
"FullAge": "30 Year(s)",
|
|
"PatientNationality": "Saudi",
|
|
"MobileNo": "0501234567",
|
|
"Email": f"{patient_name.lower().replace(' ', '.')}@test.com",
|
|
"DOB": parse_date(dob),
|
|
"ConsultantID": "101",
|
|
"PrimaryDoctor": "1001-Test Doctor",
|
|
"CompanyID": "10001",
|
|
"GradeID": "1001",
|
|
"CompanyName": "Test Company",
|
|
"GradeName": "A",
|
|
"InsuranceCompanyName": "Test Insurance",
|
|
"BillType": "CR",
|
|
"IsVIP": "0"
|
|
}],
|
|
"FetchPatientDataTimeStampVisitDataList": [
|
|
{"Type": "Consultation", "BillDate": parse_date(admit_date + timedelta(minutes=30))},
|
|
{"Type": "Doctor Visited", "BillDate": parse_date(admit_date + timedelta(minutes=60))},
|
|
{"Type": "Clinical Condtion", "BillDate": parse_date(admit_date + timedelta(minutes=90))},
|
|
{"Type": "ChiefComplaint", "BillDate": parse_date(admit_date + timedelta(minutes=120))},
|
|
{"Type": "Prescribed Drugs", "BillDate": parse_date(admit_date + timedelta(minutes=150))}
|
|
],
|
|
"Code": 200,
|
|
"Status": "Success",
|
|
"Message": "",
|
|
"Message2L": "",
|
|
"MobileNo": "",
|
|
"ValidateMessage": ""
|
|
}
|
|
|
|
return his_data
|
|
|
|
|
|
def test_patient_type(client: Client, patient_type: str, patient_name: str, expected_survey_type: str):
|
|
"""Test a specific patient type"""
|
|
print(f"\n{'='*70}")
|
|
print(f"Testing PatientType: {patient_type} ({expected_survey_type})")
|
|
print(f"{'='*70}")
|
|
|
|
# Create test HIS data
|
|
his_data = create_test_his_data(patient_type, patient_name, is_discharged=True)
|
|
|
|
# Send request to API
|
|
print(f"\n📤 Sending HIS patient data for: {patient_name}")
|
|
print(f" PatientType: {patient_type}")
|
|
|
|
response = client.post(
|
|
'/api/integrations/events/',
|
|
data=json.dumps(his_data),
|
|
content_type='application/json'
|
|
)
|
|
|
|
print(f"\n📥 Response Status: {response.status_code}")
|
|
|
|
if response.status_code == 200:
|
|
result = response.json()
|
|
print(f"\n✅ SUCCESS")
|
|
print(f" Message: {result.get('message')}")
|
|
|
|
if result.get('patient'):
|
|
patient = result['patient']
|
|
print(f"\n 👤 Patient Created:")
|
|
print(f" ID: {patient.get('id')}")
|
|
print(f" MRN: {patient.get('mrn')}")
|
|
print(f" Name: {patient.get('name')}")
|
|
|
|
if result.get('survey'):
|
|
survey = result['survey']
|
|
print(f"\n 📋 Survey Created:")
|
|
print(f" ID: {survey.get('id')}")
|
|
print(f" Status: {survey.get('status')}")
|
|
print(f" URL: {survey.get('survey_url')}")
|
|
|
|
# Verify survey was created in database
|
|
survey_id = result.get('survey', {}).get('id')
|
|
if survey_id:
|
|
survey = SurveyInstance.objects.filter(id=survey_id).first()
|
|
if survey:
|
|
print(f"\n 🔍 Database Verification:")
|
|
print(f" Survey Found: Yes")
|
|
print(f" Template: {survey.survey_template.name}")
|
|
print(f" Patient: {survey.patient}")
|
|
print(f" Status: {survey.status}")
|
|
print(f" Delivery Channel: {survey.delivery_channel}")
|
|
|
|
# Check if template matches expected type
|
|
template_name = survey.survey_template.name.upper()
|
|
if expected_survey_type.upper() in template_name:
|
|
print(f" ✅ Template Type: CORRECT ({expected_survey_type})")
|
|
else:
|
|
print(f" ⚠️ Template Type: MISMATCH")
|
|
print(f" Expected: {expected_survey_type}")
|
|
print(f" Found: {survey.survey_template.name}")
|
|
|
|
return True
|
|
else:
|
|
print(f"\n ❌ Database Verification:")
|
|
print(f" Survey Found: NO")
|
|
return False
|
|
else:
|
|
print(f"\n❌ FAILED")
|
|
print(f" Response: {response.json()}")
|
|
return False
|
|
|
|
|
|
def main():
|
|
"""Run tests for all patient types"""
|
|
print("="*70)
|
|
print("🧪 HIS INTEGRATION TEST - All Patient Types")
|
|
print("="*70)
|
|
|
|
# Create test client
|
|
client = Client()
|
|
|
|
# Check if we have active survey templates
|
|
templates = SurveyTemplate.objects.filter(is_active=True)
|
|
if not templates.exists():
|
|
print("\n⚠️ WARNING: No active survey templates found!")
|
|
print(" Please create survey templates before running tests.")
|
|
print("\n Required templates:")
|
|
print(" - Inpatient Survey (or contains 'INPATIENT')")
|
|
print(" - OPD Survey (or contains 'OPD')")
|
|
print(" - EMS Survey (or contains 'EMS')")
|
|
print(" - Day Case Survey (or contains 'DAY CASE')")
|
|
return
|
|
|
|
print(f"\n📋 Found {templates.count()} active survey template(s):")
|
|
for template in templates:
|
|
print(f" - {template.name}")
|
|
|
|
# Test all patient types
|
|
test_cases = [
|
|
("1", "Test Inpatient", "Inpatient"),
|
|
("2", "Test OPD Patient", "OPD"),
|
|
("O", "Test OPD Patient Alt", "OPD"),
|
|
("3", "Test EMS Patient", "EMS"),
|
|
("E", "Test EMS Patient Alt", "EMS"),
|
|
("4", "Test Day Case Patient", "Day Case"),
|
|
("D", "Test Day Case Patient Alt", "Day Case"),
|
|
]
|
|
|
|
results = []
|
|
for patient_type, patient_name, expected_type in test_cases:
|
|
success = test_patient_type(client, patient_type, patient_name, expected_type)
|
|
results.append({
|
|
'patient_type': patient_type,
|
|
'patient_name': patient_name,
|
|
'expected_type': expected_type,
|
|
'success': success
|
|
})
|
|
|
|
# Print summary
|
|
print(f"\n{'='*70}")
|
|
print("📊 TEST SUMMARY")
|
|
print(f"{'='*70}")
|
|
|
|
total = len(results)
|
|
successful = sum(1 for r in results if r['success'])
|
|
failed = total - successful
|
|
|
|
print(f"\nTotal Tests: {total}")
|
|
print(f"Successful: {successful}")
|
|
print(f"Failed: {failed}")
|
|
|
|
if successful == total:
|
|
print(f"\n✅ ALL TESTS PASSED!")
|
|
else:
|
|
print(f"\n❌ SOME TESTS FAILED:")
|
|
for result in results:
|
|
if not result['success']:
|
|
print(f" - {result['patient_name']} (Type {result['patient_type']})")
|
|
|
|
print(f"{'='*70}\n")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |