From e96ce3f5204246d497f98a4396484c40782dace4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Roy?= Date: Wed, 23 Aug 2023 11:34:38 -0700 Subject: [PATCH] baf: Raise ConfigEntryNotReady when the device has a mismatched UUID (#98898) --- homeassistant/components/baf/__init__.py | 5 +++ homeassistant/components/baf/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/baf/test_init.py | 43 ++++++++++++++++++++++ 5 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 tests/components/baf/test_init.py diff --git a/homeassistant/components/baf/__init__.py b/homeassistant/components/baf/__init__.py index dd784b214f7..fcc648f4001 100644 --- a/homeassistant/components/baf/__init__.py +++ b/homeassistant/components/baf/__init__.py @@ -6,6 +6,7 @@ from asyncio import timeout from aiobafi6 import Device, Service from aiobafi6.discovery import PORT +from aiobafi6.exceptions import DeviceUUIDMismatchError from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_IP_ADDRESS, Platform @@ -37,6 +38,10 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: try: async with timeout(RUN_TIMEOUT): await device.async_wait_available() + except DeviceUUIDMismatchError as ex: + raise ConfigEntryNotReady( + f"Unexpected device found at {ip_address}; expected {entry.unique_id}, found {device.dns_sd_uuid}" + ) from ex except asyncio.TimeoutError as ex: run_future.cancel() raise ConfigEntryNotReady(f"Timed out connecting to {ip_address}") from ex diff --git a/homeassistant/components/baf/manifest.json b/homeassistant/components/baf/manifest.json index 37fd5cee7c6..497b3638fce 100644 --- a/homeassistant/components/baf/manifest.json +++ b/homeassistant/components/baf/manifest.json @@ -5,7 +5,7 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/baf", "iot_class": "local_push", - "requirements": ["aiobafi6==0.8.2"], + "requirements": ["aiobafi6==0.9.0"], "zeroconf": [ { "type": "_api._tcp.local.", diff --git a/requirements_all.txt b/requirements_all.txt index 813e3af0ce7..f7cb1f9d60a 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -203,7 +203,7 @@ aioasuswrt==1.4.0 aioazuredevops==1.3.5 # homeassistant.components.baf -aiobafi6==0.8.2 +aiobafi6==0.9.0 # homeassistant.components.aws aiobotocore==2.6.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 681755137b3..fbae222770c 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -184,7 +184,7 @@ aioasuswrt==1.4.0 aioazuredevops==1.3.5 # homeassistant.components.baf -aiobafi6==0.8.2 +aiobafi6==0.9.0 # homeassistant.components.aws aiobotocore==2.6.0 diff --git a/tests/components/baf/test_init.py b/tests/components/baf/test_init.py new file mode 100644 index 00000000000..c87237892ad --- /dev/null +++ b/tests/components/baf/test_init.py @@ -0,0 +1,43 @@ +"""Test the baf init flow.""" +from unittest.mock import patch + +from aiobafi6.exceptions import DeviceUUIDMismatchError +import pytest + +from homeassistant.components.baf.const import DOMAIN +from homeassistant.config_entries import ConfigEntryState +from homeassistant.const import CONF_IP_ADDRESS +from homeassistant.core import HomeAssistant +from homeassistant.setup import async_setup_component + +from . import MOCK_UUID, MockBAFDevice + +from tests.common import MockConfigEntry + + +def _patch_device_init(side_effect=None): + """Mock out the BAF Device object.""" + + def _create_mock_baf(*args, **kwargs): + return MockBAFDevice(side_effect) + + return patch("homeassistant.components.baf.Device", _create_mock_baf) + + +async def test_config_entry_wrong_uuid( + hass: HomeAssistant, caplog: pytest.LogCaptureFixture +) -> None: + """Test config entry enters setup retry when uuid mismatches.""" + mismatched_uuid = MOCK_UUID + "0" + already_migrated_config_entry = MockConfigEntry( + domain=DOMAIN, data={CONF_IP_ADDRESS: "127.0.0.1"}, unique_id=mismatched_uuid + ) + already_migrated_config_entry.add_to_hass(hass) + with _patch_device_init(DeviceUUIDMismatchError): + await async_setup_component(hass, DOMAIN, {DOMAIN: {}}) + await hass.async_block_till_done() + assert already_migrated_config_entry.state == ConfigEntryState.SETUP_RETRY + assert ( + "Unexpected device found at 127.0.0.1; expected 12340, found 1234" + in caplog.text + )