mirror of
https://github.com/home-assistant/core.git
synced 2025-04-23 16:57:53 +00:00
Fix config_flow error from dlna_dmr for UPnP discovery info containing a single service (#69977)
This commit is contained in:
parent
1c2bea2dbd
commit
4e57b1b118
@ -134,10 +134,16 @@ class DlnaDmrFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
|
||||
discovery_service_list = discovery_info.upnp.get(ssdp.ATTR_UPNP_SERVICE_LIST)
|
||||
if not discovery_service_list:
|
||||
return self.async_abort(reason="not_dmr")
|
||||
discovery_service_ids = {
|
||||
service.get("serviceId")
|
||||
for service in discovery_service_list.get("service") or []
|
||||
}
|
||||
|
||||
services = discovery_service_list.get("service")
|
||||
if not services:
|
||||
discovery_service_ids: set[str] = set()
|
||||
elif isinstance(services, list):
|
||||
discovery_service_ids = {service.get("serviceId") for service in services}
|
||||
else:
|
||||
# Only one service defined (etree_to_dict failed to make a list)
|
||||
discovery_service_ids = {services.get("serviceId")}
|
||||
|
||||
if not DmrDevice.SERVICE_IDS.issubset(discovery_service_ids):
|
||||
return self.async_abort(reason="not_dmr")
|
||||
|
||||
|
@ -388,7 +388,7 @@ async def test_ssdp_flow_upnp_udn(
|
||||
|
||||
async def test_ssdp_missing_services(hass: HomeAssistant) -> None:
|
||||
"""Test SSDP ignores devices that are missing required services."""
|
||||
# No services defined at all
|
||||
# No service list at all
|
||||
discovery = dataclasses.replace(MOCK_DISCOVERY)
|
||||
discovery.upnp = discovery.upnp.copy()
|
||||
del discovery.upnp[ssdp.ATTR_UPNP_SERVICE_LIST]
|
||||
@ -400,6 +400,18 @@ async def test_ssdp_missing_services(hass: HomeAssistant) -> None:
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
||||
assert result["reason"] == "not_dmr"
|
||||
|
||||
# Service list does not contain services
|
||||
discovery = dataclasses.replace(MOCK_DISCOVERY)
|
||||
discovery.upnp = discovery.upnp.copy()
|
||||
discovery.upnp[ssdp.ATTR_UPNP_SERVICE_LIST] = {"bad_key": "bad_value"}
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DLNA_DOMAIN,
|
||||
context={"source": config_entries.SOURCE_SSDP},
|
||||
data=discovery,
|
||||
)
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
||||
assert result["reason"] == "not_dmr"
|
||||
|
||||
# AVTransport service is missing
|
||||
discovery = dataclasses.replace(MOCK_DISCOVERY)
|
||||
discovery.upnp = discovery.upnp.copy()
|
||||
@ -417,6 +429,28 @@ async def test_ssdp_missing_services(hass: HomeAssistant) -> None:
|
||||
assert result["reason"] == "not_dmr"
|
||||
|
||||
|
||||
async def test_ssdp_single_service(hass: HomeAssistant) -> None:
|
||||
"""Test SSDP discovery info with only one service defined.
|
||||
|
||||
THe etree_to_dict function turns multiple services into a list of dicts, but
|
||||
a single service into only a dict.
|
||||
"""
|
||||
discovery = dataclasses.replace(MOCK_DISCOVERY)
|
||||
discovery.upnp = discovery.upnp.copy()
|
||||
service_list = discovery.upnp[ssdp.ATTR_UPNP_SERVICE_LIST].copy()
|
||||
# Turn mock's list of service dicts into a single dict
|
||||
service_list["service"] = service_list["service"][0]
|
||||
discovery.upnp[ssdp.ATTR_UPNP_SERVICE_LIST] = service_list
|
||||
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DLNA_DOMAIN,
|
||||
context={"source": config_entries.SOURCE_SSDP},
|
||||
data=discovery,
|
||||
)
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
||||
assert result["reason"] == "not_dmr"
|
||||
|
||||
|
||||
async def test_ssdp_ignore_device(hass: HomeAssistant) -> None:
|
||||
"""Test SSDP discovery ignores certain devices."""
|
||||
discovery = dataclasses.replace(MOCK_DISCOVERY)
|
||||
|
Loading…
x
Reference in New Issue
Block a user