* Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
59 lines
1.9 KiB
Python
59 lines
1.9 KiB
Python
"""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,
|
|
}
|
|
}
|