mirror of
https://github.com/home-assistant/core.git
synced 2026-08-24 02:24:51 -05:00
Remove support for advanced mode from schema config flow (#172117)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
This commit is contained in:
co-authored by
copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
parent
5053392cf2
commit
2368a3614d
@@ -658,15 +658,6 @@ class FlowHandler(Generic[_FlowContextT, _FlowResultT, _HandlerT]):
|
||||
"""
|
||||
schema = {}
|
||||
for key, val in data_schema.schema.items():
|
||||
if isinstance(key, vol.Marker):
|
||||
# Exclude advanced field
|
||||
if (
|
||||
key.description
|
||||
and key.description.get("advanced")
|
||||
and not self.show_advanced_options
|
||||
):
|
||||
continue
|
||||
|
||||
# Process the section schema options
|
||||
if (
|
||||
suggested_values is not None
|
||||
|
||||
@@ -181,25 +181,6 @@ class SchemaCommonFlowHandler:
|
||||
"""Handle a form step."""
|
||||
form_step: SchemaFlowFormStep = cast(SchemaFlowFormStep, self._flow[step_id])
|
||||
|
||||
if (
|
||||
user_input is not None
|
||||
and (data_schema := await self._get_schema(form_step))
|
||||
and data_schema.schema
|
||||
and not self._handler.show_advanced_options
|
||||
):
|
||||
# Add advanced field default if not set
|
||||
for key in data_schema.schema:
|
||||
if isinstance(key, (vol.Optional, vol.Required)):
|
||||
if (
|
||||
key.description
|
||||
and key.description.get("advanced")
|
||||
and key.default is not vol.UNDEFINED
|
||||
and key not in self._options
|
||||
):
|
||||
user_input[str(key.schema)] = cast(
|
||||
Callable[[], Any], key.default
|
||||
)()
|
||||
|
||||
if user_input is not None and form_step.validate_user_input is not None:
|
||||
# Do extra validation of user input
|
||||
try:
|
||||
@@ -210,7 +191,7 @@ class SchemaCommonFlowHandler:
|
||||
if user_input is not None:
|
||||
# User input was validated successfully, update options
|
||||
self._update_and_remove_omitted_optional_keys(
|
||||
self._options, user_input, data_schema
|
||||
self._options, user_input, await self._get_schema(form_step)
|
||||
)
|
||||
|
||||
if user_input is not None or form_step.schema is None:
|
||||
@@ -230,12 +211,6 @@ class SchemaCommonFlowHandler:
|
||||
if (
|
||||
isinstance(key, vol.Optional)
|
||||
and key not in user_input
|
||||
and not (
|
||||
# don't remove advanced keys, if they are hidden
|
||||
key.description
|
||||
and key.description.get("advanced")
|
||||
and not self._handler.show_advanced_options
|
||||
)
|
||||
and not (
|
||||
# don't remove read_only keys
|
||||
isinstance(data_schema.schema[key], selector.Selector)
|
||||
|
||||
@@ -104,213 +104,6 @@ async def test_name(hass: HomeAssistant, entity_registry: er.EntityRegistry) ->
|
||||
assert wrapped_entity_config_entry_title(hass, entry.id) == "Custom Name"
|
||||
|
||||
|
||||
@pytest.mark.parametrize("marker", [vol.Required, vol.Optional])
|
||||
async def test_config_flow_advanced_option(
|
||||
hass: HomeAssistant, manager: data_entry_flow.FlowManager, marker
|
||||
) -> None:
|
||||
"""Test handling of advanced options in config flow."""
|
||||
manager.hass = hass
|
||||
|
||||
CONFIG_SCHEMA = vol.Schema(
|
||||
{
|
||||
marker("option1"): str,
|
||||
marker("advanced_no_default", description={"advanced": True}): str,
|
||||
marker(
|
||||
"advanced_default",
|
||||
default="a very reasonable default",
|
||||
description={"advanced": True},
|
||||
): str,
|
||||
}
|
||||
)
|
||||
|
||||
CONFIG_FLOW: dict[str, SchemaFlowFormStep | SchemaFlowMenuStep] = {
|
||||
"init": SchemaFlowFormStep(CONFIG_SCHEMA)
|
||||
}
|
||||
|
||||
@manager.mock_reg_handler("test")
|
||||
class TestFlow(MockSchemaConfigFlowHandler):
|
||||
config_flow = CONFIG_FLOW
|
||||
|
||||
# Start flow in basic mode
|
||||
result = await manager.async_init("test")
|
||||
assert result["type"] is data_entry_flow.FlowResultType.FORM
|
||||
assert list(result["data_schema"].schema.keys()) == ["option1"]
|
||||
|
||||
result = await manager.async_configure(result["flow_id"], {"option1": "blabla"})
|
||||
assert result["type"] is data_entry_flow.FlowResultType.CREATE_ENTRY
|
||||
assert result["data"] == {}
|
||||
assert result["options"] == {
|
||||
"advanced_default": "a very reasonable default",
|
||||
"option1": "blabla",
|
||||
}
|
||||
for option in result["options"]:
|
||||
# Make sure we didn't get the Optional or Required instance as key
|
||||
assert isinstance(option, str)
|
||||
|
||||
# Start flow in advanced mode
|
||||
result = await manager.async_init("test", context={"show_advanced_options": True})
|
||||
assert result["type"] is data_entry_flow.FlowResultType.FORM
|
||||
assert list(result["data_schema"].schema.keys()) == [
|
||||
"option1",
|
||||
"advanced_no_default",
|
||||
"advanced_default",
|
||||
]
|
||||
|
||||
result = await manager.async_configure(
|
||||
result["flow_id"], {"advanced_no_default": "abc123", "option1": "blabla"}
|
||||
)
|
||||
assert result["type"] is data_entry_flow.FlowResultType.CREATE_ENTRY
|
||||
assert result["data"] == {}
|
||||
assert result["options"] == {
|
||||
"advanced_default": "a very reasonable default",
|
||||
"advanced_no_default": "abc123",
|
||||
"option1": "blabla",
|
||||
}
|
||||
for option in result["options"]:
|
||||
# Make sure we didn't get the Optional or Required instance as key
|
||||
assert isinstance(option, str)
|
||||
|
||||
# Start flow in advanced mode
|
||||
result = await manager.async_init("test", context={"show_advanced_options": True})
|
||||
assert result["type"] is data_entry_flow.FlowResultType.FORM
|
||||
assert list(result["data_schema"].schema.keys()) == [
|
||||
"option1",
|
||||
"advanced_no_default",
|
||||
"advanced_default",
|
||||
]
|
||||
|
||||
result = await manager.async_configure(
|
||||
result["flow_id"],
|
||||
{
|
||||
"advanced_default": "not default",
|
||||
"advanced_no_default": "abc123",
|
||||
"option1": "blabla",
|
||||
},
|
||||
)
|
||||
assert result["type"] is data_entry_flow.FlowResultType.CREATE_ENTRY
|
||||
assert result["data"] == {}
|
||||
assert result["options"] == {
|
||||
"advanced_default": "not default",
|
||||
"advanced_no_default": "abc123",
|
||||
"option1": "blabla",
|
||||
}
|
||||
for option in result["options"]:
|
||||
# Make sure we didn't get the Optional or Required instance as key
|
||||
assert isinstance(option, str)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("marker", [vol.Required, vol.Optional])
|
||||
async def test_options_flow_advanced_option(
|
||||
hass: HomeAssistant, manager: data_entry_flow.FlowManager, marker
|
||||
) -> None:
|
||||
"""Test handling of advanced options in options flow."""
|
||||
manager.hass = hass
|
||||
|
||||
OPTIONS_SCHEMA = vol.Schema(
|
||||
{
|
||||
marker("option1"): str,
|
||||
marker("advanced_no_default", description={"advanced": True}): str,
|
||||
marker(
|
||||
"advanced_default",
|
||||
default="a very reasonable default",
|
||||
description={"advanced": True},
|
||||
): str,
|
||||
}
|
||||
)
|
||||
|
||||
OPTIONS_FLOW: dict[str, SchemaFlowFormStep | SchemaFlowMenuStep] = {
|
||||
"init": SchemaFlowFormStep(OPTIONS_SCHEMA)
|
||||
}
|
||||
|
||||
class TestFlow(MockSchemaConfigFlowHandler, domain="test"):
|
||||
config_flow = {}
|
||||
options_flow = OPTIONS_FLOW
|
||||
|
||||
mock_integration(hass, MockModule("test"))
|
||||
mock_platform(hass, "test.config_flow", None)
|
||||
config_entry = MockConfigEntry(
|
||||
data={},
|
||||
domain="test",
|
||||
options={
|
||||
"option1": "blabla",
|
||||
"advanced_no_default": "abc123",
|
||||
"advanced_default": "not default",
|
||||
},
|
||||
)
|
||||
config_entry.add_to_hass(hass)
|
||||
|
||||
# Start flow in basic mode
|
||||
result = await hass.config_entries.options.async_init(config_entry.entry_id)
|
||||
assert result["type"] is data_entry_flow.FlowResultType.FORM
|
||||
assert list(result["data_schema"].schema.keys()) == ["option1"]
|
||||
|
||||
result = await hass.config_entries.options.async_configure(
|
||||
result["flow_id"], {"option1": "blublu"}
|
||||
)
|
||||
assert result["type"] is data_entry_flow.FlowResultType.CREATE_ENTRY
|
||||
assert result["data"] == {
|
||||
"advanced_default": "not default",
|
||||
"advanced_no_default": "abc123",
|
||||
"option1": "blublu",
|
||||
}
|
||||
for option in result["data"]:
|
||||
# Make sure we didn't get the Optional or Required instance as key
|
||||
assert isinstance(option, str)
|
||||
|
||||
# Start flow in advanced mode
|
||||
result = await hass.config_entries.options.async_init(
|
||||
config_entry.entry_id, context={"show_advanced_options": True}
|
||||
)
|
||||
assert result["type"] is data_entry_flow.FlowResultType.FORM
|
||||
assert list(result["data_schema"].schema.keys()) == [
|
||||
"option1",
|
||||
"advanced_no_default",
|
||||
"advanced_default",
|
||||
]
|
||||
|
||||
result = await hass.config_entries.options.async_configure(
|
||||
result["flow_id"], {"advanced_no_default": "def456", "option1": "blabla"}
|
||||
)
|
||||
assert result["type"] is data_entry_flow.FlowResultType.CREATE_ENTRY
|
||||
assert result["data"] == {
|
||||
"advanced_default": "a very reasonable default",
|
||||
"advanced_no_default": "def456",
|
||||
"option1": "blabla",
|
||||
}
|
||||
for option in result["data"]:
|
||||
# Make sure we didn't get the Optional or Required instance as key
|
||||
assert isinstance(option, str)
|
||||
|
||||
# Start flow in advanced mode
|
||||
result = await hass.config_entries.options.async_init(
|
||||
config_entry.entry_id, context={"show_advanced_options": True}
|
||||
)
|
||||
assert result["type"] is data_entry_flow.FlowResultType.FORM
|
||||
assert list(result["data_schema"].schema.keys()) == [
|
||||
"option1",
|
||||
"advanced_no_default",
|
||||
"advanced_default",
|
||||
]
|
||||
|
||||
result = await hass.config_entries.options.async_configure(
|
||||
result["flow_id"],
|
||||
{
|
||||
"advanced_default": "also not default",
|
||||
"advanced_no_default": "abc123",
|
||||
"option1": "blabla",
|
||||
},
|
||||
)
|
||||
assert result["type"] is data_entry_flow.FlowResultType.CREATE_ENTRY
|
||||
assert result["data"] == {
|
||||
"advanced_default": "also not default",
|
||||
"advanced_no_default": "abc123",
|
||||
"option1": "blabla",
|
||||
}
|
||||
for option in result["data"]:
|
||||
# Make sure we didn't get the Optional or Required instance as key
|
||||
assert isinstance(option, str)
|
||||
|
||||
|
||||
async def test_menu_step(hass: HomeAssistant) -> None:
|
||||
"""Test menu step."""
|
||||
|
||||
@@ -526,7 +319,7 @@ async def test_suggested_values(
|
||||
)
|
||||
config_entry.add_to_hass(hass)
|
||||
|
||||
# Start flow in basic mode, suggested values should be the existing options
|
||||
# Start flow, suggested values should be the existing options
|
||||
result = await hass.config_entries.options.async_init(config_entry.entry_id)
|
||||
assert result["type"] is data_entry_flow.FlowResultType.FORM
|
||||
assert result["step_id"] == "init"
|
||||
@@ -678,7 +471,7 @@ async def test_options_flow_state(hass: HomeAssistant) -> None:
|
||||
)
|
||||
config_entry.add_to_hass(hass)
|
||||
|
||||
# Start flow in basic mode, flow state is initialised with None value
|
||||
# Start flow, flow state is initialised with None value
|
||||
result = await hass.config_entries.options.async_init(config_entry.entry_id)
|
||||
assert result["type"] is data_entry_flow.FlowResultType.FORM
|
||||
assert result["step_id"] == "step_1"
|
||||
@@ -715,19 +508,13 @@ async def test_options_flow_state(hass: HomeAssistant) -> None:
|
||||
async def test_options_flow_omit_optional_keys(
|
||||
hass: HomeAssistant, manager: data_entry_flow.FlowManager
|
||||
) -> None:
|
||||
"""Test handling of advanced options in options flow."""
|
||||
"""Test handling of optional keys in options flow."""
|
||||
manager.hass = hass
|
||||
|
||||
OPTIONS_SCHEMA = vol.Schema(
|
||||
{
|
||||
vol.Optional("optional_no_default"): str,
|
||||
vol.Optional("optional_default", default="a very reasonable default"): str,
|
||||
vol.Optional("advanced_no_default", description={"advanced": True}): str,
|
||||
vol.Optional(
|
||||
"advanced_default",
|
||||
default="a very reasonable default",
|
||||
description={"advanced": True},
|
||||
): str,
|
||||
}
|
||||
)
|
||||
|
||||
@@ -747,13 +534,11 @@ async def test_options_flow_omit_optional_keys(
|
||||
options={
|
||||
"optional_no_default": "abc123",
|
||||
"optional_default": "not default",
|
||||
"advanced_no_default": "abc123",
|
||||
"advanced_default": "not default",
|
||||
},
|
||||
)
|
||||
config_entry.add_to_hass(hass)
|
||||
|
||||
# Start flow in basic mode
|
||||
# Start flow
|
||||
result = await hass.config_entries.options.async_init(config_entry.entry_id)
|
||||
assert result["type"] is data_entry_flow.FlowResultType.FORM
|
||||
assert list(result["data_schema"].schema.keys()) == [
|
||||
@@ -764,27 +549,6 @@ async def test_options_flow_omit_optional_keys(
|
||||
result = await hass.config_entries.options.async_configure(result["flow_id"], {})
|
||||
assert result["type"] is data_entry_flow.FlowResultType.CREATE_ENTRY
|
||||
assert result["data"] == {
|
||||
"advanced_default": "not default",
|
||||
"advanced_no_default": "abc123",
|
||||
"optional_default": "a very reasonable default",
|
||||
}
|
||||
|
||||
# Start flow in advanced mode
|
||||
result = await hass.config_entries.options.async_init(
|
||||
config_entry.entry_id, context={"show_advanced_options": True}
|
||||
)
|
||||
assert result["type"] is data_entry_flow.FlowResultType.FORM
|
||||
assert list(result["data_schema"].schema.keys()) == [
|
||||
"optional_no_default",
|
||||
"optional_default",
|
||||
"advanced_no_default",
|
||||
"advanced_default",
|
||||
]
|
||||
|
||||
result = await hass.config_entries.options.async_configure(result["flow_id"], {})
|
||||
assert result["type"] is data_entry_flow.FlowResultType.CREATE_ENTRY
|
||||
assert result["data"] == {
|
||||
"advanced_default": "a very reasonable default",
|
||||
"optional_default": "a very reasonable default",
|
||||
}
|
||||
|
||||
@@ -839,15 +603,13 @@ async def test_options_flow_with_automatic_reload(
|
||||
options={
|
||||
"optional_no_default": "abc123",
|
||||
"optional_default": "not default",
|
||||
"advanced_no_default": "abc123",
|
||||
"advanced_default": "not default",
|
||||
},
|
||||
)
|
||||
config_entry.add_to_hass(hass)
|
||||
await hass.config_entries.async_setup(config_entry.entry_id)
|
||||
assert len(load_entry_mock.mock_calls) == 1
|
||||
|
||||
# Start flow in basic mode
|
||||
# Start flow
|
||||
result = await hass.config_entries.options.async_init(config_entry.entry_id)
|
||||
assert result["type"] is data_entry_flow.FlowResultType.FORM
|
||||
|
||||
|
||||
Reference in New Issue
Block a user