test_forum_chat.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import pytest
  2. import asyncio
  3. from unittest.mock import MagicMock, AsyncMock, patch
  4. from app.services.forum_scheduler import ForumScheduler
  5. @pytest.mark.asyncio
  6. async def test_push_user_message():
  7. scheduler = ForumScheduler()
  8. forum_id = 999
  9. # 1. Test pushing message
  10. await scheduler.push_user_message(forum_id, "TestUser", "Hello World")
  11. assert forum_id in scheduler.user_message_queues
  12. queue = scheduler.user_message_queues[forum_id]
  13. assert queue.qsize() == 1
  14. item = await queue.get()
  15. assert item["speaker"] == "TestUser"
  16. assert item["content"] == "Hello World"
  17. assert "timestamp" in item
  18. @pytest.mark.asyncio
  19. async def test_process_user_messages_empty():
  20. scheduler = ForumScheduler()
  21. processed = await scheduler._process_user_messages(123)
  22. assert processed is False
  23. @pytest.mark.asyncio
  24. @patch("app.services.forum_scheduler.create_message")
  25. @patch("app.services.forum_scheduler.manager.broadcast")
  26. @patch("app.services.forum_scheduler.db_manager.get_connection")
  27. async def test_process_user_messages_flow(mock_get_conn, mock_broadcast, mock_create_msg):
  28. # Setup Mocks
  29. mock_db = MagicMock()
  30. mock_get_conn.return_value = mock_db
  31. mock_db.close = MagicMock()
  32. # Mock create_message return value
  33. mock_msg = MagicMock()
  34. mock_msg.id = 1001
  35. mock_create_msg.return_value = mock_msg
  36. scheduler = ForumScheduler()
  37. forum_id = 888
  38. # Push a message
  39. await scheduler.push_user_message(forum_id, "Audience1", "Interruption!")
  40. # Process
  41. # We need to mock _broadcast_system_log too or let it run (it uses manager.broadcast)
  42. # But _broadcast_system_log calls create_task for persist_bg, which might fail without real Redis/DB
  43. # So let's patch _broadcast_system_log
  44. with patch.object(scheduler, '_broadcast_system_log', new_callable=AsyncMock) as mock_sys_log:
  45. processed = await scheduler._process_user_messages(forum_id)
  46. assert processed is True
  47. assert scheduler.user_message_queues[forum_id].empty()
  48. # Verify DB insert called
  49. assert mock_create_msg.call_count == 1
  50. call_args = mock_create_msg.call_args[0]
  51. assert call_args[1].speaker_name == "Audience1"
  52. assert call_args[1].content == "Interruption!"
  53. # Verify Broadcast called
  54. # _broadcast_message calls manager.broadcast
  55. assert mock_broadcast.called
  56. # Verify System Log
  57. assert mock_sys_log.called
  58. assert "观众 [Audience1] 发言" in mock_sys_log.call_args[0][1]