diff --git a/homeassistant/components/netgear_lte/__init__.py b/homeassistant/components/netgear_lte/__init__.py index a6df67a7c83..a227fa5fe3e 100644 --- a/homeassistant/components/netgear_lte/__init__.py +++ b/homeassistant/components/netgear_lte/__init__.py @@ -61,6 +61,7 @@ CONFIG_SCHEMA = cv.empty_config_schema(DOMAIN) async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up Netgear LTE component.""" hass.data[DATA_HASS_CONFIG] = config + async_setup_services(hass) return True @@ -96,8 +97,6 @@ async def async_setup_entry(hass: HomeAssistant, entry: NetgearLTEConfigEntry) - await coordinator.async_config_entry_first_refresh() entry.runtime_data = coordinator - async_setup_services(hass) - await discovery.async_load_platform( hass, Platform.NOTIFY, @@ -118,7 +117,5 @@ async def async_unload_entry(hass: HomeAssistant, entry: NetgearLTEConfigEntry) unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) if not hass.config_entries.async_loaded_entries(DOMAIN): hass.data.pop(DOMAIN, None) - for service_name in hass.services.async_services()[DOMAIN]: - hass.services.async_remove(DOMAIN, service_name) return unload_ok diff --git a/homeassistant/components/netgear_lte/services.py b/homeassistant/components/netgear_lte/services.py index 5cac48c2634..45b3e41189a 100644 --- a/homeassistant/components/netgear_lte/services.py +++ b/homeassistant/components/netgear_lte/services.py @@ -4,6 +4,7 @@ import voluptuous as vol from homeassistant.const import CONF_HOST from homeassistant.core import HomeAssistant, ServiceCall, callback +from homeassistant.exceptions import ServiceValidationError from homeassistant.helpers import config_validation as cv from .const import ( @@ -14,7 +15,6 @@ from .const import ( AUTOCONNECT_MODES, DOMAIN, FAILOVER_MODES, - LOGGER, ) from .coordinator import NetgearLTEConfigEntry @@ -56,8 +56,11 @@ async def _service_handler(call: ServiceCall) -> None: break if not entry or not (modem := entry.runtime_data.modem).token: - LOGGER.error("%s: host %s unavailable", call.service, host) - return + raise ServiceValidationError( + translation_domain=DOMAIN, + translation_key="config_entry_not_found", + translation_placeholders={"service": call.service}, + ) if call.service == SERVICE_DELETE_SMS: for sms_id in call.data[ATTR_SMS_ID]: diff --git a/homeassistant/components/netgear_lte/strings.json b/homeassistant/components/netgear_lte/strings.json index 7db66f6fab6..37042e268a1 100644 --- a/homeassistant/components/netgear_lte/strings.json +++ b/homeassistant/components/netgear_lte/strings.json @@ -71,6 +71,11 @@ } } }, + "exceptions": { + "config_entry_not_found": { + "message": "Failed to perform action \"{service}\". Config entry for target not found" + } + }, "services": { "connect_lte": { "description": "Asks the modem to establish the LTE connection.", diff --git a/tests/components/netgear_lte/test_services.py b/tests/components/netgear_lte/test_services.py index 58e57cf2039..a7ca18fd4d2 100644 --- a/tests/components/netgear_lte/test_services.py +++ b/tests/components/netgear_lte/test_services.py @@ -2,9 +2,12 @@ from unittest.mock import patch +import pytest + from homeassistant.components.netgear_lte.const import DOMAIN from homeassistant.const import CONF_HOST from homeassistant.core import HomeAssistant +from homeassistant.exceptions import ServiceValidationError from .conftest import HOST @@ -54,3 +57,15 @@ async def test_set_option(hass: HomeAssistant, setup_integration: None) -> None: blocking=True, ) assert len(mock_client.mock_calls) == 1 + + entry = hass.config_entries.async_entries(DOMAIN)[0] + await hass.config_entries.async_unload(entry.entry_id) + await hass.async_block_till_done() + + with pytest.raises(ServiceValidationError): + await hass.services.async_call( + DOMAIN, + "delete_sms", + {CONF_HOST: "no-match", "sms_id": 1}, + blocking=True, + )