Clean config flow for SQL (#92332)

This commit is contained in:
G Johansson 2023-05-07 01:42:37 +02:00 committed by GitHub
parent f47f49c9a1
commit 2c5cad4ca0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 82 additions and 32 deletions

View File

@ -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.*

View File

@ -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(

View File

@ -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

View File

@ -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",

View File

@ -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]