Use OptionsFlowWithConfigEntry in braviatv (#82902)

* Use OptionsFlowWithConfigEntry in braviatv

* Make use of add_suggested_values_to_schema

* Full coverage
pull/81536/head^2
epenet 2022-11-29 16:48:51 +01:00 committed by GitHub
parent a69e0defe6
commit db9e8d2fa1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 52 additions and 17 deletions

View File

@ -245,22 +245,17 @@ class BraviaTVConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
return uuid, f"{NICKNAME_PREFIX} {uuid[:6]}"
class BraviaTVOptionsFlowHandler(config_entries.OptionsFlow):
class BraviaTVOptionsFlowHandler(config_entries.OptionsFlowWithConfigEntry):
"""Config flow options for Bravia TV."""
def __init__(self, config_entry: ConfigEntry) -> None:
"""Initialize Bravia TV options flow."""
self.config_entry = config_entry
self.ignored_sources = config_entry.options.get(CONF_IGNORED_SOURCES)
self.source_list: list[str] = []
data_schema: vol.Schema
async def async_step_init(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
"""Manage the options."""
coordinator: BraviaTVCoordinator = self.hass.data[DOMAIN][
self.config_entry.entry_id
]
coordinator: BraviaTVCoordinator
coordinator = self.hass.data[DOMAIN][self.config_entry.entry_id]
try:
await coordinator.async_update_sources()
@ -268,7 +263,13 @@ class BraviaTVOptionsFlowHandler(config_entries.OptionsFlow):
return self.async_abort(reason="failed_update")
sources = coordinator.source_map.values()
self.source_list = [item["title"] for item in sources]
source_list = [item["title"] for item in sources]
self.data_schema = vol.Schema(
{
vol.Optional(CONF_IGNORED_SOURCES): cv.multi_select(source_list),
}
)
return await self.async_step_user()
async def async_step_user(
@ -280,11 +281,7 @@ class BraviaTVOptionsFlowHandler(config_entries.OptionsFlow):
return self.async_show_form(
step_id="user",
data_schema=vol.Schema(
{
vol.Optional(
CONF_IGNORED_SOURCES, default=self.ignored_sources
): cv.multi_select(self.source_list)
}
data_schema=self.add_suggested_values_to_schema(
self.data_schema, self.options
),
)

View File

@ -21,6 +21,7 @@ from homeassistant.components.braviatv.const import (
)
from homeassistant.config_entries import SOURCE_REAUTH, SOURCE_SSDP, SOURCE_USER
from homeassistant.const import CONF_HOST, CONF_MAC, CONF_PIN
from homeassistant.core import HomeAssistant
from homeassistant.helpers import instance_id
from tests.common import MockConfigEntry
@ -381,7 +382,7 @@ async def test_create_entry_psk(hass):
}
async def test_options_flow(hass):
async def test_options_flow(hass: HomeAssistant) -> None:
"""Test config flow options."""
config_entry = MockConfigEntry(
domain=DOMAIN,
@ -422,6 +423,43 @@ async def test_options_flow(hass):
assert config_entry.options == {CONF_IGNORED_SOURCES: ["HDMI 1", "HDMI 2"]}
async def test_options_flow_error(hass: HomeAssistant) -> None:
"""Test config flow options."""
config_entry = MockConfigEntry(
domain=DOMAIN,
unique_id="very_unique_string",
data={
CONF_HOST: "bravia-host",
CONF_PIN: "1234",
CONF_MAC: "AA:BB:CC:DD:EE:FF",
},
title="TV-Model",
)
config_entry.add_to_hass(hass)
with patch("pybravia.BraviaTV.connect"), patch(
"pybravia.BraviaTV.get_power_status",
return_value="active",
), patch(
"pybravia.BraviaTV.get_external_status",
return_value=BRAVIA_SOURCES,
), patch(
"pybravia.BraviaTV.send_rest_req",
return_value={},
):
assert await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
with patch(
"pybravia.BraviaTV.send_rest_req",
side_effect=BraviaTVError,
):
result = await hass.config_entries.options.async_init(config_entry.entry_id)
assert result["type"] == data_entry_flow.FlowResultType.ABORT
assert result["reason"] == "failed_update"
@pytest.mark.parametrize(
"user_input",
[{CONF_PIN: "mypsk", CONF_USE_PSK: True}, {CONF_PIN: "1234", CONF_USE_PSK: False}],