Skip to content

Commit

Permalink
Make UniFi services handle unloaded config entry (#120028)
Browse files Browse the repository at this point in the history
  • Loading branch information
Kane610 authored and frenck committed Jun 21, 2024
1 parent 5b322f1 commit 39f67af
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 5 deletions.
15 changes: 10 additions & 5 deletions homeassistant/components/unifi/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from aiounifi.models.client import ClientReconnectRequest, ClientRemoveRequest
import voluptuous as vol

from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import ATTR_DEVICE_ID
from homeassistant.core import HomeAssistant, ServiceCall, callback
from homeassistant.helpers import device_registry as dr
Expand Down Expand Up @@ -66,9 +67,9 @@ async def async_reconnect_client(hass: HomeAssistant, data: Mapping[str, Any]) -
if mac == "":
return

for entry in hass.config_entries.async_entries(UNIFI_DOMAIN):
if (
(hub := entry.runtime_data)
for config_entry in hass.config_entries.async_entries(UNIFI_DOMAIN):
if config_entry.state is not ConfigEntryState.LOADED or (
(hub := config_entry.runtime_data)
and not hub.available
or (client := hub.api.clients.get(mac)) is None
or client.is_wired
Expand All @@ -85,8 +86,12 @@ async def async_remove_clients(hass: HomeAssistant, data: Mapping[str, Any]) ->
- Total time between first seen and last seen is less than 15 minutes.
- Neither IP, hostname nor name is configured.
"""
for entry in hass.config_entries.async_entries(UNIFI_DOMAIN):
if (hub := entry.runtime_data) and not hub.available:
for config_entry in hass.config_entries.async_entries(UNIFI_DOMAIN):
if (
config_entry.state is not ConfigEntryState.LOADED
or (hub := config_entry.runtime_data)
and not hub.available
):
continue

clients_to_remove = []
Expand Down
41 changes: 41 additions & 0 deletions tests/components/unifi/test_services.py
Original file line number Diff line number Diff line change
Expand Up @@ -281,3 +281,44 @@ async def test_remove_clients_no_call_on_empty_list(

await hass.services.async_call(UNIFI_DOMAIN, SERVICE_REMOVE_CLIENTS, blocking=True)
assert aioclient_mock.call_count == 0


@pytest.mark.parametrize(
"clients_all_payload",
[
[
{
"first_seen": 100,
"last_seen": 500,
"mac": "00:00:00:00:00:01",
}
]
],
)
async def test_services_handle_unloaded_config_entry(
hass: HomeAssistant,
aioclient_mock: AiohttpClientMocker,
device_registry: dr.DeviceRegistry,
config_entry_setup: ConfigEntry,
clients_all_payload,
) -> None:
"""Verify no call is made if config entry is unloaded."""
await hass.config_entries.async_unload(config_entry_setup.entry_id)
await hass.async_block_till_done()

aioclient_mock.clear_requests()

await hass.services.async_call(UNIFI_DOMAIN, SERVICE_REMOVE_CLIENTS, blocking=True)
assert aioclient_mock.call_count == 0

device_entry = device_registry.async_get_or_create(
config_entry_id=config_entry_setup.entry_id,
connections={(dr.CONNECTION_NETWORK_MAC, clients_all_payload[0]["mac"])},
)
await hass.services.async_call(
UNIFI_DOMAIN,
SERVICE_RECONNECT_CLIENT,
service_data={ATTR_DEVICE_ID: device_entry.id},
blocking=True,
)
assert aioclient_mock.call_count == 0

0 comments on commit 39f67af

Please sign in to comment.