@@ -32,6 +32,7 @@ async def test_next_cursor_round_trips_through_the_client(connect: Connect) -> N
3232 """The next_cursor a list handler returns reaches the client, and the cursor the client sends
3333 back on the following call reaches the handler verbatim.
3434 """
35+ cursor = "page-2"
3536 seen_cursors : list [str | None ] = []
3637
3738 async def list_tools (ctx : ServerRequestContext , params : types .PaginatedRequestParams | None ) -> ListToolsResult :
@@ -40,21 +41,20 @@ async def list_tools(ctx: ServerRequestContext, params: types.PaginatedRequestPa
4041 if params .cursor is None :
4142 return ListToolsResult (
4243 tools = [Tool (name = "alpha" , input_schema = {"type" : "object" })],
43- next_cursor = "page-2" ,
44+ next_cursor = cursor ,
4445 )
4546 return ListToolsResult (tools = [Tool (name = "beta" , input_schema = {"type" : "object" })])
4647
4748 server = Server ("paginated" , on_list_tools = list_tools )
4849
4950 async with connect (server ) as client :
5051 first_page = await client .list_tools ()
51- second_page = await client .list_tools (cursor = "page-2" )
52+ second_page = await client .list_tools (cursor = first_page . next_cursor )
5253
53- assert first_page == snapshot (
54- ListToolsResult ( tools = [ Tool ( name = "alpha" , input_schema = { "type" : "object" })], next_cursor = "page-2" )
55- )
54+ assert first_page . next_cursor == cursor
55+ assert seen_cursors == [ None , cursor ]
56+ assert [ tool . name for tool in first_page . tools ] == [ "alpha" ]
5657 assert second_page == snapshot (ListToolsResult (tools = [Tool (name = "beta" , input_schema = {"type" : "object" })]))
57- assert seen_cursors == snapshot ([None , "page-2" ])
5858
5959
6060@requirement ("pagination:exhaustion" )
@@ -158,6 +158,7 @@ async def list_tools(ctx: ServerRequestContext, params: types.PaginatedRequestPa
158158@requirement ("resources:list:pagination" )
159159async def test_resources_list_supports_cursor_pagination (connect : Connect ) -> None :
160160 """resources/list round-trips the cursor like every other list operation."""
161+ cursor = "page-2"
161162 seen_cursors : list [str | None ] = []
162163
163164 async def list_resources (
@@ -166,25 +167,26 @@ async def list_resources(
166167 assert params is not None
167168 seen_cursors .append (params .cursor )
168169 if params .cursor is None :
169- return ListResourcesResult (resources = [Resource (uri = "memo://1" , name = "first" )], next_cursor = "page-2" )
170+ return ListResourcesResult (resources = [Resource (uri = "memo://1" , name = "first" )], next_cursor = cursor )
170171 return ListResourcesResult (resources = [Resource (uri = "memo://2" , name = "second" )])
171172
172173 server = Server ("paginated" , on_list_resources = list_resources )
173174
174175 async with connect (server ) as client :
175176 first_page = await client .list_resources ()
176- second_page = await client .list_resources (cursor = "page-2" )
177+ second_page = await client .list_resources (cursor = first_page . next_cursor )
177178
178- assert seen_cursors == snapshot ([None , "page-2" ])
179+ assert first_page .next_cursor == cursor
180+ assert seen_cursors == [None , cursor ]
179181 assert [resource .name for resource in first_page .resources ] == ["first" ]
180- assert first_page .next_cursor == "page-2"
181182 assert [resource .name for resource in second_page .resources ] == ["second" ]
182183 assert second_page .next_cursor is None
183184
184185
185186@requirement ("resources:templates:pagination" )
186187async def test_resource_templates_list_supports_cursor_pagination (connect : Connect ) -> None :
187188 """resources/templates/list round-trips the cursor like every other list operation."""
189+ cursor = "page-2"
188190 seen_cursors : list [str | None ] = []
189191
190192 async def list_resource_templates (
@@ -195,7 +197,7 @@ async def list_resource_templates(
195197 if params .cursor is None :
196198 return ListResourceTemplatesResult (
197199 resource_templates = [ResourceTemplate (name = "first" , uri_template = "users://{id}" )],
198- next_cursor = "page-2" ,
200+ next_cursor = cursor ,
199201 )
200202 return ListResourceTemplatesResult (
201203 resource_templates = [ResourceTemplate (name = "second" , uri_template = "teams://{id}" )]
@@ -205,35 +207,36 @@ async def list_resource_templates(
205207
206208 async with connect (server ) as client :
207209 first_page = await client .list_resource_templates ()
208- second_page = await client .list_resource_templates (cursor = "page-2" )
210+ second_page = await client .list_resource_templates (cursor = first_page . next_cursor )
209211
210- assert seen_cursors == snapshot ([None , "page-2" ])
212+ assert first_page .next_cursor == cursor
213+ assert seen_cursors == [None , cursor ]
211214 assert [template .name for template in first_page .resource_templates ] == ["first" ]
212- assert first_page .next_cursor == "page-2"
213215 assert [template .name for template in second_page .resource_templates ] == ["second" ]
214216 assert second_page .next_cursor is None
215217
216218
217219@requirement ("prompts:list:pagination" )
218220async def test_prompts_list_supports_cursor_pagination (connect : Connect ) -> None :
219221 """prompts/list round-trips the cursor like every other list operation."""
222+ cursor = "page-2"
220223 seen_cursors : list [str | None ] = []
221224
222225 async def list_prompts (ctx : ServerRequestContext , params : types .PaginatedRequestParams | None ) -> ListPromptsResult :
223226 assert params is not None
224227 seen_cursors .append (params .cursor )
225228 if params .cursor is None :
226- return ListPromptsResult (prompts = [Prompt (name = "first" )], next_cursor = "page-2" )
229+ return ListPromptsResult (prompts = [Prompt (name = "first" )], next_cursor = cursor )
227230 return ListPromptsResult (prompts = [Prompt (name = "second" )])
228231
229232 server = Server ("paginated" , on_list_prompts = list_prompts )
230233
231234 async with connect (server ) as client :
232235 first_page = await client .list_prompts ()
233- second_page = await client .list_prompts (cursor = "page-2" )
236+ second_page = await client .list_prompts (cursor = first_page . next_cursor )
234237
235- assert seen_cursors == snapshot ([None , "page-2" ])
238+ assert first_page .next_cursor == cursor
239+ assert seen_cursors == [None , cursor ]
236240 assert [prompt .name for prompt in first_page .prompts ] == ["first" ]
237- assert first_page .next_cursor == "page-2"
238241 assert [prompt .name for prompt in second_page .prompts ] == ["second" ]
239242 assert second_page .next_cursor is None
0 commit comments