9
9
The same test code is run on both to ensure parity.
10
10
"""
11
11
12
+ import typing as t
12
13
from collections .abc import AsyncGenerator , Awaitable , Callable
13
14
from contextlib import AbstractAsyncContextManager , asynccontextmanager
14
15
from unittest .mock import AsyncMock
25
26
26
27
TOOL_INPUT_SCHEMA = {"type" : "object" , "properties" : {"input1" : {"type" : "string" }}}
27
28
28
- SessionContextManager = Callable [[Server ], AbstractAsyncContextManager [ClientSession ]]
29
+ SessionContextManager = Callable [[Server [ object ] ], AbstractAsyncContextManager [ClientSession ]]
29
30
30
31
# Direct server connection
31
32
in_memory : SessionContextManager = create_connected_server_and_client_session
32
33
33
34
34
35
@asynccontextmanager
35
- async def proxy (server : Server ) -> AsyncGenerator [ClientSession , None ]:
36
+ async def proxy (server : Server [ object ] ) -> AsyncGenerator [ClientSession , None ]:
36
37
"""Create a connection to the server through the proxy server."""
37
38
async with in_memory (server ) as session :
38
39
wrapped_server = await create_proxy_server (session )
@@ -49,16 +50,16 @@ def session_generator(request: pytest.FixtureRequest) -> SessionContextManager:
49
50
50
51
51
52
@pytest .fixture
52
- def server () -> Server :
53
+ def server () -> Server [ object ] :
53
54
"""Return a server instance."""
54
55
return Server ("test-server" )
55
56
56
57
57
58
@pytest .fixture
58
- def server_can_list_prompts (server : Server , prompt : types .Prompt ) -> Server :
59
+ def server_can_list_prompts (server : Server [ object ] , prompt : types .Prompt ) -> Server [ object ] :
59
60
"""Return a server instance with prompts."""
60
61
61
- @server .list_prompts ()
62
+ @server .list_prompts () # type: ignore[no-untyped-call,misc]
62
63
async def _ () -> list [types .Prompt ]:
63
64
return [prompt ]
64
65
@@ -67,39 +68,42 @@ async def _() -> list[types.Prompt]:
67
68
68
69
@pytest .fixture
69
70
def server_can_get_prompt (
70
- server_can_list_prompts : Server ,
71
+ server_can_list_prompts : Server [ object ] ,
71
72
prompt_callback : Callable [[str , dict [str , str ] | None ], Awaitable [types .GetPromptResult ]],
72
- ) -> Server :
73
+ ) -> Server [ object ] :
73
74
"""Return a server instance with prompts."""
74
- server_can_list_prompts .get_prompt ()(prompt_callback )
75
+ server_can_list_prompts .get_prompt ()(prompt_callback ) # type: ignore[no-untyped-call]
75
76
76
77
return server_can_list_prompts
77
78
78
79
79
80
@pytest .fixture
80
- def server_can_list_tools (server : Server , tool : types .Tool ) -> Server :
81
+ def server_can_list_tools (server : Server [ object ] , tool : types .Tool ) -> Server [ object ] :
81
82
"""Return a server instance with tools."""
82
83
83
- @server .list_tools ()
84
+ @server .list_tools () # type: ignore[no-untyped-call,misc]
84
85
async def _ () -> list [types .Tool ]:
85
86
return [tool ]
86
87
87
88
return server
88
89
89
90
90
91
@pytest .fixture
91
- def server_can_call_tool (server_can_list_tools : Server , tool : Callable [..., ...]) -> Server :
92
+ def server_can_call_tool (
93
+ server_can_list_tools : Server [object ],
94
+ tool : Callable [..., t .Any ],
95
+ ) -> Server [object ]:
92
96
"""Return a server instance with tools."""
93
- server_can_list_tools .call_tool ()(tool )
97
+ server_can_list_tools .call_tool ()(tool ) # type: ignore[no-untyped-call]
94
98
95
99
return server_can_list_tools
96
100
97
101
98
102
@pytest .fixture
99
- def server_can_list_resources (server : Server , resource : types .Resource ) -> Server :
103
+ def server_can_list_resources (server : Server [ object ] , resource : types .Resource ) -> Server [ object ] :
100
104
"""Return a server instance with resources."""
101
105
102
- @server .list_resources ()
106
+ @server .list_resources () # type: ignore[no-untyped-call,misc]
103
107
async def _ () -> list [types .Resource ]:
104
108
return [resource ]
105
109
@@ -108,73 +112,73 @@ async def _() -> list[types.Resource]:
108
112
109
113
@pytest .fixture
110
114
def server_can_subscribe_resource (
111
- server_can_list_resources : Server ,
115
+ server_can_list_resources : Server [ object ] ,
112
116
subscribe_callback : Callable [[AnyUrl ], Awaitable [None ]],
113
- ) -> Server :
117
+ ) -> Server [ object ] :
114
118
"""Return a server instance with resource templates."""
115
- server_can_list_resources .subscribe_resource ()(subscribe_callback )
119
+ server_can_list_resources .subscribe_resource ()(subscribe_callback ) # type: ignore[no-untyped-call]
116
120
117
121
return server_can_list_resources
118
122
119
123
120
124
@pytest .fixture
121
125
def server_can_unsubscribe_resource (
122
- server_can_list_resources : Server ,
126
+ server_can_list_resources : Server [ object ] ,
123
127
unsubscribe_callback : Callable [[AnyUrl ], Awaitable [None ]],
124
- ) -> Server :
128
+ ) -> Server [ object ] :
125
129
"""Return a server instance with resource templates."""
126
- server_can_list_resources .unsubscribe_resource ()(unsubscribe_callback )
130
+ server_can_list_resources .unsubscribe_resource ()(unsubscribe_callback ) # type: ignore[no-untyped-call]
127
131
128
132
return server_can_list_resources
129
133
130
134
131
135
@pytest .fixture
132
136
def server_can_read_resource (
133
- server_can_list_resources : Server ,
137
+ server_can_list_resources : Server [ object ] ,
134
138
resource_callback : Callable [[AnyUrl ], Awaitable [str | bytes ]],
135
- ) -> Server :
139
+ ) -> Server [ object ] :
136
140
"""Return a server instance with resources."""
137
- server_can_list_resources .read_resource ()(resource_callback )
141
+ server_can_list_resources .read_resource ()(resource_callback ) # type: ignore[no-untyped-call]
138
142
139
143
return server_can_list_resources
140
144
141
145
142
146
@pytest .fixture
143
147
def server_can_set_logging_level (
144
- server : Server ,
148
+ server : Server [ object ] ,
145
149
logging_level_callback : Callable [[types .LoggingLevel ], Awaitable [None ]],
146
- ) -> Server :
150
+ ) -> Server [ object ] :
147
151
"""Return a server instance with logging capabilities."""
148
- server .set_logging_level ()(logging_level_callback )
152
+ server .set_logging_level ()(logging_level_callback ) # type: ignore[no-untyped-call]
149
153
150
154
return server
151
155
152
156
153
157
@pytest .fixture
154
158
def server_can_send_progress_notification (
155
- server : Server ,
156
- ) -> Server :
159
+ server : Server [ object ] ,
160
+ ) -> Server [ object ] :
157
161
"""Return a server instance with logging capabilities."""
158
162
return server
159
163
160
164
161
165
@pytest .fixture
162
166
def server_can_complete (
163
- server : Server ,
167
+ server : Server [ object ] ,
164
168
complete_callback : Callable [
165
169
[types .PromptReference | types .ResourceReference , types .CompletionArgument ],
166
170
Awaitable [types .Completion | None ],
167
171
],
168
- ) -> Server :
172
+ ) -> Server [ object ] :
169
173
"""Return a server instance with logging capabilities."""
170
- server .completion ()(complete_callback )
174
+ server .completion ()(complete_callback ) # type: ignore[no-untyped-call]
171
175
return server
172
176
173
177
174
178
@pytest .mark .parametrize ("prompt" , [types .Prompt (name = "prompt1" )])
175
179
async def test_list_prompts (
176
180
session_generator : SessionContextManager ,
177
- server_can_list_prompts : Server ,
181
+ server_can_list_prompts : Server [ object ] ,
178
182
prompt : types .Prompt ,
179
183
) -> None :
180
184
"""Test list_prompts."""
@@ -205,7 +209,7 @@ async def test_list_prompts(
205
209
)
206
210
async def test_list_tools (
207
211
session_generator : SessionContextManager ,
208
- server_can_list_tools : Server ,
212
+ server_can_list_tools : Server [ object ] ,
209
213
tool : types .Tool ,
210
214
) -> None :
211
215
"""Test list_tools."""
@@ -231,7 +235,7 @@ async def test_list_tools(
231
235
)
232
236
async def test_set_logging_error (
233
237
session_generator : SessionContextManager ,
234
- server_can_set_logging_level : Server ,
238
+ server_can_set_logging_level : Server [ object ] ,
235
239
logging_level_callback : AsyncMock ,
236
240
log_level : types .LoggingLevel ,
237
241
) -> None :
@@ -253,7 +257,7 @@ async def test_set_logging_error(
253
257
@pytest .mark .parametrize ("tool" , [AsyncMock ()])
254
258
async def test_call_tool (
255
259
session_generator : SessionContextManager ,
256
- server_can_call_tool : Server ,
260
+ server_can_call_tool : Server [ object ] ,
257
261
tool : AsyncMock ,
258
262
) -> None :
259
263
"""Test call_tool."""
@@ -287,7 +291,7 @@ async def test_call_tool(
287
291
)
288
292
async def test_list_resources (
289
293
session_generator : SessionContextManager ,
290
- server_can_list_resources : Server ,
294
+ server_can_list_resources : Server [ object ] ,
291
295
resource : types .Resource ,
292
296
) -> None :
293
297
"""Test get_resource."""
@@ -307,7 +311,7 @@ async def test_list_resources(
307
311
@pytest .mark .parametrize ("prompt" , [types .Prompt (name = "prompt1" )])
308
312
async def test_get_prompt (
309
313
session_generator : SessionContextManager ,
310
- server_can_get_prompt : Server ,
314
+ server_can_get_prompt : Server [ object ] ,
311
315
prompt_callback : AsyncMock ,
312
316
) -> None :
313
317
"""Test get_prompt."""
@@ -334,7 +338,7 @@ async def test_get_prompt(
334
338
)
335
339
async def test_read_resource (
336
340
session_generator : SessionContextManager ,
337
- server_can_read_resource : Server ,
341
+ server_can_read_resource : Server [ object ] ,
338
342
resource_callback : AsyncMock ,
339
343
resource : types .Resource ,
340
344
) -> None :
@@ -361,7 +365,7 @@ async def test_read_resource(
361
365
)
362
366
async def test_subscribe_resource (
363
367
session_generator : SessionContextManager ,
364
- server_can_subscribe_resource : Server ,
368
+ server_can_subscribe_resource : Server [ object ] ,
365
369
subscribe_callback : AsyncMock ,
366
370
resource : types .Resource ,
367
371
) -> None :
@@ -388,7 +392,7 @@ async def test_subscribe_resource(
388
392
)
389
393
async def test_unsubscribe_resource (
390
394
session_generator : SessionContextManager ,
391
- server_can_unsubscribe_resource : Server ,
395
+ server_can_unsubscribe_resource : Server [ object ] ,
392
396
unsubscribe_callback : AsyncMock ,
393
397
resource : types .Resource ,
394
398
) -> None :
@@ -404,7 +408,7 @@ async def test_unsubscribe_resource(
404
408
405
409
async def test_send_progress_notification (
406
410
session_generator : SessionContextManager ,
407
- server_can_send_progress_notification : Server ,
411
+ server_can_send_progress_notification : Server [ object ] ,
408
412
) -> None :
409
413
"""Test send_progress_notification."""
410
414
async with session_generator (server_can_send_progress_notification ) as session :
@@ -420,7 +424,7 @@ async def test_send_progress_notification(
420
424
@pytest .mark .parametrize ("complete_callback" , [AsyncMock ()])
421
425
async def test_complete (
422
426
session_generator : SessionContextManager ,
423
- server_can_complete : Server ,
427
+ server_can_complete : Server [ object ] ,
424
428
complete_callback : AsyncMock ,
425
429
) -> None :
426
430
"""Test complete."""
@@ -445,7 +449,7 @@ async def test_complete(
445
449
@pytest .mark .parametrize ("tool" , [AsyncMock ()])
446
450
async def test_call_tool_with_error (
447
451
session_generator : SessionContextManager ,
448
- server_can_call_tool : Server ,
452
+ server_can_call_tool : Server [ object ] ,
449
453
tool : AsyncMock ,
450
454
) -> None :
451
455
"""Test call_tool."""
0 commit comments