From 5d9d63096ff11942ad8db34859af02bf1e5f12d2 Mon Sep 17 00:00:00 2001 From: c <37263590+Aphroq@users.noreply.github.com> Date: Fri, 1 May 2026 17:18:54 +0000 Subject: [PATCH 1/2] test: add realtime tool output serialization edge cases Add focused realtime serialization coverage for _serialize_tool_output. - serialize None as JSON null - serialize lists as JSON arrays - serialize dataclass instances via asdict - fall back to string output for raw bytes --- tests/realtime/test_session.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/realtime/test_session.py b/tests/realtime/test_session.py index c1c919a866..dd94bc93b5 100644 --- a/tests/realtime/test_session.py +++ b/tests/realtime/test_session.py @@ -1505,6 +1505,27 @@ def __str__(self) -> str: assert _serialize_tool_output(BrokenDataclass(lock=threading.Lock())) == "broken-dataclass" + def test_serialize_tool_output_serializes_none_as_json_null(self) -> None: + assert _serialize_tool_output(None) == "null" + + def test_serialize_tool_output_serializes_lists_as_json(self) -> None: + value = ["hello", 1, True, None] + + assert _serialize_tool_output(value) == json.dumps(value) + + def test_serialize_tool_output_serializes_dataclass_instances(self) -> None: + @dataclasses.dataclass + class ToolResult: + label: str + values: list[int] + + assert _serialize_tool_output(ToolResult(label="demo", values=[1, 2])) == json.dumps( + {"label": "demo", "values": [1, 2]} + ) + + def test_serialize_tool_output_returns_string_for_bytes(self) -> None: + assert _serialize_tool_output(b"abc") == "b'abc'" + @pytest.mark.asyncio async def test_mixed_tool_types_filtering(self, mock_model, mock_agent): """Test that function tools and handoffs are properly separated""" From 057d013150090491e92f6b5b16e6f1a475d9fe1b Mon Sep 17 00:00:00 2001 From: c <37263590+Aphroq@users.noreply.github.com> Date: Sat, 2 May 2026 11:23:08 +0000 Subject: [PATCH 2/2] test: parametrize realtime serialization edge cases --- tests/realtime/test_session.py | 44 ++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/tests/realtime/test_session.py b/tests/realtime/test_session.py index dd94bc93b5..9ea712a013 100644 --- a/tests/realtime/test_session.py +++ b/tests/realtime/test_session.py @@ -1505,26 +1505,30 @@ def __str__(self) -> str: assert _serialize_tool_output(BrokenDataclass(lock=threading.Lock())) == "broken-dataclass" - def test_serialize_tool_output_serializes_none_as_json_null(self) -> None: - assert _serialize_tool_output(None) == "null" - - def test_serialize_tool_output_serializes_lists_as_json(self) -> None: - value = ["hello", 1, True, None] - - assert _serialize_tool_output(value) == json.dumps(value) - - def test_serialize_tool_output_serializes_dataclass_instances(self) -> None: - @dataclasses.dataclass - class ToolResult: - label: str - values: list[int] - - assert _serialize_tool_output(ToolResult(label="demo", values=[1, 2])) == json.dumps( - {"label": "demo", "values": [1, 2]} - ) - - def test_serialize_tool_output_returns_string_for_bytes(self) -> None: - assert _serialize_tool_output(b"abc") == "b'abc'" + @dataclasses.dataclass + class ToolResult: + label: str + values: list[int] + + @pytest.mark.parametrize( + ("value", "expected"), + [ + pytest.param(None, "null", id="none"), + pytest.param( + ["hello", 1, True, None], + json.dumps(["hello", 1, True, None]), + id="list", + ), + pytest.param( + ToolResult(label="demo", values=[1, 2]), + json.dumps({"label": "demo", "values": [1, 2]}), + id="dataclass", + ), + pytest.param(b"abc", "b'abc'", id="bytes"), + ], + ) + def test_serialize_tool_output_edge_cases(self, value: Any, expected: str) -> None: + assert _serialize_tool_output(value) == expected @pytest.mark.asyncio async def test_mixed_tool_types_filtering(self, mock_model, mock_agent):