16 KiB
Real-Time SLA Testing Guide
This guide explains how to use the realistic SLA testing scenarios that simulate real-world complaint workflows with time compression.
Overview
The SLA testing system uses time-compressed simulation to test real workflows in a fraction of the time:
- Time Compression Ratio: 1 second of real time = 1 hour of system time
- This allows testing a 48-hour SLA in just 48 seconds
- All actual system code is executed (no mocking)
- Real Celery tasks, email sending, and database operations
Test Scripts
1. Scenario 1: Successful Explanation Submission
File: test_scenario_1_successful_explanation.py
Tests the happy path where a staff member submits their explanation before the SLA deadline. No escalation occurs.
Duration: ~7 seconds
SLA Configuration:
- Response deadline: 10 hours (10 seconds)
- First reminder: 5 hours before deadline
- Auto-escalation: Enabled (but not triggered)
Workflow:
T+0s Setup environment (hospital, department, staff)
T+2s Create complaint
T+1s Request explanation from staff
T+0s Verify initial state (pending, no reminders)
T+3s Staff submits explanation (before deadline)
T+0s Verify explanation submitted
T+0s Verify no escalation occurred
Expected Results:
- ✅ Explanation request email sent
- ✅ Staff submits explanation before deadline
- ✅ Explanation marked as used
- ✅ No reminders sent (not needed)
- ✅ No escalation occurred
- ✅ Complaint resolution process can proceed
Key Database States:
# After completion
ComplaintExplanation.is_used = True
ComplaintExplanation.is_overdue = False
ComplaintExplanation.reminder_sent_at = None
ComplaintExplanation.escalated_to_manager = None
2. Scenario 2: Escalation with Reminders
File: test_scenario_2_escalation_with_reminders.py
Tests the case where a staff member doesn't submit their explanation, leading to reminders and automatic escalation through the management chain.
Duration: ~37 seconds
SLA Configuration:
- Response deadline: 12 hours (12 seconds)
- First reminder: 6 hours before deadline
- Second reminder: 3 hours before deadline
- Auto-escalation: Enabled, immediate
- Max escalation levels: 3
Workflow:
T+0s Setup environment (hospital, department, staff hierarchy)
- Staff (Omar Al-Harbi)
- Manager (Mohammed Al-Rashid)
- Department Head (Ahmed Al-Farsi)
- Hospital Admin
T+1s Create complaint (high severity, high priority)
T+1s Request explanation from staff
T+0s Verify initial state (pending)
T+4s Wait for first reminder check
- First reminder sent at T+6h (6 hours after request)
T+0s Verify first reminder sent
T+3s Wait for second reminder check
- Second reminder sent at T+9h (3 hours before deadline)
T+0s Verify second reminder sent
T+3s Wait for deadline (T+12h)
- Escalate to manager
T+0s Verify escalation to manager
T+12s Wait for manager deadline (T+24h total)
- Manager also doesn't respond
- Escalate to department head
T+0s Verify escalation to department head
T+0s Final verification (overdue state)
Expected Results:
- ✅ Explanation request email sent to staff
- ✅ First reminder sent at 6 hours before deadline
- ✅ Second reminder sent at 3 hours before deadline
- ✅ Deadline reached - escalated to manager
- ✅ Manager receives explanation request
- ✅ Manager deadline reached - escalated to department head
- ✅ Department head receives explanation request
- ✅ Explanation marked as overdue
- ✅ Escalation chain: Staff → Manager → Department Head
Key Database States:
# After escalation to manager
ComplaintExplanation.is_used = False
ComplaintExplanation.is_overdue = True
ComplaintExplanation.reminder_sent_at = [timestamp]
ComplaintExplanation.second_reminder_sent_at = [timestamp]
ComplaintExplanation.escalated_to_manager = Manager instance
ComplaintExplanation.escalated_at = [timestamp]
ComplaintExplanation.escalation_level = 1
# After escalation to department head
ComplaintExplanation.escalated_to_dept_head = Department Head instance
ComplaintExplanation.escalation_level = 2
Running the Tests
Prerequisites
-
Django Setup: Make sure Django is properly configured
# Check your .env file has the correct settings cat .env | grep DJANGO_SETTINGS_MODULE -
Database: Ensure your database is accessible
# Run migrations if needed python manage.py migrate -
Email Configuration: Email service should be configured (or use console backend)
Execute Scenario 1
# Make the script executable
chmod +x test_scenario_1_successful_explanation.py
# Run the test
python test_scenario_1_successful_explanation.py
Expected Output:
================================================================================
SCENARIO 1: SUCCESSFUL EXPLANATION SUBMISSION
================================================================================
[Step 1] Setting up test environment
→ Executing immediately
✓ Created hospital: Al Hammadi Hospital
✓ Created department: Emergency Department
✓ Created staff member: Omar Al-Harbi
✓ Created ExplanationSLAConfig: 10h response time
✓ Created ComplaintSLAConfig: medium/medium - 72h SLA
[Step 2] Creating complaint
→ Waiting 2s (simulates 2 hours)
[1/2s] Simulated time: 2 hours
[2/2s] Simulated time: 4 hours
✓ Created complaint: Poor response time in emergency... (ID: 1)
ℹ Severity: medium
ℹ Priority: medium
ℹ Status: open
ℹ Staff: Omar Al-Harbi
[Step 3] Requesting explanation from staff
→ Waiting 1s (simulates 1 hours)
[1/1s] Simulated time: 1 hours
✓ Created explanation request for Omar Al-Harbi
ℹ Token: abc123...
✓ Explanation request email sent
ℹ SLA Due At: 2026-01-14 17:04:00
ℹ Hours until deadline: 10.0
[Step 4] Verifying initial explanation state
→ Executing immediately
✓ Explanation pending correctly (is_used=False, is_overdue=False, reminder=False)
[Step 5] Staff submits explanation (before deadline)
→ Waiting 3s (simulates 3 hours)
[1/3s] Simulated time: 1 hours
[2/3s] Simulated time: 2 hours
[3/3s] Simulated time: 3 hours
✓ Staff submitted explanation
ℹ Response time: 2026-01-14 17:04:00
ℹ SLA deadline: 2026-01-15 03:04:00
✓ Submitted 7.0 hours BEFORE deadline ✓
[Step 6] Verifying explanation submitted successfully
→ Executing immediately
✓ Explanation submitted successfully (is_used=True, is_overdue=False)
[Step 7] Verifying no escalation occurred
→ Executing immediately
✓ No escalation occurred (as expected)
================================================================================
TEST SUMMARY
================================================================================
Total Steps: 7
Successful: 7
Failed: 0
Elapsed Time: 7.2s
✓✓✓ ALL TESTS PASSED ✓✓✓
================================================================================
✓ Scenario 1 completed successfully!
Execute Scenario 2
# Make the script executable
chmod +x test_scenario_2_escalation_with_reminders.py
# Run the test
python test_scenario_2_escalation_with_reminders.py
Expected Output:
================================================================================
SCENARIO 2: ESCALATION WITH REMINDERS
================================================================================
[Step 1] Setting up test environment
→ Executing immediately
✓ Created hospital: Al Hammadi Hospital
✓ Created department: Emergency Department
✓ Created staff hierarchy: Omar Al-Harbi → Mohammed Al-Rashid → Ahmed Al-Farsi → Admin
✓ Created ExplanationSLAConfig: 12h response time
✓ Second reminder config: 3h before deadline
✓ Created ComplaintSLAConfig: high/high - 48h SLA
[Step 2] Creating complaint
→ Waiting 1s (simulates 1 hours)
[1/1s] Simulated time: 1 hours
✓ Created complaint: Patient left waiting for 3 hours... (ID: 2)
ℹ Severity: high
ℹ Priority: high
ℹ Status: open
ℹ Staff: Omar Al-Harbi
[Step 3] Requesting explanation from staff
→ Waiting 1s (simulates 1 hours)
[1/1s] Simulated time: 1 hours
✓ Created explanation request for Omar Al-Harbi
✓ Explanation request email sent
ℹ SLA Deadline: 12.0 hours from now
ℹ First reminder: 6.0 hours from now
ℹ Second reminder: 9.0 hours from now
[Step 4] Verifying initial explanation state
→ Executing immediately
✓ Explanation pending correctly (is_used=False, is_overdue=False, reminder=False)
[Step 5] Waiting for first reminder
→ Waiting 4s (simulates 4 hours)
[1/4s] Simulated time: 1 hours
[2/4s] Simulated time: 2 hours
[3/4s] Simulated time: 3 hours
[4/4s] Simulated time: 4 hours
ℹ Checking for first reminder...
✓ First reminder sent at 2026-01-14 16:09:00
✓ First reminder sent correctly
[Step 6] Verifying first reminder sent
→ Executing immediately
✓ Reminder sent correctly (is_used=False, has_reminder=True, escalated=False)
[Step 7] Waiting for second reminder
→ Waiting 3s (simulates 3 hours)
[1/3s] Simulated time: 1 hours
[2/3s] Simulated time: 2 hours
[3/3s] Simulated time: 3 hours
ℹ Checking for second reminder...
✓ Second reminder sent at 2026-01-14 16:12:00
✓ Second reminder sent correctly
[Step 8] Waiting for deadline (escalation to manager)
→ Waiting 3s (simulates 3 hours)
[1/3s] Simulated time: 1 hours
[2/3s] Simulated time: 2 hours
[3/3s] Simulated time: 3 hours
ℹ Checking for overdue explanations (escalate to manager)...
✓ Escalated to manager: Mohammed Al-Rashid
✓ Escalated to manager correctly
[Step 9] Verifying escalation to manager
→ Executing immediately
✓ Escalated to manager: Mohammed Al-Rashid
✓ Escalated correctly
[Step 10] Waiting for manager deadline (escalation to department head)
→ Waiting 12s (simulates 12 hours)
[1/12s] Simulated time: 1 hours
[5/12s] Simulated time: 5 hours
[10/12s] Simulated time: 10 hours
[12/12s] Simulated time: 12 hours
ℹ Checking for overdue manager explanations (escalate to department head)...
✓ Manager's explanation escalated to department head
✓ Escalated to department head correctly
[Step 11] Verifying escalation to department head
→ Executing immediately
✓ Escalated to department head: Ahmed Al-Farsi
✓ Escalated correctly
[Step 12] Final verification - explanation state
→ Executing immediately
✓ Explanation overdue and escalated correctly (is_used=False, is_overdue=True, escalated=True)
================================================================================
TEST SUMMARY
================================================================================
Total Steps: 12
Successful: 12
Failed: 0
Elapsed Time: 37.5s
✓✓✓ ALL TESTS PASSED ✓✓✓
================================================================================
✓ Scenario 2 completed successfully!
Understanding the Test Results
Success Indicators
✅ Explanation Submitted: Staff responded before deadline ✅ No Escalation: Workflow completed at staff level ✅ Reminders Sent: System sent timely reminders ✅ Escalation Occurred: System automatically escalated to manager ✅ Multi-Level Escalation: Escalation chain worked correctly
Common Issues and Solutions
Issue: "Email failed to send"
Cause: Email service not configured Solution:
- Check
.envfor email settings - Use console backend for testing:
EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend
Issue: "Escalation not triggered"
Cause: SLA configuration incorrect Solution:
- Verify
auto_escalate_enabled=True - Check
response_hoursmatches expected timing - Ensure
escalation_hours_overdueis set correctly
Issue: "Reminder not sent"
Cause: Reminder timing misconfiguration Solution:
- Check
reminder_hours_beforein SLA config - Verify
SecondReminderConfigis enabled (for second reminder) - Ensure sufficient time has passed
Customizing Scenarios
Adjust Time Compression
Modify the time_compression_ratio parameter:
# 1 second = 1 hour (default)
test = Scenario1SuccessfulExplanation(time_compression_ratio=1)
# 1 second = 2 hours (faster testing)
test = Scenario1SuccessfulExplanation(time_compression_ratio=2)
# 1 second = 30 minutes (slower, more detailed)
test = Scenario1SuccessfulExplanation(time_compression_ratio=0.5)
Change SLA Deadlines
Modify the SLA configuration in the test scripts:
# In setup_environment()
self.create_explanation_sla_config(
hospital=hospital,
response_hours=24, # Change from 10 to 24 hours
reminder_hours_before=12, # Change from 5 to 12 hours
auto_escalate_enabled=True,
escalation_hours_overdue=0,
max_escalation_levels=3
)
Test Different Severities
Create complaints with different severity/priority:
# High severity, high priority
complaint = Complaint.objects.create(
hospital=hospital,
department=department,
staff=staff,
severity='high',
priority='high',
# ... other fields
)
# Low severity, low priority
complaint = Complaint.objects.create(
hospital=hospital,
department=department,
staff=staff,
severity='low',
priority='low',
# ... other fields
)
Database Cleanup
After running tests, you may want to clean up test data:
# Delete test complaints and explanations
python manage.py shell
>>> from apps.complaints.models import Complaint, ComplaintExplanation
>>> Complaint.objects.filter(contact_name="Test Patient").delete()
>>> Complaint.objects.filter(contact_name="Concerned Family Member").delete()
# Delete test staff (be careful with real data!)
>>> from apps.organizations.models import Staff
>>> Staff.objects.filter(email__contains=".test").delete()
Debugging Tips
Enable Django Debug Mode
Make sure DEBUG=True in your settings to see detailed error messages.
Check Celery Tasks
If Celery tasks aren't executing:
# Check if Celery worker is running
ps aux | grep celery
# Start Celery worker
celery -A config worker -l info
Inspect Database State
# Check explanation state
from apps.complaints.models import ComplaintExplanation
exp = ComplaintExplanation.objects.first()
print(f"is_used: {exp.is_used}")
print(f"is_overdue: {exp.is_overdue}")
print(f"sla_due_at: {exp.sla_due_at}")
print(f"escalated_to_manager: {exp.escalated_to_manager}")
View Email Content
When using console email backend, emails will be printed to stdout. You can also check:
from django.core.mail import outbox
print(len(outbox)) # Number of emails sent
print(outbox[0].subject) # Subject of first email
print(outbox[0].body) # Body of first email
Next Steps
After successfully running the scenarios:
- Verify in Admin: Check the Django admin interface to see the created complaints and explanations
- Review Emails: Examine the email templates and content
- Test UI: Manually test the complaint and explanation workflows in the web interface
- Customize Scenarios: Modify the test scripts to match your specific use cases
- Integration Testing: Run these tests as part of your CI/CD pipeline
Support
For issues or questions:
- Check the logs in the
logs/directory - Review the SLA documentation in
docs/SLA_SYSTEM_OVERVIEW.md - Examine the Celery tasks in
apps/complaints/tasks.py