From 9e1042d9e02bdcb0d972c14979c1955c95aa3c69 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Wed, 28 Apr 2021 15:09:39 +0200 Subject: [PATCH] Fix zwave_js flow set add-on options (#49813) * Fix zwave_js flow set add-on options * Improve and deduplicate error messages * Add more call assertions * Add final missing call assertion --- homeassistant/components/zwave_js/addon.py | 2 +- .../components/zwave_js/config_flow.py | 15 +++-- tests/components/zwave_js/test_config_flow.py | 58 ++++++++++++++++++- 3 files changed, 65 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/zwave_js/addon.py b/homeassistant/components/zwave_js/addon.py index 0c2fdb17944..1413ea06de1 100644 --- a/homeassistant/components/zwave_js/addon.py +++ b/homeassistant/components/zwave_js/addon.py @@ -46,7 +46,7 @@ def api_error(error_message: str) -> Callable[[F], F]: try: return_value = await func(*args, **kwargs) except HassioAPIError as err: - raise AddonError(error_message) from err + raise AddonError(f"{error_message}: {err}") from err return return_value diff --git a/homeassistant/components/zwave_js/config_flow.py b/homeassistant/components/zwave_js/config_flow.py index b2bc5c0e0e0..b0f6c76b3f1 100644 --- a/homeassistant/components/zwave_js/config_flow.py +++ b/homeassistant/components/zwave_js/config_flow.py @@ -212,7 +212,7 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): try: await self.install_task except AddonError as err: - _LOGGER.error("Failed to install Z-Wave JS add-on: %s", err) + _LOGGER.error(err) return self.async_show_progress_done(next_step_id="install_failed") self.integration_created_addon = True @@ -274,7 +274,7 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): try: await self.start_task except (CannotConnect, AddonError) as err: - _LOGGER.error("Failed to start Z-Wave JS add-on: %s", err) + _LOGGER.error(err) return self.async_show_progress_done(next_step_id="start_failed") return self.async_show_progress_done(next_step_id="finish_addon_setup") @@ -309,7 +309,7 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): else: break else: - raise CannotConnect("Failed to start add-on: timeout") + raise CannotConnect("Failed to start Z-Wave JS add-on: timeout") finally: # Continue the flow after show progress when the task is done. self.hass.async_create_task( @@ -352,7 +352,7 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): try: addon_info: dict = await addon_manager.async_get_addon_info() except AddonError as err: - _LOGGER.error("Failed to get Z-Wave JS add-on info: %s", err) + _LOGGER.error(err) raise AbortFlow("addon_info_failed") from err return addon_info @@ -374,12 +374,11 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): async def _async_set_addon_config(self, config: dict) -> None: """Set Z-Wave JS add-on config.""" - options = {"options": config} addon_manager: AddonManager = get_addon_manager(self.hass) try: - await addon_manager.async_set_addon_options(options) + await addon_manager.async_set_addon_options(config) except AddonError as err: - _LOGGER.error("Failed to set Z-Wave JS add-on config: %s", err) + _LOGGER.error(err) raise AbortFlow("addon_set_config_failed") from err async def _async_install_addon(self) -> None: @@ -399,7 +398,7 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): try: discovery_info_config = await addon_manager.async_get_addon_discovery_info() except AddonError as err: - _LOGGER.error("Failed to get Z-Wave JS add-on discovery info: %s", err) + _LOGGER.error(err) raise AbortFlow("addon_get_discovery_info_failed") from err return discovery_info_config diff --git a/tests/components/zwave_js/test_config_flow.py b/tests/components/zwave_js/test_config_flow.py index 7eea126e52e..2414d2aea00 100644 --- a/tests/components/zwave_js/test_config_flow.py +++ b/tests/components/zwave_js/test_config_flow.py @@ -1,6 +1,6 @@ """Test the Z-Wave JS config flow.""" import asyncio -from unittest.mock import DEFAULT, patch +from unittest.mock import DEFAULT, call, patch import pytest from zwave_js_server.version import VersionInfo @@ -384,6 +384,10 @@ async def test_discovery_addon_not_running( result["flow_id"], {"usb_path": "/test", "network_key": "abc123"} ) + assert set_addon_options.call_args == call( + hass, "core_zwave_js", {"options": {"device": "/test", "network_key": "abc123"}} + ) + assert result["type"] == "progress" assert result["step_id"] == "start_addon" @@ -397,6 +401,8 @@ async def test_discovery_addon_not_running( result = await hass.config_entries.flow.async_configure(result["flow_id"]) await hass.async_block_till_done() + assert start_addon.call_args == call(hass, "core_zwave_js") + assert result["type"] == "create_entry" assert result["title"] == TITLE assert result["data"] == { @@ -441,6 +447,8 @@ async def test_discovery_addon_not_installed( result = await hass.config_entries.flow.async_configure(result["flow_id"]) + assert install_addon.call_args == call(hass, "core_zwave_js") + assert result["type"] == "form" assert result["step_id"] == "configure_addon" @@ -448,6 +456,10 @@ async def test_discovery_addon_not_installed( result["flow_id"], {"usb_path": "/test", "network_key": "abc123"} ) + assert set_addon_options.call_args == call( + hass, "core_zwave_js", {"options": {"device": "/test", "network_key": "abc123"}} + ) + assert result["type"] == "progress" assert result["step_id"] == "start_addon" @@ -461,6 +473,8 @@ async def test_discovery_addon_not_installed( result = await hass.config_entries.flow.async_configure(result["flow_id"]) await hass.async_block_till_done() + assert start_addon.call_args == call(hass, "core_zwave_js") + assert result["type"] == "create_entry" assert result["title"] == TITLE assert result["data"] == { @@ -694,6 +708,10 @@ async def test_addon_installed( result["flow_id"], {"usb_path": "/test", "network_key": "abc123"} ) + assert set_addon_options.call_args == call( + hass, "core_zwave_js", {"options": {"device": "/test", "network_key": "abc123"}} + ) + assert result["type"] == "progress" assert result["step_id"] == "start_addon" @@ -707,6 +725,8 @@ async def test_addon_installed( result = await hass.config_entries.flow.async_configure(result["flow_id"]) await hass.async_block_till_done() + assert start_addon.call_args == call(hass, "core_zwave_js") + assert result["type"] == "create_entry" assert result["title"] == TITLE assert result["data"] == { @@ -754,12 +774,18 @@ async def test_addon_installed_start_failure( result["flow_id"], {"usb_path": "/test", "network_key": "abc123"} ) + assert set_addon_options.call_args == call( + hass, "core_zwave_js", {"options": {"device": "/test", "network_key": "abc123"}} + ) + assert result["type"] == "progress" assert result["step_id"] == "start_addon" await hass.async_block_till_done() result = await hass.config_entries.flow.async_configure(result["flow_id"]) + assert start_addon.call_args == call(hass, "core_zwave_js") + assert result["type"] == "abort" assert result["reason"] == "addon_start_failed" @@ -807,12 +833,18 @@ async def test_addon_installed_failures( result["flow_id"], {"usb_path": "/test", "network_key": "abc123"} ) + assert set_addon_options.call_args == call( + hass, "core_zwave_js", {"options": {"device": "/test", "network_key": "abc123"}} + ) + assert result["type"] == "progress" assert result["step_id"] == "start_addon" await hass.async_block_till_done() result = await hass.config_entries.flow.async_configure(result["flow_id"]) + assert start_addon.call_args == call(hass, "core_zwave_js") + assert result["type"] == "abort" assert result["reason"] == "addon_start_failed" @@ -851,9 +883,15 @@ async def test_addon_installed_set_options_failure( result["flow_id"], {"usb_path": "/test", "network_key": "abc123"} ) + assert set_addon_options.call_args == call( + hass, "core_zwave_js", {"options": {"device": "/test", "network_key": "abc123"}} + ) + assert result["type"] == "abort" assert result["reason"] == "addon_set_config_failed" + assert start_addon.call_count == 0 + @pytest.mark.parametrize("discovery_info", [{"config": ADDON_DISCOVERY_INFO}]) async def test_addon_installed_already_configured( @@ -897,12 +935,20 @@ async def test_addon_installed_already_configured( result["flow_id"], {"usb_path": "/test_new", "network_key": "def456"} ) + assert set_addon_options.call_args == call( + hass, + "core_zwave_js", + {"options": {"device": "/test_new", "network_key": "def456"}}, + ) + assert result["type"] == "progress" assert result["step_id"] == "start_addon" await hass.async_block_till_done() result = await hass.config_entries.flow.async_configure(result["flow_id"]) + assert start_addon.call_args == call(hass, "core_zwave_js") + assert result["type"] == "abort" assert result["reason"] == "already_configured" assert entry.data["url"] == "ws://host1:3001" @@ -944,6 +990,8 @@ async def test_addon_not_installed( result = await hass.config_entries.flow.async_configure(result["flow_id"]) + assert install_addon.call_args == call(hass, "core_zwave_js") + assert result["type"] == "form" assert result["step_id"] == "configure_addon" @@ -951,6 +999,10 @@ async def test_addon_not_installed( result["flow_id"], {"usb_path": "/test", "network_key": "abc123"} ) + assert set_addon_options.call_args == call( + hass, "core_zwave_js", {"options": {"device": "/test", "network_key": "abc123"}} + ) + assert result["type"] == "progress" assert result["step_id"] == "start_addon" @@ -964,6 +1016,8 @@ async def test_addon_not_installed( result = await hass.config_entries.flow.async_configure(result["flow_id"]) await hass.async_block_till_done() + assert start_addon.call_args == call(hass, "core_zwave_js") + assert result["type"] == "create_entry" assert result["title"] == TITLE assert result["data"] == { @@ -1001,5 +1055,7 @@ async def test_install_addon_failure(hass, supervisor, addon_installed, install_ result = await hass.config_entries.flow.async_configure(result["flow_id"]) + assert install_addon.call_args == call(hass, "core_zwave_js") + assert result["type"] == "abort" assert result["reason"] == "addon_install_failed"