core/tests/components/uptimerobot/test_init.py

108 lines
3.5 KiB
Python

"""Test the Uptime Robot init."""
import datetime
from unittest.mock import patch
from pytest import LogCaptureFixture
from pyuptimerobot import UptimeRobotApiResponse
from pyuptimerobot.exceptions import UptimeRobotAuthenticationException
from homeassistant import config_entries
from homeassistant.components.uptimerobot.const import DOMAIN
from homeassistant.core import HomeAssistant
from homeassistant.util import dt
from tests.common import MockConfigEntry, async_fire_time_changed
async def test_reauthentication_trigger_in_setup(
hass: HomeAssistant, caplog: LogCaptureFixture
):
"""Test reauthentication trigger."""
mock_config_entry = MockConfigEntry(
domain=DOMAIN,
title="test@test.test",
data={"platform": DOMAIN, "api_key": "1234"},
unique_id="1234567890",
source=config_entries.SOURCE_USER,
)
mock_config_entry.add_to_hass(hass)
with patch(
"pyuptimerobot.UptimeRobot.async_get_monitors",
side_effect=UptimeRobotAuthenticationException,
):
await hass.config_entries.async_setup(mock_config_entry.entry_id)
await hass.async_block_till_done()
flows = hass.config_entries.flow.async_progress()
assert mock_config_entry.state == config_entries.ConfigEntryState.SETUP_ERROR
assert mock_config_entry.reason == "could not authenticate"
assert len(flows) == 1
flow = flows[0]
assert flow["step_id"] == "reauth_confirm"
assert flow["handler"] == DOMAIN
assert flow["context"]["source"] == config_entries.SOURCE_REAUTH
assert flow["context"]["entry_id"] == mock_config_entry.entry_id
assert (
"Config entry 'test@test.test' for uptimerobot integration could not authenticate"
in caplog.text
)
async def test_reauthentication_trigger_after_setup(
hass: HomeAssistant, caplog: LogCaptureFixture
):
"""Test reauthentication trigger."""
mock_config_entry = MockConfigEntry(
domain=DOMAIN,
title="test@test.test",
data={"platform": DOMAIN, "api_key": "1234"},
unique_id="1234567890",
source=config_entries.SOURCE_USER,
)
mock_config_entry.add_to_hass(hass)
with patch(
"pyuptimerobot.UptimeRobot.async_get_monitors",
return_value=UptimeRobotApiResponse.from_dict(
{
"stat": "ok",
"monitors": [
{"id": 1234, "friendly_name": "Test monitor", "status": 2}
],
}
),
):
await hass.config_entries.async_setup(mock_config_entry.entry_id)
await hass.async_block_till_done()
binary_sensor = hass.states.get("binary_sensor.test_monitor")
assert mock_config_entry.state == config_entries.ConfigEntryState.LOADED
assert binary_sensor.state == "on"
with patch(
"pyuptimerobot.UptimeRobot.async_get_monitors",
side_effect=UptimeRobotAuthenticationException,
):
async_fire_time_changed(hass, dt.utcnow() + datetime.timedelta(seconds=10))
await hass.async_block_till_done()
flows = hass.config_entries.flow.async_progress()
binary_sensor = hass.states.get("binary_sensor.test_monitor")
assert binary_sensor.state == "unavailable"
assert "Authentication failed while fetching uptimerobot data" in caplog.text
assert len(flows) == 1
flow = flows[0]
assert flow["step_id"] == "reauth_confirm"
assert flow["handler"] == DOMAIN
assert flow["context"]["source"] == config_entries.SOURCE_REAUTH
assert flow["context"]["entry_id"] == mock_config_entry.entry_id