Skip to content

Commit e417229

Browse files
committed
Fix tests
🏠 Remote-Dev: homespace
1 parent 16d1ab7 commit e417229

File tree

3 files changed

+87
-0
lines changed

3 files changed

+87
-0
lines changed

tests/experimental/tasks/server/test_run_task_flow.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
GetTaskResult,
3232
ListToolsResult,
3333
PaginatedRequestParams,
34+
TaskMetadata,
3435
TextContent,
3536
)
3637

@@ -365,3 +366,26 @@ async def work(task: ServerTaskContext) -> CallToolResult:
365366
break
366367

367368
assert status.status_message == "Manually failed"
369+
370+
371+
@pytest.mark.anyio
372+
async def test_run_task_without_session_id_raises() -> None:
373+
"""Test that run_task raises when session has no session_id."""
374+
task_support = TaskSupport.in_memory()
375+
376+
mock_session = Mock()
377+
mock_session.session_id = None
378+
379+
experimental = Experimental(
380+
task_metadata=TaskMetadata(ttl=60000),
381+
_client_capabilities=None,
382+
_session=mock_session,
383+
_task_support=task_support,
384+
)
385+
386+
async def work(task: ServerTaskContext) -> CallToolResult:
387+
raise NotImplementedError
388+
389+
async with task_support.run():
390+
with pytest.raises(RuntimeError, match="Session ID is required"):
391+
await experimental.run_task(work)

tests/experimental/tasks/server/test_server.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,53 @@ async def run_server() -> None:
399399
tg.cancel_scope.cancel()
400400

401401

402+
@pytest.mark.anyio
403+
async def test_default_task_handlers_require_session_id() -> None:
404+
"""Test that default task handlers reject requests when session has no session_id."""
405+
server = Server("test-no-session-id")
406+
server.experimental.enable_tasks()
407+
408+
server_to_client_send, server_to_client_receive = anyio.create_memory_object_stream[SessionMessage](10)
409+
client_to_server_send, client_to_server_receive = anyio.create_memory_object_stream[SessionMessage](10)
410+
411+
async def message_handler(
412+
message: RequestResponder[ServerRequest, ClientResult] | ServerNotification | Exception,
413+
) -> None: ... # pragma: no branch
414+
415+
async def run_server() -> None:
416+
async with ServerSession(
417+
client_to_server_receive,
418+
server_to_client_send,
419+
InitializationOptions(
420+
server_name="test-server",
421+
server_version="1.0.0",
422+
capabilities=server.get_capabilities(
423+
notification_options=NotificationOptions(),
424+
experimental_capabilities={},
425+
),
426+
),
427+
) as server_session:
428+
# session_id is None (no session_id passed)
429+
async for message in server_session.incoming_messages:
430+
await server._handle_message(message, server_session, {}, False)
431+
432+
async with anyio.create_task_group() as tg:
433+
tg.start_soon(run_server)
434+
435+
async with ClientSession(
436+
server_to_client_receive,
437+
client_to_server_send,
438+
message_handler=message_handler,
439+
) as client_session:
440+
await client_session.initialize()
441+
442+
# All default task handlers should fail with "Session ID is required"
443+
with pytest.raises(MCPError, match="Session ID is required"):
444+
await client_session.experimental.list_tasks()
445+
446+
tg.cancel_scope.cancel()
447+
448+
402449
@pytest.mark.anyio
403450
async def test_build_elicit_form_request() -> None:
404451
"""Test that _build_elicit_form_request builds a proper elicitation request."""

tests/experimental/tasks/server/test_server_task_context.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -725,3 +725,19 @@ async def test_create_message_as_task_raises_without_handler() -> None:
725725
)
726726

727727
store.cleanup()
728+
729+
730+
@pytest.mark.anyio
731+
async def test_server_task_context_requires_session_id() -> None:
732+
"""Test that ServerTaskContext raises when session has no session_id."""
733+
store = InMemoryTaskStore()
734+
queue = InMemoryTaskMessageQueue()
735+
task = await store.create_task(TaskMetadata(ttl=60000), session_id="test-session")
736+
737+
mock_session = Mock()
738+
mock_session.session_id = None
739+
740+
with pytest.raises(RuntimeError, match="Session ID is required for task operations"):
741+
ServerTaskContext(task=task, store=store, session=mock_session, queue=queue)
742+
743+
store.cleanup()

0 commit comments

Comments
 (0)