File size: 18,755 Bytes
24214fc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
#!/usr/bin/env python3
"""
Comprehensive test for Task 8: Enhanced Provider Summary Generation Implementation.

This script validates that all requirements for Task 8 have been successfully implemented:
- Task 8.1: Property test for provider summary completeness βœ“
- Task 8.2: Updated provider summary data model βœ“  
- Task 8.3: Implemented triage context inclusion βœ“

Requirements validated: 7.1, 7.2, 7.3, 7.4, 7.5
"""

import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'src'))

from datetime import datetime, timedelta
from core.provider_summary_generator import ProviderSummaryGenerator, ProviderSummary


def test_task_8_1_property_based_provider_summary():
    """Test Task 8.1: Property test for provider summary completeness."""
    print("Testing Task 8.1: Property-based provider summary completeness...")
    
    # This is tested in the main property test suite
    # Here we do a focused validation of the key properties
    
    generator = ProviderSummaryGenerator()
    
    # Property: Complete provider summary generation
    summary = generator.generate_summary(
        indicators=['severe_distress', 'suicidal_ideation', 'spiritual_crisis'],
        reasoning="Patient expressing severe spiritual distress with suicidal ideation requiring immediate intervention.",
        confidence=0.92,
        patient_name="Test Patient",
        patient_phone="555-123-4567",
        patient_email="test@example.com",
        triage_questions=["How are you feeling about your spiritual beliefs?"],
        triage_responses=["I feel like God has abandoned me completely"],
        conversation_context="Patient revealed escalating spiritual crisis during conversation.",
        medical_context={'conditions': ['terminal illness'], 'medications': ['pain management']},
        context_factors=['escalating_distress', 'medical_context_relevant']
    )
    
    # Property assertion: All required fields present (Requirements 7.1-7.5)
    assert summary.patient_name == "Test Patient", "Should include patient contact information"
    assert summary.patient_phone == "555-123-4567", "Should include patient phone"
    assert summary.patient_email == "test@example.com", "Should include patient email"
    assert len(summary.indicators) == 3, "Should include all distress indicators"
    assert summary.reasoning.startswith("Patient expressing"), "Should provide clear reasoning"
    assert len(summary.triage_context) == 1, "Should include triage context"
    assert summary.conversation_context != "", "Should include conversation background"
    
    # Validation should pass for complete summary
    validation_issues = summary.validate_completeness()
    assert len(validation_issues) == 0, f"Complete summary should have no validation issues: {validation_issues}"
    
    print("   βœ“ Property 7: Complete Provider Summary Generation validated")
    return True


def test_task_8_2_enhanced_data_model():
    """Test Task 8.2: Enhanced provider summary data model."""
    print("Testing Task 8.2: Enhanced provider summary data model...")
    
    # Test enhanced ProviderSummary data model using generator
    generator = ProviderSummaryGenerator()
    summary = generator.generate_summary(
        indicators=['hopelessness', 'spiritual_abandonment', 'family_conflict'],
        reasoning="Comprehensive assessment indicates severe spiritual distress",
        confidence=0.88,
        patient_name="Jane Doe",
        patient_phone="555-987-6543",
        patient_email="jane.doe@email.com",
        emergency_contact="John Doe (husband) - 555-111-2222",
        medical_context={'conditions': ['chronic_pain'], 'medications': ['opioids']},
        context_factors=['medical_context_relevant', 'family_stress'],
        defensive_patterns_detected=True
    )
    
    # Test serialization
    summary_dict = summary.to_dict()
    
    # Enhanced fields should be present
    enhanced_fields = [
        'patient_email', 'emergency_contact', 'severity_level', 'urgency_level',
        'medical_context', 'context_factors', 'defensive_patterns_detected',
        'recommended_actions', 'follow_up_timeline', 'conversation_history_summary'
    ]
    
    for field in enhanced_fields:
        assert field in summary_dict, f"Enhanced data model should include {field}"
    
    # Test validation functionality
    validation_issues = summary.validate_completeness()
    if validation_issues:
        print(f"   Validation issues: {validation_issues}")
    assert len(validation_issues) == 0, f"Complete summary should pass validation: {validation_issues}"
    
    # Test incomplete summary validation
    incomplete_summary = ProviderSummary()  # Default values
    validation_issues = incomplete_summary.validate_completeness()
    assert len(validation_issues) > 0, "Incomplete summary should have validation issues"
    
    expected_issues = [
        "Patient name is missing or placeholder",
        "Patient phone is missing or placeholder", 
        "No distress indicators specified",
        "Classification reasoning is missing or insufficient"
    ]
    
    for expected_issue in expected_issues:
        assert any(expected_issue in issue for issue in validation_issues), \
            f"Should detect issue: {expected_issue}"
    
    print("   βœ“ Enhanced provider summary data model working correctly")
    return True


