Make the kitchen_sink integration set up a config entry (#85680)
* Make the kitchen_sink integration set up a config entry * Update homeassistant/components/kitchen_sink/config_flow.py Co-authored-by: epenet <6771947+epenet@users.noreply.github.com> * Add singleton check in import step + add test * Fix tests Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>pull/86072/head
parent
3179101fbc
commit
f9662e0af0
|
@ -15,9 +15,9 @@ from homeassistant.components.recorder.statistics import (
|
||||||
async_import_statistics,
|
async_import_statistics,
|
||||||
get_last_statistics,
|
get_last_statistics,
|
||||||
)
|
)
|
||||||
|
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
|
||||||
from homeassistant.const import Platform, UnitOfEnergy, UnitOfTemperature, UnitOfVolume
|
from homeassistant.const import Platform, UnitOfEnergy, UnitOfTemperature, UnitOfVolume
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers.discovery import async_load_platform
|
|
||||||
from homeassistant.helpers.issue_registry import IssueSeverity, async_create_issue
|
from homeassistant.helpers.issue_registry import IssueSeverity, async_create_issue
|
||||||
from homeassistant.helpers.typing import ConfigType
|
from homeassistant.helpers.typing import ConfigType
|
||||||
import homeassistant.util.dt as dt_util
|
import homeassistant.util.dt as dt_util
|
||||||
|
@ -32,9 +32,20 @@ COMPONENTS_WITH_DEMO_PLATFORM = [
|
||||||
|
|
||||||
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
|
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
|
||||||
"""Set up the demo environment."""
|
"""Set up the demo environment."""
|
||||||
# Set up demo platforms
|
hass.async_create_task(
|
||||||
for platform in COMPONENTS_WITH_DEMO_PLATFORM:
|
hass.config_entries.flow.async_init(
|
||||||
hass.async_create_task(async_load_platform(hass, platform, DOMAIN, {}, config))
|
DOMAIN, context={"source": SOURCE_IMPORT}, data={}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
|
||||||
|
"""Set the config entry up."""
|
||||||
|
# Set up demo platforms with config entry
|
||||||
|
await hass.config_entries.async_forward_entry_setups(
|
||||||
|
config_entry, COMPONENTS_WITH_DEMO_PLATFORM
|
||||||
|
)
|
||||||
|
|
||||||
# Create issues
|
# Create issues
|
||||||
_create_issues(hass)
|
_create_issues(hass)
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
"""Config flow to configure the Kitchen Sink component."""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from homeassistant import config_entries
|
||||||
|
from homeassistant.data_entry_flow import FlowResult
|
||||||
|
|
||||||
|
from . import DOMAIN
|
||||||
|
|
||||||
|
|
||||||
|
class KitchenSinkConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
||||||
|
"""Kitchen Sink configuration flow."""
|
||||||
|
|
||||||
|
VERSION = 1
|
||||||
|
|
||||||
|
async def async_step_import(self, import_info: dict[str, Any]) -> FlowResult:
|
||||||
|
"""Set the config entry up from yaml."""
|
||||||
|
if self._async_current_entries():
|
||||||
|
return self.async_abort(reason="single_instance_allowed")
|
||||||
|
|
||||||
|
return self.async_create_entry(title="Kitchen Sink", data=import_info)
|
|
@ -11,18 +11,17 @@ from homeassistant.const import ATTR_BATTERY_LEVEL, UnitOfPower
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers.entity import DeviceInfo
|
from homeassistant.helpers.entity import DeviceInfo
|
||||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType, StateType
|
from homeassistant.helpers.typing import StateType
|
||||||
|
|
||||||
from . import DOMAIN
|
from . import DOMAIN
|
||||||
|
|
||||||
|
|
||||||
async def async_setup_platform(
|
async def async_setup_entry(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
config: ConfigType,
|
config_entry: ConfigEntry,
|
||||||
async_add_entities: AddEntitiesCallback,
|
async_add_entities: AddEntitiesCallback,
|
||||||
discovery_info: DiscoveryInfoType | None = None,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Set up the Demo sensors."""
|
"""Set up the Everything but the Kitchen Sink config entry."""
|
||||||
async_add_entities(
|
async_add_entities(
|
||||||
[
|
[
|
||||||
DemoSensor(
|
DemoSensor(
|
||||||
|
@ -56,15 +55,6 @@ async def async_setup_platform(
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
async def async_setup_entry(
|
|
||||||
hass: HomeAssistant,
|
|
||||||
config_entry: ConfigEntry,
|
|
||||||
async_add_entities: AddEntitiesCallback,
|
|
||||||
) -> None:
|
|
||||||
"""Set up the Everything but the Kitchen Sink config entry."""
|
|
||||||
await async_setup_platform(hass, {}, async_add_entities)
|
|
||||||
|
|
||||||
|
|
||||||
class DemoSensor(SensorEntity):
|
class DemoSensor(SensorEntity):
|
||||||
"""Representation of a Demo sensor."""
|
"""Representation of a Demo sensor."""
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
"""Test the Everything but the Kitchen Sink config flow."""
|
||||||
|
from unittest.mock import patch
|
||||||
|
|
||||||
|
from homeassistant import config_entries, data_entry_flow, setup
|
||||||
|
from homeassistant.components.kitchen_sink import DOMAIN
|
||||||
|
|
||||||
|
|
||||||
|
async def test_import(hass):
|
||||||
|
"""Test that we can import a config entry."""
|
||||||
|
with patch("homeassistant.components.kitchen_sink.async_setup_entry"):
|
||||||
|
assert await setup.async_setup_component(hass, DOMAIN, {DOMAIN: {}})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
assert len(hass.config_entries.async_entries(DOMAIN)) == 1
|
||||||
|
entry = hass.config_entries.async_entries(DOMAIN)[0]
|
||||||
|
assert entry.data == {}
|
||||||
|
|
||||||
|
|
||||||
|
async def test_import_once(hass):
|
||||||
|
"""Test that we don't create multiple config entries."""
|
||||||
|
with patch(
|
||||||
|
"homeassistant.components.kitchen_sink.async_setup_entry"
|
||||||
|
) as mock_setup_entry:
|
||||||
|
result = await hass.config_entries.flow.async_init(
|
||||||
|
DOMAIN,
|
||||||
|
context={"source": config_entries.SOURCE_IMPORT},
|
||||||
|
data={},
|
||||||
|
)
|
||||||
|
assert result["type"] == data_entry_flow.FlowResultType.CREATE_ENTRY
|
||||||
|
assert result["title"] == "Kitchen Sink"
|
||||||
|
assert result["data"] == {}
|
||||||
|
assert result["options"] == {}
|
||||||
|
mock_setup_entry.assert_called_once()
|
||||||
|
|
||||||
|
# Test importing again doesn't create a 2nd entry
|
||||||
|
with patch(
|
||||||
|
"homeassistant.components.kitchen_sink.async_setup_entry"
|
||||||
|
) as mock_setup_entry:
|
||||||
|
result = await hass.config_entries.flow.async_init(
|
||||||
|
DOMAIN,
|
||||||
|
context={"source": config_entries.SOURCE_IMPORT},
|
||||||
|
data={},
|
||||||
|
)
|
||||||
|
assert result["type"] == data_entry_flow.FlowResultType.ABORT
|
||||||
|
assert result["reason"] == "single_instance_allowed"
|
||||||
|
mock_setup_entry.assert_not_called()
|
Loading…
Reference in New Issue