import json import unittest from unittest.mock import Mock, patch from app.services.worker_control_service import WORKER_CONTROL_CHANNEL, WORKER_PENDING_COMMAND_KEY, send_worker_command class WorkerControlServiceTests(unittest.TestCase): @patch("app.services.worker_control_service.get_redis") def test_send_worker_command_persists_request_id_and_publishes_same_payload(self, mock_get_redis) -> None: redis_client = Mock() mock_get_redis.return_value = redis_client ok, message = send_worker_command( "start_detection", payload={"job_id": 1, "job_code": "detect-20260419030000-abc123"}, ) self.assertTrue(ok) self.assertIn("已发送 Worker 控制指令", message) redis_client.set.assert_called_once() set_args = redis_client.set.call_args.args self.assertEqual(WORKER_PENDING_COMMAND_KEY, set_args[0]) serialized = set_args[1] self.assertEqual(120, redis_client.set.call_args.kwargs["ex"]) payload = json.loads(serialized) self.assertEqual("start_detection", payload["action"]) self.assertEqual(1, payload["job_id"]) self.assertEqual("detect-20260419030000-abc123", payload["job_code"]) self.assertTrue(payload["request_id"].startswith("workerctl-")) redis_client.publish.assert_called_once_with(WORKER_CONTROL_CHANNEL, serialized) if __name__ == "__main__": unittest.main()