from concurrent.futures import ThreadPoolExecutor from unittest.mock import Mock import pytest from apps.admin_console.services.automation_store import AutomationStore from mcp_server import task_requests from mcp_server.tools import task_runner @pytest.fixture def receipts(tmp_path, monkeypatch): store = AutomationStore(tmp_path / "automation.db") monkeypatch.setattr(task_requests, "store", store) return store def test_concurrent_retries_dispatch_once(receipts): execute = Mock(side_effect=lambda sid: {"trace_id": sid, "status": "queued"}) with ThreadPoolExecutor(max_workers=4) as pool: results = list( pool.map( lambda _: task_requests.run_once("one", {"goal": "observe"}, execute), range(8) ) ) assert execute.call_count == 1 assert len({result["trace_id"] for result in results}) == 1 assert task_requests.lookup("one")["status"] == "queued" receipts.save_job({"session_id": results[0]["trace_id"], "status": "completed", "position": 1}) assert task_requests.lookup("one")["status"] == "completed" assert task_requests.lookup("one")["status_scope"] == "task_queue" def test_conflicting_content_and_lost_reply_never_repeat(receipts): execute = Mock(side_effect=ConnectionError("after admission")) with pytest.raises(ConnectionError): task_requests.run_once("one", {"goal": "observe"}, execute) receipt = task_requests.run_once("one", {"goal": "observe"}, execute) assert receipt["submission_state"] == "unknown" assert receipt["trace_id"] assert execute.call_count == 1 with pytest.raises(ValueError, match="不同任务内容"): task_requests.run_once("one", {"goal": "write"}, execute) assert task_requests.lookup("missing")["status"] == "not_found" def test_public_task_entry_uses_receipts_before_dispatch(receipts, monkeypatch): execute = Mock( side_effect=lambda **kwargs: {"trace_id": kwargs["trace_id"], "status": "queued"} ) monkeypatch.setattr(task_runner, "_run_task", execute) first = task_runner.mobile_run_task("observe", request_id="public-one") second = task_runner.mobile_run_task("observe", request_id="public-one") assert first["trace_id"] == second["trace_id"] execute.assert_called_once()