11import contextlib
22
3- import anyio
43import httpx
54import pytest
65from httpx_sse import ServerSentEvent
76
87from mcp .client .streamable_http import RequestContext , StreamableHTTPTransport
8+ from mcp .shared ._context_streams import create_context_streams
99from mcp .shared .message import ClientMessageMetadata , SessionMessage
1010from mcp .types import JSONRPCRequest
1111
@@ -32,7 +32,7 @@ async def spy_aclose() -> None:
3232
3333 monkeypatch .setattr ("mcp.client.streamable_http.EventSource" , _RaiseEventSource )
3434
35- send_stream , receive_stream = anyio . create_memory_object_stream [SessionMessage | Exception ](1 )
35+ send_stream , receive_stream = create_context_streams [SessionMessage | Exception ](1 )
3636 async with send_stream , receive_stream :
3737 transport = StreamableHTTPTransport ("http://example.invalid/mcp" )
3838 async with httpx .AsyncClient (transport = httpx .MockTransport (lambda _ : httpx .Response (200 ))) as client :
@@ -53,13 +53,13 @@ async def test_handle_resumption_request_closes_response_when_aconnect_sse_raise
5353 monkeypatch : pytest .MonkeyPatch ,
5454) -> None :
5555 @contextlib .asynccontextmanager
56- async def fake_aconnect_sse (* _args , ** _kwargs ):
56+ async def fake_aconnect_sse (* _args : object , ** _kwargs : object ):
5757 raise RuntimeError ("connect failed" )
5858 yield
5959
6060 monkeypatch .setattr ("mcp.client.streamable_http.aconnect_sse" , fake_aconnect_sse )
6161
62- send_stream , receive_stream = anyio . create_memory_object_stream [SessionMessage | Exception ](1 )
62+ send_stream , receive_stream = create_context_streams [SessionMessage | Exception ](1 )
6363 async with send_stream , receive_stream :
6464 transport = StreamableHTTPTransport ("http://example.invalid/mcp" )
6565 metadata = ClientMessageMetadata (resumption_token = "1" )
@@ -72,8 +72,14 @@ async def fake_aconnect_sse(*_args, **_kwargs):
7272 read_stream_writer = send_stream ,
7373 )
7474
75- with pytest .raises (RuntimeError , match = "connect failed" ):
75+ error : RuntimeError | None = None
76+ try :
7677 await transport ._handle_resumption_request (ctx )
78+ except RuntimeError as exc :
79+ error = exc
80+
81+ assert error is not None
82+ assert str (error ) == "connect failed"
7783
7884
7985@pytest .mark .anyio
@@ -92,12 +98,12 @@ async def spy_aclose() -> None:
9298 response .aclose = spy_aclose # type: ignore[method-assign]
9399
94100 @contextlib .asynccontextmanager
95- async def fake_aconnect_sse (* _args , ** _kwargs ):
101+ async def fake_aconnect_sse (* _args : object , ** _kwargs : object ):
96102 yield _RaiseEventSource (response )
97103
98104 monkeypatch .setattr ("mcp.client.streamable_http.aconnect_sse" , fake_aconnect_sse )
99105
100- send_stream , receive_stream = anyio . create_memory_object_stream [SessionMessage | Exception ](1 )
106+ send_stream , receive_stream = create_context_streams [SessionMessage | Exception ](1 )
101107 async with send_stream , receive_stream :
102108 transport = StreamableHTTPTransport ("http://example.invalid/mcp" )
103109 metadata = ClientMessageMetadata (resumption_token = "1" )
@@ -110,7 +116,13 @@ async def fake_aconnect_sse(*_args, **_kwargs):
110116 read_stream_writer = send_stream ,
111117 )
112118
113- with pytest .raises (RuntimeError , match = "boom" ):
119+ error : RuntimeError | None = None
120+ try :
114121 await transport ._handle_resumption_request (ctx )
122+ except RuntimeError as exc :
123+ error = exc
124+
125+ assert error is not None
126+ assert str (error ) == "boom"
115127
116128 assert closed
0 commit comments