Skip to content

Commit a583f12

Browse files
committed
Increase task test coverage
1 parent 19c3939 commit a583f12

File tree

1 file changed

+219
-17
lines changed

1 file changed

+219
-17
lines changed

tests/server/test_session_tasks.py

Lines changed: 219 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,50 @@ async def test_get_task_payload_not_completed():
204204
tg.cancel_scope.cancel()
205205

206206

207+
@pytest.mark.anyio
208+
async def test_get_task_payload_not_found():
209+
"""Test GetTaskPayloadRequest fails when task doesn't exist."""
210+
task_store = InMemoryTaskStore()
211+
client_task_store = InMemoryTaskStore()
212+
server = Server("test", task_store=task_store)
213+
214+
async with create_client_server_memory_streams() as (client_streams, server_streams):
215+
client_read, client_write = client_streams
216+
server_read, server_write = server_streams
217+
218+
async with anyio.create_task_group() as tg:
219+
tg.start_soon(
220+
lambda: server.run(
221+
server_read,
222+
server_write,
223+
server.create_initialization_options(),
224+
)
225+
)
226+
227+
try:
228+
async with ClientSession(
229+
read_stream=client_read,
230+
write_stream=client_write,
231+
task_store=client_task_store,
232+
) as client_session:
233+
await client_session.initialize()
234+
235+
# Try to get payload for non-existent task
236+
try:
237+
await client_session.send_request(
238+
types.ClientRequest(
239+
types.GetTaskPayloadRequest(params=types.GetTaskPayloadParams(taskId="non-existent"))
240+
),
241+
types.ServerResult,
242+
)
243+
assert False, "Should have raised McpError"
244+
except Exception as e:
245+
# Should get an error about task not found
246+
assert "Task not found" in str(e) or str(types.INVALID_PARAMS) in str(e)
247+
finally:
248+
tg.cancel_scope.cancel()
249+
250+
207251
@pytest.mark.anyio
208252
async def test_list_tasks_empty():
209253
"""Test ListTasksRequest with no tasks."""
@@ -624,23 +668,17 @@ async def server_session():
624668
from_client, to_server = anyio.create_memory_object_stream[SessionMessage](1)
625669
from_server, to_client = anyio.create_memory_object_stream[SessionMessage](1)
626670

627-
session = ServerSession(
628-
to_server,
629-
from_server,
630-
InitializationOptions(
631-
server_name="test",
632-
server_version="1.0.0",
633-
capabilities=types.ServerCapabilities(),
634-
),
635-
)
636-
637-
yield session
638-
639-
# Cleanup
640-
await from_client.aclose()
641-
await to_server.aclose()
642-
await from_server.aclose()
643-
await to_client.aclose()
671+
async with from_client, to_server, from_server, to_client:
672+
session = ServerSession(
673+
to_server,
674+
from_server,
675+
InitializationOptions(
676+
server_name="test",
677+
server_version="1.0.0",
678+
capabilities=types.ServerCapabilities(),
679+
),
680+
)
681+
yield session
644682

645683

