test_chat_reply.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import json
  2. import unittest
  3. from unittest.mock import Mock
  4. from langchain_core.messages import AIMessage
  5. from langchain_core.runnables import RunnableLambda
  6. from chat_service import ChatService
  7. class ChatReplyTests(unittest.IsolatedAsyncioTestCase):
  8. def make_service(self, follow_up):
  9. service = ChatService.__new__(ChatService)
  10. payload = {"intents": ["out_of_scope"], "user_queries": {}}
  11. payload.update(follow_up)
  12. service.llm = RunnableLambda(
  13. lambda _: AIMessage(content=json.dumps(payload))
  14. )
  15. service.memory = Mock(current_task={})
  16. service.memory.get_short_term_text.return_value = ""
  17. service.memory.get_profile_text.return_value = ""
  18. service.messages = []
  19. service.conversation_history = ""
  20. return service
  21. async def test_empty_out_of_scope_reply_has_fallback(self):
  22. for payload in ({}, {"follow_up_message": ""},
  23. {"follow_up_message": " "}, {"follow_up_message": None}):
  24. for streaming in (False, True):
  25. with self.subTest(payload=payload, streaming=streaming):
  26. service = self.make_service(payload)
  27. if streaming:
  28. reply = "".join([part async for part in service.chat_stream("你好")])
  29. else:
  30. reply = await service.chat("你好")
  31. self.assertIn("企业差旅助手", reply)
  32. self.assertEqual(service.messages[-1],
  33. {"role": "assistant", "content": reply})
  34. service.memory.add_message.assert_called_with("assistant", reply)
  35. async def test_existing_reply_is_preserved(self):
  36. for streaming in (False, True):
  37. service = self.make_service({"follow_up_message": "你刚才说要去北京。"})
  38. if streaming:
  39. reply = "".join([part async for part in service.chat_stream("我要去哪里?")])
  40. else:
  41. reply = await service.chat("我要去哪里?")
  42. self.assertEqual(reply, "你刚才说要去北京。")
  43. if __name__ == "__main__":
  44. unittest.main()