AI_Virtual_Wardrobe / tests /test_llm.py
mata01's picture
feat: implement conversational chatbot with routing and chat history support
265cc9d
Raw
History Blame Contribute Delete
4.82 kB
import pytest
from unittest.mock import patch, MagicMock
from app.services.llm_service import LLMService
def test_llm_service_mock_mode():
# If key is not configured, it should return mock recommendation
with patch("app.services.llm_service.settings") as mock_settings:
mock_settings.NVIDIA_API_KEY = None
service = LLMService()
assert service.enabled is False
# Test old recommend_outfits wrapper
res = service.recommend_outfits(
user_profile={"gender": "male", "height_cm": 175, "weight_kg": 70},
wardrobe_items=[{"id": "item1", "category": "shirt", "color_hex": "#ffffff"}],
weather="28C",
event="workplace"
)
assert "Mock Outfit" in res["recommendation"]
assert "item1" in res["selected_item_ids"]
def test_chat_and_recommend_mock_routing():
with patch("app.services.llm_service.settings") as mock_settings:
mock_settings.NVIDIA_API_KEY = None
service = LLMService()
assert service.enabled is False
# Test recommendation intent (should be true)
res_rec = service.chat_and_recommend(
user_profile={"gender": "male", "height_cm": 175, "weight_kg": 70},
wardrobe_items=[{"id": "item1", "category": "shirt", "color_hex": "#ffffff"}],
message="Gợi ý phối đồ đi chơi",
history=[],
weather="28C"
)
assert res_rec["is_recommendation"] is True
assert "item1" in res_rec["selected_item_ids"]
# Test non-recommendation/chat intent (should be false if there is history)
res_chat = service.chat_and_recommend(
user_profile={"gender": "male", "height_cm": 175, "weight_kg": 70},
wardrobe_items=[{"id": "item1", "category": "shirt", "color_hex": "#ffffff"}],
message="Tại sao chiếc áo này lại hợp với tôi?",
history=[{"role": "user", "content": "Mặc gì đây"}, {"role": "assistant", "content": "Áo sơ mi"}],
weather="28C"
)
assert res_chat["is_recommendation"] is False
assert "item1" not in res_chat["selected_item_ids"]
assert "Tại sao chiếc áo này lại hợp với tôi?" in res_chat["recommendation"]
def test_llm_service_nvidia_api_success():
with patch("app.services.llm_service.settings") as mock_settings:
mock_settings.NVIDIA_API_KEY = "mock_key"
mock_settings.NVIDIA_MODEL = "moonshotai/kimi-k2.6"
service = LLMService()
assert service.enabled is True
# Mock requests.post
mock_response = MagicMock()
mock_response.raise_for_status.return_value = None
mock_response.json.return_value = {
"choices": [
{
"message": {
"content": '{\n "is_recommendation": true,\n "recommendation": "Gợi ý: Áo thun trắng phối quần short năng động.",\n "selected_item_ids": ["item1"]\n}'
}
}
]
}
with patch("requests.post", return_value=mock_response) as mock_post:
res = service.chat_and_recommend(
user_profile={"gender": "male", "height_cm": 175, "weight_kg": 70},
wardrobe_items=[{"id": "item1", "category": "shirt", "color_hex": "#ffffff"}],
message="Mặc gì hôm nay?",
history=[],
weather="28C"
)
mock_post.assert_called_once()
assert res["is_recommendation"] is True
assert res["recommendation"] == "Gợi ý: Áo thun trắng phối quần short năng động."
assert res["selected_item_ids"] == ["item1"]
def test_llm_service_nvidia_api_error_fallback():
with patch("app.services.llm_service.settings") as mock_settings:
mock_settings.NVIDIA_API_KEY = "mock_key"
mock_settings.NVIDIA_MODEL = "moonshotai/kimi-k2.6"
service = LLMService()
assert service.enabled is True
with patch("requests.post", side_effect=Exception("API connection timeout")) as mock_post:
res = service.chat_and_recommend(
user_profile={"gender": "male", "height_cm": 175, "weight_kg": 70},
wardrobe_items=[{"id": "item1", "category": "shirt", "color_hex": "#ffffff"}],
message="Mặc gì hôm nay?",
history=[]
)
mock_post.assert_called_once()
assert res["is_recommendation"] is False
assert "Hệ thống gặp lỗi" in res["recommendation"]
assert res["selected_item_ids"] == []