Move config option to OptionsFlow in iss (#65303)

Co-authored-by: Franck Nijhof <frenck@frenck.nl>
This commit is contained in:
Simon Hansen 2022-02-14 21:07:50 +01:00 committed by GitHub
parent 5be5a014f3
commit 7cb0ce0eec
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 102 additions and 27 deletions

View file

@ -15,6 +15,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
hass.data.setdefault(DOMAIN, {}) hass.data.setdefault(DOMAIN, {})
entry.async_on_unload(entry.add_update_listener(update_listener))
hass.config_entries.async_setup_platforms(entry, PLATFORMS) hass.config_entries.async_setup_platforms(entry, PLATFORMS)
return True return True
@ -25,3 +27,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS): if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
del hass.data[DOMAIN] del hass.data[DOMAIN]
return unload_ok return unload_ok
async def update_listener(hass: HomeAssistant, entry: ConfigEntry):
"""Handle options update."""
await hass.config_entries.async_reload(entry.entry_id)

View file

@ -72,8 +72,8 @@ async def async_setup_entry(
) -> None: ) -> None:
"""Set up the sensor platform.""" """Set up the sensor platform."""
name = entry.data.get(CONF_NAME, DEFAULT_NAME) name = entry.title
show_on_map = entry.data.get(CONF_SHOW_ON_MAP, False) show_on_map = entry.options.get(CONF_SHOW_ON_MAP, False)
try: try:
iss_data = IssData(hass.config.latitude, hass.config.longitude) iss_data = IssData(hass.config.latitude, hass.config.longitude)

View file

@ -4,8 +4,10 @@ import voluptuous as vol
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.const import CONF_NAME, CONF_SHOW_ON_MAP from homeassistant.const import CONF_NAME, CONF_SHOW_ON_MAP
from homeassistant.core import callback
from homeassistant.data_entry_flow import FlowResult from homeassistant.data_entry_flow import FlowResult
from .binary_sensor import DEFAULT_NAME
from .const import DOMAIN from .const import DOMAIN
@ -14,6 +16,14 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
VERSION = 1 VERSION = 1
@staticmethod
@callback
def async_get_options_flow(
config_entry: config_entries.ConfigEntry,
) -> config_entries.OptionsFlow:
"""Get the options flow for this handler."""
return OptionsFlowHandler(config_entry)
async def async_step_user(self, user_input=None) -> FlowResult: async def async_step_user(self, user_input=None) -> FlowResult:
"""Handle a flow initialized by the user.""" """Handle a flow initialized by the user."""
# Check if already configured # Check if already configured
@ -26,17 +36,12 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
if user_input is not None: if user_input is not None:
return self.async_create_entry( return self.async_create_entry(
title="International Space Station", data=user_input title=user_input.get(CONF_NAME, DEFAULT_NAME),
data={},
options={CONF_SHOW_ON_MAP: user_input.get(CONF_SHOW_ON_MAP, False)},
) )
return self.async_show_form( return self.async_show_form(step_id="user")
step_id="user",
data_schema=vol.Schema(
{
vol.Optional(CONF_SHOW_ON_MAP, default=False): bool,
}
),
)
async def async_step_import(self, conf: dict) -> FlowResult: async def async_step_import(self, conf: dict) -> FlowResult:
"""Import a configuration from configuration.yaml.""" """Import a configuration from configuration.yaml."""
@ -46,3 +51,30 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
CONF_SHOW_ON_MAP: conf[CONF_SHOW_ON_MAP], CONF_SHOW_ON_MAP: conf[CONF_SHOW_ON_MAP],
} }
) )
class OptionsFlowHandler(config_entries.OptionsFlow):
"""Config flow options handler for iss."""
def __init__(self, config_entry: config_entries.ConfigEntry) -> None:
"""Initialize options flow."""
self.config_entry = config_entry
self.options = dict(config_entry.options)
async def async_step_init(self, user_input=None) -> FlowResult:
"""Manage the options."""
if user_input is not None:
self.options.update(user_input)
return self.async_create_entry(title="", data=self.options)
return self.async_show_form(
step_id="init",
data_schema=vol.Schema(
{
vol.Optional(
CONF_SHOW_ON_MAP,
default=self.config_entry.options.get(CONF_SHOW_ON_MAP, False),
): bool,
}
),
)

View file

@ -2,15 +2,21 @@
"config": { "config": {
"step": { "step": {
"user": { "user": {
"description": "Do you want to configure the International Space Station?", "description": "Do you want to configure International Space Station (ISS)?"
"data": {
"show_on_map": "Show on map?"
}
} }
}, },
"abort": { "abort": {
"single_instance_allowed": "[%key:common::config_flow::abort::single_instance_allowed%]", "single_instance_allowed": "[%key:common::config_flow::abort::single_instance_allowed%]",
"latitude_longitude_not_defined": "Latitude and longitude are not defined in Home Assistant." "latitude_longitude_not_defined": "Latitude and longitude are not defined in Home Assistant."
} }
},
"options": {
"step": {
"init": {
"data": {
"show_on_map": "Show on map"
}
}
}
} }
} }

