Vital / tests /test_chat_helpers.py
eddyejembi's picture
Upload folder using huggingface_hub
4e88df3 verified
Raw
History Blame Contribute Delete
3.76 kB
"""Tests for coach chat helpers."""
import unittest
from datetime import date, datetime, timezone
from db.database import close_connection, initialize_database, set_db_path
from db import queries
from vital_types.db import FoodLogEntry, ProfileInput
from vital_types.llm import ChatMessage
from llm.chat_helpers import (
extract_food_description,
recent_user_text,
user_requests_food_log,
)
from llm.tool_runner import execute_tool
class ChatHelpersTest(unittest.TestCase):
"""Verify food-log intent detection and today's logs payload."""
def setUp(self) -> None:
"""Use an isolated database."""
import tempfile
from pathlib import Path
self.temp_dir = tempfile.TemporaryDirectory()
db_path = Path(self.temp_dir.name) / "test_vital.db"
close_connection()
set_db_path(db_path)
initialize_database()
queries.save_profile(
ProfileInput(
name="Eddy",
age=30,
city="Port Harcourt",
profession="Engineer",
goal="Wellness",
conditions=[],
medications=[],
triggers=[],
wake_time="07:00",
sleep_time="23:00",
desk_worker=True,
exercise_level="light",
dietary_notes="",
local_foods="beans, plantain",
)
)
def tearDown(self) -> None:
"""Close the database."""
close_connection()
self.temp_dir.cleanup()
def test_user_requests_food_log_detects_explicit_meal(self) -> None:
"""Explicit meal + log wording should request food logging."""
message = "I just had lunch. I ate beans and plantain. Can you log that for me?"
self.assertTrue(user_requests_food_log(message, None))
def test_user_requests_food_log_detects_follow_up(self) -> None:
"""A follow-up 'log it' should use earlier meal context."""
history = [
ChatMessage(
role="user",
content="I just had lunch. I ate beans and plantain.",
),
]
self.assertTrue(user_requests_food_log("Okay I just had it log it for me.", history))
def test_extract_food_description_from_natural_language(self) -> None:
"""Parser should pull meal details from user text."""
text = "I just had lunch. I ate beans and plantain. Can you log that for me?"
self.assertEqual(extract_food_description(text), "beans and plantain")
def test_recent_user_text_includes_prior_turns(self) -> None:
"""Recent user text should include earlier user messages."""
history = [
ChatMessage(role="user", content="I ate beans and plantain for lunch."),
]
combined = recent_user_text("Please log it.", history)
self.assertIn("beans and plantain", combined)
self.assertIn("Please log it.", combined)
def test_get_todays_logs_includes_food_logs(self) -> None:
"""Today's logs tool should expose persisted food entries."""
queries.insert_food_log(
FoodLogEntry(
date=date.today(),
meal_type="lunch",
food_description="beans and plantain",
logged_at=datetime.now(timezone.utc),
)
)
result = execute_tool("get_todays_logs", {})
self.assertTrue(result.success)
food_logs = result.result.get("food_logs")
self.assertIsInstance(food_logs, list)
self.assertEqual(len(food_logs), 1)
self.assertEqual(food_logs[0]["food_description"], "beans and plantain")
if __name__ == "__main__":
unittest.main()