Spaces:
Running
Running
| """Tests for user-name personalization helpers.""" | |
| import unittest | |
| from datetime import date, timedelta | |
| from core.personalization import build_desk_break_message, first_name, personalize_message | |
| from db.database import get_db_path, reset_database, set_db_path | |
| from llm.daily_schedule import copy_daily_plan_from_previous | |
| from vital_types.daily_plan import DailyPlan, DailyScheduleJob | |
| from vital_types.db import ProfileInput | |
| class PersonalizationTests(unittest.TestCase): | |
| """Cover name prefixing and plan finalization.""" | |
| def setUp(self) -> None: | |
| """Use an isolated database for copy-plan tests.""" | |
| self._db_path = get_db_path().parent / "test_personalization.db" | |
| set_db_path(self._db_path) | |
| reset_database() | |
| def tearDown(self) -> None: | |
| """Close DB connection after each test.""" | |
| from db.database import close_connection | |
| close_connection() | |
| def test_first_name_extracts_token(self) -> None: | |
| """First name should be the leading token.""" | |
| self.assertEqual(first_name("Eddy Okafor"), "Eddy") | |
| def test_personalize_message_prefixes_name(self) -> None: | |
| """Break messages should start with the user's first name.""" | |
| result = personalize_message("Eddy Okafor", "Take a break and stretch.") | |
| self.assertEqual(result, "Eddy, Take a break and stretch.") | |
| def test_desk_break_message_template(self) -> None: | |
| """Desk break uses the fixed spoken template.""" | |
| message = build_desk_break_message("Eddy", 30) | |
| self.assertIn("Eddy", message) | |
| self.assertIn("30 minutes", message) | |
| self.assertIn("stretch", message.lower()) | |
| def test_copy_plan_strips_old_prep_jobs(self) -> None: | |
| """Copying should not duplicate exercise prep rows.""" | |
| profile = ProfileInput( | |
| name="Eddy", | |
| age=30, | |
| city="Abuja", | |
| profession="Engineer", | |
| goal="Manage a health condition", | |
| conditions=["sickle cell"], | |
| medications=[], | |
| triggers=["dehydration"], | |
| wake_time="07:00", | |
| sleep_time="23:00", | |
| desk_worker=True, | |
| exercise_level="light", | |
| dietary_notes="", | |
| local_foods="", | |
| ) | |
| source = DailyPlan( | |
| plan_date=date.today(), | |
| summary="Prior", | |
| hydration_goal_liters=2.5, | |
| generated_at=date.today(), | |
| jobs=[ | |
| DailyScheduleJob( | |
| job_id="exercise_prep_walk", | |
| type="check_in", | |
| time="16:50", | |
| message="Prep", | |
| tts=True, | |
| context="", | |
| ), | |
| DailyScheduleJob( | |
| job_id="walk_1700", | |
| type="exercise", | |
| time="17:00", | |
| message="Walk", | |
| tts=True, | |
| context="", | |
| exercise_type="walking", | |
| duration_minutes=20, | |
| ), | |
| ], | |
| ) | |
| copied = copy_daily_plan_from_previous(profile, date.today() + timedelta(days=1), source) | |
| prep_jobs = [job for job in copied.jobs if job.job_id.startswith("exercise_prep_")] | |
| self.assertEqual(len(prep_jobs), 1) | |