Skip to content

Commit 1c9b3ce

Browse files
Fix test failures by making mock app.run block until cancelled
The tests were failing because AsyncMock(return_value=None) caused app.run to complete immediately, which closed the transport streams and triggered cleanup that removed transports from _server_instances before assertions could check for them. Now using mock_app_run that calls anyio.sleep_forever() and blocks until the test context cancels it. This keeps transports alive during the test assertions.
1 parent a06fde7 commit 1c9b3ce

File tree

1 file changed

+17
-8
lines changed

1 file changed

+17
-8
lines changed

tests/server/test_session_roaming.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,15 @@
2626
from mcp.types import JSONRPCMessage
2727

2828

29+
async def mock_app_run(*args: Any, **kwargs: Any) -> None:
30+
"""Mock app.run that blocks until cancelled instead of completing immediately."""
31+
try:
32+
await anyio.sleep_forever()
33+
except anyio.get_cancelled_exc_class():
34+
# Task was cancelled, which is expected when test exits
35+
pass
36+
37+
2938
class SimpleEventStore(EventStore):
3039
"""Simple in-memory event store for testing session roaming."""
3140

@@ -76,8 +85,8 @@ async def test_session_roaming_with_eventstore():
7685
# Create first manager instance (simulating pod 1)
7786
manager1 = StreamableHTTPSessionManager(app=app, event_store=event_store)
7887

79-
# Mock app.run to complete immediately
80-
app.run = AsyncMock(return_value=None) # type: ignore[method-assign]
88+
# Mock app.run to block until cancelled
89+
app.run = mock_app_run # type: ignore[method-assign]
8190

8291
sent_messages: list[Message] = []
8392

@@ -122,7 +131,7 @@ async def mock_receive() -> dict[str, Any]:
122131
manager2 = StreamableHTTPSessionManager(app=app, event_store=event_store)
123132

124133
# Mock app.run for manager2
125-
app.run = AsyncMock(return_value=None) # type: ignore[method-assign]
134+
app.run = mock_app_run # type: ignore[method-assign]
126135

127136
# Start manager2 and use the session from manager1
128137
async with manager2.run():
@@ -199,7 +208,7 @@ async def test_session_roaming_concurrent_requests():
199208

200209
# Create first manager and a session
201210
manager1 = StreamableHTTPSessionManager(app=app, event_store=event_store)
202-
app.run = AsyncMock(return_value=None) # type: ignore[method-assign]
211+
app.run = mock_app_run # type: ignore[method-assign]
203212

204213
sent_messages: list[Message] = []
205214

@@ -235,7 +244,7 @@ async def mock_receive() -> dict[str, Any]:
235244

236245
# Create second manager
237246
manager2 = StreamableHTTPSessionManager(app=app, event_store=event_store)
238-
app.run = AsyncMock(return_value=None) # type: ignore[method-assign]
247+
app.run = mock_app_run # type: ignore[method-assign]
239248

240249
async with manager2.run():
241250
# Make two concurrent requests with the same roaming session ID
@@ -362,7 +371,7 @@ async def test_session_roaming_fast_path_unchanged():
362371
event_store = SimpleEventStore()
363372
manager = StreamableHTTPSessionManager(app=app, event_store=event_store)
364373

365-
app.run = AsyncMock(return_value=None) # type: ignore[method-assign]
374+
app.run = mock_app_run # type: ignore[method-assign]
366375

367376
sent_messages: list[Message] = []
368377

@@ -433,7 +442,7 @@ async def test_session_roaming_logs_correctly(caplog: Any): # type: ignore[misc
433442

434443
# Create first manager and session
435444
manager1 = StreamableHTTPSessionManager(app=app, event_store=event_store)
436-
app.run = AsyncMock(return_value=None) # type: ignore[method-assign]
445+
app.run = mock_app_run # type: ignore[method-assign]
437446

438447
sent_messages: list[Message] = []
439448

@@ -471,7 +480,7 @@ async def mock_receive() -> dict[str, Any]:
471480

472481
# Create second manager
473482
manager2 = StreamableHTTPSessionManager(app=app, event_store=event_store)
474-
app.run = AsyncMock(return_value=None) # type: ignore[method-assign]
483+
app.run = mock_app_run # type: ignore[method-assign]
475484

476485
async with manager2.run():
477486
scope_with_session = {

0 commit comments

Comments
 (0)