def test_task_8_3_triage_context_inclusion():
    """Test Task 8.3: Triage context inclusion and conversation background extraction."""
    print("Testing Task 8.3: Triage context inclusion...")
    
    generator = ProviderSummaryGenerator()
    
    # Test comprehensive triage context inclusion
    triage_questions = [
        "Can you tell me more about your spiritual concerns?",
        "How has this affected your daily life?",
        "What kind of support would be most helpful?"
    ]
    
    triage_responses = [
        "I feel completely disconnected from my faith",
        "I can't find meaning in anything anymore",
        "I don't know who I can trust to talk about this"
    ]
    
    conversation_history = [
        {"message": "I'm questioning everything I believed", "classification": "YELLOW"},
        {"message": "Maybe there's no point to any of this", "classification": "RED"},
        {"message": "I feel so alone in this struggle", "classification": "RED"}
    ]
    
    summary = generator.generate_summary(
        indicators=['spiritual_crisis', 'existential_despair', 'social_isolation'],
        reasoning="Patient experiencing profound spiritual crisis with existential questioning.",
        confidence=0.85,
        patient_name="Maria Santos",
        patient_phone="555-456-7890",
        triage_questions=triage_questions,
        triage_responses=triage_responses,
        conversation_context="Patient revealed deep spiritual questioning through targeted inquiry.",
        conversation_history=conversation_history,
        context_factors=['spiritual_crisis', 'existential_questioning']
    )
    
    # Test triage context inclusion (Requirement 7.4)
    assert len(summary.triage_context) == 3, "Should include all triage exchanges"
    
    for i, exchange in enumerate(summary.triage_context):
        assert 'question' in exchange, "Triage context should include questions"
        assert 'response' in exchange, "Triage context should include responses"
        assert 'timestamp' in exchange, "Triage context should include timestamps"
        assert exchange['question'] == triage_questions[i], "Should preserve original questions"
        assert exchange['response'] == triage_responses[i], "Should preserve original responses"
    
    # Test conversation background extraction (Requirement 7.5)
    assert summary.conversation_context != "", "Should include conversation context"
    assert summary.conversation_history_summary != "", "Should generate conversation summary"
    assert "3 exchanges" in summary.conversation_history_summary, "Should analyze conversation length"
    
    # Test display formatting includes triage information
    display_format = generator.format_for_display(summary)
    
    assert "TRIAGE EXCHANGES" in display_format, "Display should include triage section"
    
    for question in triage_questions:
        assert question in display_format, f"Should display triage question: {question}"
    
    for response in triage_responses:
        assert response in display_format, f"Should display triage response: {response}"
    
    assert "CONVERSATION ANALYSIS" in display_format, "Should include conversation analysis"
    
    # Test export format includes triage summary
    export_format = generator.format_for_export(summary)
    assert "Triage:" in export_format, "Export should include triage summary"
    
    print("   βœ“ Triage context inclusion and conversation background extraction working")
    return True


