@@ -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
208252async 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