From 9319fc62638814a28e2e18a8f6ad2b31cdfaa144 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Tue, 25 May 2021 14:37:34 +0200 Subject: [PATCH] Update zwave_js stored add-on options (#51063) * Update zwave_js entry data if add-on data changed * Fix tests * Add test --- homeassistant/components/zwave_js/__init__.py | 13 +++++ tests/components/zwave_js/test_init.py | 50 ++++++++++++++++++- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/zwave_js/__init__.py b/homeassistant/components/zwave_js/__init__.py index bac6433a5e2..520495d5071 100644 --- a/homeassistant/components/zwave_js/__init__.py +++ b/homeassistant/components/zwave_js/__init__.py @@ -51,6 +51,8 @@ from .const import ( ATTR_TYPE, ATTR_VALUE, ATTR_VALUE_RAW, + CONF_ADDON_DEVICE, + CONF_ADDON_NETWORK_KEY, CONF_DATA_COLLECTION_OPTED_IN, CONF_INTEGRATION_CREATED_ADDON, CONF_NETWORK_KEY, @@ -580,6 +582,17 @@ async def async_ensure_addon_running(hass: HomeAssistant, entry: ConfigEntry) -> ) raise ConfigEntryNotReady + addon_options = addon_info.options + addon_device = addon_options[CONF_ADDON_DEVICE] + addon_network_key = addon_options[CONF_ADDON_NETWORK_KEY] + updates = {} + if usb_path != addon_device: + updates[CONF_USB_PATH] = addon_device + if network_key != addon_network_key: + updates[CONF_NETWORK_KEY] = addon_network_key + if updates: + hass.config_entries.async_update_entry(entry, data={**entry.data, **updates}) + @callback def async_ensure_addon_updated(hass: HomeAssistant) -> None: diff --git a/tests/components/zwave_js/test_init.py b/tests/components/zwave_js/test_init.py index c4f35941a25..65421eba604 100644 --- a/tests/components/zwave_js/test_init.py +++ b/tests/components/zwave_js/test_init.py @@ -654,6 +654,48 @@ async def test_addon_info_failure( assert start_addon.call_count == 0 +@pytest.mark.parametrize( + "old_device, new_device, old_network_key, new_network_key", + [("/old_test", "/new_test", "old123", "new123")], +) +async def test_addon_options_changed( + hass, + client, + addon_installed, + addon_running, + install_addon, + addon_options, + start_addon, + old_device, + new_device, + old_network_key, + new_network_key, +): + """Test update config entry data on entry setup if add-on options changed.""" + addon_options["device"] = new_device + addon_options["network_key"] = new_network_key + entry = MockConfigEntry( + domain=DOMAIN, + title="Z-Wave JS", + data={ + "url": "ws://host1:3001", + "use_addon": True, + "usb_path": old_device, + "network_key": old_network_key, + }, + ) + entry.add_to_hass(hass) + + await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + + assert entry.state == ConfigEntryState.LOADED + assert entry.data["usb_path"] == new_device + assert entry.data["network_key"] == new_network_key + assert install_addon.call_count == 0 + assert start_addon.call_count == 0 + + @pytest.mark.parametrize( "addon_version, update_available, update_calls, snapshot_calls, " "update_addon_side_effect, create_shapshot_side_effect", @@ -681,13 +723,15 @@ async def test_update_addon( create_shapshot_side_effect, ): """Test update the Z-Wave JS add-on during entry setup.""" + device = "/test" + network_key = "abc123" + addon_options["device"] = device + addon_options["network_key"] = network_key addon_info.return_value["version"] = addon_version addon_info.return_value["update_available"] = update_available create_shapshot.side_effect = create_shapshot_side_effect update_addon.side_effect = update_addon_side_effect client.connect.side_effect = InvalidServerVersion("Invalid version") - device = "/test" - network_key = "abc123" entry = MockConfigEntry( domain=DOMAIN, title="Z-Wave JS", @@ -729,6 +773,8 @@ async def test_stop_addon( stop_addon.side_effect = stop_addon_side_effect device = "/test" network_key = "abc123" + addon_options["device"] = device + addon_options["network_key"] = network_key entry = MockConfigEntry( domain=DOMAIN, title="Z-Wave JS",