|
12 | 12 |
|
13 | 13 | pytestmark = pytest.mark.anyio |
14 | 14 |
|
| 15 | + |
15 | 16 | async def test_report_progress_passes_related_request_id() -> None: |
16 | 17 | """report_progress must forward request_id as related_request_id.""" |
17 | 18 | mock_session = AsyncMock() |
18 | 19 | mock_session.send_progress_notification = AsyncMock() |
| 20 | + |
19 | 21 | 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(), |
| 22 | + request_id="req-2001", |
| 23 | + session=mock_session, |
| 24 | + meta={"progress_token": "tok-progress"}, |
| 25 | + lifespan_context=None, |
| 26 | + experimental=Experimental(), |
25 | 27 | ) |
| 28 | + |
26 | 29 | ctx = Context(request_context=request_context, mcp_server=MagicMock()) |
| 30 | + |
27 | 31 | await ctx.report_progress(25, 100, message="quarter done") |
28 | 32 | await ctx.report_progress(50, 100) |
29 | 33 | await ctx.report_progress(100, 100, message="complete") |
| 34 | + |
30 | 35 | assert mock_session.send_progress_notification.call_count == 3 |
| 36 | + |
31 | 37 | 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", |
| 38 | + progress_token="tok-progress", |
| 39 | + progress=25.0, |
| 40 | + total=100.0, |
| 41 | + message="quarter done", |
| 42 | + related_request_id="req-2001", |
37 | 43 | ) |
38 | 44 | 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", |
| 45 | + progress_token="tok-progress", |
| 46 | + progress=50.0, |
| 47 | + total=100.0, |
| 48 | + message=None, |
| 49 | + related_request_id="req-2001", |
44 | 50 | ) |
45 | 51 | 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", |
| 52 | + progress_token="tok-progress", |
| 53 | + progress=100.0, |
| 54 | + total=100.0, |
| 55 | + message="complete", |
| 56 | + related_request_id="req-2001", |
51 | 57 | ) |
52 | 58 |
|
| 59 | + |
53 | 60 | async def test_report_progress_no_token_skips_notification() -> None: |
54 | 61 | """report_progress is a no-op when no progress_token is present.""" |
55 | 62 | mock_session = AsyncMock() |
56 | 63 | mock_session.send_progress_notification = AsyncMock() |
| 64 | + |
57 | 65 | request_context = ServerRequestContext( |
58 | | - request_id="req-no-token", |
59 | | - session=mock_session, |
60 | | - meta={}, |
61 | | - lifespan_context=None, |
62 | | - experimental=Experimental(), |
| 66 | + request_id="req-no-token", |
| 67 | + session=mock_session, |
| 68 | + meta={}, |
| 69 | + lifespan_context=None, |
| 70 | + experimental=Experimental(), |
63 | 71 | ) |
| 72 | + |
64 | 73 | ctx = Context(request_context=request_context, mcp_server=MagicMock()) |
| 74 | + |
65 | 75 | await ctx.report_progress(50, 100) |
66 | | -mock_session.send_progress_notification.assert_not_called() |
| 76 | + |
| 77 | + mock_session.send_progress_notification.assert_not_called() |
| 78 | + |
67 | 79 |
|
68 | 80 | async def test_report_progress_integer_token() -> None: |
69 | 81 | """report_progress works when progress_token is an integer (e.g. 0).""" |
70 | 82 | mock_session = AsyncMock() |
71 | 83 | mock_session.send_progress_notification = AsyncMock() |
| 84 | + |
72 | 85 | 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(), |
| 86 | + request_id="req-int-token", |
| 87 | + session=mock_session, |
| 88 | + meta={"progress_token": 0}, |
| 89 | + lifespan_context=None, |
| 90 | + experimental=Experimental(), |
78 | 91 | ) |
| 92 | + |
79 | 93 | ctx = Context(request_context=request_context, mcp_server=MagicMock()) |
| 94 | + |
80 | 95 | await ctx.report_progress(1, 10) |
| 96 | + |
81 | 97 | 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", |
| 98 | + progress_token=0, |
| 99 | + progress=1.0, |
| 100 | + total=10.0, |
| 101 | + message=None, |
| 102 | + related_request_id="req-int-token", |
87 | 103 | ) |
0 commit comments