from unittest.mock import AsyncMock import pytest from mcp_server.tools import exploration @pytest.mark.asyncio async def test_queries_never_start_exploration_and_guidance_uses_shared_route(monkeypatch): request = AsyncMock(return_value={"status": "running"}) monkeypatch.setattr(exploration, "_request", request) await exploration.mobile_exploration("get", exploration_id="conversation", after=15) request.assert_awaited_once_with("GET", "/api/explorations/conversation", params={"after": 15}) with pytest.raises(ValueError): await exploration.mobile_exploration( "get", exploration_id="conversation", payload={"goal": "不该执行"} ) await exploration.mobile_exploration( "message", exploration_id="conversation", request_id="guidance", payload={"text": "先点击设置"}, ) assert request.call_args.args == ("POST", "/api/explorations/conversation/messages") assert request.call_args.kwargs["json"] == {"text": "先点击设置", "request_id": "guidance"} @pytest.mark.asyncio async def test_demo_requires_stable_request_and_valid_identifiers(monkeypatch): request = AsyncMock(return_value={}) monkeypatch.setattr(exploration, "_request", request) with pytest.raises(ValueError): await exploration.mobile_exploration("demonstrate", exploration_id="session") with pytest.raises(ValueError): await exploration.mobile_exploration( "demo_finish", exploration_id="session", demonstration_id="../foreign", request_id="finish", ) request.assert_not_awaited() await exploration.mobile_exploration( "demo_extend", exploration_id="session", demonstration_id="demo", request_id="extend", payload={"seconds": 900}, ) assert request.call_args.args == ( "POST", "/api/explorations/session/demonstrations/demo/extend", )