From 7ef33a72198ecc83d2dd3faa32980baf8fb6ed51 Mon Sep 17 00:00:00 2001 From: Eugene Prystupa Date: Mon, 29 Jun 2020 12:07:43 -0400 Subject: [PATCH] Add first unit test to config flow for Plum Lightpad (#37183) * add first unit test to config flow for Plum Lightpad * add first unit test to config flow for Plum Lightpad (add changed requirements_test_all.txt) * add first unit test to config flow for Plum Lightpad * add first unit test to config flow for Plum Lightpad (bring coverage to 100%) * add first unit test to config flow for Plum Lightpad * add first unit test to config flow for Plum Lightpad (updated patch path as suggested) * add first unit test to config flow for Plum Lightpad (add unit test for abort) --- .coveragerc | 3 +- requirements_test_all.txt | 3 + tests/components/plum_lightpad/__init__.py | 1 + .../plum_lightpad/test_config_flow.py | 117 ++++++++++++++++++ 4 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 tests/components/plum_lightpad/__init__.py create mode 100644 tests/components/plum_lightpad/test_config_flow.py diff --git a/.coveragerc b/.coveragerc index 0da952504de..150867054b2 100644 --- a/.coveragerc +++ b/.coveragerc @@ -620,7 +620,8 @@ omit = homeassistant/components/plugwise/climate.py homeassistant/components/plugwise/sensor.py homeassistant/components/plugwise/switch.py - homeassistant/components/plum_lightpad/* + homeassistant/components/plum_lightpad/__init__.py + homeassistant/components/plum_lightpad/light.py homeassistant/components/pocketcasts/sensor.py homeassistant/components/point/* homeassistant/components/prezzibenzina/sensor.py diff --git a/requirements_test_all.txt b/requirements_test_all.txt index ad91ada704a..55b76e1d26b 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -489,6 +489,9 @@ plexauth==0.0.5 # homeassistant.components.plex plexwebsocket==0.0.11 +# homeassistant.components.plum_lightpad +plumlightpad==0.0.11 + # homeassistant.components.mhz19 # homeassistant.components.serial_pm pmsensor==0.4 diff --git a/tests/components/plum_lightpad/__init__.py b/tests/components/plum_lightpad/__init__.py new file mode 100644 index 00000000000..d86bcb13eb1 --- /dev/null +++ b/tests/components/plum_lightpad/__init__.py @@ -0,0 +1 @@ +"""Tests for the Plum Lightpad integration.""" diff --git a/tests/components/plum_lightpad/test_config_flow.py b/tests/components/plum_lightpad/test_config_flow.py new file mode 100644 index 00000000000..9fc32f9872c --- /dev/null +++ b/tests/components/plum_lightpad/test_config_flow.py @@ -0,0 +1,117 @@ +"""Test the Plum Lightpad config flow.""" +from requests.exceptions import ConnectTimeout + +from homeassistant import config_entries, setup +from homeassistant.components.plum_lightpad.const import DOMAIN + +from tests.async_mock import patch +from tests.common import MockConfigEntry + + +async def test_form(hass): + """Test we get the form.""" + await setup.async_setup_component(hass, "persistent_notification", {}) + + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + assert result["type"] == "form" + assert result["errors"] == {} + + with patch( + "homeassistant.components.plum_lightpad.utils.Plum.loadCloudData" + ), patch( + "homeassistant.components.plum_lightpad.async_setup", return_value=True + ) as mock_setup, patch( + "homeassistant.components.plum_lightpad.async_setup_entry", return_value=True, + ) as mock_setup_entry: + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], + {"username": "test-plum-username", "password": "test-plum-password"}, + ) + + assert result2["type"] == "create_entry" + assert result2["title"] == "test-plum-username" + assert result2["data"] == { + "username": "test-plum-username", + "password": "test-plum-password", + } + await hass.async_block_till_done() + assert len(mock_setup.mock_calls) == 1 + assert len(mock_setup_entry.mock_calls) == 1 + + +async def test_form_cannot_connect(hass): + """Test we handle invalid auth.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + + with patch( + "homeassistant.components.plum_lightpad.utils.Plum.loadCloudData", + side_effect=ConnectTimeout, + ): + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], + {"username": "test-plum-username", "password": "test-plum-password"}, + ) + + assert result2["type"] == "form" + assert result2["errors"] == {"base": "cannot_connect"} + + +async def test_form_one_entry_per_email_allowed(hass): + """Test that only one entry allowed per Plum cloud email address.""" + MockConfigEntry( + domain=DOMAIN, + unique_id="test-plum-username", + data={"username": "test-plum-username", "password": "test-plum-password"}, + ).add_to_hass(hass) + + await setup.async_setup_component(hass, "persistent_notification", {}) + + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + + with patch( + "homeassistant.components.plum_lightpad.utils.Plum.loadCloudData" + ), patch("homeassistant.components.plum_lightpad.async_setup") as mock_setup, patch( + "homeassistant.components.plum_lightpad.async_setup_entry" + ) as mock_setup_entry: + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], + {"username": "test-plum-username", "password": "test-plum-password"}, + ) + + assert result2["type"] == "abort" + await hass.async_block_till_done() + assert len(mock_setup.mock_calls) == 0 + assert len(mock_setup_entry.mock_calls) == 0 + + +async def test_import(hass): + """Test configuring the flow using configuration.yaml.""" + await setup.async_setup_component(hass, "persistent_notification", {}) + + with patch( + "homeassistant.components.plum_lightpad.utils.Plum.loadCloudData" + ), patch( + "homeassistant.components.plum_lightpad.async_setup", return_value=True + ) as mock_setup, patch( + "homeassistant.components.plum_lightpad.async_setup_entry", return_value=True, + ) as mock_setup_entry: + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": config_entries.SOURCE_IMPORT}, + data={"username": "test-plum-username", "password": "test-plum-password"}, + ) + assert result["type"] == "create_entry" + assert result["title"] == "test-plum-username" + assert result["data"] == { + "username": "test-plum-username", + "password": "test-plum-password", + } + await hass.async_block_till_done() + assert len(mock_setup.mock_calls) == 1 + assert len(mock_setup_entry.mock_calls) == 1