From a68af0a3a9834d3c252ee8225023fdc415d4bc94 Mon Sep 17 00:00:00 2001 From: Kevin Fronczak <kfronczak@gmail.com> Date: Tue, 16 Jun 2020 05:05:33 -0400 Subject: [PATCH] Add blink tests (#36672) Co-authored-by: Martin Hjelmare <marhje52@gmail.com> --- .coveragerc | 7 +- requirements_test_all.txt | 3 + tests/components/blink/__init__.py | 1 + tests/components/blink/test_config_flow.py | 204 +++++++++++++++++++++ 4 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 tests/components/blink/__init__.py create mode 100644 tests/components/blink/test_config_flow.py diff --git a/.coveragerc b/.coveragerc index f0f3123d494..44e02a1fa30 100644 --- a/.coveragerc +++ b/.coveragerc @@ -80,7 +80,12 @@ omit = homeassistant/components/bh1750/sensor.py homeassistant/components/bitcoin/sensor.py homeassistant/components/bizkaibus/sensor.py - homeassistant/components/blink/* + homeassistant/components/blink/__init__.py + homeassistant/components/blink/alarm_control_panel.py + homeassistant/components/blink/binary_sensor.py + homeassistant/components/blink/camera.py + homeassistant/components/blink/const.py + homeassistant/components/blink/sensor.py homeassistant/components/blinksticklight/light.py homeassistant/components/blinkt/light.py homeassistant/components/blockchain/sensor.py diff --git a/requirements_test_all.txt b/requirements_test_all.txt index f60c67fd797..68655db8848 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -161,6 +161,9 @@ bellows==0.17.0 # homeassistant.components.blebox blebox_uniapi==1.3.2 +# homeassistant.components.blink +blinkpy==0.15.0 + # homeassistant.components.bom bomradarloop==0.1.4 diff --git a/tests/components/blink/__init__.py b/tests/components/blink/__init__.py new file mode 100644 index 00000000000..d7d04d83549 --- /dev/null +++ b/tests/components/blink/__init__.py @@ -0,0 +1 @@ +"""Tests for the Blink component.""" diff --git a/tests/components/blink/test_config_flow.py b/tests/components/blink/test_config_flow.py new file mode 100644 index 00000000000..e6315aac972 --- /dev/null +++ b/tests/components/blink/test_config_flow.py @@ -0,0 +1,204 @@ +"""Test the Blink config flow.""" +from homeassistant import config_entries, data_entry_flow, setup +from homeassistant.components.blink import DOMAIN + +from tests.async_mock import Mock, 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.blink.config_flow.Blink", + return_value=Mock( + get_auth_token=Mock(return_value=True), + key_required=False, + login_response={}, + ), + ), patch( + "homeassistant.components.blink.async_setup", return_value=True + ) as mock_setup, patch( + "homeassistant.components.blink.async_setup_entry", return_value=True, + ) as mock_setup_entry: + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], {"username": "blink@example.com", "password": "example"}, + ) + + assert result2["type"] == "create_entry" + assert result2["title"] == "blink" + assert result2["result"].unique_id == "blink@example.com" + assert result2["data"] == { + "username": "blink@example.com", + "password": "example", + "login_response": {}, + } + await hass.async_block_till_done() + assert len(mock_setup.mock_calls) == 1 + assert len(mock_setup_entry.mock_calls) == 1 + + +async def test_import(hass): + """Test we import the config.""" + with patch( + "homeassistant.components.blink.config_flow.Blink", + return_value=Mock( + get_auth_token=Mock(return_value=True), + key_required=False, + login_response={}, + ), + ), patch( + "homeassistant.components.blink.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": "blink@example.com", + "password": "example", + "scan_interval": 10, + }, + ) + + assert result["type"] == "create_entry" + assert result["title"] == "blink" + assert result["result"].unique_id == "blink@example.com" + assert result["data"] == { + "username": "blink@example.com", + "password": "example", + "scan_interval": 10, + "login_response": {}, + } + await hass.async_block_till_done() + assert len(mock_setup_entry.mock_calls) == 1 + + +async def test_form_2fa(hass): + """Test we get the 2fa form.""" + await setup.async_setup_component(hass, "persistent_notification", {}) + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + + mock_blink = Mock( + get_auth_token=Mock(return_value=True), + key_required=True, + login_response={}, + login_handler=Mock(send_auth_key=Mock(return_value=True)), + ) + + with patch( + "homeassistant.components.blink.config_flow.Blink", return_value=mock_blink + ), patch( + "homeassistant.components.blink.async_setup", return_value=True + ) as mock_setup: + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], {"username": "blink@example.com", "password": "example"} + ) + + assert result2["type"] == "form" + assert result2["step_id"] == "2fa" + + mock_blink.key_required = False + with patch( + "homeassistant.components.blink.config_flow.Blink", return_value=mock_blink + ), patch( + "homeassistant.components.blink.async_setup", return_value=True + ) as mock_setup, patch( + "homeassistant.components.blink.async_setup_entry", return_value=True + ) as mock_setup_entry: + result3 = await hass.config_entries.flow.async_configure( + result2["flow_id"], {"pin": "1234"} + ) + + assert result3["type"] == "create_entry" + assert result3["title"] == "blink" + assert result3["result"].unique_id == "blink@example.com" + 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_invalid_auth(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.blink.config_flow.Blink.get_auth_token", + return_value=None, + ): + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], {"username": "blink@example.com", "password": "example"} + ) + + assert result2["type"] == "form" + assert result2["errors"] == {"base": "invalid_auth"} + + +async def test_form_unknown_error(hass): + """Test we handle unknown error at startup.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + + with patch( + "homeassistant.components.blink.config_flow.Blink.get_auth_token", + return_value=None, + ), patch( + "homeassistant.components.blink.config_flow.validate_input", + side_effect=KeyError, + ): + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], {"username": "blink@example.com", "password": "example"} + ) + + assert result2["type"] == "form" + assert result2["errors"] == {"base": "unknown"} + + +async def test_options_flow(hass): + """Test config flow options.""" + config_entry = MockConfigEntry( + domain=DOMAIN, + data={ + "username": "blink@example.com", + "password": "example", + "login_response": {}, + }, + options={}, + entry_id=1, + ) + config_entry.add_to_hass(hass) + + mock_blink = Mock( + login_handler=True, + setup_params=Mock(return_value=True), + setup_post_verify=Mock(return_value=True), + ) + + with patch("homeassistant.components.blink.Blink", return_value=mock_blink): + await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + result = await hass.config_entries.options.async_init( + config_entry.entry_id, context={"show_advanced_options": False} + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_FORM + assert result["step_id"] == "simple_options" + + result = await hass.config_entries.options.async_configure( + result["flow_id"], user_input={"scan_interval": 5}, + ) + + assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY + assert result["data"] == {"scan_interval": 5} + assert mock_blink.refresh_rate == 5 -- GitLab