From 77571c8a84e093fa6cae50b850e96a5fa8e9f02c Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 12 Oct 2022 11:33:09 +0200 Subject: [PATCH] Add error handling to LaMetric number platform (#80159) --- homeassistant/components/lametric/number.py | 2 + tests/components/lametric/test_number.py | 67 +++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/homeassistant/components/lametric/number.py b/homeassistant/components/lametric/number.py index e66b130b3e2..9275160f497 100644 --- a/homeassistant/components/lametric/number.py +++ b/homeassistant/components/lametric/number.py @@ -16,6 +16,7 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback from .const import DOMAIN from .coordinator import LaMetricDataUpdateCoordinator from .entity import LaMetricEntity +from .helpers import lametric_exception_handler @dataclass @@ -96,6 +97,7 @@ class LaMetricNumberEntity(LaMetricEntity, NumberEntity): """Return the number value.""" return self.entity_description.value_fn(self.coordinator.data) + @lametric_exception_handler async def async_set_native_value(self, value: float) -> None: """Change to new number value.""" await self.entity_description.set_value_fn(self.coordinator.lametric, value) diff --git a/tests/components/lametric/test_number.py b/tests/components/lametric/test_number.py index 1acf939fc99..f80b2214577 100644 --- a/tests/components/lametric/test_number.py +++ b/tests/components/lametric/test_number.py @@ -1,6 +1,9 @@ """Tests for the LaMetric number platform.""" from unittest.mock import MagicMock +from demetriek import LaMetricConnectionError, LaMetricError +import pytest + from homeassistant.components.lametric.const import DOMAIN from homeassistant.components.number import ( ATTR_MAX, @@ -16,8 +19,10 @@ from homeassistant.const import ( ATTR_FRIENDLY_NAME, ATTR_ICON, ATTR_UNIT_OF_MEASUREMENT, + STATE_UNAVAILABLE, ) from homeassistant.core import HomeAssistant +from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers import device_registry as dr, entity_registry as er from homeassistant.helpers.entity import EntityCategory @@ -125,3 +130,65 @@ async def test_volume( assert len(mock_lametric.audio.mock_calls) == 1 mock_lametric.audio.assert_called_once_with(volume=42) + + +async def test_number_error( + hass: HomeAssistant, + init_integration: MockConfigEntry, + mock_lametric: MagicMock, +) -> None: + """Test error handling of the LaMetric numbers.""" + mock_lametric.audio.side_effect = LaMetricError + + state = hass.states.get("number.frenck_s_lametric_volume") + assert state + assert state.state == "100" + + with pytest.raises( + HomeAssistantError, match="Invalid response from the LaMetric device" + ): + await hass.services.async_call( + NUMBER_DOMAIN, + SERVICE_SET_VALUE, + { + ATTR_ENTITY_ID: "number.frenck_s_lametric_volume", + ATTR_VALUE: 42, + }, + blocking=True, + ) + await hass.async_block_till_done() + + state = hass.states.get("number.frenck_s_lametric_volume") + assert state + assert state.state == "100" + + +async def test_number_connection_error( + hass: HomeAssistant, + init_integration: MockConfigEntry, + mock_lametric: MagicMock, +) -> None: + """Test connection error handling of the LaMetric numbers.""" + mock_lametric.audio.side_effect = LaMetricConnectionError + + state = hass.states.get("number.frenck_s_lametric_volume") + assert state + assert state.state == "100" + + with pytest.raises( + HomeAssistantError, match="Error communicating with the LaMetric device" + ): + await hass.services.async_call( + NUMBER_DOMAIN, + SERVICE_SET_VALUE, + { + ATTR_ENTITY_ID: "number.frenck_s_lametric_volume", + ATTR_VALUE: 42, + }, + blocking=True, + ) + await hass.async_block_till_done() + + state = hass.states.get("number.frenck_s_lametric_volume") + assert state + assert state.state == STATE_UNAVAILABLE