Skip to content

Commit 0da9dbb

Browse files
committed
Add capability tests for tasks
1 parent a2c5f0a commit 0da9dbb

File tree

1 file changed

+170
-0
lines changed

1 file changed

+170
-0
lines changed

tests/server/test_session_tasks.py

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,3 +383,173 @@ async def test_delete_task_not_found():
383383
assert "Failed to delete task" in str(e) or str(types.INVALID_PARAMS) in str(e)
384384
finally:
385385
tg.cancel_scope.cancel()
386+
387+
388+
@pytest.mark.anyio
389+
async def test_get_task_without_capability():
390+
"""Test GetTaskRequest fails when client hasn't announced tasks capability."""
391+
task_store = InMemoryTaskStore()
392+
server = Server("test", task_store=task_store)
393+
394+
# Create a task in the store
395+
task_id = "test-task-999"
396+
task_meta = types.TaskMetadata(taskId=task_id)
397+
request = types.ClientRequest(types.PingRequest())
398+
await task_store.create_task(task_meta, "req-1", request.root)
399+
400+
async with create_client_server_memory_streams() as (client_streams, server_streams):
401+
client_read, client_write = client_streams
402+
server_read, server_write = server_streams
403+
404+
async with anyio.create_task_group() as tg:
405+
tg.start_soon(
406+
lambda: server.run(
407+
server_read,
408+
server_write,
409+
server.create_initialization_options(),
410+
)
411+
)
412+
413+
try:
414+
async with ClientSession(
415+
read_stream=client_read,
416+
write_stream=client_write,
417+
# No task_store - client won't announce tasks capability
418+
) as client_session:
419+
await client_session.initialize()
420+
421+
# Try to send GetTaskRequest
422+
try:
423+
await client_session.send_request(
424+
types.ClientRequest(types.GetTaskRequest(params=types.GetTaskParams(taskId=task_id))),
425+
types.GetTaskResult,
426+
)
427+
assert False, "Should have raised McpError"
428+
except Exception as e:
429+
assert "not announced tasks capability" in str(e) or str(types.INVALID_REQUEST) in str(e)
430+
finally:
431+
tg.cancel_scope.cancel()
432+
433+
434+
@pytest.mark.anyio
435+
async def test_get_task_payload_without_capability():
436+
"""Test GetTaskPayloadRequest fails when client hasn't announced tasks capability."""
437+
task_store = InMemoryTaskStore()
438+
server = Server("test", task_store=task_store)
439+
440+
async with create_client_server_memory_streams() as (client_streams, server_streams):
441+
client_read, client_write = client_streams
442+
server_read, server_write = server_streams
443+
444+
async with anyio.create_task_group() as tg:
445+
tg.start_soon(
446+
lambda: server.run(
447+
server_read,
448+
server_write,
449+
server.create_initialization_options(),
450+
)
451+
)
452+
453+
try:
454+
async with ClientSession(
455+
read_stream=client_read,
456+
write_stream=client_write,
457+
# No task_store - client won't announce tasks capability
458+
) as client_session:
459+
await client_session.initialize()
460+
461+
# Try to send GetTaskPayloadRequest
462+
try:
463+
await client_session.send_request(
464+
types.ClientRequest(
465+
types.GetTaskPayloadRequest(params=types.GetTaskPayloadParams(taskId="some-task"))
466+
),
467+
types.ServerResult,
468+
)
469+
assert False, "Should have raised McpError"
470+
except Exception as e:
471+
assert "not announced tasks capability" in str(e) or str(types.INVALID_REQUEST) in str(e)
472+
finally:
473+
tg.cancel_scope.cancel()
474+
475+
476+
@pytest.mark.anyio
477+
async def test_list_tasks_without_capability():
478+
"""Test ListTasksRequest fails when client hasn't announced tasks capability."""
479+
task_store = InMemoryTaskStore()
480+
server = Server("test", task_store=task_store)
481+
482+
async with create_client_server_memory_streams() as (client_streams, server_streams):
483+
client_read, client_write = client_streams
484+
server_read, server_write = server_streams
485+
486+
async with anyio.create_task_group() as tg:
487+
tg.start_soon(
488+
lambda: server.run(
489+
server_read,
490+
server_write,
491+
server.create_initialization_options(),
492+
)
493+
)
494+
495+
try:
496+
async with ClientSession(
497+
read_stream=client_read,
498+
write_stream=client_write,
499+
# No task_store - client won't announce tasks capability
500+
) as client_session:
501+
await client_session.initialize()
502+
503+
# Try to send ListTasksRequest
504+
try:
505+
await client_session.send_request(
506+
types.ClientRequest(types.ListTasksRequest()),
507+
types.ListTasksResult,
508+
)
509+
assert False, "Should have raised McpError"
510+
except Exception as e:
511+
assert "not announced tasks capability" in str(e) or str(types.INVALID_REQUEST) in str(e)
512+
finally:
513+
tg.cancel_scope.cancel()
514+
515+
516+
@pytest.mark.anyio
517+
async def test_delete_task_without_capability():
518+
"""Test DeleteTaskRequest fails when client hasn't announced tasks capability."""
519+
task_store = InMemoryTaskStore()
520+
server = Server("test", task_store=task_store)
521+
522+
async with create_client_server_memory_streams() as (client_streams, server_streams):
523+
client_read, client_write = client_streams
524+
server_read, server_write = server_streams
525+
526+
async with anyio.create_task_group() as tg:
527+
tg.start_soon(
528+
lambda: server.run(
529+
server_read,
530+
server_write,
531+
server.create_initialization_options(),
532+
)
533+
)
534+
535+
try:
536+
async with ClientSession(
537+
read_stream=client_read,
538+
write_stream=client_write,
539+
# No task_store - client won't announce tasks capability
540+
) as client_session:
541+
await client_session.initialize()
542+
543+
# Try to send DeleteTaskRequest
544+
try:
545+
await client_session.send_request(
546+
types.ClientRequest(
547+
types.DeleteTaskRequest(params=types.DeleteTaskParams(taskId="some-task"))
548+
),
549+
types.EmptyResult,
550+
)
551+
assert False, "Should have raised McpError"
552+
except Exception as e:
553+
assert "not announced tasks capability" in str(e) or str(types.INVALID_REQUEST) in str(e)
554+
finally:
555+
tg.cancel_scope.cancel()

0 commit comments

Comments
 (0)