diff --git a/homeassistant/components/scrape/config_flow.py b/homeassistant/components/scrape/config_flow.py index 034667a4a76..6bb68d2fdec 100644 --- a/homeassistant/components/scrape/config_flow.py +++ b/homeassistant/components/scrape/config_flow.py @@ -134,7 +134,7 @@ DATA_SCHEMA_SENSOR = vol.Schema(SENSOR_SETUP) CONFIG_FLOW: dict[str, SchemaFlowFormStep | SchemaFlowMenuStep] = { "user": SchemaFlowFormStep( schema=DATA_SCHEMA_RESOURCE, - next_step=lambda _: "sensor", + next_step="sensor", validate_user_input=validate_rest_setup, ), "sensor": SchemaFlowFormStep( diff --git a/homeassistant/helpers/schema_config_entry_flow.py b/homeassistant/helpers/schema_config_entry_flow.py index c1936b4bd1e..2154ebc216f 100644 --- a/homeassistant/helpers/schema_config_entry_flow.py +++ b/homeassistant/helpers/schema_config_entry_flow.py @@ -32,18 +32,22 @@ class SchemaFlowFormStep: vol.Schema | None, ] | None - # Optional function to validate user input. - # The validate_user_input function is called if the schema validates successfully. - # The validate_user_input function is passed the user input from the current step. - # The validate_user_input should raise SchemaFlowError is user input is invalid. validate_user_input: Callable[[dict[str, Any]], dict[str, Any]] = lambda x: x + """Optional function to validate user input. - # Optional function to identify next step. - # The next_step function is called if the schema validates successfully or if no - # schema is defined. The next_step function is passed the union of config entry - # options and user input from previous steps. - # If next_step is None, the flow is ended with FlowResultType.CREATE_ENTRY. - next_step: Callable[[dict[str, Any]], str] | None = None + - The `validate_user_input` function is called if the schema validates successfully. + - The `validate_user_input` function is passed the user input from the current step. + - The `validate_user_input` should raise `SchemaFlowError` is user input is invalid. + """ + + next_step: Callable[[dict[str, Any]], str] | str | None = None + """Optional property to identify next step. + + - If `next_step` is a function, it is called if the schema validates successfully or + if no schema is defined. The `next_step` function is passed the union of config entry + options and user input from previous steps. + - If `next_step` is None, the flow is ended with `FlowResultType.CREATE_ENTRY`. + """ # Optional function to allow amending a form schema. # The update_form_schema function is called before async_show_form is called. The @@ -140,7 +144,10 @@ class SchemaCommonFlowHandler: # Flow done, create entry or update config entry options return self._handler.async_create_entry(data=self._options) - next_step_id = form_step.next_step(self._options) + if isinstance(form_step.next_step, str): + next_step_id = form_step.next_step + else: + next_step_id = form_step.next_step(self._options) return self._show_next_step(next_step_id) diff --git a/tests/helpers/test_schema_config_entry_flow.py b/tests/helpers/test_schema_config_entry_flow.py index e54582db606..7ea5768fcad 100644 --- a/tests/helpers/test_schema_config_entry_flow.py +++ b/tests/helpers/test_schema_config_entry_flow.py @@ -29,7 +29,8 @@ async def test_menu_step(hass: HomeAssistant) -> None: "user": SchemaFlowMenuStep(MENU_1), "option1": SchemaFlowFormStep(vol.Schema({}), next_step=lambda _: "menu2"), "menu2": SchemaFlowMenuStep(MENU_2), - "option3": SchemaFlowFormStep(vol.Schema({})), + "option3": SchemaFlowFormStep(vol.Schema({}), next_step="option4"), + "option4": SchemaFlowFormStep(vol.Schema({})), } class TestConfigFlow(SchemaConfigFlowHandler, domain=TEST_DOMAIN): @@ -63,5 +64,9 @@ async def test_menu_step(hass: HomeAssistant) -> None: assert result["type"] == FlowResultType.FORM assert result["step_id"] == "option3" + result = await hass.config_entries.flow.async_configure(result["flow_id"], {}) + assert result["type"] == FlowResultType.FORM + assert result["step_id"] == "option4" + result = await hass.config_entries.flow.async_configure(result["flow_id"], {}) assert result["type"] == FlowResultType.CREATE_ENTRY