Skip to content

Commit 73c7db0

Browse files
committed
test(open_responses): cover endpoint review paths
1 parent a6a59c8 commit 73c7db0

2 files changed

Lines changed: 54 additions & 0 deletions

File tree

tests/components/open_responses/test_ai_task.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,15 @@
44
from copy import deepcopy
55
from typing import Any
66

7+
import pytest
78
import voluptuous as vol
89

910
from homeassistant.components import ai_task
11+
from homeassistant.components.open_responses.client import (
12+
OpenResponsesInvalidModelError,
13+
)
1014
from homeassistant.core import HomeAssistant
15+
from homeassistant.exceptions import HomeAssistantError
1116
from homeassistant.helpers import selector
1217

1318
from tests.common import MockConfigEntry
@@ -91,3 +96,26 @@ async def test_generate_structured_data(
9196

9297
assert result.data == {"characters": ["Mario", "Luigi"]}
9398
assert calls[0]["text"]["format"]["type"] == "json_schema"
99+
100+
101+
async def test_generate_data_handles_invalid_model(
102+
hass: HomeAssistant,
103+
mock_config_entry: MockConfigEntry,
104+
mock_init_component: None,
105+
) -> None:
106+
"""Test runtime model errors are surfaced as Home Assistant errors."""
107+
108+
async def stream_response(**params: Any) -> AsyncGenerator[dict[str, Any]]:
109+
if params["model"] == "open-responses-model":
110+
raise OpenResponsesInvalidModelError("missing model")
111+
yield {}
112+
113+
mock_config_entry.runtime_data.stream_response = stream_response
114+
115+
with pytest.raises(HomeAssistantError, match="Invalid Open Responses model"):
116+
await ai_task.async_generate_data(
117+
hass,
118+
task_name="Test Task",
119+
entity_id="ai_task.open_responses_ai_task",
120+
instructions="Generate test data",
121+
)

tests/components/open_responses/test_client.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,32 @@ async def test_create_response_requests_json() -> None:
7878
assert http_client.post.await_args.kwargs["headers"]["accept"] == "application/json"
7979

8080

81+
async def test_stream_response_requests_event_stream() -> None:
82+
"""Test streaming responses request server-sent events."""
83+
requests: list[httpx.Request] = []
84+
85+
async def handler(request: httpx.Request) -> httpx.Response:
86+
requests.append(request)
87+
return httpx.Response(
88+
200,
89+
content=b'data: {"type": "response.created"}\n\ndata: [DONE]\n\n',
90+
request=request,
91+
)
92+
93+
async with httpx.AsyncClient(transport=httpx.MockTransport(handler)) as http_client:
94+
client = OpenResponsesClient(http_client, "api-key", "https://example.local/v1")
95+
96+
assert [
97+
event
98+
async for event in client.stream_response(
99+
model="model",
100+
input=[{"type": "message", "role": "user", "content": "ping"}],
101+
)
102+
] == [{"type": "response.created"}]
103+
104+
assert requests[0].headers["accept"] == "text/event-stream"
105+
106+
81107
async def test_iter_sse_events_accumulates_multiline_data() -> None:
82108
"""Test SSE data lines are joined until the event delimiter."""
83109

0 commit comments

Comments
 (0)