HH/test_survey_builder.py
2026-01-24 15:27:30 +03:00

252 lines
8.3 KiB
Python

#!/usr/bin/env python
"""
Test script to verify the Survey Question Builder implementation
"""
import os
import sys
import django
# Setup Django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'PX360.settings')
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
django.setup()
from django.test import Client, TestCase
from django.contrib.auth import get_user_model
from apps.surveys.models import SurveyTemplate, Question
from apps.organizations.models import Hospital, Department
User = get_user_model()
def test_survey_template_creation():
"""Test that survey templates can be created with questions"""
print("\n" + "="*60)
print("TEST: Survey Template Creation with Questions")
print("="*60)
try:
# Get or create a hospital
hospital = Hospital.objects.first()
if not hospital:
hospital = Hospital.objects.create(
name="Test Hospital",
name_ar="مستشفى تجريبي",
code="TEST001"
)
print(f"✓ Created test hospital: {hospital.name}")
else:
print(f"✓ Using existing hospital: {hospital.name}")
# Create a survey template
template = SurveyTemplate.objects.create(
name="Patient Satisfaction Survey",
name_ar="استبيان رضا المرضى",
hospital=hospital,
survey_type="post_discharge",
scoring_method="average",
negative_threshold=3.0,
is_active=True
)
print(f"✓ Created survey template: {template.name}")
# Create various types of questions
questions_data = [
{
'text': "How would you rate your overall experience?",
'text_ar': "كيف تقي تجربتك العامة؟",
'question_type': 'rating',
'order': 1,
'is_required': True
},
{
'text': "What did you like most about our service?",
'text_ar': "ما الذي أعجبك أكثر في خدمتنا؟",
'question_type': 'text',
'order': 2,
'is_required': True
},
{
'text': "How did you hear about us?",
'text_ar': "كيف سمعت عنا؟",
'question_type': 'single_choice',
'order': 3,
'is_required': False,
'choices': [
{"value": "1", "label": "Friend/Family", "label_ar": "صديق/عائلة"},
{"value": "2", "label": "Doctor Referral", "label_ar": "إحالة طبيب"},
{"value": "3", "label": "Online", "label_ar": "عبر الإنترنت"},
{"value": "4", "label": "Other", "label_ar": "أخرى"}
]
},
{
'text': "Which services did you use? (Select all that apply)",
'text_ar': "ما الخدمات التي استخدمتها؟ (اختر جميع ما ينطبق)",
'question_type': 'multiple_choice',
'order': 4,
'is_required': False,
'choices': [
{"value": "1", "label": "Emergency", "label_ar": "الطوارئ"},
{"value": "2", "label": "Outpatient", "label_ar": "العيادات الخارجية"},
{"value": "3", "label": "Inpatient", "label_ar": "تنويم"},
{"value": "4", "label": "Surgery", "label_ar": "الجراحة"}
]
}
]
# Create questions
for q_data in questions_data:
choices = q_data.pop('choices', None)
question = Question.objects.create(
template=template,
**q_data
)
if choices:
question.choices_json = choices
question.save()
print(f"✓ Created question: {question.text} ({question.question_type})")
# Verify questions were created
questions_count = template.questions.count()
print(f"\n✓ Total questions created: {questions_count}")
# Display question details
print("\n--- Question Details ---")
for q in template.questions.all().order_by('order'):
print(f"\nQ{q.order}. {q.text}")
print(f" Type: {q.question_type}")
print(f" Required: {q.is_required}")
if q.choices_json:
print(f" Choices: {len(q.choices_json)} options")
for choice in q.choices_json:
print(f" - {choice.get('label', 'N/A')} ({choice.get('label_ar', 'N/A')})")
print("\n" + "="*60)
print("✅ TEST PASSED: Survey template with questions created successfully")
print("="*60 + "\n")
return True
except Exception as e:
print(f"\n❌ TEST FAILED: {str(e)}")
import traceback
traceback.print_exc()
return False
def test_template_form_access():
"""Test that the template form page loads correctly"""
print("\n" + "="*60)
print("TEST: Template Form Page Access")
print("="*60)
try:
client = Client()
# Test the list page
response = client.get('/surveys/templates/')
if response.status_code == 200:
print("✓ Template list page loads (200)")
elif response.status_code == 302:
print("✓ Template list page redirects (302) - likely requires authentication")
else:
print(f"⚠ Template list page status: {response.status_code}")
# Test the create page
response = client.get('/surveys/templates/create/')
if response.status_code == 200:
print("✓ Template create page loads (200)")
elif response.status_code == 302:
print("✓ Template create page redirects (302) - likely requires authentication")
else:
print(f"⚠ Template create page status: {response.status_code}")
print("\n" + "="*60)
print("✅ TEST PASSED: Template form pages accessible")
print("="*60 + "\n")
return True
except Exception as e:
print(f"\n❌ TEST FAILED: {str(e)}")
import traceback
traceback.print_exc()
return False
def test_javascript_files():
"""Test that all JavaScript files exist"""
print("\n" + "="*60)
print("TEST: JavaScript Files Existence")
print("="*60)
js_files = [
'static/surveys/js/builder.js',
'static/surveys/js/choices-builder.js',
'static/surveys/js/preview.js'
]
all_exist = True
for js_file in js_files:
if os.path.exists(js_file):
size = os.path.getsize(js_file)
print(f"{js_file} exists ({size} bytes)")
else:
print(f"{js_file} NOT FOUND")
all_exist = False
if all_exist:
print("\n" + "="*60)
print("✅ TEST PASSED: All JavaScript files exist")
print("="*60 + "\n")
else:
print("\n" + "="*60)
print("❌ TEST FAILED: Some JavaScript files missing")
print("="*60 + "\n")
return all_exist
def run_all_tests():
"""Run all tests"""
print("\n" + "="*60)
print("SURVEY BUILDER IMPLEMENTATION TESTS")
print("="*60)
results = []
# Test 1: JavaScript files
results.append(('JavaScript Files', test_javascript_files()))
# Test 2: Template creation with questions
results.append(('Survey Template Creation', test_survey_template_creation()))
# Test 3: Form access
results.append(('Template Form Access', test_template_form_access()))
# Summary
print("\n" + "="*60)
print("TEST SUMMARY")
print("="*60)
for test_name, passed in results:
status = "✅ PASSED" if passed else "❌ FAILED"
print(f"{status}: {test_name}")
all_passed = all(result[1] for result in results)
print("\n" + "="*60)
if all_passed:
print("🎉 ALL TESTS PASSED!")
else:
print("⚠️ SOME TESTS FAILED")
print("="*60 + "\n")
return all_passed
if __name__ == '__main__':
success = run_all_tests()
sys.exit(0 if success else 1)