From 2922d4675f3ff180ae07df5440cec28317afbf24 Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Thu, 1 Oct 2020 09:23:12 +0200 Subject: [PATCH] Abort deCONZ config flow if no radio hardware is connected (#40811) --- .../components/deconz/config_flow.py | 3 ++ homeassistant/components/deconz/strings.json | 1 + .../components/deconz/translations/en.json | 1 + tests/components/deconz/test_config_flow.py | 31 +++++++++++++++++++ 4 files changed, 36 insertions(+) diff --git a/homeassistant/components/deconz/config_flow.py b/homeassistant/components/deconz/config_flow.py index 6c2df3ad614..c43c1c95504 100644 --- a/homeassistant/components/deconz/config_flow.py +++ b/homeassistant/components/deconz/config_flow.py @@ -172,6 +172,9 @@ class DeconzFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): except asyncio.TimeoutError: return self.async_abort(reason="no_bridges") + if self.bridge_id == "0000000000000000": + return self.async_abort(reason="no_hardware_available") + return self.async_create_entry(title=self.bridge_id, data=self.deconz_config) async def async_step_ssdp(self, discovery_info): diff --git a/homeassistant/components/deconz/strings.json b/homeassistant/components/deconz/strings.json index d3e9e884cb2..8880689934b 100644 --- a/homeassistant/components/deconz/strings.json +++ b/homeassistant/components/deconz/strings.json @@ -29,6 +29,7 @@ "already_configured": "Bridge is already configured", "already_in_progress": "Config flow for bridge is already in progress.", "no_bridges": "No deCONZ bridges discovered", + "no_hardware_available": "No radio hardware connected to deCONZ", "not_deconz_bridge": "Not a deCONZ bridge", "one_instance_only": "Component only supports one deCONZ instance", "updated_instance": "Updated deCONZ instance with new host address" diff --git a/homeassistant/components/deconz/translations/en.json b/homeassistant/components/deconz/translations/en.json index 868c5771199..f762c61ca88 100644 --- a/homeassistant/components/deconz/translations/en.json +++ b/homeassistant/components/deconz/translations/en.json @@ -4,6 +4,7 @@ "already_configured": "Bridge is already configured", "already_in_progress": "Config flow for bridge is already in progress.", "no_bridges": "No deCONZ bridges discovered", + "no_hardware_available": "No radio hardware connected to deCONZ", "not_deconz_bridge": "Not a deCONZ bridge", "one_instance_only": "Component only supports one deCONZ instance", "updated_instance": "Updated deCONZ instance with new host address" diff --git a/tests/components/deconz/test_config_flow.py b/tests/components/deconz/test_config_flow.py index 104edca6cca..8e46308ccd7 100644 --- a/tests/components/deconz/test_config_flow.py +++ b/tests/components/deconz/test_config_flow.py @@ -24,6 +24,8 @@ from .test_gateway import API_KEY, BRIDGEID, setup_deconz_integration from tests.async_mock import patch +BAD_BRIDGEID = "0000000000000000" + async def test_flow_discovered_bridges(hass, aioclient_mock): """Test that config flow works for discovered bridges.""" @@ -391,6 +393,35 @@ async def test_flow_ssdp_discovery(hass, aioclient_mock): } +async def test_flow_ssdp_discovery_bad_bridge_id_aborts(hass, aioclient_mock): + """Test that config flow aborts if deCONZ signals no radio hardware available.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, + data={ + ssdp.ATTR_SSDP_LOCATION: "http://1.2.3.4:80/", + ssdp.ATTR_UPNP_MANUFACTURER_URL: DECONZ_MANUFACTURERURL, + ssdp.ATTR_UPNP_SERIAL: BAD_BRIDGEID, + }, + context={"source": "ssdp"}, + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "link" + + aioclient_mock.post( + "http://1.2.3.4:80/api", + json=[{"success": {"username": API_KEY}}], + headers={"content-type": CONTENT_TYPE_JSON}, + ) + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], user_input={} + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT + assert result["reason"] == "no_hardware_available" + + async def test_ssdp_discovery_not_deconz_bridge(hass): """Test a non deconz bridge being discovered over ssdp.""" result = await hass.config_entries.flow.async_init(