diff --git a/homeassistant/components/accuweather/strings.json b/homeassistant/components/accuweather/strings.json index 7bf61de8476..65aa2a9ed91 100644 --- a/homeassistant/components/accuweather/strings.json +++ b/homeassistant/components/accuweather/strings.json @@ -31,5 +31,11 @@ } } } + }, + "system_health": { + "info": { + "can_reach_server": "Reach AccuWeather server", + "remaining_requests": "Remaining allowed requests" + } } } diff --git a/homeassistant/components/accuweather/system_health.py b/homeassistant/components/accuweather/system_health.py new file mode 100644 index 00000000000..58c9ba35881 --- /dev/null +++ b/homeassistant/components/accuweather/system_health.py @@ -0,0 +1,27 @@ +"""Provide info to system health.""" +from accuweather.const import ENDPOINT + +from homeassistant.components import system_health +from homeassistant.core import HomeAssistant, callback + +from .const import COORDINATOR, DOMAIN + + +@callback +def async_register( + hass: HomeAssistant, register: system_health.SystemHealthRegistration +) -> None: + """Register system health callbacks.""" + register.async_register_info(system_health_info) + + +async def system_health_info(hass): + """Get info for the info page.""" + remaining_requests = list(hass.data[DOMAIN].values())[0][ + COORDINATOR + ].accuweather.requests_remaining + + return { + "can_reach_server": system_health.async_check_can_reach_url(hass, ENDPOINT), + "remaining_requests": remaining_requests, + } diff --git a/tests/components/accuweather/test_system_health.py b/tests/components/accuweather/test_system_health.py new file mode 100644 index 00000000000..cf8c931e123 --- /dev/null +++ b/tests/components/accuweather/test_system_health.py @@ -0,0 +1,58 @@ +"""Test AccuWeather system health.""" +import asyncio + +from aiohttp import ClientError + +from homeassistant.components.accuweather.const import COORDINATOR, DOMAIN +from homeassistant.setup import async_setup_component + +from tests.async_mock import Mock +from tests.common import get_system_health_info + + +async def test_accuweather_system_health(hass, aioclient_mock): + """Test AccuWeather system health.""" + aioclient_mock.get("https://dataservice.accuweather.com/", text="") + hass.config.components.add(DOMAIN) + assert await async_setup_component(hass, "system_health", {}) + + hass.data[DOMAIN] = {} + hass.data[DOMAIN]["0123xyz"] = {} + hass.data[DOMAIN]["0123xyz"][COORDINATOR] = Mock( + accuweather=Mock(requests_remaining="42") + ) + + info = await get_system_health_info(hass, DOMAIN) + + for key, val in info.items(): + if asyncio.iscoroutine(val): + info[key] = await val + + assert info == { + "can_reach_server": "ok", + "remaining_requests": "42", + } + + +async def test_accuweather_system_health_fail(hass, aioclient_mock): + """Test AccuWeather system health.""" + aioclient_mock.get("https://dataservice.accuweather.com/", exc=ClientError) + hass.config.components.add(DOMAIN) + assert await async_setup_component(hass, "system_health", {}) + + hass.data[DOMAIN] = {} + hass.data[DOMAIN]["0123xyz"] = {} + hass.data[DOMAIN]["0123xyz"][COORDINATOR] = Mock( + accuweather=Mock(requests_remaining="0") + ) + + info = await get_system_health_info(hass, DOMAIN) + + for key, val in info.items(): + if asyncio.iscoroutine(val): + info[key] = await val + + assert info == { + "can_reach_server": {"type": "failed", "error": "unreachable"}, + "remaining_requests": "0", + }