"""Tests for the Vistapool light platform.""" from collections.abc import Generator from typing import Any from unittest.mock import AsyncMock, patch from aioaquarite import AquariteError import pytest from syrupy.assertion import SnapshotAssertion from homeassistant.components.light import ( DOMAIN as LIGHT_DOMAIN, SERVICE_TURN_OFF, SERVICE_TURN_ON, ) from homeassistant.const import ATTR_ENTITY_ID, STATE_OFF, STATE_ON, Platform from homeassistant.core import HomeAssistant from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers import entity_registry as er from tests.common import MockConfigEntry, snapshot_platform @pytest.fixture(autouse=True) def _only_light_platform() -> Generator[None]: """Restrict integration setup to the light platform for these tests.""" with patch("homeassistant.components.vistapool.PLATFORMS", [Platform.LIGHT]): yield async def test_all_entities( hass: HomeAssistant, snapshot: SnapshotAssertion, entity_registry: er.EntityRegistry, mock_config_entry: MockConfigEntry, mock_vistapool_client: AsyncMock, mock_pool_data: dict[str, Any], ) -> None: """Test light entities for the default fixture.""" mock_vistapool_client.fetch_pool_data.return_value = mock_pool_data mock_config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(mock_config_entry.entry_id) await hass.async_block_till_done() await snapshot_platform(hass, entity_registry, snapshot, mock_config_entry.entry_id) async def test_light_string_value( hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_vistapool_client: AsyncMock, ) -> None: """Test the light coerces a numeric-as-string status to bool.""" mock_vistapool_client.fetch_pool_data.return_value = { "main": {"version": 1}, "light": {"status": "1"}, } mock_config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(mock_config_entry.entry_id) await hass.async_block_till_done() assert hass.states.get("light.my_pool_light").state == STATE_ON @pytest.mark.parametrize( ("service", "expected_value"), [ pytest.param(SERVICE_TURN_ON, 1, id="turn_on"), pytest.param(SERVICE_TURN_OFF, 0, id="turn_off"), ], ) async def test_light_set_value( hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_vistapool_client: AsyncMock, mock_pool_data: dict[str, Any], service: str, expected_value: int, ) -> None: """Test turn_on / turn_off write light.status via set_value.""" mock_vistapool_client.fetch_pool_data.return_value = mock_pool_data mock_config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(mock_config_entry.entry_id) await hass.async_block_till_done() await hass.services.async_call( LIGHT_DOMAIN, service, {ATTR_ENTITY_ID: "light.my_pool_light"}, blocking=True, ) mock_vistapool_client.set_value.assert_awaited_once_with( "ABCDEF1234567890", "light.status", expected_value ) async def test_light_set_value_raises_on_api_error( hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_vistapool_client: AsyncMock, mock_pool_data: dict[str, Any], ) -> None: """Test action raises HomeAssistantError when the library fails.""" mock_vistapool_client.fetch_pool_data.return_value = mock_pool_data mock_vistapool_client.set_value.side_effect = AquariteError("boom") mock_config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(mock_config_entry.entry_id) await hass.async_block_till_done() with pytest.raises(HomeAssistantError) as excinfo: await hass.services.async_call( LIGHT_DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: "light.my_pool_light"}, blocking=True, ) assert excinfo.value.translation_key == "set_failed" async def test_light_default_fixture_state( hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_vistapool_client: AsyncMock, mock_pool_data: dict[str, Any], ) -> None: """Test the light reports off in the default fixture (light.status=0).""" mock_vistapool_client.fetch_pool_data.return_value = mock_pool_data mock_config_entry.add_to_hass(hass) assert await hass.config_entries.async_setup(mock_config_entry.entry_id) await hass.async_block_till_done() assert hass.states.get("light.my_pool_light").state == STATE_OFF