@@ -67,6 +67,29 @@ async def test_handle_returns_result_for_completed_task(
6767 assert "io.modelcontextprotocol/related-task" in response .meta
6868
6969
70+ @pytest .mark .anyio
71+ async def test_handle_omits_none_fields_from_completed_task_payload (
72+ store : InMemoryTaskStore , queue : InMemoryTaskMessageQueue , handler : TaskResultHandler
73+ ) -> None :
74+ """Test task result payloads omit optional None fields instead of serializing null."""
75+ task = await store .create_task (TaskMetadata (ttl = 60000 ), task_id = "test-task" )
76+ result = CallToolResult (content = [TextContent (type = "text" , text = "Done!" )])
77+ await store .store_result (task .taskId , result )
78+ await store .update_task (task .taskId , status = "completed" )
79+
80+ mock_session = Mock ()
81+ mock_session .send_message = AsyncMock ()
82+
83+ request = GetTaskPayloadRequest (params = GetTaskPayloadRequestParams (taskId = task .taskId ))
84+ response = await handler .handle (request , mock_session , "req-1" )
85+
86+ payload = response .model_dump (by_alias = True , mode = "json" )
87+ assert payload ["content" ] == [{"type" : "text" , "text" : "Done!" }]
88+ assert "annotations" not in payload ["content" ][0 ]
89+ assert "_meta" not in payload ["content" ][0 ]
90+ assert "io.modelcontextprotocol/related-task" in payload ["_meta" ]
91+
92+
7093@pytest .mark .anyio
7194async def test_handle_raises_for_nonexistent_task (
7295 store : InMemoryTaskStore , queue : InMemoryTaskMessageQueue , handler : TaskResultHandler
0 commit comments