Add reconfiguration flow to ista EcoTrend integration (#143457)

This commit is contained in:
Manu 2025-04-29 20:37:04 +02:00 committed by GitHub
parent cd104dc08c
commit ad3fd151aa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 145 additions and 5 deletions

View File

@ -9,7 +9,7 @@ from typing import TYPE_CHECKING, Any
from pyecotrend_ista import KeycloakError, LoginError, PyEcotrendIsta, ServerError
import voluptuous as vol
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult
from homeassistant.const import CONF_EMAIL, CONF_NAME, CONF_PASSWORD
from homeassistant.helpers.selector import (
TextSelector,
@ -93,7 +93,11 @@ class IstaConfigFlow(ConfigFlow, domain=DOMAIN):
"""Dialog that informs the user that reauth is required."""
errors: dict[str, str] = {}
reauth_entry = self._get_reauth_entry()
reauth_entry = (
self._get_reauth_entry()
if self.source == SOURCE_REAUTH
else self._get_reconfigure_entry()
)
if user_input is not None:
ista = PyEcotrendIsta(
user_input[CONF_EMAIL],
@ -126,7 +130,7 @@ class IstaConfigFlow(ConfigFlow, domain=DOMAIN):
return self.async_update_reload_and_abort(reauth_entry, data=user_input)
return self.async_show_form(
step_id="reauth_confirm",
step_id="reauth_confirm" if self.source == SOURCE_REAUTH else "reconfigure",
data_schema=self.add_suggested_values_to_schema(
data_schema=STEP_USER_DATA_SCHEMA,
suggested_values={
@ -141,3 +145,5 @@ class IstaConfigFlow(ConfigFlow, domain=DOMAIN):
},
errors=errors,
)
async_step_reconfigure = async_step_reauth_confirm

View File

@ -3,7 +3,8 @@
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
"unique_id_mismatch": "The login details correspond to a different account. Please re-authenticate to the previously configured account."
"unique_id_mismatch": "The login details correspond to a different account. Please re-authenticate to the previously configured account.",
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]"
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
@ -33,6 +34,18 @@
"email": "[%key:component::ista_ecotrend::config::step::user::data_description::email%]",
"password": "[%key:component::ista_ecotrend::config::step::user::data_description::password%]"
}
},
"reconfigure": {
"title": "Update ista EcoTrend configuration",
"description": "Update your credentials if you have changed your **ista EcoTrend** account email or password.",
"data": {
"email": "[%key:common::config_flow::data::email%]",
"password": "[%key:common::config_flow::data::password%]"
},
"data_description": {
"email": "[%key:component::ista_ecotrend::config::step::user::data_description::email%]",
"password": "[%key:component::ista_ecotrend::config::step::user::data_description::password%]"
}
}
}
},

View File

@ -179,7 +179,7 @@ async def test_reauth_error_and_recover(
@pytest.mark.usefixtures("mock_ista")
async def test_form__already_configured(
async def test_form_already_configured(
hass: HomeAssistant,
ista_config_entry: MockConfigEntry,
) -> None:
@ -238,3 +238,124 @@ async def test_flow_reauth_unique_id_mismatch(hass: HomeAssistant) -> None:
assert result["reason"] == "unique_id_mismatch"
assert len(hass.config_entries.async_entries()) == 1
@pytest.mark.usefixtures("mock_ista")
async def test_reconfigure(
hass: HomeAssistant,
ista_config_entry: MockConfigEntry,
) -> None:
"""Test reconfigure flow."""
ista_config_entry.add_to_hass(hass)
result = await ista_config_entry.start_reconfigure_flow(hass)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "reconfigure"
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{
CONF_EMAIL: "new@example.com",
CONF_PASSWORD: "new-password",
},
)
await hass.async_block_till_done()
assert result["type"] is FlowResultType.ABORT
assert result["reason"] == "reconfigure_successful"
assert ista_config_entry.data == {
CONF_EMAIL: "new@example.com",
CONF_PASSWORD: "new-password",
}
assert len(hass.config_entries.async_entries()) == 1
@pytest.mark.parametrize(
("side_effect", "error_text"),
[
(LoginError(None), "invalid_auth"),
(ServerError, "cannot_connect"),
(IndexError, "unknown"),
],
)
async def test_reconfigure_error_and_recover(
hass: HomeAssistant,
ista_config_entry: MockConfigEntry,
mock_ista: MagicMock,
side_effect: Exception,
error_text: str,
) -> None:
"""Test reconfigure flow error and recover."""
ista_config_entry.add_to_hass(hass)
result = await ista_config_entry.start_reconfigure_flow(hass)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "reconfigure"
mock_ista.login.side_effect = side_effect
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{
CONF_EMAIL: "new@example.com",
CONF_PASSWORD: "new-password",
},
)
assert result["type"] is FlowResultType.FORM
assert result["errors"] == {"base": error_text}
mock_ista.login.side_effect = None
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{
CONF_EMAIL: "new@example.com",
CONF_PASSWORD: "new-password",
},
)
await hass.async_block_till_done()
assert result["type"] is FlowResultType.ABORT
assert result["reason"] == "reconfigure_successful"
assert ista_config_entry.data == {
CONF_EMAIL: "new@example.com",
CONF_PASSWORD: "new-password",
}
assert len(hass.config_entries.async_entries()) == 1
@pytest.mark.usefixtures("mock_ista")
async def test_flow_reconfigure_unique_id_mismatch(hass: HomeAssistant) -> None:
"""Test reconfigure flow unique id mismatch."""
config_entry = MockConfigEntry(
domain=DOMAIN,
data={
CONF_EMAIL: "test@example.com",
CONF_PASSWORD: "test-password",
},
unique_id="42243134-21f6-40a2-a79f-e417a3a12104",
)
config_entry.add_to_hass(hass)
result = await config_entry.start_reconfigure_flow(hass)
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "reconfigure"
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{
CONF_EMAIL: "new@example.com",
CONF_PASSWORD: "new-password",
},
)
await hass.async_block_till_done()
assert result["type"] is FlowResultType.ABORT
assert result["reason"] == "unique_id_mismatch"
assert len(hass.config_entries.async_entries()) == 1