def test_requirements_validation():
    """Validate that all Requirements 7.1-7.5 are met."""
    print("Validating Requirements 7.1-7.5...")
    
    generator = ProviderSummaryGenerator()
    
    # Requirement 7.1: RED classification generates referral 
    # THEN Provider_Summary_Generator SHALL include patient contact information
    print("   Testing Requirement 7.1...")
    summary_7_1 = generator.generate_summary(
        indicators=['severe_distress'],
        reasoning="RED classification test",
        confidence=0.8,
        patient_name="Contact Test Patient",
        patient_phone="555-CONTACT",
        patient_email="contact@test.com"
    )
    
    assert summary_7_1.patient_name == "Contact Test Patient", "Req 7.1: Should include patient name"
    assert summary_7_1.patient_phone == "555-CONTACT", "Req 7.1: Should include patient phone"
    assert summary_7_1.patient_email == "contact@test.com", "Req 7.1: Should include patient email"
    print("   βœ“ Requirement 7.1 validated")
    
    # Requirement 7.2: Provider summary is created 
    # THEN system SHALL include specific distress indicators found in conversation
    print("   Testing Requirement 7.2...")
    test_indicators = ['hopelessness', 'spiritual_crisis', 'family_conflict']
    summary_7_2 = generator.generate_summary(
        indicators=test_indicators,
        reasoning="Indicator test",
        confidence=0.8,
        patient_name="Indicator Test",
        patient_phone="555-INDICATOR"
    )
    
    assert summary_7_2.indicators == test_indicators, "Req 7.2: Should include specific distress indicators"
    
    # Display should show all indicators
    display = generator.format_for_display(summary_7_2)
    for indicator in test_indicators:
        assert indicator in display, f"Req 7.2: Display should show indicator {indicator}"
    
    print("   βœ“ Requirement 7.2 validated")
    
    # Requirement 7.3: Classification reasoning is documented 
    # THEN system SHALL provide clear explanation of RED determination
    print("   Testing Requirement 7.3...")
    test_reasoning = "Patient expressing severe spiritual distress with suicidal ideation requiring immediate intervention based on multiple indicators."
    summary_7_3 = generator.generate_summary(
        indicators=['suicidal_ideation'],
        reasoning=test_reasoning,
        confidence=0.9,
        patient_name="Reasoning Test",
        patient_phone="555-REASONING"
    )
    
    assert summary_7_3.reasoning == test_reasoning, "Req 7.3: Should provide clear reasoning"
    
    # Display should include reasoning
    display = generator.format_for_display(summary_7_3)
    assert test_reasoning in display, "Req 7.3: Display should show reasoning"
    
    print("   βœ“ Requirement 7.3 validated")
    
    # Requirement 7.4: Triage context exists 
    # THEN system SHALL include relevant question-answer pairs in summary
    print("   Testing Requirement 7.4...")
    test_questions = ["How are you coping?", "What support do you have?"]
    test_responses = ["I'm not coping well", "I don't have much support"]
    
    summary_7_4 = generator.generate_summary(
        indicators=['poor_coping'],
        reasoning="Triage context test",
        confidence=0.8,
        patient_name="Triage Test",
        patient_phone="555-TRIAGE",
        triage_questions=test_questions,
        triage_responses=test_responses
    )
    
    assert len(summary_7_4.triage_context) == 2, "Req 7.4: Should include question-answer pairs"
    
    for i, exchange in enumerate(summary_7_4.triage_context):
        assert exchange['question'] == test_questions[i], "Req 7.4: Should preserve questions"
        assert exchange['response'] == test_responses[i], "Req 7.4: Should preserve responses"
    
    print("   βœ“ Requirement 7.4 validated")
    
    # Requirement 7.5: Conversation history is available 
    # THEN system SHALL provide relevant background context for provider
    print("   Testing Requirement 7.5...")
    test_context = "Patient initially seemed positive but revealed deeper concerns through follow-up questioning."
    test_history = [
        {"message": "I'm doing okay", "classification": "GREEN"},
        {"message": "Actually, I'm struggling with my faith", "classification": "YELLOW"}
    ]
    
    summary_7_5 = generator.generate_summary(
        indicators=['faith_struggle'],
        reasoning="Context test",
        confidence=0.8,
        patient_name="Context Test",
        patient_phone="555-CONTEXT",
        conversation_context=test_context,
        conversation_history=test_history
    )
    
    assert summary_7_5.conversation_context == test_context, "Req 7.5: Should include conversation context"
    assert len(summary_7_5.conversation_history_summary) > 0, "Req 7.5: Should generate history summary"
    
    # Display should include background context
    display = generator.format_for_display(summary_7_5)
    assert test_context in display, "Req 7.5: Display should show conversation context"
    
    print("   βœ“ Requirement 7.5 validated")
    
    print("   βœ“ All Requirements 7.1-7.5 validated successfully")
    return True


