Skip to content

Commit 3134936

Browse files
committed
test(http): add unit tests for SSE stream parser and fallback responses
1 parent 230b541 commit 3134936

1 file changed

Lines changed: 64 additions & 0 deletions

File tree

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import httpx
2+
import pytest
3+
4+
from a2a.client.errors import A2AClientError
5+
from a2a.client.transports.http_helpers import (
6+
_default_sse_error_handler,
7+
parse_sse_stream,
8+
send_http_stream_request,
9+
)
10+
11+
12+
def test_default_sse_error_handler():
13+
with pytest.raises(
14+
A2AClientError, match='SSE stream error event received: error_msg'
15+
):
16+
_default_sse_error_handler('error_msg')
17+
18+
19+
@pytest.mark.asyncio
20+
async def test_parse_sse_stream_edge_cases():
21+
async def mock_aiter_lines():
22+
yield ': comment line (should be ignored)\n'
23+
yield 'event: custom_event\n'
24+
yield 'data: hello\n'
25+
yield 'data: world\n'
26+
yield '\n'
27+
yield '\n'
28+
yield 'data: \n'
29+
yield '\n'
30+
31+
response = httpx.Response(200)
32+
response.aiter_lines = mock_aiter_lines # type: ignore
33+
34+
events = [e async for e in parse_sse_stream(response)]
35+
assert events == [
36+
('custom_event', ' hello\nworld'),
37+
('message', ''),
38+
]
39+
40+
41+
@pytest.mark.asyncio
42+
async def test_send_http_stream_request_non_sse(mocker):
43+
client = httpx.AsyncClient()
44+
request = httpx.Request('GET', 'http://test')
45+
response = httpx.Response(
46+
200,
47+
headers={'Content-Type': 'application/json'},
48+
content=b'plain error response',
49+
request=request,
50+
)
51+
52+
mocker.patch(
53+
'a2a.client.transports.http_helpers._SSEEventSource.__aenter__',
54+
return_value=response,
55+
)
56+
mocker.patch(
57+
'a2a.client.transports.http_helpers._SSEEventSource.__aexit__',
58+
return_value=None,
59+
)
60+
61+
chunks = [
62+
c async for c in send_http_stream_request(client, 'GET', 'http://test')
63+
]
64+
assert chunks == ['plain error response']

0 commit comments

Comments
 (0)