mirror of
https://github.com/home-assistant/core.git
synced 2025-08-17 19:41:45 +02:00
Import YAML config from async_setup_platform
This commit is contained in:
@@ -3,39 +3,13 @@ from __future__ import annotations
|
|||||||
|
|
||||||
from homeassistant import config_entries
|
from homeassistant import config_entries
|
||||||
from homeassistant.components.media_player.const import DOMAIN as MEDIA_PLAYER_DOMAIN
|
from homeassistant.components.media_player.const import DOMAIN as MEDIA_PLAYER_DOMAIN
|
||||||
from homeassistant.const import CONF_PLATFORM, CONF_URL
|
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers.typing import ConfigType
|
|
||||||
|
|
||||||
from .const import DOMAIN, LOGGER
|
from .const import LOGGER
|
||||||
|
|
||||||
PLATFORMS = [MEDIA_PLAYER_DOMAIN]
|
PLATFORMS = [MEDIA_PLAYER_DOMAIN]
|
||||||
|
|
||||||
|
|
||||||
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
|
|
||||||
"""Set up DLNA component."""
|
|
||||||
if MEDIA_PLAYER_DOMAIN not in config:
|
|
||||||
return True
|
|
||||||
|
|
||||||
for entry_config in config[MEDIA_PLAYER_DOMAIN]:
|
|
||||||
if entry_config.get(CONF_PLATFORM) != DOMAIN:
|
|
||||||
continue
|
|
||||||
LOGGER.warning(
|
|
||||||
"Configuring dlna_dmr via yaml is deprecated; the configuration for"
|
|
||||||
" %s has been migrated to a config entry and can be safely removed",
|
|
||||||
entry_config.get(CONF_URL),
|
|
||||||
)
|
|
||||||
hass.async_create_task(
|
|
||||||
hass.config_entries.flow.async_init(
|
|
||||||
DOMAIN,
|
|
||||||
context={"source": config_entries.SOURCE_IMPORT},
|
|
||||||
data=entry_config,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
async def async_setup_entry(
|
async def async_setup_entry(
|
||||||
hass: HomeAssistant, entry: config_entries.ConfigEntry
|
hass: HomeAssistant, entry: config_entries.ConfigEntry
|
||||||
) -> bool:
|
) -> bool:
|
||||||
|
@@ -42,6 +42,8 @@ from homeassistant.core import HomeAssistant
|
|||||||
from homeassistant.helpers import device_registry, entity_registry
|
from homeassistant.helpers import device_registry, entity_registry
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
|
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
|
||||||
|
|
||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
CONF_CALLBACK_URL_OVERRIDE,
|
CONF_CALLBACK_URL_OVERRIDE,
|
||||||
@@ -98,6 +100,30 @@ def catch_request_errors(func: Func) -> Func:
|
|||||||
return cast(Func, wrapper)
|
return cast(Func, wrapper)
|
||||||
|
|
||||||
|
|
||||||
|
async def async_setup_platform(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
config: ConfigType,
|
||||||
|
async_add_entities: AddEntitiesCallback,
|
||||||
|
discovery_info: DiscoveryInfoType | None = None,
|
||||||
|
) -> None:
|
||||||
|
"""Set up DLNA media_player platform."""
|
||||||
|
del async_add_entities, discovery_info # Unused
|
||||||
|
|
||||||
|
hass.async_create_task(
|
||||||
|
hass.config_entries.flow.async_init(
|
||||||
|
DOMAIN,
|
||||||
|
context={"source": config_entries.SOURCE_IMPORT},
|
||||||
|
data=config,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
_LOGGER.warning(
|
||||||
|
"Configuring dlna_dmr via yaml is deprecated; the configuration for"
|
||||||
|
" %s has been migrated to a config entry and can be safely removed",
|
||||||
|
config.get(CONF_URL),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
async def async_setup_entry(
|
async def async_setup_entry(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
entry: config_entries.ConfigEntry,
|
entry: config_entries.ConfigEntry,
|
||||||
|
@@ -1,59 +0,0 @@
|
|||||||
"""Tests for the DLNA DMR __init__ module."""
|
|
||||||
|
|
||||||
from unittest.mock import Mock
|
|
||||||
|
|
||||||
from async_upnp_client import UpnpError
|
|
||||||
|
|
||||||
from homeassistant.components.dlna_dmr.const import (
|
|
||||||
CONF_LISTEN_PORT,
|
|
||||||
DOMAIN as DLNA_DOMAIN,
|
|
||||||
)
|
|
||||||
from homeassistant.components.media_player.const import DOMAIN as MEDIA_PLAYER_DOMAIN
|
|
||||||
from homeassistant.const import CONF_NAME, CONF_PLATFORM, CONF_URL
|
|
||||||
from homeassistant.core import HomeAssistant
|
|
||||||
from homeassistant.helpers.typing import ConfigType
|
|
||||||
from homeassistant.setup import async_setup_component
|
|
||||||
|
|
||||||
from .conftest import MOCK_DEVICE_LOCATION
|
|
||||||
|
|
||||||
|
|
||||||
async def test_import_flow_started(hass: HomeAssistant, domain_data_mock: Mock) -> None:
|
|
||||||
"""Test import flow of YAML config is started if there's config data."""
|
|
||||||
mock_config: ConfigType = {
|
|
||||||
MEDIA_PLAYER_DOMAIN: [
|
|
||||||
{
|
|
||||||
CONF_PLATFORM: DLNA_DOMAIN,
|
|
||||||
CONF_URL: MOCK_DEVICE_LOCATION,
|
|
||||||
CONF_LISTEN_PORT: 1234,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
CONF_PLATFORM: "other_domain",
|
|
||||||
CONF_URL: MOCK_DEVICE_LOCATION,
|
|
||||||
CONF_NAME: "another device",
|
|
||||||
},
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
# Device is not available yet
|
|
||||||
domain_data_mock.upnp_factory.async_create_device.side_effect = UpnpError
|
|
||||||
|
|
||||||
# Run the setup
|
|
||||||
await async_setup_component(hass, DLNA_DOMAIN, mock_config)
|
|
||||||
await hass.async_block_till_done()
|
|
||||||
|
|
||||||
# Check config_flow has completed
|
|
||||||
assert hass.config_entries.flow.async_progress(include_uninitialized=True) == []
|
|
||||||
|
|
||||||
# Check device contact attempt was made
|
|
||||||
domain_data_mock.upnp_factory.async_create_device.assert_awaited_once_with(
|
|
||||||
MOCK_DEVICE_LOCATION
|
|
||||||
)
|
|
||||||
|
|
||||||
# Check the device is added to the unmigrated configs
|
|
||||||
assert domain_data_mock.unmigrated_config == {
|
|
||||||
MOCK_DEVICE_LOCATION: {
|
|
||||||
CONF_PLATFORM: DLNA_DOMAIN,
|
|
||||||
CONF_URL: MOCK_DEVICE_LOCATION,
|
|
||||||
CONF_LISTEN_PORT: 1234,
|
|
||||||
}
|
|
||||||
}
|
|
@@ -19,12 +19,13 @@ from homeassistant.components.dlna_dmr.const import (
|
|||||||
CONF_CALLBACK_URL_OVERRIDE,
|
CONF_CALLBACK_URL_OVERRIDE,
|
||||||
CONF_LISTEN_PORT,
|
CONF_LISTEN_PORT,
|
||||||
CONF_POLL_AVAILABILITY,
|
CONF_POLL_AVAILABILITY,
|
||||||
|
DEFAULT_NAME,
|
||||||
DOMAIN as DLNA_DOMAIN,
|
DOMAIN as DLNA_DOMAIN,
|
||||||
)
|
)
|
||||||
from homeassistant.components.dlna_dmr.data import EventListenAddr
|
from homeassistant.components.dlna_dmr.data import EventListenAddr
|
||||||
from homeassistant.components.media_player import ATTR_TO_PROPERTY, const as mp_const
|
from homeassistant.components.media_player import ATTR_TO_PROPERTY, const as mp_const
|
||||||
from homeassistant.components.media_player.const import DOMAIN as MP_DOMAIN
|
from homeassistant.components.media_player.const import DOMAIN as MP_DOMAIN
|
||||||
from homeassistant.const import ATTR_ENTITY_ID
|
from homeassistant.const import ATTR_ENTITY_ID, CONF_NAME, CONF_PLATFORM, CONF_URL
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers.device_registry import async_get as async_get_dr
|
from homeassistant.helpers.device_registry import async_get as async_get_dr
|
||||||
from homeassistant.helpers.entity_component import async_update_entity
|
from homeassistant.helpers.entity_component import async_update_entity
|
||||||
@@ -32,6 +33,7 @@ from homeassistant.helpers.entity_registry import (
|
|||||||
async_entries_for_config_entry,
|
async_entries_for_config_entry,
|
||||||
async_get as async_get_er,
|
async_get as async_get_er,
|
||||||
)
|
)
|
||||||
|
from homeassistant.helpers.typing import ConfigType
|
||||||
from homeassistant.setup import async_setup_component
|
from homeassistant.setup import async_setup_component
|
||||||
|
|
||||||
from .conftest import (
|
from .conftest import (
|
||||||
@@ -110,6 +112,46 @@ async def mock_disconnected_entity_id(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async def test_setup_platform_import_flow_started(
|
||||||
|
hass: HomeAssistant, domain_data_mock: Mock
|
||||||
|
) -> None:
|
||||||
|
"""Test import flow of YAML config is started if there's config data."""
|
||||||
|
mock_config: ConfigType = {
|
||||||
|
MP_DOMAIN: [
|
||||||
|
{
|
||||||
|
CONF_PLATFORM: DLNA_DOMAIN,
|
||||||
|
CONF_URL: MOCK_DEVICE_LOCATION,
|
||||||
|
CONF_LISTEN_PORT: 1234,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Device is not available yet
|
||||||
|
domain_data_mock.upnp_factory.async_create_device.side_effect = UpnpError
|
||||||
|
|
||||||
|
# Run the setup
|
||||||
|
await async_setup_component(hass, MP_DOMAIN, mock_config)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
# Check config_flow has completed
|
||||||
|
assert hass.config_entries.flow.async_progress(include_uninitialized=True) == []
|
||||||
|
|
||||||
|
# Check device contact attempt was made
|
||||||
|
domain_data_mock.upnp_factory.async_create_device.assert_awaited_once_with(
|
||||||
|
MOCK_DEVICE_LOCATION
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check the device is added to the unmigrated configs
|
||||||
|
assert domain_data_mock.unmigrated_config == {
|
||||||
|
MOCK_DEVICE_LOCATION: {
|
||||||
|
CONF_PLATFORM: DLNA_DOMAIN,
|
||||||
|
CONF_URL: MOCK_DEVICE_LOCATION,
|
||||||
|
CONF_LISTEN_PORT: 1234,
|
||||||
|
CONF_NAME: DEFAULT_NAME,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
async def test_setup_entry_no_options(
|
async def test_setup_entry_no_options(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
domain_data_mock: Mock,
|
domain_data_mock: Mock,
|
||||||
@@ -799,7 +841,7 @@ async def test_ssdp_byebye(
|
|||||||
# Device should be gone
|
# Device should be gone
|
||||||
mock_state = hass.states.get(mock_entity_id)
|
mock_state = hass.states.get(mock_entity_id)
|
||||||
assert mock_state is not None
|
assert mock_state is not None
|
||||||
assert mock_state.state == media_player.STATE_IDLE
|
assert mock_state.state == ha_const.STATE_UNAVAILABLE
|
||||||
|
|
||||||
# Second byebye will do nothing
|
# Second byebye will do nothing
|
||||||
await ssdp_callback(
|
await ssdp_callback(
|
||||||
|
Reference in New Issue
Block a user