Skip to content

Commit b2a2acf

Browse files
Fix test failures from httpx_client API changes
This commit fixes all test failures introduced by the API change from httpx_client_factory to direct httpx_client parameter: 1. Updated deprecated imports: Changed streamablehttp_client to streamable_http_client in test files 2. Fixed 307 redirect errors: Replaced httpx.AsyncClient with create_mcp_http_client which includes follow_redirects=True by default 3. Fixed test assertion: Updated test_session_group.py to mock create_mcp_http_client and verify the new API signature where streamable_http_client receives httpx_client parameter instead of individual headers/timeout parameters 4. Removed unused httpx import from main.py after inlining client creation All tests now pass with the new API.
1 parent a597b9a commit b2a2acf

File tree

4 files changed

+42
-11
lines changed

4 files changed

+42
-11
lines changed

examples/clients/simple-auth-client/mcp_simple_auth_client/main.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
from typing import Any
1616
from urllib.parse import parse_qs, urlparse
1717

18-
import httpx
19-
2018
from mcp.client.auth import OAuthClientProvider, TokenStorage
2119
from mcp.client.session import ClientSession
2220
from mcp.client.sse import sse_client

tests/client/test_notification_response.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from starlette.routing import Route
1919

2020
from mcp import ClientSession, types
21-
from mcp.client.streamable_http import streamablehttp_client
21+
from mcp.client.streamable_http import streamable_http_client
2222
from mcp.shared.session import RequestResponder
2323
from mcp.types import ClientNotification, RootsListChangedNotification
2424
from tests.test_helpers import wait_for_server
@@ -127,7 +127,7 @@ async def message_handler( # pragma: no cover
127127
if isinstance(message, Exception):
128128
returned_exception = message
129129

130-
async with streamablehttp_client(server_url) as (read_stream, write_stream, _):
130+
async with streamable_http_client(server_url) as (read_stream, write_stream, _):
131131
async with ClientSession(
132132
read_stream,
133133
write_stream,

tests/client/test_session_group.py

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,20 @@ async def test_establish_session_parameterized(
292292
):
293293
with mock.patch("mcp.client.session_group.mcp.ClientSession") as mock_ClientSession_class:
294294
with mock.patch(patch_target_for_client_func) as mock_specific_client_func:
295+
# For streamablehttp, also need to mock create_mcp_http_client
296+
if client_type_name == "streamablehttp":
297+
mock_create_http_client = mock.patch("mcp.client.session_group.create_mcp_http_client")
298+
mock_create_http_client_func = mock_create_http_client.start()
299+
# Mock httpx_client returned by create_mcp_http_client
300+
mock_httpx_client = mock.AsyncMock(name="MockHttpxClient")
301+
mock_httpx_client.__aenter__.return_value = mock_httpx_client
302+
mock_httpx_client.__aexit__ = mock.AsyncMock(return_value=None)
303+
mock_create_http_client_func.return_value = mock_httpx_client
304+
else:
305+
mock_create_http_client = None
306+
mock_create_http_client_func = None
307+
mock_httpx_client = None
308+
295309
mock_client_cm_instance = mock.AsyncMock(name=f"{client_type_name}ClientCM")
296310
mock_read_stream = mock.AsyncMock(name=f"{client_type_name}Read")
297311
mock_write_stream = mock.AsyncMock(name=f"{client_type_name}Write")
@@ -354,11 +368,22 @@ async def test_establish_session_parameterized(
354368
)
355369
elif client_type_name == "streamablehttp": # pragma: no branch
356370
assert isinstance(server_params_instance, StreamableHttpParameters)
371+
# Verify create_mcp_http_client was called with headers and timeout
372+
import httpx
373+
374+
assert mock_create_http_client_func is not None
375+
expected_timeout = httpx.Timeout(
376+
server_params_instance.timeout.total_seconds(),
377+
read=server_params_instance.sse_read_timeout.total_seconds(),
378+
)
379+
mock_create_http_client_func.assert_called_once_with(
380+
headers=server_params_instance.headers,
381+
timeout=expected_timeout,
382+
)
383+
# Verify streamable_http_client was called with url, httpx_client, and terminate_on_close
357384
mock_specific_client_func.assert_called_once_with(
358385
url=server_params_instance.url,
359-
headers=server_params_instance.headers,
360-
timeout=server_params_instance.timeout,
361-
sse_read_timeout=server_params_instance.sse_read_timeout,
386+
httpx_client=mock_httpx_client,
362387
terminate_on_close=server_params_instance.terminate_on_close,
363388
)
364389

@@ -382,3 +407,7 @@ async def test_establish_session_parameterized(
382407
# 3. Assert returned values
383408
assert returned_server_info is mock_initialize_result.serverInfo
384409
assert returned_session is mock_entered_session
410+
411+
# Clean up streamablehttp-specific mock
412+
if mock_create_http_client:
413+
mock_create_http_client.stop()

tests/shared/test_streamable_http.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
from mcp.client.session import ClientSession
2626
from mcp.client.streamable_http import StreamableHTTPTransport, streamable_http_client
2727
from mcp.server import Server
28-
from mcp.shared._httpx_utils import create_mcp_http_client
2928
from mcp.server.streamable_http import (
3029
MCP_PROTOCOL_VERSION_HEADER,
3130
MCP_SESSION_ID_HEADER,
@@ -39,6 +38,7 @@
3938
)
4039
from mcp.server.streamable_http_manager import StreamableHTTPSessionManager
4140
from mcp.server.transport_security import TransportSecuritySettings
41+
from mcp.shared._httpx_utils import create_mcp_http_client
4242
from mcp.shared.context import RequestContext
4343
from mcp.shared.exceptions import McpError
4444
from mcp.shared.message import ClientMessageMetadata, SessionMessage
@@ -1405,7 +1405,7 @@ async def test_streamablehttp_request_context_propagation(context_aware_server:
14051405
"X-Trace-Id": "trace-123",
14061406
}
14071407

1408-
async with httpx.AsyncClient(headers=custom_headers) as httpx_client:
1408+
async with create_mcp_http_client(headers=custom_headers) as httpx_client:
14091409
async with streamable_http_client(f"{basic_server_url}/mcp", httpx_client=httpx_client) as (
14101410
read_stream,
14111411
write_stream,
@@ -1443,8 +1443,12 @@ async def test_streamablehttp_request_context_isolation(context_aware_server: No
14431443
"Authorization": f"Bearer token-{i}",
14441444
}
14451445

1446-
async with httpx.AsyncClient(headers=headers) as httpx_client:
1447-
async with streamable_http_client(f"{basic_server_url}/mcp", httpx_client=httpx_client) as (read_stream, write_stream, _):
1446+
async with create_mcp_http_client(headers=headers) as httpx_client:
1447+
async with streamable_http_client(f"{basic_server_url}/mcp", httpx_client=httpx_client) as (
1448+
read_stream,
1449+
write_stream,
1450+
_,
1451+
):
14481452
async with ClientSession(read_stream, write_stream) as session:
14491453
await session.initialize()
14501454

0 commit comments

Comments
 (0)