diff --git a/homeassistant/components/image/__init__.py b/homeassistant/components/image/__init__.py index 02ebee49701..d3b627f8292 100644 --- a/homeassistant/components/image/__init__.py +++ b/homeassistant/components/image/__init__.py @@ -336,13 +336,12 @@ async def async_get_still_stream( # given the low frequency of image updates, it is acceptable. frame.extend(frame) await response.write(frame) - # Drain to ensure that the latest frame is available to the client - await response.drain() return True event = asyncio.Event() - async def image_state_update(_event: Event[EventStateChangedData]) -> None: + @callback + def _async_image_state_update(_event: Event[EventStateChangedData]) -> None: """Write image to stream.""" event.set() @@ -350,7 +349,7 @@ async def async_get_still_stream( remove = async_track_state_change_event( hass, image_entity.entity_id, - image_state_update, + _async_image_state_update, ) try: while True: diff --git a/tests/components/image/test_init.py b/tests/components/image/test_init.py index e407b142c52..75816e1350f 100644 --- a/tests/components/image/test_init.py +++ b/tests/components/image/test_init.py @@ -306,22 +306,35 @@ async def test_image_stream( client = await hass_client() - with patch.object(mock_image, "async_image", return_value=b""): - resp = await client.get("/api/image_proxy_stream/image.test") - assert not resp.closed - assert resp.status == HTTPStatus.OK + close_future = hass.loop.create_future() + original_get_still_stream = image.async_get_still_stream - mock_image.image_last_updated = datetime.datetime.now() - mock_image.async_write_ha_state() - # Two blocks to ensure the frame is written - await hass.async_block_till_done() - await hass.async_block_till_done() + async def _wrap_async_get_still_stream(*args, **kwargs): + result = await original_get_still_stream(*args, **kwargs) + hass.loop.call_soon(close_future.set_result, None) + return result - with patch.object(mock_image, "async_image", return_value=None): - mock_image.image_last_updated = datetime.datetime.now() - mock_image.async_write_ha_state() - # Two blocks to ensure the frame is written - await hass.async_block_till_done() - await hass.async_block_till_done() + with patch( + "homeassistant.components.image.async_get_still_stream", + _wrap_async_get_still_stream, + ): + with patch.object(mock_image, "async_image", return_value=b""): + resp = await client.get("/api/image_proxy_stream/image.test") + assert not resp.closed + assert resp.status == HTTPStatus.OK + mock_image.image_last_updated = datetime.datetime.now() + mock_image.async_write_ha_state() + # Two blocks to ensure the frame is written + await hass.async_block_till_done() + await hass.async_block_till_done() + + with patch.object(mock_image, "async_image", return_value=None): + mock_image.image_last_updated = datetime.datetime.now() + mock_image.async_write_ha_state() + # Two blocks to ensure the frame is written + await hass.async_block_till_done() + await hass.async_block_till_done() + + await close_future assert resp.closed