View file

@ -6,10 +6,16 @@
}, },
"step": { "step": {
"user": { "user": {
"data": { "description": "Do you want to configure International Space Station (ISS)?"
"show_on_map": "Show on map?" }
}
}, },
"description": "Do you want to configure the International Space Station?" "options": {
"step": {
"init": {
"data": {
"show_on_map": "Show on map"
}
} }
} }
} }

View file

@ -7,11 +7,12 @@ from homeassistant.components.iss.const import DOMAIN
from homeassistant.config import async_process_ha_core_config from homeassistant.config import async_process_ha_core_config
from homeassistant.config_entries import SOURCE_IMPORT, SOURCE_USER from homeassistant.config_entries import SOURCE_IMPORT, SOURCE_USER
from homeassistant.const import CONF_NAME, CONF_SHOW_ON_MAP from homeassistant.const import CONF_NAME, CONF_SHOW_ON_MAP
from homeassistant.core import HomeAssistant
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
async def test_import(hass): async def test_import(hass: HomeAssistant):
"""Test entry will be imported.""" """Test entry will be imported."""
imported_config = {CONF_NAME: DEFAULT_NAME, CONF_SHOW_ON_MAP: False} imported_config = {CONF_NAME: DEFAULT_NAME, CONF_SHOW_ON_MAP: False}
@ -22,10 +23,11 @@ async def test_import(hass):
DOMAIN, context={"source": SOURCE_IMPORT}, data=imported_config DOMAIN, context={"source": SOURCE_IMPORT}, data=imported_config
) )
assert result.get("type") == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result.get("type") == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
assert result.get("result").data == imported_config assert result.get("result").title == DEFAULT_NAME
assert result.get("result").options == {CONF_SHOW_ON_MAP: False}
async def test_create_entry(hass): async def test_create_entry(hass: HomeAssistant):
"""Test we can finish a config flow.""" """Test we can finish a config flow."""
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
@ -39,14 +41,14 @@ async def test_create_entry(hass):
result = await hass.config_entries.flow.async_configure( result = await hass.config_entries.flow.async_configure(
result["flow_id"], result["flow_id"],
{CONF_SHOW_ON_MAP: True}, {},
) )
assert result.get("type") == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result.get("type") == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
assert result.get("result").data[CONF_SHOW_ON_MAP] is True assert result.get("result").data == {}
async def test_integration_already_exists(hass): async def test_integration_already_exists(hass: HomeAssistant):
"""Test we only allow a single config flow.""" """Test we only allow a single config flow."""
MockConfigEntry( MockConfigEntry(
@ -55,14 +57,14 @@ async def test_integration_already_exists(hass):
).add_to_hass(hass) ).add_to_hass(hass)
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": SOURCE_USER}, data={CONF_SHOW_ON_MAP: False} DOMAIN, context={"source": SOURCE_USER}, data={}
) )
assert result.get("type") == data_entry_flow.RESULT_TYPE_ABORT assert result.get("type") == data_entry_flow.RESULT_TYPE_ABORT
assert result.get("reason") == "single_instance_allowed" assert result.get("reason") == "single_instance_allowed"
async def test_abort_no_home(hass): async def test_abort_no_home(hass: HomeAssistant):
"""Test we don't create an entry if no coordinates are set.""" """Test we don't create an entry if no coordinates are set."""
await async_process_ha_core_config( await async_process_ha_core_config(
@ -71,8 +73,30 @@ async def test_abort_no_home(hass):
) )
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": SOURCE_USER}, data={CONF_SHOW_ON_MAP: False} DOMAIN, context={"source": SOURCE_USER}, data={}
) )
assert result.get("type") == data_entry_flow.RESULT_TYPE_ABORT assert result.get("type") == data_entry_flow.RESULT_TYPE_ABORT
assert result.get("reason") == "latitude_longitude_not_defined" assert result.get("reason") == "latitude_longitude_not_defined"
async def test_options(hass: HomeAssistant):
"""Test options flow."""
config_entry = MockConfigEntry(
domain=DOMAIN,
data={},
)
config_entry.add_to_hass(hass)
optionflow = await hass.config_entries.options.async_init(config_entry.entry_id)
configured = await hass.config_entries.options.async_configure(
optionflow["flow_id"],
user_input={
CONF_SHOW_ON_MAP: True,
},
)
assert configured.get("type") == "create_entry"