HH/docs/SLA_TESTING_README.md

393 lines
10 KiB
Markdown

# Real-Time SLA Testing System
A comprehensive, realistic testing framework for complaint SLA workflows with time-compressed simulation.
## 🎯 Overview
This testing system allows you to **simulate real-world complaint workflows** in a fraction of the time by using time compression. All actual system code is executed - no mocking or shortcuts.
### Key Features
**Real-Time Simulation**: 1 second = 1 hour (configurable)
**Actual System Execution**: Real Celery tasks, emails, database operations
**Complete Workflows**: Happy path and escalation scenarios
**Staff Hierarchy**: Multi-level escalation testing
**SLA Configuration**: Customizable deadlines and reminders
**Visual Progress**: Clear step-by-step execution logging
## 📁 Files Created
### Core Testing Framework
- **`scenario_test_base.py`** - Base class with utilities for time compression, SLA setup, and verification
- **`test_scenario_1_successful_explanation.py`** - Happy path: Staff submits before deadline
- **`test_scenario_2_escalation_with_reminders.py`** - Escalation path: Staff doesn't respond, escalates through management chain
### Documentation
- **`SLA_TESTING_QUICKSTART.md`** - Get started in 5 minutes
- **`REAL_TIME_SLA_TESTING_GUIDE.md`** - Complete guide with detailed scenarios
## 🚀 Quick Start
```bash
# Run Scenario 1 (Happy Path - ~7 seconds)
python test_scenario_1_successful_explanation.py
# Run Scenario 2 (Escalation - ~37 seconds)
python test_scenario_2_escalation_with_reminders.py
```
For detailed instructions, see [SLA_TESTING_QUICKSTART.md](SLA_TESTING_QUICKSTART.md)
## 📊 Scenarios
### Scenario 1: Successful Explanation Submission
**Duration**: ~7 seconds
**What it tests**: Staff member submits explanation before SLA deadline
**Workflow**:
1. Create complaint
2. Request explanation from staff
3. Staff submits explanation (before deadline)
4. Verify no escalation occurred
**Results**:
- ✅ Explanation submitted successfully
- ✅ No reminders needed
- ✅ No escalation triggered
- ✅ Workflow completed at staff level
### Scenario 2: Escalation with Reminders
**Duration**: ~37 seconds
**What it tests**: Staff member doesn't respond, system sends reminders and escalates
**Workflow**:
1. Create complaint (high severity)
2. Request explanation from staff
3. First reminder sent (6 hours before deadline)
4. Second reminder sent (3 hours before deadline)
5. Deadline reached - escalate to manager
6. Manager deadline reached - escalate to department head
**Results**:
- ✅ Reminders sent at correct intervals
- ✅ Escalated to manager when deadline passed
- ✅ Manager receives explanation request
- ✅ Escalated to department head when manager didn't respond
- ✅ Multi-level escalation chain works correctly
## ⏱️ Time Compression
The system uses configurable time compression to simulate real workflows:
| Real Time | Simulated Time | Ratio | Use Case |
|------------|----------------|--------|----------|
| 1 second | 1 hour | 1:1 | Default testing |
| 1 second | 2 hours | 1:2 | Faster testing |
| 1 second | 30 minutes | 1:0.5 | Detailed debugging |
**Example**: Test a 48-hour SLA in 24 seconds (1:2 ratio) or 48 seconds (1:1 ratio)
## 🔧 What Gets Created
Each test scenario creates a complete test environment:
### Common Objects
- Hospital (Al Hammadi Hospital)
- Department (Emergency Department)
- ExplanationSLAConfig (customized per scenario)
- ComplaintSLAConfig (customized per scenario)
### Scenario 1 Objects
- 1 Staff member (Omar Al-Harbi - Nurse)
- 1 Complaint (medium severity, medium priority)
- 1 Explanation request (submitted)
- 1 Hospital Admin user
### Scenario 2 Objects
- 3 Staff members (Staff → Manager → Department Head)
- 1 Complaint (high severity, high priority)
- 1 Explanation request (overdue, escalated)
- 1 SecondReminderConfig (3 hours before deadline)
- 1 Hospital Admin user
## 🎨 How It Works
### 1. Time Compression
```python
class ScenarioTestBase:
def __init__(self, time_compression_ratio=1):
# 1 second = 1 hour of system time
self.time_compression_ratio = time_compression_ratio
```
### 2. Step Execution with Sleep
```python
def print_step(self, message, duration_seconds=0):
# Print step description
print(f"[Step {self.step_number}] {message}")
# Sleep for specified time
for i in range(1, duration_seconds + 1):
time.sleep(1)
print(f" [{i}/{duration_seconds}s] Simulated time: {i * ratio} hours")
```
### 3. Real Celery Task Execution
```python
# Send explanation request email
from apps.complaints.tasks import send_explanation_request_email
result = send_explanation_request_email(str(explanation.id))
# Check and send reminders
from apps.complaints.tasks import send_explanation_reminders
result = send_explanation_reminders()
# Escalate overdue explanations
from apps.complaints.tasks import escalate_overdue_explanations
result = escalate_overdue_explanations()
```
### 4. Database Verification
```python
def verify_explanation_state(self, explanation, expected_state):
# Refresh from database
explanation = ComplaintExplanation.objects.get(id=explanation.id)
# Check state
is_used = explanation.is_used
is_overdue = explanation.is_overdue
has_reminder = explanation.reminder_sent_at is not None
has_escalation = explanation.escalated_to_manager is not None
# Verify against expected state
if expected_state == 'submitted':
return is_used and not is_overdue
# ... other states
```
## 🔍 Verification
After running tests, verify results:
### In Django Admin
```bash
python manage.py runserver
# Visit: http://localhost:8000/admin
```
Check:
- Complaints → All Complaints
- Complaints → Explanations
- Organizations → Staff
- Complaints → SLA Configurations
### In Database
```python
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"escalated_to_manager: {exp.escalated_to_manager}")
```
### In Email Output
```python
from django.core.mail import outbox
print(f"Emails sent: {len(outbox)}")
print(f"Subject: {outbox[0].subject}")
print(f"Body: {outbox[0].body}")
```
## 🛠️ Customization
### Change Time Compression
```python
# Faster testing (1s = 2h)
test = Scenario1SuccessfulExplanation(time_compression_ratio=2)
# Slower testing (1s = 30min)
test = Scenario1SuccessfulExplanation(time_compression_ratio=0.5)
```
### Change SLA Deadlines
```python
self.create_explanation_sla_config(
hospital=hospital,
response_hours=24, # Change deadline
reminder_hours_before=12, # Change reminder timing
auto_escalate_enabled=True,
escalation_hours_overdue=0,
max_escalation_levels=3
)
```
### Test Different Severities
```python
complaint = Complaint.objects.create(
hospital=hospital,
department=department,
staff=staff,
severity='high', # or 'medium', 'low'
priority='high', # or 'medium', 'low'
# ... other fields
)
```
## 🧹 Cleanup
Delete test data after testing:
```bash
python manage.py shell
```
```python
# Delete test complaints
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
from apps.organizations.models import Staff
Staff.objects.filter(email__contains=".test").delete()
# Delete SLA configs
from apps.complaints.models import ExplanationSLAConfig, ComplaintSLAConfig, SecondReminderConfig
ExplanationSLAConfig.objects.all().delete()
ComplaintSLAConfig.objects.all().delete()
SecondReminderConfig.objects.all().delete()
```
## 🐛 Debugging
### Enable Django Debug Mode
```python
# In config/settings/dev.py
DEBUG = True
```
### Check Celery Tasks
```bash
# Check if Celery worker is running
ps aux | grep celery
# Start Celery worker
celery -A config worker -l info
```
### View Email Content
Use console email backend for testing:
```bash
# In .env
EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend
```
## 📚 Documentation
- **[SLA_TESTING_QUICKSTART.md](SLA_TESTING_QUICKSTART.md)** - Get started in 5 minutes
- **[REAL_TIME_SLA_TESTING_GUIDE.md](REAL_TIME_SLA_TESTING_GUIDE.md)** - Complete guide with detailed scenarios
- **[SLA_SYSTEM_OVERVIEW.md](SLA_SYSTEM_OVERVIEW.md)** - SLA system architecture
- **[apps/complaints/models.py](../apps/complaints/models.py)** - Complaint and explanation models
- **[apps/complaints/tasks.py](../apps/complaints/tasks.py)** - Celery tasks for SLA processing
## ✅ Test Checklist
Before running tests:
- [ ] Django is properly configured
- [ ] Database is accessible and migrated
- [ ] Email service is configured (or use console backend)
- [ ] Celery worker is running (for background tasks)
After running tests:
- [ ] Verify all steps passed
- [ ] Check results in Django admin
- [ ] Review email output
- [ ] Verify SLA configurations
- [ ] Clean up test data if needed
## 🎓 Use Cases
### Development Testing
- Test SLA logic during development
- Verify reminder timing
- Test escalation chains
- Debug SLA calculations
### CI/CD Integration
- Automated regression testing
- SLA configuration validation
- Workflow verification
- Performance testing
### Pre-Production Validation
- Test new SLA configurations
- Verify email templates
- Validate escalation rules
- Test staff hierarchy changes
### Training and Demo
- Demonstrate SLA system
- Train staff on escalation process
- Show reminder workflow
- Explain escalation chain
## 🔗 Related Features
- **Complaint System**: Full complaint lifecycle management
- **Staff Hierarchy**: Multi-level management structure
- **Email Notifications**: Automated reminder and escalation emails
- **Celery Tasks**: Background job processing for SLA enforcement
- **Admin Interface**: Configure and monitor SLA settings
## 📈 Performance
- **Scenario 1**: ~7 seconds execution time
- **Scenario 2**: ~37 seconds execution time
- **Total test time**: ~45 seconds for both scenarios
- **Time compression**: 1 second = 1 hour (configurable)
## 🤝 Contributing
When adding new scenarios:
1. Extend `ScenarioTestBase`
2. Follow the step-by-step pattern
3. Include time compression
4. Verify database state at each step
5. Document expected results
6. Update this README
## 📞 Support
For issues or questions:
1. Check the documentation in `docs/` directory
2. Review Celery task logs
3. Check Django admin for verification
4. Examine email output
5. Review SLA configuration
---
**Ready to test? Start here:** [SLA_TESTING_QUICKSTART.md](SLA_TESTING_QUICKSTART.md)