mirror of
https://github.com/home-assistant/core.git
synced 2025-07-20 03:37:07 +00:00
Clean config flow for SQL (#92332)
This commit is contained in:
parent
f47f49c9a1
commit
2c5cad4ca0
@ -286,6 +286,7 @@ homeassistant.components.smhi.*
|
|||||||
homeassistant.components.snooz.*
|
homeassistant.components.snooz.*
|
||||||
homeassistant.components.sonarr.*
|
homeassistant.components.sonarr.*
|
||||||
homeassistant.components.speedtestdotnet.*
|
homeassistant.components.speedtestdotnet.*
|
||||||
|
homeassistant.components.sql.*
|
||||||
homeassistant.components.ssdp.*
|
homeassistant.components.ssdp.*
|
||||||
homeassistant.components.statistics.*
|
homeassistant.components.statistics.*
|
||||||
homeassistant.components.steamist.*
|
homeassistant.components.steamist.*
|
||||||
|
@ -114,9 +114,6 @@ class SQLConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
db_url = user_input.get(CONF_DB_URL)
|
db_url = user_input.get(CONF_DB_URL)
|
||||||
query = user_input[CONF_QUERY]
|
query = user_input[CONF_QUERY]
|
||||||
column = user_input[CONF_COLUMN_NAME]
|
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
|
db_url_for_validation = None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -133,22 +130,23 @@ class SQLConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
except ValueError:
|
except ValueError:
|
||||||
errors["query"] = "query_invalid"
|
errors["query"] = "query_invalid"
|
||||||
|
|
||||||
add_db_url = (
|
options = {
|
||||||
{CONF_DB_URL: db_url} if db_url == db_url_for_validation else {}
|
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:
|
if not errors:
|
||||||
return self.async_create_entry(
|
return self.async_create_entry(
|
||||||
title=name,
|
title=user_input[CONF_NAME],
|
||||||
data={},
|
data={},
|
||||||
options={
|
options=options,
|
||||||
**add_db_url,
|
|
||||||
CONF_QUERY: query,
|
|
||||||
CONF_COLUMN_NAME: column,
|
|
||||||
CONF_UNIT_OF_MEASUREMENT: uom,
|
|
||||||
CONF_VALUE_TEMPLATE: value_template,
|
|
||||||
CONF_NAME: name,
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
|
|
||||||
return self.async_show_form(
|
return self.async_show_form(
|
||||||
@ -196,13 +194,21 @@ class SQLOptionsFlowHandler(config_entries.OptionsFlowWithConfigEntry):
|
|||||||
db_url_for_validation,
|
db_url_for_validation,
|
||||||
recorder_db,
|
recorder_db,
|
||||||
)
|
)
|
||||||
if db_url and db_url_for_validation == recorder_db:
|
|
||||||
user_input.pop(CONF_DB_URL)
|
options = {
|
||||||
return self.async_create_entry(
|
CONF_QUERY: query,
|
||||||
data={
|
CONF_COLUMN_NAME: column,
|
||||||
CONF_NAME: name,
|
CONF_NAME: name,
|
||||||
**user_input,
|
}
|
||||||
},
|
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=options,
|
||||||
)
|
)
|
||||||
|
|
||||||
return self.async_show_form(
|
return self.async_show_form(
|
||||||
|
10
mypy.ini
10
mypy.ini
@ -2622,6 +2622,16 @@ disallow_untyped_defs = true
|
|||||||
warn_return_any = true
|
warn_return_any = true
|
||||||
warn_unreachable = 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.*]
|
[mypy-homeassistant.components.ssdp.*]
|
||||||
check_untyped_defs = true
|
check_untyped_defs = true
|
||||||
disallow_incomplete_defs = true
|
disallow_incomplete_defs = true
|
||||||
|
@ -29,6 +29,14 @@ ENTRY_CONFIG = {
|
|||||||
CONF_UNIT_OF_MEASUREMENT: "MiB",
|
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 = {
|
ENTRY_CONFIG_INVALID_QUERY = {
|
||||||
CONF_NAME: "Get Value",
|
CONF_NAME: "Get Value",
|
||||||
CONF_QUERY: "UPDATE 5 as value",
|
CONF_QUERY: "UPDATE 5 as value",
|
||||||
|
@ -18,6 +18,7 @@ from . import (
|
|||||||
ENTRY_CONFIG_INVALID_QUERY,
|
ENTRY_CONFIG_INVALID_QUERY,
|
||||||
ENTRY_CONFIG_INVALID_QUERY_OPT,
|
ENTRY_CONFIG_INVALID_QUERY_OPT,
|
||||||
ENTRY_CONFIG_NO_RESULTS,
|
ENTRY_CONFIG_NO_RESULTS,
|
||||||
|
ENTRY_CONFIG_WITH_VALUE_TEMPLATE,
|
||||||
)
|
)
|
||||||
|
|
||||||
from tests.common import MockConfigEntry
|
from tests.common import MockConfigEntry
|
||||||
@ -49,7 +50,39 @@ async def test_form(recorder_mock: Recorder, hass: HomeAssistant) -> None:
|
|||||||
"query": "SELECT 5 as value",
|
"query": "SELECT 5 as value",
|
||||||
"column": "value",
|
"column": "value",
|
||||||
"unit_of_measurement": "MiB",
|
"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
|
assert len(mock_setup_entry.mock_calls) == 1
|
||||||
|
|
||||||
@ -118,7 +151,6 @@ async def test_flow_fails_invalid_query(
|
|||||||
"query": "SELECT 5 as value",
|
"query": "SELECT 5 as value",
|
||||||
"column": "value",
|
"column": "value",
|
||||||
"unit_of_measurement": "MiB",
|
"unit_of_measurement": "MiB",
|
||||||
"value_template": None,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -155,7 +187,6 @@ async def test_flow_fails_invalid_column_name(
|
|||||||
"query": "SELECT 5 as value",
|
"query": "SELECT 5 as value",
|
||||||
"column": "value",
|
"column": "value",
|
||||||
"unit_of_measurement": "MiB",
|
"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",
|
"query": "SELECT 5 as value",
|
||||||
"column": "value",
|
"column": "value",
|
||||||
"unit_of_measurement": "MiB",
|
"unit_of_measurement": "MiB",
|
||||||
"value_template": None,
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
entry.add_to_hass(hass)
|
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",
|
"query": "SELECT 5 as size",
|
||||||
"column": "size",
|
"column": "size",
|
||||||
"unit_of_measurement": "MiB",
|
"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",
|
"query": "SELECT 5 as size",
|
||||||
"column": "size",
|
"column": "size",
|
||||||
"unit_of_measurement": "MiB",
|
"unit_of_measurement": "MiB",
|
||||||
|
"value_template": "{{ value }}",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -218,7 +250,6 @@ async def test_options_flow_name_previously_removed(
|
|||||||
"query": "SELECT 5 as value",
|
"query": "SELECT 5 as value",
|
||||||
"column": "value",
|
"column": "value",
|
||||||
"unit_of_measurement": "MiB",
|
"unit_of_measurement": "MiB",
|
||||||
"value_template": None,
|
|
||||||
},
|
},
|
||||||
title="Get Value Title",
|
title="Get Value Title",
|
||||||
)
|
)
|
||||||
@ -270,7 +301,6 @@ async def test_options_flow_fails_db_url(
|
|||||||
"query": "SELECT 5 as value",
|
"query": "SELECT 5 as value",
|
||||||
"column": "value",
|
"column": "value",
|
||||||
"unit_of_measurement": "MiB",
|
"unit_of_measurement": "MiB",
|
||||||
"value_template": None,
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
entry.add_to_hass(hass)
|
entry.add_to_hass(hass)
|
||||||
@ -314,7 +344,6 @@ async def test_options_flow_fails_invalid_query(
|
|||||||
"query": "SELECT 5 as value",
|
"query": "SELECT 5 as value",
|
||||||
"column": "value",
|
"column": "value",
|
||||||
"unit_of_measurement": "MiB",
|
"unit_of_measurement": "MiB",
|
||||||
"value_template": None,
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
entry.add_to_hass(hass)
|
entry.add_to_hass(hass)
|
||||||
@ -369,7 +398,6 @@ async def test_options_flow_fails_invalid_column_name(
|
|||||||
"query": "SELECT 5 as value",
|
"query": "SELECT 5 as value",
|
||||||
"column": "value",
|
"column": "value",
|
||||||
"unit_of_measurement": "MiB",
|
"unit_of_measurement": "MiB",
|
||||||
"value_template": None,
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
entry.add_to_hass(hass)
|
entry.add_to_hass(hass)
|
||||||
@ -424,7 +452,6 @@ async def test_options_flow_db_url_empty(
|
|||||||
"query": "SELECT 5 as value",
|
"query": "SELECT 5 as value",
|
||||||
"column": "value",
|
"column": "value",
|
||||||
"unit_of_measurement": "MiB",
|
"unit_of_measurement": "MiB",
|
||||||
"value_template": None,
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
entry.add_to_hass(hass)
|
entry.add_to_hass(hass)
|
||||||
@ -500,8 +527,6 @@ async def test_full_flow_not_recorder_db(
|
|||||||
"db_url": "sqlite://path/to/db.db",
|
"db_url": "sqlite://path/to/db.db",
|
||||||
"query": "SELECT 5 as value",
|
"query": "SELECT 5 as value",
|
||||||
"column": "value",
|
"column": "value",
|
||||||
"unit_of_measurement": None,
|
|
||||||
"value_template": None,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
entry = hass.config_entries.async_entries(DOMAIN)[0]
|
entry = hass.config_entries.async_entries(DOMAIN)[0]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user