diff --git a/tests/components/icloud/test_config_flow.py b/tests/components/icloud/test_config_flow.py index a88a557d07af..74f76e326647 100644 --- a/tests/components/icloud/test_config_flow.py +++ b/tests/components/icloud/test_config_flow.py @@ -197,16 +197,16 @@ def mock_controller_service_validate_verification_code_failed(): async def test_user(hass: HomeAssistant) -> None: """Test user config.""" result = await hass.config_entries.flow.async_init( - DOMAIN, context={"source": SOURCE_USER}, data=None + DOMAIN, context={"source": SOURCE_USER} ) assert result["type"] is FlowResultType.FORM assert result["step_id"] == "user" + assert result["errors"] == {} # test with required - result = await hass.config_entries.flow.async_init( - DOMAIN, - context={"source": SOURCE_USER}, - data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + user_input={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, ) assert result["type"] is FlowResultType.FORM assert result["step_id"] == CONF_TRUSTED_DEVICE @@ -215,11 +215,18 @@ async def test_user(hass: HomeAssistant) -> None: @pytest.mark.usefixtures("service_authenticated") async def test_user_with_cookie(hass: HomeAssistant) -> None: """Test user config with presence of a cookie.""" - # test with all provided result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, - data={ + ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == "user" + assert result["errors"] == {} + + # test with all provided + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + user_input={ CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD, CONF_WITH_FAMILY: WITH_FAMILY, @@ -237,14 +244,21 @@ async def test_user_with_cookie(hass: HomeAssistant) -> None: async def test_login_failed(hass: HomeAssistant) -> None: """Test when we have errors during login.""" + result = await hass.config_entries.flow.async_init( + DOMAIN, + context={"source": SOURCE_USER}, + ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == "user" + assert result["errors"] == {} + with patch( "homeassistant.components.icloud.config_flow.PyiCloudService", side_effect=PyiCloudFailedLoginException(msg="Invalid login"), ): - result = await hass.config_entries.flow.async_init( - DOMAIN, - context={"source": SOURCE_USER}, - data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + user_input={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, ) assert result["type"] is FlowResultType.FORM assert result["errors"] == {CONF_PASSWORD: "invalid_auth"} @@ -256,7 +270,14 @@ async def test_no_device(hass: HomeAssistant) -> None: result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, - data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == "user" + assert result["errors"] == {} + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + user_input={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, ) assert result["type"] is FlowResultType.ABORT assert result["reason"] == "no_device" @@ -268,8 +289,18 @@ async def test_trusted_device(hass: HomeAssistant) -> None: result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, - data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == "user" + assert result["errors"] == {} + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + user_input={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == CONF_TRUSTED_DEVICE + assert result["errors"] == {} result = await hass.config_entries.flow.async_configure(result["flow_id"]) assert result["type"] is FlowResultType.FORM @@ -282,11 +313,21 @@ async def test_trusted_device_success(hass: HomeAssistant) -> None: result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, - data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == "user" + assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( - result["flow_id"], {CONF_TRUSTED_DEVICE: 0} + result["flow_id"], + user_input={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == CONF_TRUSTED_DEVICE + assert result["errors"] == {} + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], user_input={CONF_TRUSTED_DEVICE: 0} ) assert result["type"] is FlowResultType.FORM assert result["step_id"] == CONF_VERIFICATION_CODE @@ -298,11 +339,21 @@ async def test_send_verification_code_failed(hass: HomeAssistant) -> None: result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, - data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == "user" + assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( - result["flow_id"], {CONF_TRUSTED_DEVICE: 0} + result["flow_id"], + user_input={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == CONF_TRUSTED_DEVICE + assert result["errors"] == {} + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], user_input={CONF_TRUSTED_DEVICE: 0} ) assert result["type"] is FlowResultType.FORM assert result["step_id"] == CONF_TRUSTED_DEVICE @@ -315,10 +366,21 @@ async def test_verification_code(hass: HomeAssistant) -> None: result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, - data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == "user" + assert result["errors"] == {} + result = await hass.config_entries.flow.async_configure( - result["flow_id"], {CONF_TRUSTED_DEVICE: 0} + result["flow_id"], + user_input={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == CONF_TRUSTED_DEVICE + assert result["errors"] == {} + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], user_input={CONF_TRUSTED_DEVICE: 0} ) result = await hass.config_entries.flow.async_configure(result["flow_id"]) @@ -333,15 +395,26 @@ async def test_verification_code_success( result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, - data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == "user" + assert result["errors"] == {} + result = await hass.config_entries.flow.async_configure( - result["flow_id"], {CONF_TRUSTED_DEVICE: 0} + result["flow_id"], + user_input={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == CONF_TRUSTED_DEVICE + assert result["errors"] == {} + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], user_input={CONF_TRUSTED_DEVICE: 0} ) service.return_value.requires_2sa = False result = await hass.config_entries.flow.async_configure( - result["flow_id"], {CONF_VERIFICATION_CODE: "0"} + result["flow_id"], user_input={CONF_VERIFICATION_CODE: "0"} ) assert result["type"] is FlowResultType.CREATE_ENTRY assert result["result"].unique_id == USERNAME @@ -359,14 +432,28 @@ async def test_validate_verification_code_failed(hass: HomeAssistant) -> None: result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, - data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, - ) - result = await hass.config_entries.flow.async_configure( - result["flow_id"], {CONF_TRUSTED_DEVICE: 0} ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == "user" + assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( - result["flow_id"], {CONF_VERIFICATION_CODE: "0"} + result["flow_id"], + user_input={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == CONF_TRUSTED_DEVICE + assert result["errors"] == {} + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], user_input={CONF_TRUSTED_DEVICE: 0} + ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == CONF_VERIFICATION_CODE + assert result["errors"] == {} + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], user_input={CONF_VERIFICATION_CODE: "0"} ) assert result["type"] is FlowResultType.FORM assert result["step_id"] == CONF_TRUSTED_DEVICE @@ -378,13 +465,24 @@ async def test_2fa_code_success(hass: HomeAssistant, service_2fa: MagicMock) -> result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, - data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == "user" + assert result["errors"] == {} + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + user_input={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == CONF_VERIFICATION_CODE + assert result["errors"] == {} + service_2fa.return_value.requires_2fa = False service_2fa.return_value.requires_2sa = False result = await hass.config_entries.flow.async_configure( - result["flow_id"], {CONF_VERIFICATION_CODE: "0"} + result["flow_id"], user_input={CONF_VERIFICATION_CODE: "0"} ) assert result["type"] is FlowResultType.CREATE_ENTRY @@ -404,13 +502,24 @@ async def test_2fa_new_code_success( result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, - data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == "user" + assert result["errors"] == {} + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + user_input={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == CONF_VERIFICATION_CODE + assert result["errors"] == {} + service_2fa.return_value.requires_2fa = False service_2fa.return_value.requires_2sa = False result = await hass.config_entries.flow.async_configure( - result["flow_id"], {CONF_REQUEST_NEW_CODE: True} + result["flow_id"], user_input={CONF_REQUEST_NEW_CODE: True} ) assert result["type"] is FlowResultType.FORM @@ -424,11 +533,21 @@ async def test_validate_2fa_code_failed(hass: HomeAssistant) -> None: result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, - data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == "user" + assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( - result["flow_id"], {CONF_VERIFICATION_CODE: "0"} + result["flow_id"], + user_input={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == CONF_VERIFICATION_CODE + assert result["errors"] == {} + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], user_input={CONF_VERIFICATION_CODE: "0"} ) assert result["type"] is FlowResultType.FORM @@ -442,11 +561,21 @@ async def test_validate_2fa_code_not_provided(hass: HomeAssistant) -> None: result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, - data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == "user" + assert result["errors"] == {} result = await hass.config_entries.flow.async_configure( - result["flow_id"], {CONF_VERIFICATION_CODE: ""} + result["flow_id"], + user_input={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == CONF_VERIFICATION_CODE + assert result["errors"] == {} + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], user_input={CONF_VERIFICATION_CODE: ""} ) assert result["type"] is FlowResultType.FORM @@ -461,15 +590,25 @@ async def test_2fa_code_failed_request( result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, - data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == "user" + assert result["errors"] == {} + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + user_input={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == CONF_VERIFICATION_CODE + assert result["errors"] == {} service_2fa_failed_request.return_value.request_2fa_code.side_effect = ( PyiCloudAPIResponseException(reason="PyiCloud error") ) result = await hass.config_entries.flow.async_configure( - result["flow_id"], {CONF_REQUEST_NEW_CODE: True} + result["flow_id"], user_input={CONF_REQUEST_NEW_CODE: True} ) assert result["type"] is FlowResultType.FORM @@ -484,15 +623,25 @@ async def test_2fa_code_non_pyicloud_error( result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, - data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == "user" + assert result["errors"] == {} + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + user_input={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == CONF_VERIFICATION_CODE + assert result["errors"] == {} service_2fa_failed_request.return_value.request_2fa_code.side_effect = Exception( "Non-PyiCloud error" ) result = await hass.config_entries.flow.async_configure( - result["flow_id"], {CONF_REQUEST_NEW_CODE: True} + result["flow_id"], user_input={CONF_REQUEST_NEW_CODE: True} ) assert result["type"] is FlowResultType.FORM @@ -507,13 +656,23 @@ async def test_2fa_code_returned_false( result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, - data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == "user" + assert result["errors"] == {} + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + user_input={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == CONF_VERIFICATION_CODE + assert result["errors"] == {} service_2fa_failed_request.return_value.request_2fa_code.return_value = False result = await hass.config_entries.flow.async_configure( - result["flow_id"], {CONF_REQUEST_NEW_CODE: True} + result["flow_id"], user_input={CONF_REQUEST_NEW_CODE: True} ) assert result["type"] is FlowResultType.FORM @@ -535,7 +694,7 @@ async def test_password_update(hass: HomeAssistant) -> None: assert result["step_id"] == "reauth_confirm" result = await hass.config_entries.flow.async_configure( - result["flow_id"], {CONF_PASSWORD: PASSWORD_2} + result["flow_id"], user_input={CONF_PASSWORD: PASSWORD_2} ) assert result["type"] is FlowResultType.ABORT @@ -560,7 +719,7 @@ async def test_password_update_wrong_password(hass: HomeAssistant) -> None: assert result["step_id"] == "reauth_confirm" result = await hass.config_entries.flow.async_configure( - result["flow_id"], {CONF_PASSWORD: PASSWORD_2} + result["flow_id"], user_input={CONF_PASSWORD: PASSWORD_2} ) assert result["type"] is FlowResultType.FORM @@ -574,7 +733,7 @@ async def test_create_icloud_storage_dir(hass: HomeAssistant) -> None: patch( "homeassistant.components.icloud.config_flow.os.path.exists", return_value=False, - ), + ) as mocked_path, patch( "homeassistant.components.icloud.config_flow.os.makedirs" ) as makedirs_mock, @@ -582,7 +741,16 @@ async def test_create_icloud_storage_dir(hass: HomeAssistant) -> None: result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, - data={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, + ) + assert result["type"] is FlowResultType.FORM + assert result["step_id"] == "user" + assert result["errors"] == {} + + mocked_path.return_value = True + + result = await hass.config_entries.flow.async_configure( + result["flow_id"], + user_input={CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD}, ) assert result["type"] is FlowResultType.FORM assert result["step_id"] == CONF_TRUSTED_DEVICE