mirror of
https://github.com/home-assistant/core.git
synced 2026-09-08 06:31:35 +01:00
135 lines
4.4 KiB
Python
135 lines
4.4 KiB
Python
"""Test Anglian Water init."""
|
|
|
|
from unittest.mock import AsyncMock, MagicMock
|
|
|
|
from pyanglianwater.exceptions import (
|
|
ConsentRequiredError,
|
|
ExpiredAccessTokenError,
|
|
InteractionRequiredError,
|
|
InvalidGrantError,
|
|
SelfAssertedError,
|
|
SmartMeterUnavailableError,
|
|
)
|
|
import pytest
|
|
|
|
from homeassistant.components.anglian_water.const import DOMAIN
|
|
from homeassistant.components.recorder import Recorder
|
|
from homeassistant.config_entries import ConfigEntryState
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers import issue_registry as ir
|
|
|
|
from .const import CONSENT_REQUIRED_ISSUE_ID
|
|
|
|
from tests.common import MockConfigEntry
|
|
|
|
|
|
async def test_setup_unload_entry(
|
|
recorder_mock: Recorder,
|
|
hass: HomeAssistant,
|
|
mock_config_entry: MockConfigEntry,
|
|
mock_anglian_water_client: AsyncMock,
|
|
mock_anglian_water_authenticator: MagicMock,
|
|
) -> None:
|
|
"""Test successful setup and unload of the config entry."""
|
|
mock_config_entry.add_to_hass(hass)
|
|
assert await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
|
await hass.async_block_till_done()
|
|
|
|
assert mock_config_entry.state is ConfigEntryState.LOADED
|
|
|
|
assert await hass.config_entries.async_unload(mock_config_entry.entry_id)
|
|
await hass.async_block_till_done()
|
|
|
|
assert mock_config_entry.state is ConfigEntryState.NOT_LOADED
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("exception_type", "expected_state"),
|
|
[
|
|
pytest.param(
|
|
ExpiredAccessTokenError,
|
|
ConfigEntryState.SETUP_ERROR,
|
|
id="expired_access_token",
|
|
),
|
|
pytest.param(
|
|
InteractionRequiredError,
|
|
ConfigEntryState.SETUP_ERROR,
|
|
id="interaction_required",
|
|
),
|
|
pytest.param(
|
|
InvalidGrantError,
|
|
ConfigEntryState.SETUP_ERROR,
|
|
id="invalid_grant",
|
|
),
|
|
pytest.param(
|
|
SelfAssertedError,
|
|
ConfigEntryState.SETUP_ERROR,
|
|
id="self_asserted",
|
|
),
|
|
],
|
|
)
|
|
async def test_setup_auth_failures(
|
|
hass: HomeAssistant,
|
|
mock_config_entry: MockConfigEntry,
|
|
mock_anglian_water_client: AsyncMock,
|
|
mock_anglian_water_authenticator: MagicMock,
|
|
exception_type: type[Exception],
|
|
expected_state: ConfigEntryState,
|
|
) -> None:
|
|
"""Test setup failure due to authentication errors."""
|
|
mock_anglian_water_authenticator.send_refresh_request.side_effect = exception_type
|
|
|
|
mock_config_entry.add_to_hass(hass)
|
|
assert not await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
|
await hass.async_block_till_done()
|
|
|
|
assert mock_config_entry.state is expected_state
|
|
|
|
|
|
async def test_setup_consent_required(
|
|
recorder_mock: Recorder,
|
|
hass: HomeAssistant,
|
|
issue_registry: ir.IssueRegistry,
|
|
mock_config_entry: MockConfigEntry,
|
|
mock_anglian_water_client: AsyncMock,
|
|
mock_anglian_water_authenticator: MagicMock,
|
|
) -> None:
|
|
"""Test setup raises ConfigEntryNotReady and creates a repair issue when consent is required."""
|
|
mock_anglian_water_authenticator.send_refresh_request.side_effect = (
|
|
ConsentRequiredError
|
|
)
|
|
|
|
mock_config_entry.add_to_hass(hass)
|
|
assert not await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
|
await hass.async_block_till_done()
|
|
|
|
assert mock_config_entry.state is ConfigEntryState.SETUP_RETRY
|
|
|
|
assert issue_registry.async_get_issue(DOMAIN, CONSENT_REQUIRED_ISSUE_ID) is not None
|
|
|
|
# Test that the issue is deleted once consent is granted
|
|
mock_anglian_water_authenticator.send_refresh_request.side_effect = None
|
|
await hass.config_entries.async_reload(mock_config_entry.entry_id)
|
|
await hass.async_block_till_done()
|
|
|
|
assert mock_config_entry.state is ConfigEntryState.LOADED
|
|
assert issue_registry.async_get_issue(DOMAIN, CONSENT_REQUIRED_ISSUE_ID) is None
|
|
|
|
|
|
async def test_setup_smart_meter_unavailable(
|
|
hass: HomeAssistant,
|
|
mock_config_entry: MockConfigEntry,
|
|
mock_anglian_water_client: AsyncMock,
|
|
mock_anglian_water_authenticator: MagicMock,
|
|
) -> None:
|
|
"""Test setup fails when the smart meter is unavailable."""
|
|
mock_anglian_water_client.validate_smart_meter.side_effect = (
|
|
SmartMeterUnavailableError
|
|
)
|
|
|
|
mock_config_entry.add_to_hass(hass)
|
|
assert not await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
|
await hass.async_block_till_done()
|
|
|
|
assert mock_config_entry.state is ConfigEntryState.SETUP_ERROR
|