From 2c5cad4ca0d64c7396794b83cc5284a7baec6e90 Mon Sep 17 00:00:00 2001 From: G Johansson Date: Sun, 7 May 2023 01:42:37 +0200 Subject: [PATCH] Clean config flow for SQL (#92332) --- .strict-typing | 1 + homeassistant/components/sql/config_flow.py | 48 ++++++++++++--------- mypy.ini | 10 +++++ tests/components/sql/__init__.py | 8 ++++ tests/components/sql/test_config_flow.py | 47 +++++++++++++++----- 5 files changed, 82 insertions(+), 32 deletions(-) diff --git a/.strict-typing b/.strict-typing index caab7641a89..f7297d8e680 100644 --- a/.strict-typing +++ b/.strict-typing @@ -286,6 +286,7 @@ homeassistant.components.smhi.* homeassistant.components.snooz.* homeassistant.components.sonarr.* homeassistant.components.speedtestdotnet.* +homeassistant.components.sql.* homeassistant.components.ssdp.* homeassistant.components.statistics.* homeassistant.components.steamist.* diff --git a/homeassistant/components/sql/config_flow.py b/homeassistant/components/sql/config_flow.py index 7cbcbe73efa..a6c526a6a7f 100644 --- a/homeassistant/components/sql/config_flow.py +++ b/homeassistant/components/sql/config_flow.py @@ -114,9 +114,6 @@ class SQLConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): db_url = user_input.get(CONF_DB_URL) query = user_input[CONF_QUERY] column = user_input[CONF_COLUMN_NAME] - uom = user_input.get(CONF_UNIT_OF_MEASUREMENT) - value_template = user_input.get(CONF_VALUE_TEMPLATE) - name = user_input[CONF_NAME] db_url_for_validation = None try: @@ -133,22 +130,23 @@ class SQLConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): except ValueError: errors["query"] = "query_invalid" - add_db_url = ( - {CONF_DB_URL: db_url} if db_url == db_url_for_validation else {} - ) + options = { + CONF_QUERY: query, + CONF_COLUMN_NAME: column, + CONF_NAME: user_input[CONF_NAME], + } + if uom := user_input.get(CONF_UNIT_OF_MEASUREMENT): + options[CONF_UNIT_OF_MEASUREMENT] = uom + if value_template := user_input.get(CONF_VALUE_TEMPLATE): + options[CONF_VALUE_TEMPLATE] = value_template + if db_url_for_validation != get_instance(self.hass).db_url: + options[CONF_DB_URL] = db_url_for_validation if not errors: return self.async_create_entry( - title=name, + title=user_input[CONF_NAME], data={}, - options={ - **add_db_url, - CONF_QUERY: query, - CONF_COLUMN_NAME: column, - CONF_UNIT_OF_MEASUREMENT: uom, - CONF_VALUE_TEMPLATE: value_template, - CONF_NAME: name, - }, + options=options, ) return self.async_show_form( @@ -196,13 +194,21 @@ class SQLOptionsFlowHandler(config_entries.OptionsFlowWithConfigEntry): db_url_for_validation, recorder_db, ) - if db_url and db_url_for_validation == recorder_db: - user_input.pop(CONF_DB_URL) + + options = { + CONF_QUERY: query, + CONF_COLUMN_NAME: column, + CONF_NAME: name, + } + if uom := user_input.get(CONF_UNIT_OF_MEASUREMENT): + options[CONF_UNIT_OF_MEASUREMENT] = uom + if value_template := user_input.get(CONF_VALUE_TEMPLATE): + options[CONF_VALUE_TEMPLATE] = value_template + if db_url_for_validation != get_instance(self.hass).db_url: + options[CONF_DB_URL] = db_url_for_validation + return self.async_create_entry( - data={ - CONF_NAME: name, - **user_input, - }, + data=options, ) return self.async_show_form( diff --git a/mypy.ini b/mypy.ini index 7f8ae23d38d..b4155232ff1 100644 --- a/mypy.ini +++ b/mypy.ini @@ -2622,6 +2622,16 @@ disallow_untyped_defs = true warn_return_any = true warn_unreachable = true +[mypy-homeassistant.components.sql.*] +check_untyped_defs = true +disallow_incomplete_defs = true +disallow_subclassing_any = true +disallow_untyped_calls = true +disallow_untyped_decorators = true +disallow_untyped_defs = true +warn_return_any = true +warn_unreachable = true + [mypy-homeassistant.components.ssdp.*] check_untyped_defs = true disallow_incomplete_defs = true diff --git a/tests/components/sql/__init__.py b/tests/components/sql/__init__.py index 5a941b37d63..9927a9734cd 100644 --- a/tests/components/sql/__init__.py +++ b/tests/components/sql/__init__.py @@ -29,6 +29,14 @@ ENTRY_CONFIG = { CONF_UNIT_OF_MEASUREMENT: "MiB", } +ENTRY_CONFIG_WITH_VALUE_TEMPLATE = { + CONF_NAME: "Get Value", + CONF_QUERY: "SELECT 5 as value", + CONF_COLUMN_NAME: "value", + CONF_UNIT_OF_MEASUREMENT: "MiB", + CONF_VALUE_TEMPLATE: "{{ value }}", +} + ENTRY_CONFIG_INVALID_QUERY = { CONF_NAME: "Get Value", CONF_QUERY: "UPDATE 5 as value", diff --git a/tests/components/sql/test_config_flow.py b/tests/components/sql/test_config_flow.py index a8e590a9760..8958454ac62 100644 --- a/tests/components/sql/test_config_flow.py +++ b/tests/components/sql/test_config_flow.py @@ -18,6 +18,7 @@ from . import ( ENTRY_CONFIG_INVALID_QUERY, ENTRY_CONFIG_INVALID_QUERY_OPT, ENTRY_CONFIG_NO_RESULTS, + ENTRY_CONFIG_WITH_VALUE_TEMPLATE, ) from tests.common import MockConfigEntry @@ -49,7 +50,39 @@ async def test_form(recorder_mock: Recorder, hass: HomeAssistant) -> None: "query": "SELECT 5 as value", "column": "value", "unit_of_measurement": "MiB", - "value_template": None, + } + assert len(mock_setup_entry.mock_calls) == 1 + + +async def test_form_with_value_template( + recorder_mock: Recorder, hass: HomeAssistant +) -> None: + """Test for with value template.""" + + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": config_entries.SOURCE_USER} + ) + assert result["type"] == FlowResultType.FORM + assert result["errors"] == {} + + with patch( + "homeassistant.components.sql.async_setup_entry", + return_value=True, + ) as mock_setup_entry: + result2 = await hass.config_entries.flow.async_configure( + result["flow_id"], + ENTRY_CONFIG_WITH_VALUE_TEMPLATE, + ) + await hass.async_block_till_done() + + assert result2["type"] == FlowResultType.CREATE_ENTRY + assert result2["title"] == "Get Value" + assert result2["options"] == { + "name": "Get Value", + "query": "SELECT 5 as value", + "column": "value", + "unit_of_measurement": "MiB", + "value_template": "{{ value }}", } assert len(mock_setup_entry.mock_calls) == 1 @@ -118,7 +151,6 @@ async def test_flow_fails_invalid_query( "query": "SELECT 5 as value", "column": "value", "unit_of_measurement": "MiB", - "value_template": None, } @@ -155,7 +187,6 @@ async def test_flow_fails_invalid_column_name( "query": "SELECT 5 as value", "column": "value", "unit_of_measurement": "MiB", - "value_template": None, } @@ -170,7 +201,6 @@ async def test_options_flow(recorder_mock: Recorder, hass: HomeAssistant) -> Non "query": "SELECT 5 as value", "column": "value", "unit_of_measurement": "MiB", - "value_template": None, }, ) entry.add_to_hass(hass) @@ -194,6 +224,7 @@ async def test_options_flow(recorder_mock: Recorder, hass: HomeAssistant) -> Non "query": "SELECT 5 as size", "column": "size", "unit_of_measurement": "MiB", + "value_template": "{{ value }}", }, ) @@ -203,6 +234,7 @@ async def test_options_flow(recorder_mock: Recorder, hass: HomeAssistant) -> Non "query": "SELECT 5 as size", "column": "size", "unit_of_measurement": "MiB", + "value_template": "{{ value }}", } @@ -218,7 +250,6 @@ async def test_options_flow_name_previously_removed( "query": "SELECT 5 as value", "column": "value", "unit_of_measurement": "MiB", - "value_template": None, }, title="Get Value Title", ) @@ -270,7 +301,6 @@ async def test_options_flow_fails_db_url( "query": "SELECT 5 as value", "column": "value", "unit_of_measurement": "MiB", - "value_template": None, }, ) entry.add_to_hass(hass) @@ -314,7 +344,6 @@ async def test_options_flow_fails_invalid_query( "query": "SELECT 5 as value", "column": "value", "unit_of_measurement": "MiB", - "value_template": None, }, ) entry.add_to_hass(hass) @@ -369,7 +398,6 @@ async def test_options_flow_fails_invalid_column_name( "query": "SELECT 5 as value", "column": "value", "unit_of_measurement": "MiB", - "value_template": None, }, ) entry.add_to_hass(hass) @@ -424,7 +452,6 @@ async def test_options_flow_db_url_empty( "query": "SELECT 5 as value", "column": "value", "unit_of_measurement": "MiB", - "value_template": None, }, ) entry.add_to_hass(hass) @@ -500,8 +527,6 @@ async def test_full_flow_not_recorder_db( "db_url": "sqlite://path/to/db.db", "query": "SELECT 5 as value", "column": "value", - "unit_of_measurement": None, - "value_template": None, } entry = hass.config_entries.async_entries(DOMAIN)[0]