From 67838518ab9128c7092a9d1731e04585a8a5b004 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Wed, 26 Jan 2022 20:07:34 +0100 Subject: [PATCH] Abort owntracks config flow when not connected to home assistant cloud (#64968) --- .../components/owntracks/config_flow.py | 5 ++- .../components/owntracks/strings.json | 1 + .../components/owntracks/test_config_flow.py | 34 +++++++++++++++++-- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/owntracks/config_flow.py b/homeassistant/components/owntracks/config_flow.py index 095a0e6edc9..bdc8323d512 100644 --- a/homeassistant/components/owntracks/config_flow.py +++ b/homeassistant/components/owntracks/config_flow.py @@ -25,7 +25,10 @@ class OwnTracksFlow(config_entries.ConfigFlow, domain=DOMAIN): if user_input is None: return self.async_show_form(step_id="user") - webhook_id, webhook_url, cloudhook = await self._get_webhook_id() + try: + webhook_id, webhook_url, cloudhook = await self._get_webhook_id() + except cloud.CloudNotConnected: + return self.async_abort(reason="cloud_not_connected") secret = secrets.token_hex(16) diff --git a/homeassistant/components/owntracks/strings.json b/homeassistant/components/owntracks/strings.json index ddb700cc642..a127d9d6a4a 100644 --- a/homeassistant/components/owntracks/strings.json +++ b/homeassistant/components/owntracks/strings.json @@ -7,6 +7,7 @@ } }, "abort": { + "cloud_not_connected": "[%key:common::config_flow::abort::cloud_not_connected%]", "single_instance_allowed": "[%key:common::config_flow::abort::single_instance_allowed%]" }, "create_entry": { diff --git a/tests/components/owntracks/test_config_flow.py b/tests/components/owntracks/test_config_flow.py index 07d4831b6b9..31a3a327d1c 100644 --- a/tests/components/owntracks/test_config_flow.py +++ b/tests/components/owntracks/test_config_flow.py @@ -149,20 +149,48 @@ async def test_unload(hass): async def test_with_cloud_sub(hass): """Test creating a config flow while subscribed.""" - hass.config.components.add("cloud") + assert await async_setup_component(hass, "cloud", {}) + with patch( "homeassistant.components.cloud.async_active_subscription", return_value=True ), patch( - "homeassistant.components.cloud.async_create_cloudhook", - return_value="https://hooks.nabu.casa/ABCD", + "homeassistant.components.cloud.async_is_logged_in", return_value=True + ), patch( + "homeassistant.components.cloud.async_is_connected", return_value=True + ), patch( + "hass_nabucasa.cloudhooks.Cloudhooks.async_create", + return_value={"cloudhook_url": "https://hooks.nabu.casa/ABCD"}, ): result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_USER}, data={} ) + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY entry = result["result"] assert entry.data["cloudhook"] assert ( result["description_placeholders"]["webhook_url"] == "https://hooks.nabu.casa/ABCD" ) + + +async def test_with_cloud_sub_not_connected(hass): + """Test creating a config flow while subscribed.""" + assert await async_setup_component(hass, "cloud", {}) + + with patch( + "homeassistant.components.cloud.async_active_subscription", return_value=True + ), patch( + "homeassistant.components.cloud.async_is_logged_in", return_value=True + ), patch( + "homeassistant.components.cloud.async_is_connected", return_value=False + ), patch( + "hass_nabucasa.cloudhooks.Cloudhooks.async_create", + return_value={"cloudhook_url": "https://hooks.nabu.casa/ABCD"}, + ): + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER}, data={} + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT + assert result["reason"] == "cloud_not_connected"