From f4b57617fbbda8327a38be729c0b4bb01e35299f Mon Sep 17 00:00:00 2001 From: Raphael Hehl <7577984+RaHehl@users.noreply.github.com> Date: Wed, 27 Nov 2024 16:23:59 +0100 Subject: [PATCH] Unifiprotect fix missing domain check (#131724) --- homeassistant/components/unifiprotect/data.py | 1 + tests/components/unifiprotect/test_init.py | 66 ++++++++++++++++++- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/unifiprotect/data.py b/homeassistant/components/unifiprotect/data.py index 4ad8892ca01..baecc7f8323 100644 --- a/homeassistant/components/unifiprotect/data.py +++ b/homeassistant/components/unifiprotect/data.py @@ -349,6 +349,7 @@ def async_ufp_instance_for_config_entry_ids( entry.runtime_data.api for entry_id in config_entry_ids if (entry := hass.config_entries.async_get_entry(entry_id)) + and entry.domain == DOMAIN and hasattr(entry, "runtime_data") ), None, diff --git a/tests/components/unifiprotect/test_init.py b/tests/components/unifiprotect/test_init.py index 46e57c62101..457fd9d3b97 100644 --- a/tests/components/unifiprotect/test_init.py +++ b/tests/components/unifiprotect/test_init.py @@ -2,8 +2,9 @@ from __future__ import annotations -from unittest.mock import AsyncMock, patch +from unittest.mock import AsyncMock, Mock, patch +import pytest from uiprotect import NotAuthorized, NvrError, ProtectApiClient from uiprotect.api import DEVICE_UPDATE_INTERVAL from uiprotect.data import NVR, Bootstrap, CloudAccount, Light @@ -13,6 +14,9 @@ from homeassistant.components.unifiprotect.const import ( CONF_DISABLE_RTSP, DOMAIN, ) +from homeassistant.components.unifiprotect.data import ( + async_ufp_instance_for_config_entry_ids, +) from homeassistant.config_entries import ConfigEntry, ConfigEntryState from homeassistant.core import HomeAssistant from homeassistant.helpers import device_registry as dr, entity_registry as er @@ -286,3 +290,63 @@ async def test_device_remove_devices_nvr( client = await hass_ws_client(hass) response = await client.remove_device(live_device_entry.id, entry_id) assert not response["success"] + + +@pytest.mark.parametrize( + ("mock_entries", "expected_result"), + [ + pytest.param( + [ + Mock( + spec=ConfigEntry, + domain=DOMAIN, + runtime_data=Mock(api="mock_api_instance_1"), + ), + Mock( + spec=ConfigEntry, + domain="other_domain", + runtime_data=Mock(api="mock_api_instance_2"), + ), + ], + "mock_api_instance_1", + id="one_matching_domain", + ), + pytest.param( + [ + Mock( + spec=ConfigEntry, + domain="other_domain", + runtime_data=Mock(api="mock_api_instance_1"), + ), + Mock( + spec=ConfigEntry, + domain="other_domain", + runtime_data=Mock(api="mock_api_instance_2"), + ), + ], + None, + id="no_matching_domain", + ), + ], +) +async def test_async_ufp_instance_for_config_entry_ids( + mock_entries, expected_result +) -> None: + """Test async_ufp_instance_for_config_entry_ids with various entry configurations.""" + + hass = Mock(spec=HomeAssistant) + + mock_entry_mapping = { + str(index): entry for index, entry in enumerate(mock_entries, start=1) + } + + def mock_async_get_entry(entry_id): + return mock_entry_mapping.get(entry_id) + + hass.config_entries.async_get_entry = Mock(side_effect=mock_async_get_entry) + + entry_ids = set(mock_entry_mapping.keys()) + + result = async_ufp_instance_for_config_entry_ids(hass, entry_ids) + + assert result == expected_result