import unittest from unittest.mock import AsyncMock from server.services.dashboard_query import DashboardQueryService class _Logger: def warning(self, message): return message class TestDashboardQueryService(unittest.IsolatedAsyncioTestCase): def setUp(self): self.database = AsyncMock() self.hub = AsyncMock() self.service = DashboardQueryService( gameplay_database=self.database, ws_hub=self.hub, logger=_Logger(), dashboard_running_game_stale_sec=600, ) async def test_pushes_compact_latest_turn_event(self): self.database.get_game_replay.return_value = { "game": {"game_id": "game-1", "status": "running"}, "turns": [{"turn": 1}, {"turn": 2, "my_move": "up"}], } await self.service.push_dashboard_game_replay_update("game-1") payload = self.hub.broadcast_payload.await_args.args[0] self.assertEqual(payload["type"], "dashboard_game_replay_update") self.assertEqual(payload["game_id"], "game-1") self.assertEqual(payload["turn"], {"turn": 2, "my_move": "up"}) self.assertNotIn("turns", payload) async def test_publishes_game_id_for_cluster_live_updates(self): self.database.get_game_replay.return_value = { "game": {"game_id": "game-1", "status": "running"}, "turns": [{"turn": 3}], } publish = AsyncMock() self.service.set_publish_notice(publish) await self.service.push_dashboard_game_replay_update("game-1") publish.assert_awaited_once_with("game_turn", "game-1") async def test_remote_turn_notice_loads_and_broadcasts_turn(self): self.database.get_game_replay.return_value = { "game": {"game_id": "game-1", "status": "running"}, "turns": [{"turn": 4}], } await self.service.on_dashboard_games_update_notice("game_turn", "game-1") payload = self.hub.broadcast_payload.await_args.args[0] self.assertEqual(payload["turn"]["turn"], 4) if __name__ == "__main__": unittest.main()