Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clean config flow for SQL #92332

Merged
merged 5 commits into from
May 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions .strict-typing
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,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.*
Expand Down
48 changes: 27 additions & 21 deletions homeassistant/components/sql/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,6 @@ async def async_step_user(
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:
Expand All @@ -133,22 +130,23 @@ async def async_step_user(
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(
Expand Down Expand Up @@ -196,13 +194,21 @@ async def async_step_init(
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(
Expand Down
10 changes: 10 additions & 0 deletions mypy.ini
Original file line number Diff line number Diff line change
Expand Up @@ -2602,6 +2602,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
Expand Down
8 changes: 8 additions & 0 deletions tests/components/sql/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,14 @@
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",
Expand Down
47 changes: 36 additions & 11 deletions tests/components/sql/test_config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
ENTRY_CONFIG_INVALID_QUERY,
ENTRY_CONFIG_INVALID_QUERY_OPT,
ENTRY_CONFIG_NO_RESULTS,
ENTRY_CONFIG_WITH_VALUE_TEMPLATE,
)

from tests.common import MockConfigEntry
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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,
}


Expand Down Expand Up @@ -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,
}


Expand All @@ -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)
Expand All @@ -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 }}",
},
)

Expand All @@ -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 }}",
}


Expand All @@ -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",
)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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]
Expand Down