From f326dd919b65b9582fa31ca2a81b6fe95029000c Mon Sep 17 00:00:00 2001 From: Luke Date: Fri, 5 May 2023 15:20:30 -0400 Subject: [PATCH] Roborock continue on failed mqtt disconnect (#92502) continue on async disconnect failure --- homeassistant/components/roborock/__init__.py | 6 ++++- tests/components/roborock/mock_data.py | 5 ++++ tests/components/roborock/test_init.py | 23 +++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/roborock/__init__.py b/homeassistant/components/roborock/__init__.py index 497d30b41cf..1ea5e4734bb 100644 --- a/homeassistant/components/roborock/__init__.py +++ b/homeassistant/components/roborock/__init__.py @@ -8,6 +8,7 @@ import logging from roborock.api import RoborockApiClient from roborock.cloud_api import RoborockMqttClient from roborock.containers import HomeDataDevice, RoborockDeviceInfo, UserData +from roborock.exceptions import RoborockException from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_USERNAME @@ -44,7 +45,10 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: for device, result in zip(devices, network_results) if result is not None } - await mqtt_client.async_disconnect() + try: + await mqtt_client.async_disconnect() + except RoborockException as err: + _LOGGER.warning("Failed disconnecting from the mqtt server %s", err) if not network_info: raise ConfigEntryNotReady( "Could not get network information about your devices" diff --git a/tests/components/roborock/mock_data.py b/tests/components/roborock/mock_data.py index cbd5ef379e8..55eb8086842 100644 --- a/tests/components/roborock/mock_data.py +++ b/tests/components/roborock/mock_data.py @@ -7,6 +7,7 @@ from roborock.containers import ( Consumable, DNDTimer, HomeData, + NetworkInfo, Status, UserData, ) @@ -368,3 +369,7 @@ STATUS = Status.from_dict( ) PROP = DeviceProp(STATUS, DND_TIMER, CLEAN_SUMMARY, CONSUMABLE, CLEAN_RECORD) + +NETWORK_INFO = NetworkInfo( + ip="123.232.12.1", ssid="wifi", mac="ac:cc:cc:cc:cc", bssid="bssid", rssi=90 +) diff --git a/tests/components/roborock/test_init.py b/tests/components/roborock/test_init.py index 05bf0848475..18d9ee1bafe 100644 --- a/tests/components/roborock/test_init.py +++ b/tests/components/roborock/test_init.py @@ -1,6 +1,8 @@ """Test for Roborock init.""" from unittest.mock import patch +from roborock.exceptions import RoborockTimeout + from homeassistant.components.roborock.const import DOMAIN from homeassistant.config_entries import ConfigEntryState from homeassistant.core import HomeAssistant @@ -8,6 +10,7 @@ from homeassistant.helpers.update_coordinator import UpdateFailed from homeassistant.setup import async_setup_component from tests.common import MockConfigEntry +from tests.components.roborock.mock_data import HOME_DATA, NETWORK_INFO async def test_unload_entry( @@ -38,3 +41,23 @@ async def test_config_entry_not_ready( ): await async_setup_component(hass, DOMAIN, {}) assert mock_roborock_entry.state is ConfigEntryState.SETUP_RETRY + + +async def test_continue_setup_mqtt_disconnect_fail( + hass: HomeAssistant, mock_roborock_entry: MockConfigEntry +): + """Test that if disconnect fails, we still continue setting up.""" + with patch( + "homeassistant.components.roborock.RoborockApiClient.get_home_data", + return_value=HOME_DATA, + ), patch( + "homeassistant.components.roborock.RoborockMqttClient.get_networking", + return_value=NETWORK_INFO, + ), patch( + "homeassistant.components.roborock.RoborockMqttClient.async_disconnect", + side_effect=RoborockTimeout(), + ), patch( + "homeassistant.components.roborock.RoborockDataUpdateCoordinator.async_config_entry_first_refresh" + ): + await async_setup_component(hass, DOMAIN, {}) + assert mock_roborock_entry.state is ConfigEntryState.LOADED