mirror of
https://github.com/home-assistant/core.git
synced 2025-07-18 02:37:08 +00:00
Handle tplink credential change at run time (#108692)
This commit is contained in:
parent
12b41c35ec
commit
f6bc5c98b3
@ -4,9 +4,10 @@ from __future__ import annotations
|
|||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from kasa import SmartDevice, SmartDeviceException
|
from kasa import AuthenticationException, SmartDevice, SmartDeviceException
|
||||||
|
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
|
from homeassistant.exceptions import ConfigEntryAuthFailed
|
||||||
from homeassistant.helpers.debounce import Debouncer
|
from homeassistant.helpers.debounce import Debouncer
|
||||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
||||||
|
|
||||||
@ -42,5 +43,7 @@ class TPLinkDataUpdateCoordinator(DataUpdateCoordinator[None]):
|
|||||||
"""Fetch all device and sensor data from api."""
|
"""Fetch all device and sensor data from api."""
|
||||||
try:
|
try:
|
||||||
await self.device.update(update_children=False)
|
await self.device.update(update_children=False)
|
||||||
|
except AuthenticationException as ex:
|
||||||
|
raise ConfigEntryAuthFailed from ex
|
||||||
except SmartDeviceException as ex:
|
except SmartDeviceException as ex:
|
||||||
raise UpdateFailed(ex) from ex
|
raise UpdateFailed(ex) from ex
|
||||||
|
@ -5,6 +5,7 @@ import copy
|
|||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from unittest.mock import AsyncMock, MagicMock, patch
|
from unittest.mock import AsyncMock, MagicMock, patch
|
||||||
|
|
||||||
|
from kasa.exceptions import AuthenticationException
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant import setup
|
from homeassistant import setup
|
||||||
@ -17,6 +18,8 @@ from homeassistant.const import (
|
|||||||
CONF_PASSWORD,
|
CONF_PASSWORD,
|
||||||
CONF_USERNAME,
|
CONF_USERNAME,
|
||||||
EVENT_HOMEASSISTANT_STARTED,
|
EVENT_HOMEASSISTANT_STARTED,
|
||||||
|
STATE_ON,
|
||||||
|
STATE_UNAVAILABLE,
|
||||||
)
|
)
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers.entity_registry import EntityRegistry
|
from homeassistant.helpers.entity_registry import EntityRegistry
|
||||||
@ -29,6 +32,7 @@ from . import (
|
|||||||
IP_ADDRESS,
|
IP_ADDRESS,
|
||||||
MAC_ADDRESS,
|
MAC_ADDRESS,
|
||||||
_mocked_dimmer,
|
_mocked_dimmer,
|
||||||
|
_mocked_plug,
|
||||||
_patch_connect,
|
_patch_connect,
|
||||||
_patch_discovery,
|
_patch_discovery,
|
||||||
_patch_single_discovery,
|
_patch_single_discovery,
|
||||||
@ -256,3 +260,32 @@ async def test_config_entry_errors(
|
|||||||
any(mock_config_entry.async_get_active_flows(hass, {SOURCE_REAUTH}))
|
any(mock_config_entry.async_get_active_flows(hass, {SOURCE_REAUTH}))
|
||||||
== reauth_flows
|
== reauth_flows
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
async def test_plug_auth_fails(hass: HomeAssistant) -> None:
|
||||||
|
"""Test a smart plug auth failure."""
|
||||||
|
config_entry = MockConfigEntry(domain=DOMAIN, data={}, unique_id=MAC_ADDRESS)
|
||||||
|
config_entry.add_to_hass(hass)
|
||||||
|
plug = _mocked_plug()
|
||||||
|
with _patch_discovery(device=plug), _patch_connect(device=plug):
|
||||||
|
await async_setup_component(hass, tplink.DOMAIN, {tplink.DOMAIN: {}})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
entity_id = "switch.my_plug"
|
||||||
|
state = hass.states.get(entity_id)
|
||||||
|
assert state.state == STATE_ON
|
||||||
|
plug.update = AsyncMock(side_effect=AuthenticationException)
|
||||||
|
|
||||||
|
async_fire_time_changed(hass, dt_util.utcnow() + timedelta(seconds=30))
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
state = hass.states.get(entity_id)
|
||||||
|
assert state.state == STATE_UNAVAILABLE
|
||||||
|
|
||||||
|
assert (
|
||||||
|
len(
|
||||||
|
hass.config_entries.flow.async_progress_by_handler(
|
||||||
|
DOMAIN, match_context={"source": SOURCE_REAUTH}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
== 1
|
||||||
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user