Add diagnostics to UptimeRobot (#64905)

This commit is contained in:
Joakim Sørensen 2022-01-25 14:49:27 +01:00 committed by GitHub
parent 076bc976ee
commit 1093a2b808
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 140 additions and 9 deletions

View file

@ -57,6 +57,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
class UptimeRobotDataUpdateCoordinator(DataUpdateCoordinator):
"""Data update coordinator for UptimeRobot."""
data: list[UptimeRobotMonitor]
def __init__(
self,
hass: HomeAssistant,
@ -69,17 +71,16 @@ class UptimeRobotDataUpdateCoordinator(DataUpdateCoordinator):
hass,
LOGGER,
name=DOMAIN,
update_method=self._async_update_data,
update_interval=COORDINATOR_UPDATE_INTERVAL,
)
self._config_entry_id = config_entry_id
self._device_registry = dev_reg
self._api = api
self.api = api
async def _async_update_data(self) -> list[UptimeRobotMonitor] | None:
"""Update data."""
try:
response = await self._api.async_get_monitors()
response = await self.api.async_get_monitors()
except UptimeRobotAuthenticationException as exception:
raise ConfigEntryAuthFailed(exception) from exception
except UptimeRobotException as exception:

View file

@ -9,17 +9,19 @@ from homeassistant.components.binary_sensor import (
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from . import UptimeRobotDataUpdateCoordinator
from .const import DOMAIN
from .entity import UptimeRobotEntity
async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
hass: HomeAssistant,
entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the UptimeRobot binary_sensors."""
coordinator: DataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
coordinator: UptimeRobotDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
async_add_entities(
[
UptimeRobotBinarySensor(

View file

@ -0,0 +1,45 @@
"""Diagnostics support for UptimeRobot."""
from __future__ import annotations
from typing import Any
from pyuptimerobot import UptimeRobotException
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from . import UptimeRobotDataUpdateCoordinator
from .const import DOMAIN
async def async_get_config_entry_diagnostics(
hass: HomeAssistant,
entry: ConfigEntry,
) -> dict[str, Any]:
"""Return diagnostics for a config entry."""
coordinator: UptimeRobotDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
account: dict[str, Any] | str | None = None
try:
response = await coordinator.api.async_get_account_details()
except UptimeRobotException as err:
account = str(err)
else:
if (details := response.data) is not None:
account = {
"up_monitors": details.up_monitors,
"down_monitors": details.down_monitors,
"paused_monitors": details.paused_monitors,
}
return {
"account": account,
"monitors": [
{
"id": monitor.id,
"type": str(monitor.type),
"interval": monitor.interval,
"status": monitor.status,
}
for monitor in coordinator.data
],
}

View file

@ -20,10 +20,15 @@ from homeassistant.core import HomeAssistant
from tests.common import MockConfigEntry
MOCK_UPTIMEROBOT_API_KEY = "1234"
MOCK_UPTIMEROBOT_API_KEY = "0242ac120003"
MOCK_UPTIMEROBOT_EMAIL = "test@test.test"
MOCK_UPTIMEROBOT_UNIQUE_ID = "1234567890"
MOCK_UPTIMEROBOT_ACCOUNT = {"email": "test@test.test", "user_id": 1234567890}
MOCK_UPTIMEROBOT_ACCOUNT = {
"email": MOCK_UPTIMEROBOT_EMAIL,
"user_id": 1234567890,
"up_monitors": 1,
}
MOCK_UPTIMEROBOT_ERROR = {"message": "test error from API."}
MOCK_UPTIMEROBOT_MONITOR = {
"id": 1234,
@ -35,7 +40,7 @@ MOCK_UPTIMEROBOT_MONITOR = {
MOCK_UPTIMEROBOT_CONFIG_ENTRY_DATA = {
"domain": DOMAIN,
"title": "test@test.test",
"title": MOCK_UPTIMEROBOT_EMAIL,
"data": {"platform": DOMAIN, "api_key": MOCK_UPTIMEROBOT_API_KEY},
"unique_id": MOCK_UPTIMEROBOT_UNIQUE_ID,
"source": config_entries.SOURCE_USER,

View file

@ -0,0 +1,78 @@
"""Test UptimeRobot diagnostics."""
import json
from unittest.mock import patch
from aiohttp import ClientSession
from pyuptimerobot import UptimeRobotException
from homeassistant.core import HomeAssistant
from .common import (
MOCK_UPTIMEROBOT_ACCOUNT,
MOCK_UPTIMEROBOT_API_KEY,
MOCK_UPTIMEROBOT_EMAIL,
MockApiResponseKey,
mock_uptimerobot_api_response,
setup_uptimerobot_integration,
)
from tests.components.diagnostics import get_diagnostics_for_config_entry
async def test_entry_diagnostics(
hass: HomeAssistant,
hass_client: ClientSession,
) -> None:
"""Test config entry diagnostics."""
entry = await setup_uptimerobot_integration(hass)
with patch(
"pyuptimerobot.UptimeRobot.async_get_account_details",
return_value=mock_uptimerobot_api_response(
key=MockApiResponseKey.ACCOUNT,
data=MOCK_UPTIMEROBOT_ACCOUNT,
),
):
result = await get_diagnostics_for_config_entry(
hass,
hass_client,
entry,
)
assert result["account"] == {
"down_monitors": 0,
"paused_monitors": 0,
"up_monitors": 1,
}
assert result["monitors"] == [
{"id": 1234, "interval": 0, "status": 2, "type": "MonitorType.HTTP"}
]
assert list(result.keys()) == ["account", "monitors"]
result_dump = json.dumps(result)
assert MOCK_UPTIMEROBOT_EMAIL not in result_dump
assert MOCK_UPTIMEROBOT_API_KEY not in result_dump
async def test_entry_diagnostics_exception(
hass: HomeAssistant,
hass_client: ClientSession,
) -> None:
"""Test config entry diagnostics with exception."""
entry = await setup_uptimerobot_integration(hass)
with patch(
"pyuptimerobot.UptimeRobot.async_get_account_details",
side_effect=UptimeRobotException("Test exception"),
):
result = await get_diagnostics_for_config_entry(
hass,
hass_client,
entry,
)
assert result["account"] == "Test exception"