@@ -35,7 +35,7 @@ async def test_server_session_initialize():
3535 client_to_server_send , client_to_server_receive = anyio .create_memory_object_stream [SessionMessage ](1 )
3636
3737 # Create a message handler to catch exceptions
38- async def message_handler ( # pragma: no cover
38+ async def message_handler (
3939 message : RequestResponder [types .ServerRequest , types .ClientResult ] | types .ServerNotification | Exception ,
4040 ) -> None :
4141 if isinstance (message , Exception ):
@@ -55,15 +55,15 @@ async def run_server():
5555 capabilities = ServerCapabilities (),
5656 ),
5757 ) as server_session :
58- async for message in server_session .incoming_messages : # pragma: no branch
59- if isinstance (message , Exception ): # pragma: no cover
58+ async for message in server_session .incoming_messages :
59+ assert message is not None , "Expected to receive messages"
60+ if isinstance (message , Exception ):
6061 raise message
6162
62- if isinstance (message , ClientNotification ) and isinstance (
63- message .root , InitializedNotification
64- ): # pragma: no branch
65- received_initialized = True
66- return
63+ assert isinstance (message , ClientNotification ), "Expected ClientNotification"
64+ assert isinstance (message .root , InitializedNotification ), "Expected InitializedNotification"
65+ received_initialized = True
66+ return
6767
6868 try :
6969 async with (
@@ -77,12 +77,70 @@ async def run_server():
7777 tg .start_soon (run_server )
7878
7979 await client_session .initialize ()
80- except anyio .ClosedResourceError : # pragma: no cover
80+ except anyio .ClosedResourceError :
81+ # This can happen if the server closes before the client finishes
8182 pass
8283
8384 assert received_initialized
8485
8586
87+ @pytest .mark .anyio
88+ async def test_server_session_initialize_with_title_and_description ():
89+ """Test that server_title and server_description are passed through to serverInfo."""
90+ server_to_client_send , server_to_client_receive = anyio .create_memory_object_stream [SessionMessage ](1 )
91+ client_to_server_send , client_to_server_receive = anyio .create_memory_object_stream [SessionMessage ](1 )
92+
93+ async def message_handler (
94+ message : RequestResponder [types .ServerRequest , types .ClientResult ] | types .ServerNotification | Exception ,
95+ ) -> None :
96+ if isinstance (message , Exception ):
97+ raise message
98+
99+ async def run_server ():
100+ async with ServerSession (
101+ client_to_server_receive ,
102+ server_to_client_send ,
103+ InitializationOptions (
104+ server_name = "test-server" ,
105+ server_version = "1.0.0" ,
106+ title = "Test Server Title" ,
107+ description = "A description of what this server does." ,
108+ capabilities = ServerCapabilities (),
109+ ),
110+ ) as server_session :
111+ async for message in server_session .incoming_messages :
112+ assert message is not None , "Expected to receive messages"
113+ if isinstance (message , Exception ):
114+ raise message
115+
116+ assert isinstance (message , ClientNotification ), "Expected ClientNotification"
117+ assert isinstance (message .root , InitializedNotification ), "Expected InitializedNotification"
118+ return
119+
120+ result : types .InitializeResult | None = None
121+ try :
122+ async with (
123+ ClientSession (
124+ server_to_client_receive ,
125+ client_to_server_send ,
126+ message_handler = message_handler ,
127+ ) as client_session ,
128+ anyio .create_task_group () as tg ,
129+ ):
130+ tg .start_soon (run_server )
131+
132+ result = await client_session .initialize ()
133+ except anyio .ClosedResourceError :
134+ # This can happen if the server closes before the client finishes
135+ pass
136+
137+ assert result is not None
138+ assert result .serverInfo .name == "test-server"
139+ assert result .serverInfo .title == "Test Server Title"
140+ assert result .serverInfo .version == "1.0.0"
141+ assert result .serverInfo .description == "A description of what this server does."
142+
143+
86144@pytest .mark .anyio
87145async def test_server_capabilities ():
88146 server = Server ("test" )
@@ -97,7 +155,7 @@ async def test_server_capabilities():
97155
98156 # Add a prompts handler
99157 @server .list_prompts ()
100- async def list_prompts () -> list [Prompt ]: # pragma: no cover
158+ async def list_prompts () -> list [Prompt ]:
101159 return []
102160
103161 caps = server .get_capabilities (notification_options , experimental_capabilities )
@@ -107,7 +165,7 @@ async def list_prompts() -> list[Prompt]: # pragma: no cover
107165
108166 # Add a resources handler
109167 @server .list_resources ()
110- async def list_resources () -> list [Resource ]: # pragma: no cover
168+ async def list_resources () -> list [Resource ]:
111169 return []
112170
113171 caps = server .get_capabilities (notification_options , experimental_capabilities )
@@ -117,7 +175,7 @@ async def list_resources() -> list[Resource]: # pragma: no cover
117175
118176 # Add a complete handler
119177 @server .completion ()
120- async def complete ( # pragma: no cover
178+ async def complete (
121179 ref : PromptReference | ResourceTemplateReference ,
122180 argument : CompletionArgument ,
123181 context : CompletionContext | None ,
@@ -153,15 +211,15 @@ async def run_server():
153211 capabilities = ServerCapabilities (),
154212 ),
155213 ) as server_session :
156- async for message in server_session .incoming_messages : # pragma: no branch
157- if isinstance (message , Exception ): # pragma: no cover
214+ async for message in server_session .incoming_messages :
215+ assert message is not None , "Expected to receive messages"
216+ if isinstance (message , Exception ):
158217 raise message
159218
160- if isinstance (message , types .ClientNotification ) and isinstance (
161- message .root , InitializedNotification
162- ): # pragma: no branch
163- received_initialized = True
164- return
219+ assert isinstance (message , types .ClientNotification ), "Expected ClientNotification"
220+ assert isinstance (message .root , InitializedNotification ), "Expected InitializedNotification"
221+ received_initialized = True
222+ return
165223
166224 async def mock_client ():
167225 nonlocal received_protocol_version
@@ -239,18 +297,18 @@ async def run_server():
239297 capabilities = ServerCapabilities (),
240298 ),
241299 ) as server_session :
242- async for message in server_session .incoming_messages : # pragma: no branch
243- if isinstance (message , Exception ): # pragma: no cover
300+ async for message in server_session .incoming_messages :
301+ assert message is not None , "Expected to receive messages"
302+ if isinstance (message , Exception ):
244303 raise message
245304
246305 # We should receive a ping request before initialization
247- if isinstance (message , RequestResponder ) and isinstance (
248- message .request .root , types .PingRequest
249- ): # pragma: no branch
250- # Respond to the ping
251- with message :
252- await message .respond (types .ServerResult (types .EmptyResult ()))
253- return
306+ assert isinstance (message , RequestResponder ), "Expected RequestResponder"
307+ assert isinstance (message .request .root , types .PingRequest ), "Expected PingRequest"
308+ # Respond to the ping
309+ with message :
310+ await message .respond (types .ServerResult (types .EmptyResult ()))
311+ return
254312
255313 async def mock_client ():
256314 nonlocal ping_response_received , ping_response_id
@@ -508,9 +566,9 @@ async def mock_client():
508566
509567 # Wait for the error response
510568 error_message = await server_to_client_receive .receive ()
511- if isinstance (error_message .message .root , types .JSONRPCError ): # pragma: no branch
512- error_response_received = True
513- error_code = error_message .message .root .error .code
569+ assert isinstance (error_message .message .root , types .JSONRPCError ), "Expected JSONRPCError response"
570+ error_response_received = True
571+ error_code = error_message .message .root .error .code
514572
515573 async with (
516574 client_to_server_send ,
0 commit comments