diff --git a/homeassistant/components/kitchen_sink/__init__.py b/homeassistant/components/kitchen_sink/__init__.py index b2d4c4cbcc5..db7cb8d4b48 100644 --- a/homeassistant/components/kitchen_sink/__init__.py +++ b/homeassistant/components/kitchen_sink/__init__.py @@ -15,9 +15,9 @@ from homeassistant.components.recorder.statistics import ( async_import_statistics, get_last_statistics, ) +from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.const import Platform, UnitOfEnergy, UnitOfTemperature, UnitOfVolume 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.typing import ConfigType import homeassistant.util.dt as dt_util @@ -32,9 +32,20 @@ COMPONENTS_WITH_DEMO_PLATFORM = [ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up the demo environment.""" - # Set up demo platforms - for platform in COMPONENTS_WITH_DEMO_PLATFORM: - hass.async_create_task(async_load_platform(hass, platform, DOMAIN, {}, config)) + hass.async_create_task( + hass.config_entries.flow.async_init( + 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(hass) diff --git a/homeassistant/components/kitchen_sink/config_flow.py b/homeassistant/components/kitchen_sink/config_flow.py new file mode 100644 index 00000000000..ded2b84e31c --- /dev/null +++ b/homeassistant/components/kitchen_sink/config_flow.py @@ -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) diff --git a/homeassistant/components/kitchen_sink/sensor.py b/homeassistant/components/kitchen_sink/sensor.py index b6806b02115..6692f53810b 100644 --- a/homeassistant/components/kitchen_sink/sensor.py +++ b/homeassistant/components/kitchen_sink/sensor.py @@ -11,18 +11,17 @@ from homeassistant.const import ATTR_BATTERY_LEVEL, UnitOfPower from homeassistant.core import HomeAssistant from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity_platform import AddEntitiesCallback -from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType, StateType +from homeassistant.helpers.typing import StateType from . import DOMAIN -async def async_setup_platform( +async def async_setup_entry( hass: HomeAssistant, - config: ConfigType, + config_entry: ConfigEntry, async_add_entities: AddEntitiesCallback, - discovery_info: DiscoveryInfoType | None = None, ) -> None: - """Set up the Demo sensors.""" + """Set up the Everything but the Kitchen Sink config entry.""" async_add_entities( [ 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): """Representation of a Demo sensor.""" diff --git a/tests/components/kitchen_sink/test_config_flow.py b/tests/components/kitchen_sink/test_config_flow.py new file mode 100644 index 00000000000..9a499a2e579 --- /dev/null +++ b/tests/components/kitchen_sink/test_config_flow.py @@ -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()