Files
core/tests/components/tplink_omada/test_init.py
T

151 lines
4.4 KiB
Python

"""Tests for TP-Link Omada integration init."""
from unittest.mock import MagicMock, patch
import pytest
from tplink_omada_client.exceptions import (
ConnectionFailed,
LoginFailed,
OmadaClientException,
UnsupportedControllerVersion,
)
from homeassistant.components.tplink_omada.const import DOMAIN
from homeassistant.components.tplink_omada.coordinator import OmadaCoordinator
from homeassistant.config_entries import ConfigEntryState
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.update_coordinator import UpdateFailed
from tests.common import MockConfigEntry
MOCK_ENTRY_DATA = {
"host": "https://fake.omada.host",
"verify_ssl": True,
"site": "SiteId",
"username": "test-username",
"password": "test-password",
}
@pytest.mark.parametrize(
("side_effect", "entry_state", "translation_key"),
[
(
UnsupportedControllerVersion("4.0.0"),
ConfigEntryState.SETUP_ERROR,
"unsupported_controller",
),
(
LoginFailed(401, "invalid credentials"),
ConfigEntryState.SETUP_ERROR,
"auth_failed",
),
(
ConnectionFailed(),
ConfigEntryState.SETUP_RETRY,
"cannot_connect",
),
(
OmadaClientException(),
ConfigEntryState.SETUP_RETRY,
"unexpected_error",
),
],
)
async def test_setup_entry_login_failed_raises_configentryauthfailed(
hass: HomeAssistant,
mock_omada_client: MagicMock,
mock_config_entry: MockConfigEntry,
side_effect: OmadaClientException,
entry_state: ConfigEntryState,
translation_key: str,
) -> None:
"""Test setup entry with login failed raises ConfigEntryAuthFailed."""
mock_omada_client.login.side_effect = side_effect
mock_config_entry.add_to_hass(hass)
await hass.config_entries.async_setup(mock_config_entry.entry_id)
await hass.async_block_till_done()
assert mock_config_entry.state is entry_state
assert mock_config_entry.error_reason_translation_key == translation_key
assert mock_config_entry.error_reason_translation_placeholders is None
async def test_coordinator_update_failure_is_translated(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_omada_site_client: MagicMock,
) -> None:
"""Test coordinator API failures raise a translated UpdateFailed."""
coordinator = OmadaCoordinator(
hass, mock_config_entry, mock_omada_site_client, "test"
)
with (
patch.object(
OmadaCoordinator,
"poll_update",
side_effect=OmadaClientException("boom"),
),
pytest.raises(UpdateFailed) as err,
):
await coordinator._async_update_data()
assert err.value.translation_domain == DOMAIN
assert err.value.translation_key == "api_error"
async def test_missing_devices_removed_at_startup(
hass: HomeAssistant,
device_registry: dr.DeviceRegistry,
mock_omada_client: MagicMock,
) -> None:
"""Test missing devices are removed at startup."""
mock_config_entry = MockConfigEntry(
title="Test Omada Controller",
domain=DOMAIN,
data=dict(MOCK_ENTRY_DATA),
unique_id="12345_SiteId",
version=2,
)
mock_config_entry.add_to_hass(hass)
device_entry = device_registry.async_get_or_create(
config_entry_id=mock_config_entry.entry_id,
identifiers={(DOMAIN, "AA:BB:CC:DD:EE:FF")},
manufacturer="TPLink",
name="Old Device",
model="Some old model",
)
assert device_registry.async_get(device_entry.id) == device_entry
await hass.config_entries.async_setup(mock_config_entry.entry_id)
await hass.async_block_till_done()
assert device_registry.async_get(device_entry.id) is None
async def test_migrate_entry_v1_to_v2(
hass: HomeAssistant,
mock_omada_client: MagicMock,
) -> None:
"""Test migration of a version 1 config entry to version 2."""
entry = MockConfigEntry(
title="Test Omada Controller",
domain=DOMAIN,
data=dict(MOCK_ENTRY_DATA),
unique_id="12345",
version=1,
)
entry.add_to_hass(hass)
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
assert entry.version == 2
assert entry.unique_id == "12345_SiteId"
assert entry.state is ConfigEntryState.LOADED