def test_integration_with_existing_system():
    """Test integration with existing medical assistant system."""
    print("Testing integration with existing system...")
    
    generator = ProviderSummaryGenerator()
    
    # Test backward compatibility with existing ProviderSummaryGenerator interface
    legacy_summary = generator.generate_summary(
        indicators=['anxiety', 'depression'],
        reasoning="Legacy interface test",
        confidence=0.75,
        patient_name="Legacy Test",
        patient_phone="555-LEGACY"
    )
    
    # Should work with minimal parameters (backward compatibility)
    assert legacy_summary.patient_name == "Legacy Test", "Should support legacy interface"
    assert legacy_summary.classification == "RED", "Should default to RED classification"
    assert len(legacy_summary.indicators) == 2, "Should preserve indicators"
    
    # Enhanced features should have sensible defaults
    assert legacy_summary.severity_level in ['CRITICAL', 'HIGH', 'MODERATE'], "Should determine severity"
    assert legacy_summary.urgency_level in ['IMMEDIATE', 'URGENT', 'STANDARD'], "Should determine urgency"
    assert len(legacy_summary.recommended_actions) > 0, "Should generate recommended actions"
    
    # Test validation with existing system
    validation_result = generator.validate_summary_completeness(legacy_summary)
    assert isinstance(validation_result, bool), "Should provide validation result"
    
    # Test generation with validation
    summary_with_validation, issues = generator.generate_summary_with_validation(
        indicators=['test_indicator'],
        reasoning="Test with validation",
        confidence=0.8,
        patient_name="Validation Test",
        patient_phone="555-VALIDATE"
    )
    
    assert isinstance(summary_with_validation, ProviderSummary), "Should return summary"
    assert isinstance(issues, list), "Should return validation issues list"
    
    print("   βœ“ Integration with existing system working correctly")
    return True


def main():
    """Run all Task 8 completion tests."""
    print("=" * 70)
    print("TASK 8 COMPLETION VALIDATION: ENHANCED PROVIDER SUMMARY GENERATION")
    print("=" * 70)
    
    try:
        # Test all subtasks
        if not test_task_8_1_property_based_provider_summary():
            return False
        
        if not test_task_8_2_enhanced_data_model():
            return False
        
        if not test_task_8_3_triage_context_inclusion():
            return False
        
        if not test_requirements_validation():
            return False
        
        if not test_integration_with_existing_system():
            return False
        
        print("\n" + "=" * 70)
        print("βœ… TASK 8 COMPLETED SUCCESSFULLY!")
        print("=" * 70)
        print("IMPLEMENTED FEATURES:")
        print("βœ“ Enhanced provider summary data model with comprehensive fields")
        print("βœ“ Complete contact information validation and completeness checking")
        print("βœ“ Comprehensive triage context inclusion with question-answer pairs")
        print("βœ“ Conversation background extraction and analysis")
        print("βœ“ Severity and urgency level determination based on assessment")
        print("βœ“ Medical context integration for comprehensive patient view")
        print("βœ“ Defensive pattern detection and handling recommendations")
        print("βœ“ Recommended actions generation based on specific assessment factors")
        print("βœ“ Enhanced display formatting with all required sections")
        print("βœ“ Export formatting with data cleaning for single-line output")
        print("βœ“ Validation and completeness checking with detailed issue reporting")
        print("βœ“ Integration with context-aware classification results")
        print("βœ“ Backward compatibility with existing system interfaces")
        print("\nREQUIREMENTS VALIDATED:")
        print("βœ“ 7.1: Provider summaries include complete patient contact information")
        print("βœ“ 7.2: Summaries include specific distress indicators from conversation")
        print("βœ“ 7.3: Clear explanation of RED classification reasoning provided")
        print("βœ“ 7.4: Relevant triage question-answer pairs included in summaries")
        print("βœ“ 7.5: Conversation background context provided for provider review")
        print("=" * 70)
        return True
        
    except Exception as e:
        print(f"\n❌ TASK 8 VALIDATION FAILED: {e}")
        import traceback
        traceback.print_exc()
        return False


if __name__ == "__main__":
    success = main()
    sys.exit(0 if success else 1)