646684
@pytest.mark.anyio
@@ -911,3 +949,167 @@ async def test_check_tasks_capability_all_capabilities_present(server_session: S
911949

912950
result = server_session._check_tasks_capability(required, client)
913951
assert result is True
952+
953+
954+
@pytest.mark.anyio
955+
async def test_get_task_without_task_store():
956+
"""Test GetTaskRequest fails when server has no task store configured."""
957+
client_task_store = InMemoryTaskStore()
958+
server = Server("test") # No task_store parameter
959+
960+
async with create_client_server_memory_streams() as (client_streams, server_streams):
961+
client_read, client_write = client_streams
962+
server_read, server_write = server_streams
963+
964+
async with anyio.create_task_group() as tg:
965+
tg.start_soon(
966+
lambda: server.run(
967+
server_read,
968+
server_write,
969+
server.create_initialization_options(),
970+
)
971+
)
972+
973+
try:
974+
async with ClientSession(
975+
read_stream=client_read,
976+
write_stream=client_write,
977+
task_store=client_task_store,
978+
) as client_session:
979+
await client_session.initialize()
980+
981+
# Try to send GetTaskRequest
982+
try:
983+
await client_session.send_request(
984+
types.ClientRequest(types.GetTaskRequest(params=types.GetTaskParams(taskId="test-task"))),
985+
types.GetTaskResult,
986+
)
987+
assert False, "Should have raised McpError"
988+
except Exception as e:
989+
assert "Task store not configured" in str(e) or str(types.INVALID_REQUEST) in str(e)
990+
finally:
991+
tg.cancel_scope.cancel()
992+
993+
994+
@pytest.mark.anyio
995+
async def test_get_task_payload_without_task_store():
996+
"""Test GetTaskPayloadRequest fails when server has no task store configured."""
997+
client_task_store = InMemoryTaskStore()
998+
server = Server("test") # No task_store parameter
999+
1000+
async with create_client_server_memory_streams() as (client_streams, server_streams):
1001+
client_read, client_write = client_streams
1002+
server_read, server_write = server_streams
1003+
1004+
async with anyio.create_task_group() as tg:
1005+
tg.start_soon(
1006+
lambda: server.run(
1007+
server_read,
1008+
server_write,
1009+
server.create_initialization_options(),
1010+
)
1011+
)
1012+
1013+
try:
1014+
async with ClientSession(
1015+
read_stream=client_read,
1016+
write_stream=client_write,
1017+
task_store=client_task_store,
1018+
) as client_session:
1019+
await client_session.initialize()
1020+
1021+
# Try to send GetTaskPayloadRequest
1022+
try:
1023+
await client_session.send_request(
1024+
types.ClientRequest(
1025+
types.GetTaskPayloadRequest(params=types.GetTaskPayloadParams(taskId="test-task"))
1026+
),
1027+
types.ServerResult,
1028+
)
1029+
assert False, "Should have raised McpError"
1030+
except Exception as e:
1031+
assert "Task store not configured" in str(e) or str(types.INVALID_REQUEST) in str(e)
1032+
finally:
1033+
tg.cancel_scope.cancel()
1034+
1035+
1036+
@pytest.mark.anyio
1037+
async def test_list_tasks_without_task_store():
1038+
"""Test ListTasksRequest fails when server has no task store configured."""
1039+
client_task_store = InMemoryTaskStore()
1040+
server = Server("test") # No task_store parameter
1041+
1042+
async with create_client_server_memory_streams() as (client_streams, server_streams):
1043+
client_read, client_write = client_streams
1044+
server_read, server_write = server_streams
1045+
1046+
async with anyio.create_task_group() as tg:
1047+
tg.start_soon(
1048+
lambda: server.run(
1049+
server_read,
1050+
server_write,
1051+
server.create_initialization_options(),
1052+
)
1053+
)
1054+
1055+
try:
1056+
async with ClientSession(
1057+
read_stream=client_read,
1058+
write_stream=client_write,
1059+
task_store=client_task_store,
1060+
) as client_session:
1061+
await client_session.initialize()
1062+
1063+
# Try to send ListTasksRequest
1064+
try:
1065+
await client_session.send_request(
1066+
types.ClientRequest(types.ListTasksRequest()),
1067+
types.ListTasksResult,
1068+
)
1069+
assert False, "Should have raised McpError"
1070+
except Exception as e:
1071+
assert "Task store not configured" in str(e) or str(types.INVALID_REQUEST) in str(e)
1072+
finally:
1073+
tg.cancel_scope.cancel()
1074+
1075+
1076+
@pytest.mark.anyio
1077+
async def test_delete_task_without_task_store():
1078+
"""Test DeleteTaskRequest fails when server has no task store configured."""
1079+
client_task_store = InMemoryTaskStore()
1080+
server = Server("test") # No task_store parameter
1081+
1082+
async with create_client_server_memory_streams() as (client_streams, server_streams):
1083+
client_read, client_write = client_streams
1084+
server_read, server_write = server_streams
1085+
1086+
async with anyio.create_task_group() as tg:
1087+
tg.start_soon(
1088+
lambda: server.run(
1089+
server_read,
1090+
server_write,
1091+
server.create_initialization_options(),
1092+
)
1093+
)
1094+
1095+
try:
1096+
async with ClientSession(
1097+
read_stream=client_read,
1098+
write_stream=client_write,
1099+
task_store=client_task_store,
1100+
) as client_session:
1101+
await client_session.initialize()
1102+
1103+
# Try to send DeleteTaskRequest
1104+
try:
1105+
await client_session.send_request(
1106+
types.ClientRequest(
1107+
types.DeleteTaskRequest(params=types.DeleteTaskParams(taskId="test-task"))
1108+
),
1109+
types.EmptyResult,
1110+
)
1111+
assert False, "Should have raised McpError"
1112+
except Exception as e:
1113+
assert "Task store not configured" in str(e) or str(types.INVALID_REQUEST) in str(e)
1114+
finally:
1115+
tg.cancel_scope.cancel()

0 commit comments

Comments
 (0)