Spaces:
Sleeping
Sleeping
| #!/usr/bin/env python3 | |
| """ | |
| Integration test for next_check_in functionality in LifestyleSessionManager | |
| """ | |
| import json | |
| from datetime import datetime, timedelta | |
| from core_classes import LifestyleProfile, ChatMessage, LifestyleSessionManager | |
| class MockAPI: | |
| def generate_response(self, system_prompt: str, user_prompt: str, temperature: float = 0.3, call_type: str = "") -> str: | |
| """Mock API that returns realistic profile update responses""" | |
| if call_type == "LIFESTYLE_PROFILE_UPDATE": | |
| # Return a realistic profile update with next_check_in | |
| return json.dumps({ | |
| "updates_needed": True, | |
| "reasoning": "Patient completed first lifestyle session with good engagement", | |
| "updated_fields": { | |
| "exercise_preferences": ["upper body exercises", "seated exercises", "resistance band training"], | |
| "personal_preferences": ["prefers gradual changes", "wants weekly check-ins initially"], | |
| "session_summary": "First lifestyle session completed. Patient motivated to start adapted exercise program.", | |
| "next_check_in": "2025-09-08", | |
| "progress_metrics": {"initial_motivation": "high", "session_1_completion": "successful"} | |
| }, | |
| "session_insights": "Patient shows high motivation despite physical limitations. Requires close monitoring initially.", | |
| "next_session_rationale": "New patient needs immediate follow-up in 3 days to ensure safe program initiation and address any concerns." | |
| }) | |
| return "Mock response" | |
| def test_next_checkin_integration(): | |
| """Test the complete next_check_in workflow""" | |
| print("π§ͺ Testing Next Check-in Integration\n") | |
| # Create mock components | |
| api = MockAPI() | |
| session_manager = LifestyleSessionManager(api) | |
| # Create test lifestyle profile | |
| profile = LifestyleProfile( | |
| patient_name="Test Patient", | |
| patient_age="52", | |
| conditions=["Type 2 diabetes", "Hypertension"], | |
| primary_goal="Improve exercise tolerance", | |
| exercise_preferences=["upper body exercises"], | |
| exercise_limitations=["Right below knee amputation"], | |
| dietary_notes=["Diabetic diet"], | |
| personal_preferences=["prefers gradual changes"], | |
| journey_summary="Initial assessment completed", | |
| last_session_summary="", | |
| next_check_in="not set", | |
| progress_metrics={} | |
| ) | |
| # Create mock session messages | |
| session_messages = [ | |
| ChatMessage( | |
| timestamp="2025-09-05T10:00:00Z", | |
| role="user", | |
| message="I want to start exercising but I'm worried about my amputation", | |
| mode="lifestyle" | |
| ), | |
| ChatMessage( | |
| timestamp="2025-09-05T10:01:00Z", | |
| role="assistant", | |
| message="I understand your concerns. Let's start with safe, adapted exercises.", | |
| mode="lifestyle" | |
| ), | |
| ChatMessage( | |
| timestamp="2025-09-05T10:02:00Z", | |
| role="user", | |
| message="What exercises would be good for me to start with?", | |
| mode="lifestyle" | |
| ) | |
| ] | |
| print("π **Before Update:**") | |
| print(f" Next check-in: {profile.next_check_in}") | |
| print(f" Exercise preferences: {profile.exercise_preferences}") | |
| print(f" Progress metrics: {profile.progress_metrics}") | |
| print() | |
| # Test the profile update with next_check_in | |
| try: | |
| updated_profile = session_manager.update_profile_after_session( | |
| profile, | |
| session_messages, | |
| "First lifestyle coaching session", | |
| save_to_disk=False | |
| ) | |
| print("π **After Update:**") | |
| print(f" β Next check-in: {updated_profile.next_check_in}") | |
| print(f" β Exercise preferences: {updated_profile.exercise_preferences}") | |
| print(f" β Personal preferences: {updated_profile.personal_preferences}") | |
| print(f" β Progress metrics: {updated_profile.progress_metrics}") | |
| print(f" β Last session summary: {updated_profile.last_session_summary}") | |
| print() | |
| # Validate the next_check_in was set | |
| if updated_profile.next_check_in != "not set": | |
| print("β Next check-in successfully updated!") | |
| # Try to parse the date to validate format | |
| try: | |
| check_in_date = datetime.strptime(updated_profile.next_check_in, "%Y-%m-%d") | |
| today = datetime.now() | |
| days_until = (check_in_date - today).days | |
| print(f"π Next session in {days_until} days ({updated_profile.next_check_in})") | |
| except ValueError: | |
| print(f"β οΈ Next check-in format may be descriptive: {updated_profile.next_check_in}") | |
| else: | |
| print("β Next check-in was not updated") | |
| except Exception as e: | |
| print(f"β Error during profile update: {e}") | |
| def test_different_checkin_scenarios(): | |
| """Test different scenarios for next check-in timing""" | |
| print("\nπ― Testing Different Check-in Scenarios\n") | |
| scenarios = [ | |
| { | |
| "name": "New Patient", | |
| "expected_days": 1-3, | |
| "description": "First session, needs immediate follow-up" | |
| }, | |
| { | |
| "name": "Active Coaching", | |
| "expected_days": 7, | |
| "description": "Regular coaching phase, weekly check-ins" | |
| }, | |
| { | |
| "name": "Stable Progress", | |
| "expected_days": 14-21, | |
| "description": "Good progress, bi-weekly follow-up" | |
| }, | |
| { | |
| "name": "Maintenance Phase", | |
| "expected_days": 30, | |
| "description": "Established routine, monthly check-ins" | |
| } | |
| ] | |
| for scenario in scenarios: | |
| print(f"π **{scenario['name']}**") | |
| print(f" Expected timing: {scenario['expected_days']} days") | |
| print(f" Description: {scenario['description']}") | |
| print() | |
| if __name__ == "__main__": | |
| test_next_checkin_integration() | |
| test_different_checkin_scenarios() | |
| print("π **Summary:**") | |
| print(" β’ Next check-in field successfully integrated into profile updates") | |
| print(" β’ LLM determines optimal timing based on patient status") | |
| print(" β’ Date format: YYYY-MM-DD for easy parsing") | |
| print(" β’ Rationale provided for timing decisions") | |
| print(" β’ Supports different follow-up intervals based on patient needs") | |
| print("\nβ Next check-in functionality fully integrated!") |