From 1f8f2e3119039cbbb5ea159df3fd71dd5c132527 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 4 Nov 2025 19:33:18 +0000 Subject: [PATCH] Improve ecovacs image tests to use image proxy API Updated test_image.py to properly test image retrieval using the Home Assistant image proxy API pattern: - Added tests that retrieve actual image content via /api/image_proxy/ - Test HTTP status codes and content types - Test both successful image retrieval (when SVG is available) and error cases (when no SVG) - Added test for image content changes when map is updated - Use snapshot assertions to validate image content - Added ClientSessionGenerator for hass_client fixture This follows the pattern used in other HA image platform tests (e.g., fyta, devolo_home_network) and properly tests the full image entity functionality. --- tests/components/ecovacs/test_image.py | 90 +++++++++++++++++++++----- 1 file changed, 74 insertions(+), 16 deletions(-) diff --git a/tests/components/ecovacs/test_image.py b/tests/components/ecovacs/test_image.py index fb30631ecffe..5211dbf22f4f 100644 --- a/tests/components/ecovacs/test_image.py +++ b/tests/components/ecovacs/test_image.py @@ -1,6 +1,7 @@ """Tests for Ecovacs image entities.""" from datetime import timedelta +from http import HTTPStatus from unittest.mock import Mock from deebot_client.events.map import CachedMapInfoEvent, MapChangedEvent, MapInfo @@ -17,6 +18,8 @@ from homeassistant.helpers import device_registry as dr, entity_registry as er from .util import notify_and_wait +from tests.typing import ClientSessionGenerator + pytestmark = [pytest.mark.usefixtures("init_integration")] @@ -149,32 +152,36 @@ async def test_image_update_service( ("device_fixture", "entity_id"), [ ("yna5x1", "image.ozmo_950_map"), + ("qhe2o2", "image.dusty_map"), ], - ids=["yna5x1"], + ids=["yna5x1", "qhe2o2"], ) async def test_image_svg_content( hass: HomeAssistant, + hass_client: ClientSessionGenerator, controller: EcovacsController, + snapshot: SnapshotAssertion, entity_id: str, ) -> None: - """Test image returns SVG content.""" + """Test image returns SVG content via image proxy.""" device = controller.devices[0] # Mock the get_svg_map to return SVG content svg_content = '' device.map.get_svg_map = Mock(return_value=svg_content) - # Get the entity - entity_obj = hass.states.get(entity_id) - assert entity_obj is not None + # Get the entity state + state = hass.states.get(entity_id) + assert state is not None - # Test that content_type is set correctly - entity_entry = er.async_get(hass).async_get(entity_id) - assert entity_entry - - # Verify the image method returns encoded SVG - # Note: We can't directly call entity.image() from the test without accessing internals - # But we can verify the entity is set up correctly + # Retrieve image via the image proxy API + client = await hass_client() + resp = await client.get(f"/api/image_proxy/{entity_id}") + assert resp.status == HTTPStatus.OK + assert resp.content_type == "image/svg+xml" + body = await resp.read() + assert body == svg_content.encode() + assert body == snapshot @pytest.mark.parametrize( @@ -186,15 +193,66 @@ async def test_image_svg_content( ) async def test_image_no_svg_content( hass: HomeAssistant, + hass_client: ClientSessionGenerator, controller: EcovacsController, entity_id: str, ) -> None: - """Test image returns None when no SVG available.""" + """Test image returns error when no SVG available.""" device = controller.devices[0] # Mock the get_svg_map to return None device.map.get_svg_map = Mock(return_value=None) - # Get the entity - entity_obj = hass.states.get(entity_id) - assert entity_obj is not None + # Get the entity state + state = hass.states.get(entity_id) + assert state is not None + + # Try to retrieve image via the image proxy API + client = await hass_client() + resp = await client.get(f"/api/image_proxy/{entity_id}") + assert resp.status == HTTPStatus.INTERNAL_SERVER_ERROR + + +@pytest.mark.parametrize( + ("device_fixture", "entity_id"), + [ + ("yna5x1", "image.ozmo_950_map"), + ], + ids=["yna5x1"], +) +async def test_image_update_on_map_change( + hass: HomeAssistant, + hass_client: ClientSessionGenerator, + controller: EcovacsController, + freezer: FrozenDateTimeFactory, + entity_id: str, +) -> None: + """Test image content changes when map is updated.""" + device = controller.devices[0] + event_bus = device.events + + # Set initial SVG content + svg_content_1 = '' + device.map.get_svg_map = Mock(return_value=svg_content_1) + + # Retrieve initial image + client = await hass_client() + resp = await client.get(f"/api/image_proxy/{entity_id}") + assert resp.status == HTTPStatus.OK + body_1 = await resp.read() + assert body_1 == svg_content_1.encode() + + # Update map with new content + svg_content_2 = '' + device.map.get_svg_map = Mock(return_value=svg_content_2) + + # Trigger map changed event + freezer.tick(timedelta(minutes=1)) + await notify_and_wait(hass, event_bus, MapChangedEvent()) + + # Retrieve updated image + resp = await client.get(f"/api/image_proxy/{entity_id}") + assert resp.status == HTTPStatus.OK + body_2 = await resp.read() + assert body_2 == svg_content_2.encode() + assert body_2 != body_1