From d9a09a2aeae97a02181ceb9cc43913aca740f7f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=85ke=20Strandberg?= Date: Mon, 28 Apr 2025 08:59:34 +0200 Subject: [PATCH] Enable deletion of stale miele devices (#143811) Enable deletion of stale devices --- homeassistant/components/miele/__init__.py | 13 ++++++++ tests/components/miele/test_init.py | 39 ++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/homeassistant/components/miele/__init__.py b/homeassistant/components/miele/__init__.py index 823802314c3..3f1d4e7fd54 100644 --- a/homeassistant/components/miele/__init__.py +++ b/homeassistant/components/miele/__init__.py @@ -7,6 +7,7 @@ from aiohttp import ClientError, ClientResponseError from homeassistant.const import Platform from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady +from homeassistant.helpers import device_registry as dr from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.config_entry_oauth2_flow import ( OAuth2Session, @@ -73,3 +74,15 @@ async def async_unload_entry(hass: HomeAssistant, entry: MieleConfigEntry) -> bo """Unload a config entry.""" return await hass.config_entries.async_unload_platforms(entry, PLATFORMS) + + +async def async_remove_config_entry_device( + hass: HomeAssistant, config_entry: MieleConfigEntry, device_entry: dr.DeviceEntry +) -> bool: + """Remove a config entry from a device.""" + return not any( + identifier + for identifier in device_entry.identifiers + if identifier[0] == DOMAIN + and identifier[1] in config_entry.runtime_data.data.devices + ) diff --git a/tests/components/miele/test_init.py b/tests/components/miele/test_init.py index e32830c7540..7a81ef78065 100644 --- a/tests/components/miele/test_init.py +++ b/tests/components/miele/test_init.py @@ -13,11 +13,13 @@ from homeassistant.components.miele.const import DOMAIN from homeassistant.config_entries import ConfigEntryState from homeassistant.core import HomeAssistant from homeassistant.helpers import device_registry as dr +from homeassistant.setup import async_setup_component from . import setup_integration from tests.common import MockConfigEntry from tests.test_util.aiohttp import AiohttpClientMocker +from tests.typing import WebSocketGenerator async def test_load_unload_entry( @@ -118,3 +120,40 @@ async def test_device_info( ) assert device_entry is not None assert device_entry == snapshot + + +async def test_device_remove_devices( + hass: HomeAssistant, + hass_ws_client: WebSocketGenerator, + mock_config_entry: MockConfigEntry, + mock_miele_client: MagicMock, + device_registry: dr.DeviceRegistry, +) -> None: + """Test we can only remove a device that no longer exists.""" + assert await async_setup_component(hass, "config", {}) + + 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() + + device_entry = device_registry.async_get_device( + identifiers={ + ( + DOMAIN, + "Dummy_Appliance_1", + ) + }, + ) + client = await hass_ws_client(hass) + response = await client.remove_device(device_entry.id, mock_config_entry.entry_id) + assert not response["success"] + + old_device_entry = device_registry.async_get_or_create( + config_entry_id=mock_config_entry.entry_id, + identifiers={(DOMAIN, "OLD-DEVICE-UUID")}, + ) + response = await client.remove_device( + old_device_entry.id, mock_config_entry.entry_id + ) + assert response["success"]