Skip to content

Commit 0b1d01a

Browse files
authored
fix: correct indentation and simplify docstrings in regression test
1 parent d4c364e commit 0b1d01a

1 file changed

Lines changed: 63 additions & 93 deletions

File tree

Lines changed: 63 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,6 @@
1-
"""Regression test for https://github.com/modelcontextprotocol/python-sdk/issues/2001.
2-
3-
Progress notifications not delivered via SSE in stateless HTTP mode.
4-
5-
Root cause: Context.report_progress() was calling send_progress_notification()
6-
without passing related_request_id. The SSE / streamable-HTTP transport uses
7-
that field to route server-initiated messages back to the correct client stream;
8-
without it notifications are silently dropped.
9-
10-
Fix: pass related_request_id=self.request_id in send_progress_notification(),
11-
consistent with how send_log_message() already works.
12-
"""
1+
# Regression test for issue #2001 - progress notifications via SSE in stateless HTTP
2+
# Root cause: send_progress_notification() called without related_request_id.
3+
# Fix: pass related_request_id=self.request_id - see mcpserver/context.py
134

145
from unittest.mock import AsyncMock, MagicMock
156

@@ -21,97 +12,76 @@
2112

2213
pytestmark = pytest.mark.anyio
2314

24-
2515
async def test_report_progress_passes_related_request_id() -> None:
26-
"""report_progress must forward request_id as related_request_id.
27-
28-
Without related_request_id the streamable-HTTP transport cannot route
29-
progress notifications to the correct SSE stream; they are silently
30-
dropped. Regression test for issue #2001.
31-
"""
16+
"""report_progress must forward request_id as related_request_id."""
3217
mock_session = AsyncMock()
3318
mock_session.send_progress_notification = AsyncMock()
34-
35-
request_context = ServerRequestContext(
36-
request_id="req-2001",
37-
session=mock_session,
38-
meta={"progress_token": "tok-progress"},
39-
lifespan_context=None,
40-
experimental=Experimental(),
41-
)
42-
43-
ctx = Context(request_context=request_context, mcp_server=MagicMock())
44-
45-
await ctx.report_progress(25, 100, message="quarter done")
46-
await ctx.report_progress(50, 100)
47-
await ctx.report_progress(100, 100, message="complete")
48-
49-
assert mock_session.send_progress_notification.call_count == 3
50-
51-
mock_session.send_progress_notification.assert_any_call(
52-
progress_token="tok-progress",
53-
progress=25.0,
54-
total=100.0,
55-
message="quarter done",
56-
related_request_id="req-2001",
57-
)
58-
mock_session.send_progress_notification.assert_any_call(
59-
progress_token="tok-progress",
60-
progress=50.0,
61-
total=100.0,
62-
message=None,
63-
related_request_id="req-2001",
64-
)
65-
mock_session.send_progress_notification.assert_any_call(
66-
progress_token="tok-progress",
67-
progress=100.0,
68-
total=100.0,
69-
message="complete",
70-
related_request_id="req-2001",
71-
)
72-
19+
request_context = ServerRequestContext(
20+
request_id="req-2001",
21+
session=mock_session,
22+
meta={"progress_token": "tok-progress"},
23+
lifespan_context=None,
24+
experimental=Experimental(),
25+
)
26+
ctx = Context(request_context=request_context, mcp_server=MagicMock())
27+
await ctx.report_progress(25, 100, message="quarter done")
28+
await ctx.report_progress(50, 100)
29+
await ctx.report_progress(100, 100, message="complete")
30+
assert mock_session.send_progress_notification.call_count == 3
31+
mock_session.send_progress_notification.assert_any_call(
32+
progress_token="tok-progress",
33+
progress=25.0,
34+
total=100.0,
35+
message="quarter done",
36+
related_request_id="req-2001",
37+
)
38+
mock_session.send_progress_notification.assert_any_call(
39+
progress_token="tok-progress",
40+
progress=50.0,
41+
total=100.0,
42+
message=None,
43+
related_request_id="req-2001",
44+
)
45+
mock_session.send_progress_notification.assert_any_call(
46+
progress_token="tok-progress",
47+
progress=100.0,
48+
total=100.0,
49+
message="complete",
50+
related_request_id="req-2001",
51+
)
7352

7453
async def test_report_progress_no_token_skips_notification() -> None:
7554
"""report_progress is a no-op when no progress_token is present."""
7655
mock_session = AsyncMock()
7756
mock_session.send_progress_notification = AsyncMock()
78-
79-
request_context = ServerRequestContext(
80-
request_id="req-no-token",
81-
session=mock_session,
82-
meta={},
83-
lifespan_context=None,
84-
experimental=Experimental(),
85-
)
86-
87-
ctx = Context(request_context=request_context, mcp_server=MagicMock())
88-
89-
await ctx.report_progress(50, 100)
90-
91-
mock_session.send_progress_notification.assert_not_called()
92-
57+
request_context = ServerRequestContext(
58+
request_id="req-no-token",
59+
session=mock_session,
60+
meta={},
61+
lifespan_context=None,
62+
experimental=Experimental(),
63+
)
64+
ctx = Context(request_context=request_context, mcp_server=MagicMock())
65+
await ctx.report_progress(50, 100)
66+
mock_session.send_progress_notification.assert_not_called()
9367

9468
async def test_report_progress_integer_token() -> None:
9569
"""report_progress works when progress_token is an integer (e.g. 0)."""
9670
mock_session = AsyncMock()
9771
mock_session.send_progress_notification = AsyncMock()
98-
99-
request_context = ServerRequestContext(
100-
request_id="req-int-token",
101-
session=mock_session,
102-
meta={"progress_token": 0},
103-
lifespan_context=None,
104-
experimental=Experimental(),
105-
)
106-
107-
ctx = Context(request_context=request_context, mcp_server=MagicMock())
108-
109-
await ctx.report_progress(1, 10)
110-
111-
mock_session.send_progress_notification.assert_awaited_once_with(
112-
progress_token=0,
113-
progress=1.0,
114-
total=10.0,
115-
message=None,
116-
related_request_id="req-int-token",
117-
)
72+
request_context = ServerRequestContext(
73+
request_id="req-int-token",
74+
session=mock_session,
75+
meta={"progress_token": 0},
76+
lifespan_context=None,
77+
experimental=Experimental(),
78+
)
79+
ctx = Context(request_context=request_context, mcp_server=MagicMock())
80+
await ctx.report_progress(1, 10)
81+
mock_session.send_progress_notification.assert_awaited_once_with(
82+
progress_token=0,
83+
progress=1.0,
84+
total=10.0,
85+
message=None,
86+
related_request_id="req-int-token",
87+
)

0 commit comments

Comments
 (0)