From d72c960add7b8949c66368c69c81fd14e099244d Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Fri, 22 May 2020 13:07:47 +0200 Subject: [PATCH 1/7] Remove non supported setup option via UI --- homeassistant/components/lutron_caseta/manifest.json | 11 +++++++---- homeassistant/generated/config_flows.py | 1 - 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/lutron_caseta/manifest.json b/homeassistant/components/lutron_caseta/manifest.json index 7b55dfd9c8749b..34fc326425cc3c 100644 --- a/homeassistant/components/lutron_caseta/manifest.json +++ b/homeassistant/components/lutron_caseta/manifest.json @@ -2,7 +2,10 @@ "domain": "lutron_caseta", "name": "Lutron Caséta", "documentation": "https://www.home-assistant.io/integrations/lutron_caseta", - "requirements": ["pylutron-caseta==0.6.1"], - "codeowners": ["@swails"], - "config_flow": true -} \ No newline at end of file + "requirements": [ + "pylutron-caseta==0.6.1" + ], + "codeowners": [ + "@swails" + ] +} diff --git a/homeassistant/generated/config_flows.py b/homeassistant/generated/config_flows.py index 2918f09d626e86..208ea3ef07f759 100644 --- a/homeassistant/generated/config_flows.py +++ b/homeassistant/generated/config_flows.py @@ -85,7 +85,6 @@ "locative", "logi_circle", "luftdaten", - "lutron_caseta", "mailgun", "melcloud", "met", From 4f52cc9d5e9d34003210b06f39552d2860d0c3c6 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Fri, 22 May 2020 13:08:23 +0200 Subject: [PATCH 2/7] Simplify config yaml access --- homeassistant/components/lutron_caseta/__init__.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/homeassistant/components/lutron_caseta/__init__.py b/homeassistant/components/lutron_caseta/__init__.py index 59fd81e650e9bc..ff7ec61ecc83e2 100644 --- a/homeassistant/components/lutron_caseta/__init__.py +++ b/homeassistant/components/lutron_caseta/__init__.py @@ -39,11 +39,7 @@ async def async_setup(hass, base_config): """Set up the Lutron component.""" - bridge_configs = base_config.get(DOMAIN) - - if not bridge_configs: - return True - + bridge_configs = base_config[DOMAIN] hass.data.setdefault(DOMAIN, {}) for config in bridge_configs: From 4e69da998d67fbb45117757a3c07398045a3eeca Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Fri, 22 May 2020 14:07:29 +0200 Subject: [PATCH 3/7] Fix config flow test --- tests/components/lutron_caseta/test_config_flow.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/components/lutron_caseta/test_config_flow.py b/tests/components/lutron_caseta/test_config_flow.py index a528e223e44322..9175e9c343e0f7 100644 --- a/tests/components/lutron_caseta/test_config_flow.py +++ b/tests/components/lutron_caseta/test_config_flow.py @@ -51,7 +51,11 @@ async def test_bridge_import_flow(hass): with patch( "homeassistant.components.lutron_caseta.async_setup_entry", return_value=True, - ) as mock_setup_entry, patch.object(Smartbridge, "create_tls") as create_tls: + ) as mock_setup_entry, patch( + "homeassistant.components.lutron_caseta.async_setup", return_value=True + ), patch.object( + Smartbridge, "create_tls" + ) as create_tls: create_tls.return_value = MockBridge(can_connect=True) result = await hass.config_entries.flow.async_init( From 03005adcf1fbc891c07b778b7c3d884cc9183fea Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Fri, 22 May 2020 14:17:56 +0200 Subject: [PATCH 4/7] Include config flow in coverage report --- .coveragerc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.coveragerc b/.coveragerc index c49073f28f0346..933ddd69081084 100644 --- a/.coveragerc +++ b/.coveragerc @@ -440,7 +440,13 @@ omit = homeassistant/components/luftdaten/* homeassistant/components/lupusec/* homeassistant/components/lutron/* - homeassistant/components/lutron_caseta/* + homeassistant/components/lutron_caseta/__init__.py + homeassistant/components/lutron_caseta/binary_sensor.py + homeassistant/components/lutron_caseta/cover.py + homeassistant/components/lutron_caseta/fan.py + homeassistant/components/lutron_caseta/light.py + homeassistant/components/lutron_caseta/scene.py + homeassistant/components/lutron_caseta/switch.py homeassistant/components/lw12wifi/light.py homeassistant/components/lyft/sensor.py homeassistant/components/magicseaweed/sensor.py From e3ac8f6e0d7bf4dfd6dffb4324bb1c6ae28179c5 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Fri, 22 May 2020 14:18:36 +0200 Subject: [PATCH 5/7] Cover abort cannot connect --- tests/components/lutron_caseta/test_config_flow.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/components/lutron_caseta/test_config_flow.py b/tests/components/lutron_caseta/test_config_flow.py index 9175e9c343e0f7..ab717fd2e75d43 100644 --- a/tests/components/lutron_caseta/test_config_flow.py +++ b/tests/components/lutron_caseta/test_config_flow.py @@ -1,5 +1,4 @@ """Test the Lutron Caseta config flow.""" -from asynctest import patch from pylutron_caseta.smartbridge import Smartbridge from homeassistant import config_entries, data_entry_flow @@ -14,6 +13,7 @@ ) from homeassistant.const import CONF_HOST +from tests.async_mock import patch from tests.common import MockConfigEntry @@ -95,6 +95,12 @@ async def test_bridge_cannot_connect(hass): assert result["type"] == "form" assert result["step_id"] == STEP_IMPORT_FAILED assert result["errors"] == {"base": ERROR_CANNOT_CONNECT} + + result = await hass.config_entries.flow.async_configure(result["flow_id"], {}) + + assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT + assert result["reason"] == CasetaConfigFlow.ABORT_REASON_CANNOT_CONNECT + # validate setup_entry was not called assert len(mock_setup_entry.mock_calls) == 0 From 64e03d78a1985c977e59dd73f6e27ad817653f21 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Fri, 22 May 2020 14:41:44 +0200 Subject: [PATCH 6/7] Add test for unknown error --- .../lutron_caseta/test_config_flow.py | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/tests/components/lutron_caseta/test_config_flow.py b/tests/components/lutron_caseta/test_config_flow.py index ab717fd2e75d43..fc9c5fe279d455 100644 --- a/tests/components/lutron_caseta/test_config_flow.py +++ b/tests/components/lutron_caseta/test_config_flow.py @@ -13,7 +13,7 @@ ) from homeassistant.const import CONF_HOST -from tests.async_mock import patch +from tests.async_mock import AsyncMock, patch from tests.common import MockConfigEntry @@ -81,9 +81,7 @@ async def test_bridge_cannot_connect(hass): CONF_CA_CERTS: "", } - with patch( - "homeassistant.components.lutron_caseta.async_setup_entry", return_value=True, - ) as mock_setup_entry, patch.object(Smartbridge, "create_tls") as create_tls: + with patch.object(Smartbridge, "create_tls") as create_tls: create_tls.return_value = MockBridge(can_connect=False) result = await hass.config_entries.flow.async_init( @@ -101,8 +99,35 @@ async def test_bridge_cannot_connect(hass): assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT assert result["reason"] == CasetaConfigFlow.ABORT_REASON_CANNOT_CONNECT - # validate setup_entry was not called - assert len(mock_setup_entry.mock_calls) == 0 + +async def test_bridge_cannot_connect_unknown_error(hass): + """Test checking for connection and encountering an unknown error.""" + + entry_mock_data = { + CONF_HOST: "", + CONF_KEYFILE: "", + CONF_CERTFILE: "", + CONF_CA_CERTS: "", + } + + with patch.object(Smartbridge, "create_tls") as create_tls: + mock_bridge = MockBridge() + mock_bridge.connect = AsyncMock(side_effect=Exception()) + create_tls.return_value = mock_bridge + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": config_entries.SOURCE_IMPORT}, + data=entry_mock_data, + ) + + assert result["type"] == "form" + assert result["step_id"] == STEP_IMPORT_FAILED + assert result["errors"] == {"base": ERROR_CANNOT_CONNECT} + + result = await hass.config_entries.flow.async_configure(result["flow_id"], {}) + + assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT + assert result["reason"] == CasetaConfigFlow.ABORT_REASON_CANNOT_CONNECT async def test_duplicate_bridge_import(hass): From bfa4d9f444bdb5be951d1f60238b70424f1d6105 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Fri, 22 May 2020 14:42:25 +0200 Subject: [PATCH 7/7] Remove non specific exception catching --- homeassistant/components/lutron_caseta/config_flow.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/homeassistant/components/lutron_caseta/config_flow.py b/homeassistant/components/lutron_caseta/config_flow.py index 45a7f10fbf068d..3a5a4a151a1450 100644 --- a/homeassistant/components/lutron_caseta/config_flow.py +++ b/homeassistant/components/lutron_caseta/config_flow.py @@ -94,11 +94,6 @@ async def async_validate_connectable_bridge_config(self): await bridge.close() return True - except (KeyError, ValueError): - _LOGGER.error( - "Error while checking connectivity to bridge %s", self.data[CONF_HOST], - ) - return False except Exception: # pylint: disable=broad-except _LOGGER.exception( "Unknown exception while checking connectivity to bridge %s",