From 22bdd385837d256c4e79cc008512d4bc3839c19e Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Fri, 26 Nov 2021 00:13:52 +0100 Subject: [PATCH] Use SsdpServiceInfo for SOURCE_SSDP tests (part 4) (#60339) Co-authored-by: epenet --- homeassistant/components/ssdp/__init__.py | 20 ++- tests/components/denonavr/test_config_flow.py | 60 +++++---- tests/components/hue/test_config_flow.py | 104 ++++++++++----- .../components/konnected/test_config_flow.py | 123 +++++++++++------- tests/components/upnp/conftest.py | 24 ++-- tests/components/upnp/test_config_flow.py | 14 +- tests/components/wilight/__init__.py | 54 +++++--- tests/components/wilight/test_config_flow.py | 15 ++- 8 files changed, 265 insertions(+), 149 deletions(-) diff --git a/homeassistant/components/ssdp/__init__.py b/homeassistant/components/ssdp/__init__.py index 298757eeccd..afcb2211ea6 100644 --- a/homeassistant/components/ssdp/__init__.py +++ b/homeassistant/components/ssdp/__init__.py @@ -2,7 +2,7 @@ from __future__ import annotations import asyncio -from collections.abc import Awaitable +from collections.abc import Awaitable, Iterator from dataclasses import dataclass, field from datetime import timedelta from enum import Enum @@ -144,7 +144,7 @@ class SsdpServiceInfo( # Use a property if it is available, fallback to upnp data if hasattr(self, name): return getattr(self, name) - return self.upnp.get(name) + return self.upnp[name] def get(self, name: str, default: Any = None) -> Any: """ @@ -164,6 +164,22 @@ class SsdpServiceInfo( return getattr(self, name) return self.upnp.get(name, default) + def __iter__(self) -> Iterator[str]: + """ + Implement iter(self) on upnp data. + + Deprecated, and will be removed in version 2022.6. + """ + if not self._warning_logged: + report( + "accessed discovery_info.__iter__() instead of discovery_info.upnp.__iter__(); this will fail in version 2022.6", + exclude_integrations={"ssdp"}, + error_if_core=False, + level=logging.DEBUG, + ) + self._warning_logged = True + return self.upnp.__iter__() + @bind_hass async def async_register_callback( diff --git a/tests/components/denonavr/test_config_flow.py b/tests/components/denonavr/test_config_flow.py index b38c43775f9..ff811e0d235 100644 --- a/tests/components/denonavr/test_config_flow.py +++ b/tests/components/denonavr/test_config_flow.py @@ -300,12 +300,16 @@ async def test_config_flow_ssdp(hass): result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - ssdp.ATTR_UPNP_MANUFACTURER: TEST_MANUFACTURER, - ssdp.ATTR_UPNP_MODEL_NAME: TEST_MODEL, - ssdp.ATTR_UPNP_SERIAL: TEST_SERIALNUMBER, - ssdp.ATTR_SSDP_LOCATION: TEST_SSDP_LOCATION, - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location=TEST_SSDP_LOCATION, + upnp={ + ssdp.ATTR_UPNP_MANUFACTURER: TEST_MANUFACTURER, + ssdp.ATTR_UPNP_MODEL_NAME: TEST_MODEL, + ssdp.ATTR_UPNP_SERIAL: TEST_SERIALNUMBER, + }, + ), ) assert result["type"] == "form" @@ -336,12 +340,16 @@ async def test_config_flow_ssdp_not_denon(hass): result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - ssdp.ATTR_UPNP_MANUFACTURER: "NotSupported", - ssdp.ATTR_UPNP_MODEL_NAME: TEST_MODEL, - ssdp.ATTR_UPNP_SERIAL: TEST_SERIALNUMBER, - ssdp.ATTR_SSDP_LOCATION: TEST_SSDP_LOCATION, - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location=TEST_SSDP_LOCATION, + upnp={ + ssdp.ATTR_UPNP_MANUFACTURER: "NotSupported", + ssdp.ATTR_UPNP_MODEL_NAME: TEST_MODEL, + ssdp.ATTR_UPNP_SERIAL: TEST_SERIALNUMBER, + }, + ), ) assert result["type"] == "abort" @@ -357,10 +365,14 @@ async def test_config_flow_ssdp_missing_info(hass): result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - ssdp.ATTR_UPNP_MANUFACTURER: TEST_MANUFACTURER, - ssdp.ATTR_SSDP_LOCATION: TEST_SSDP_LOCATION, - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location=TEST_SSDP_LOCATION, + upnp={ + ssdp.ATTR_UPNP_MANUFACTURER: TEST_MANUFACTURER, + }, + ), ) assert result["type"] == "abort" @@ -376,12 +388,16 @@ async def test_config_flow_ssdp_ignored_model(hass): result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - ssdp.ATTR_UPNP_MANUFACTURER: TEST_MANUFACTURER, - ssdp.ATTR_UPNP_MODEL_NAME: TEST_IGNORED_MODEL, - ssdp.ATTR_UPNP_SERIAL: TEST_SERIALNUMBER, - ssdp.ATTR_SSDP_LOCATION: TEST_SSDP_LOCATION, - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location=TEST_SSDP_LOCATION, + upnp={ + ssdp.ATTR_UPNP_MANUFACTURER: TEST_MANUFACTURER, + ssdp.ATTR_UPNP_MODEL_NAME: TEST_IGNORED_MODEL, + ssdp.ATTR_UPNP_SERIAL: TEST_SERIALNUMBER, + }, + ), ) assert result["type"] == "abort" diff --git a/tests/components/hue/test_config_flow.py b/tests/components/hue/test_config_flow.py index 9d5fc280ff6..079c7db7d8b 100644 --- a/tests/components/hue/test_config_flow.py +++ b/tests/components/hue/test_config_flow.py @@ -333,11 +333,15 @@ async def test_bridge_ssdp(hass, mf_url, aioclient_mock): result = await hass.config_entries.flow.async_init( const.DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - ssdp.ATTR_SSDP_LOCATION: "http://0.0.0.0/", - ssdp.ATTR_UPNP_MANUFACTURER_URL: mf_url, - ssdp.ATTR_UPNP_SERIAL: "1234", - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location="http://0.0.0.0/", + upnp={ + ssdp.ATTR_UPNP_MANUFACTURER_URL: mf_url, + ssdp.ATTR_UPNP_SERIAL: "1234", + }, + ), ) assert result["type"] == "form" @@ -349,7 +353,11 @@ async def test_bridge_ssdp_discover_other_bridge(hass): result = await hass.config_entries.flow.async_init( const.DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ssdp.ATTR_UPNP_MANUFACTURER_URL: "http://www.notphilips.com"}, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + upnp={ssdp.ATTR_UPNP_MANUFACTURER_URL: "http://www.notphilips.com"}, + ), ) assert result["type"] == "abort" @@ -361,12 +369,16 @@ async def test_bridge_ssdp_emulated_hue(hass): result = await hass.config_entries.flow.async_init( const.DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - ssdp.ATTR_SSDP_LOCATION: "http://0.0.0.0/", - ssdp.ATTR_UPNP_FRIENDLY_NAME: "Home Assistant Bridge", - ssdp.ATTR_UPNP_MANUFACTURER_URL: config_flow.HUE_MANUFACTURERURL[0], - ssdp.ATTR_UPNP_SERIAL: "1234", - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location="http://0.0.0.0/", + upnp={ + ssdp.ATTR_UPNP_FRIENDLY_NAME: "Home Assistant Bridge", + ssdp.ATTR_UPNP_MANUFACTURER_URL: config_flow.HUE_MANUFACTURERURL[0], + ssdp.ATTR_UPNP_SERIAL: "1234", + }, + ), ) assert result["type"] == "abort" @@ -378,10 +390,14 @@ async def test_bridge_ssdp_missing_location(hass): result = await hass.config_entries.flow.async_init( const.DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - ssdp.ATTR_UPNP_MANUFACTURER_URL: config_flow.HUE_MANUFACTURERURL[0], - ssdp.ATTR_UPNP_SERIAL: "1234", - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + upnp={ + ssdp.ATTR_UPNP_MANUFACTURER_URL: config_flow.HUE_MANUFACTURERURL[0], + ssdp.ATTR_UPNP_SERIAL: "1234", + }, + ), ) assert result["type"] == "abort" @@ -393,10 +409,14 @@ async def test_bridge_ssdp_missing_serial(hass): result = await hass.config_entries.flow.async_init( const.DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - ssdp.ATTR_SSDP_LOCATION: "http://0.0.0.0/", - ssdp.ATTR_UPNP_MANUFACTURER_URL: config_flow.HUE_MANUFACTURERURL[0], - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location="http://0.0.0.0/", + upnp={ + ssdp.ATTR_UPNP_MANUFACTURER_URL: config_flow.HUE_MANUFACTURERURL[0], + }, + ), ) assert result["type"] == "abort" @@ -408,12 +428,16 @@ async def test_bridge_ssdp_espalexa(hass): result = await hass.config_entries.flow.async_init( const.DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - ssdp.ATTR_SSDP_LOCATION: "http://0.0.0.0/", - ssdp.ATTR_UPNP_FRIENDLY_NAME: "Espalexa (0.0.0.0)", - ssdp.ATTR_UPNP_MANUFACTURER_URL: config_flow.HUE_MANUFACTURERURL[0], - ssdp.ATTR_UPNP_SERIAL: "1234", - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location="http://0.0.0.0/", + upnp={ + ssdp.ATTR_UPNP_FRIENDLY_NAME: "Espalexa (0.0.0.0)", + ssdp.ATTR_UPNP_MANUFACTURER_URL: config_flow.HUE_MANUFACTURERURL[0], + ssdp.ATTR_UPNP_SERIAL: "1234", + }, + ), ) assert result["type"] == "abort" @@ -430,11 +454,15 @@ async def test_bridge_ssdp_already_configured(hass, aioclient_mock): result = await hass.config_entries.flow.async_init( const.DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - ssdp.ATTR_SSDP_LOCATION: "http://0.0.0.0/", - ssdp.ATTR_UPNP_MANUFACTURER_URL: config_flow.HUE_MANUFACTURERURL[0], - ssdp.ATTR_UPNP_SERIAL: "1234", - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location="http://0.0.0.0/", + upnp={ + ssdp.ATTR_UPNP_MANUFACTURER_URL: config_flow.HUE_MANUFACTURERURL[0], + ssdp.ATTR_UPNP_SERIAL: "1234", + }, + ), ) assert result["type"] == "abort" @@ -587,11 +615,15 @@ async def test_ssdp_discovery_update_configuration(hass, aioclient_mock): result = await hass.config_entries.flow.async_init( const.DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - ssdp.ATTR_SSDP_LOCATION: "http://1.1.1.1/", - ssdp.ATTR_UPNP_MANUFACTURER_URL: config_flow.HUE_MANUFACTURERURL[0], - ssdp.ATTR_UPNP_SERIAL: "aabbccddeeff", - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location="http://1.1.1.1/", + upnp={ + ssdp.ATTR_UPNP_MANUFACTURER_URL: config_flow.HUE_MANUFACTURERURL[0], + ssdp.ATTR_UPNP_SERIAL: "aabbccddeeff", + }, + ), ) assert result["type"] == "abort" diff --git a/tests/components/konnected/test_config_flow.py b/tests/components/konnected/test_config_flow.py index 466359c3dc3..7397f03c1fc 100644 --- a/tests/components/konnected/test_config_flow.py +++ b/tests/components/konnected/test_config_flow.py @@ -4,7 +4,7 @@ from unittest.mock import patch import pytest from homeassistant import config_entries -from homeassistant.components import konnected +from homeassistant.components import konnected, ssdp from homeassistant.components.konnected import config_flow from tests.common import MockConfigEntry @@ -113,11 +113,15 @@ async def test_ssdp(hass, mock_panel): result = await hass.config_entries.flow.async_init( config_flow.DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - "ssdp_location": "http://1.2.3.4:1234/Device.xml", - "manufacturer": config_flow.KONN_MANUFACTURER, - "modelName": config_flow.KONN_MODEL, - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location="http://1.2.3.4:1234/Device.xml", + upnp={ + "manufacturer": config_flow.KONN_MANUFACTURER, + "modelName": config_flow.KONN_MODEL, + }, + ), ) assert result["type"] == "form" @@ -134,11 +138,15 @@ async def test_ssdp(hass, mock_panel): result = await hass.config_entries.flow.async_init( config_flow.DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - "ssdp_location": "http://1.2.3.4:1234/Device.xml", - "manufacturer": config_flow.KONN_MANUFACTURER, - "modelName": config_flow.KONN_MODEL, - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location="http://1.2.3.4:1234/Device.xml", + upnp={ + "manufacturer": config_flow.KONN_MANUFACTURER, + "modelName": config_flow.KONN_MODEL, + }, + ), ) assert result["type"] == "abort" @@ -149,9 +157,12 @@ async def test_ssdp(hass, mock_panel): result = await hass.config_entries.flow.async_init( config_flow.DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - "ssdp_location": "http://1.2.3.4:1234/Device.xml", - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location="http://1.2.3.4:1234/Device.xml", + upnp={}, + ), ) assert result["type"] == "abort" @@ -161,11 +172,15 @@ async def test_ssdp(hass, mock_panel): result = await hass.config_entries.flow.async_init( config_flow.DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - "ssdp_location": "http://1.2.3.4:1234/Device.xml", - "manufacturer": "SHOULD_FAIL", - "modelName": config_flow.KONN_MODEL, - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location="http://1.2.3.4:1234/Device.xml", + upnp={ + "manufacturer": "SHOULD_FAIL", + "modelName": config_flow.KONN_MODEL, + }, + ), ) assert result["type"] == "abort" @@ -175,11 +190,15 @@ async def test_ssdp(hass, mock_panel): result = await hass.config_entries.flow.async_init( config_flow.DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - "ssdp_location": "http://1.2.3.4:1234/Device.xml", - "manufacturer": config_flow.KONN_MANUFACTURER, - "modelName": "SHOULD_FAIL", - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location="http://1.2.3.4:1234/Device.xml", + upnp={ + "manufacturer": config_flow.KONN_MANUFACTURER, + "modelName": "SHOULD_FAIL", + }, + ), ) assert result["type"] == "abort" @@ -195,11 +214,15 @@ async def test_ssdp(hass, mock_panel): result = await hass.config_entries.flow.async_init( config_flow.DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - "ssdp_location": "http://1.2.3.4:1234/Device.xml", - "manufacturer": config_flow.KONN_MANUFACTURER, - "modelName": config_flow.KONN_MODEL, - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location="http://1.2.3.4:1234/Device.xml", + upnp={ + "manufacturer": config_flow.KONN_MANUFACTURER, + "modelName": config_flow.KONN_MODEL, + }, + ), ) assert result["type"] == "abort" @@ -317,11 +340,15 @@ async def test_import_ssdp_host_user_finish(hass, mock_panel): ssdp_result = await hass.config_entries.flow.async_init( config_flow.DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - "ssdp_location": "http://0.0.0.0:1234/Device.xml", - "manufacturer": config_flow.KONN_MANUFACTURER, - "modelName": config_flow.KONN_MODEL_PRO, - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location="http://0.0.0.0:1234/Device.xml", + upnp={ + "manufacturer": config_flow.KONN_MANUFACTURER, + "modelName": config_flow.KONN_MODEL_PRO, + }, + ), ) assert ssdp_result["type"] == "abort" assert ssdp_result["reason"] == "already_in_progress" @@ -360,11 +387,15 @@ async def test_ssdp_already_configured(hass, mock_panel): result = await hass.config_entries.flow.async_init( config_flow.DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - "ssdp_location": "http://0.0.0.0:1234/Device.xml", - "manufacturer": config_flow.KONN_MANUFACTURER, - "modelName": config_flow.KONN_MODEL_PRO, - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location="http://0.0.0.0:1234/Device.xml", + upnp={ + "manufacturer": config_flow.KONN_MANUFACTURER, + "modelName": config_flow.KONN_MODEL_PRO, + }, + ), ) assert result["type"] == "abort" assert result["reason"] == "already_configured" @@ -436,11 +467,15 @@ async def test_ssdp_host_update(hass, mock_panel): result = await hass.config_entries.flow.async_init( config_flow.DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - "ssdp_location": "http://1.1.1.1:1234/Device.xml", - "manufacturer": config_flow.KONN_MANUFACTURER, - "modelName": config_flow.KONN_MODEL_PRO, - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location="http://1.1.1.1:1234/Device.xml", + upnp={ + "manufacturer": config_flow.KONN_MANUFACTURER, + "modelName": config_flow.KONN_MODEL_PRO, + }, + ), ) assert result["type"] == "abort" diff --git a/tests/components/upnp/conftest.py b/tests/components/upnp/conftest.py index f8c6110db7e..6f6f2905869 100644 --- a/tests/components/upnp/conftest.py +++ b/tests/components/upnp/conftest.py @@ -30,17 +30,19 @@ TEST_USN = f"{TEST_UDN}::{TEST_ST}" TEST_LOCATION = "http://192.168.1.1/desc.xml" TEST_HOSTNAME = urlparse(TEST_LOCATION).hostname TEST_FRIENDLY_NAME = "friendly name" -TEST_DISCOVERY = { - ssdp.ATTR_SSDP_LOCATION: TEST_LOCATION, - ssdp.ATTR_SSDP_ST: TEST_ST, - ssdp.ATTR_SSDP_USN: TEST_USN, - ssdp.ATTR_UPNP_UDN: TEST_UDN, - "usn": TEST_USN, - "location": TEST_LOCATION, - "_host": TEST_HOSTNAME, - "_udn": TEST_UDN, - "friendlyName": TEST_FRIENDLY_NAME, -} +TEST_DISCOVERY = ssdp.SsdpServiceInfo( + ssdp_usn=TEST_USN, + ssdp_st=TEST_ST, + ssdp_location=TEST_LOCATION, + upnp={ + ssdp.ATTR_UPNP_UDN: TEST_UDN, + "usn": TEST_USN, + "location": TEST_LOCATION, + "_host": TEST_HOSTNAME, + "_udn": TEST_UDN, + "friendlyName": TEST_FRIENDLY_NAME, + }, +) class MockDevice: diff --git a/tests/components/upnp/test_config_flow.py b/tests/components/upnp/test_config_flow.py index a704232ef84..0771e51f890 100644 --- a/tests/components/upnp/test_config_flow.py +++ b/tests/components/upnp/test_config_flow.py @@ -66,12 +66,14 @@ async def test_flow_ssdp_incomplete_discovery(hass: HomeAssistant): result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_SSDP}, - data={ - ssdp.ATTR_SSDP_LOCATION: TEST_LOCATION, - ssdp.ATTR_SSDP_ST: TEST_ST, - ssdp.ATTR_SSDP_USN: TEST_USN, - # ssdp.ATTR_UPNP_UDN: TEST_UDN, # Not provided. - }, + data=ssdp.SsdpServiceInfo( + ssdp_usn=TEST_USN, + ssdp_st=TEST_ST, + ssdp_location=TEST_LOCATION, + upnp={ + # ssdp.ATTR_UPNP_UDN: TEST_UDN, # Not provided. + }, + ), ) assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT assert result["reason"] == "incomplete_discovery" diff --git a/tests/components/wilight/__init__.py b/tests/components/wilight/__init__.py index dd7d83876f8..dbcfbbaaa8c 100644 --- a/tests/components/wilight/__init__.py +++ b/tests/components/wilight/__init__.py @@ -2,8 +2,8 @@ from pywilight.const import DOMAIN +from homeassistant.components import ssdp from homeassistant.components.ssdp import ( - ATTR_SSDP_LOCATION, ATTR_UPNP_MANUFACTURER, ATTR_UPNP_MODEL_NAME, ATTR_UPNP_MODEL_NUMBER, @@ -33,28 +33,40 @@ UPNP_MAC_ADDRESS = "5C:CF:7F:8B:CA:56" UPNP_MANUFACTURER_NOT_WILIGHT = "Test" CONF_COMPONENTS = "components" -MOCK_SSDP_DISCOVERY_INFO_P_B = { - ATTR_SSDP_LOCATION: SSDP_LOCATION, - ATTR_UPNP_MANUFACTURER: UPNP_MANUFACTURER, - ATTR_UPNP_MODEL_NAME: UPNP_MODEL_NAME_P_B, - ATTR_UPNP_MODEL_NUMBER: UPNP_MODEL_NUMBER, - ATTR_UPNP_SERIAL: UPNP_SERIAL, -} +MOCK_SSDP_DISCOVERY_INFO_P_B = ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location=SSDP_LOCATION, + upnp={ + ATTR_UPNP_MANUFACTURER: UPNP_MANUFACTURER, + ATTR_UPNP_MODEL_NAME: UPNP_MODEL_NAME_P_B, + ATTR_UPNP_MODEL_NUMBER: UPNP_MODEL_NUMBER, + ATTR_UPNP_SERIAL: UPNP_SERIAL, + }, +) -MOCK_SSDP_DISCOVERY_INFO_WRONG_MANUFACTURER = { - ATTR_SSDP_LOCATION: SSDP_LOCATION, - ATTR_UPNP_MANUFACTURER: UPNP_MANUFACTURER_NOT_WILIGHT, - ATTR_UPNP_MODEL_NAME: UPNP_MODEL_NAME_P_B, - ATTR_UPNP_MODEL_NUMBER: UPNP_MODEL_NUMBER, - ATTR_UPNP_SERIAL: ATTR_UPNP_SERIAL, -} +MOCK_SSDP_DISCOVERY_INFO_WRONG_MANUFACTURER = ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location=SSDP_LOCATION, + upnp={ + ATTR_UPNP_MANUFACTURER: UPNP_MANUFACTURER_NOT_WILIGHT, + ATTR_UPNP_MODEL_NAME: UPNP_MODEL_NAME_P_B, + ATTR_UPNP_MODEL_NUMBER: UPNP_MODEL_NUMBER, + ATTR_UPNP_SERIAL: ATTR_UPNP_SERIAL, + }, +) -MOCK_SSDP_DISCOVERY_INFO_MISSING_MANUFACTURER = { - ATTR_SSDP_LOCATION: SSDP_LOCATION, - ATTR_UPNP_MODEL_NAME: UPNP_MODEL_NAME_P_B, - ATTR_UPNP_MODEL_NUMBER: UPNP_MODEL_NUMBER, - ATTR_UPNP_SERIAL: ATTR_UPNP_SERIAL, -} +MOCK_SSDP_DISCOVERY_INFO_MISSING_MANUFACTURER = ssdp.SsdpServiceInfo( + ssdp_usn="mock_usn", + ssdp_st="mock_st", + ssdp_location=SSDP_LOCATION, + upnp={ + ATTR_UPNP_MODEL_NAME: UPNP_MODEL_NAME_P_B, + ATTR_UPNP_MODEL_NUMBER: UPNP_MODEL_NUMBER, + ATTR_UPNP_SERIAL: ATTR_UPNP_SERIAL, + }, +) async def setup_integration( diff --git a/tests/components/wilight/test_config_flow.py b/tests/components/wilight/test_config_flow.py index 4835167715d..326224b02c9 100644 --- a/tests/components/wilight/test_config_flow.py +++ b/tests/components/wilight/test_config_flow.py @@ -1,4 +1,5 @@ """Test the WiLight config flow.""" +import dataclasses from unittest.mock import patch import pytest @@ -55,7 +56,7 @@ def mock_dummy_get_components_from_model_wrong(): async def test_show_ssdp_form(hass: HomeAssistant) -> None: """Test that the ssdp confirmation form is served.""" - discovery_info = MOCK_SSDP_DISCOVERY_INFO_P_B.copy() + discovery_info = dataclasses.replace(MOCK_SSDP_DISCOVERY_INFO_P_B) result = await hass.config_entries.flow.async_init( DOMAIN, context={CONF_SOURCE: SOURCE_SSDP}, data=discovery_info ) @@ -71,7 +72,7 @@ async def test_show_ssdp_form(hass: HomeAssistant) -> None: async def test_ssdp_not_wilight_abort_1(hass: HomeAssistant) -> None: """Test that the ssdp aborts not_wilight.""" - discovery_info = MOCK_SSDP_DISCOVERY_INFO_WRONG_MANUFACTURER.copy() + discovery_info = dataclasses.replace(MOCK_SSDP_DISCOVERY_INFO_WRONG_MANUFACTURER) result = await hass.config_entries.flow.async_init( DOMAIN, context={CONF_SOURCE: SOURCE_SSDP}, data=discovery_info ) @@ -83,7 +84,7 @@ async def test_ssdp_not_wilight_abort_1(hass: HomeAssistant) -> None: async def test_ssdp_not_wilight_abort_2(hass: HomeAssistant) -> None: """Test that the ssdp aborts not_wilight.""" - discovery_info = MOCK_SSDP_DISCOVERY_INFO_MISSING_MANUFACTURER.copy() + discovery_info = dataclasses.replace(MOCK_SSDP_DISCOVERY_INFO_MISSING_MANUFACTURER) result = await hass.config_entries.flow.async_init( DOMAIN, context={CONF_SOURCE: SOURCE_SSDP}, data=discovery_info ) @@ -97,7 +98,7 @@ async def test_ssdp_not_wilight_abort_3( ) -> None: """Test that the ssdp aborts not_wilight.""" - discovery_info = MOCK_SSDP_DISCOVERY_INFO_P_B.copy() + discovery_info = dataclasses.replace(MOCK_SSDP_DISCOVERY_INFO_P_B) result = await hass.config_entries.flow.async_init( DOMAIN, context={CONF_SOURCE: SOURCE_SSDP}, data=discovery_info ) @@ -111,7 +112,7 @@ async def test_ssdp_not_supported_abort( ) -> None: """Test that the ssdp aborts not_supported.""" - discovery_info = MOCK_SSDP_DISCOVERY_INFO_P_B.copy() + discovery_info = dataclasses.replace(MOCK_SSDP_DISCOVERY_INFO_P_B) result = await hass.config_entries.flow.async_init( DOMAIN, context={CONF_SOURCE: SOURCE_SSDP}, data=discovery_info ) @@ -134,7 +135,7 @@ async def test_ssdp_device_exists_abort(hass: HomeAssistant) -> None: entry.add_to_hass(hass) - discovery_info = MOCK_SSDP_DISCOVERY_INFO_P_B.copy() + discovery_info = dataclasses.replace(MOCK_SSDP_DISCOVERY_INFO_P_B) result = await hass.config_entries.flow.async_init( DOMAIN, context={CONF_SOURCE: SOURCE_SSDP}, @@ -148,7 +149,7 @@ async def test_ssdp_device_exists_abort(hass: HomeAssistant) -> None: async def test_full_ssdp_flow_implementation(hass: HomeAssistant) -> None: """Test the full SSDP flow from start to finish.""" - discovery_info = MOCK_SSDP_DISCOVERY_INFO_P_B.copy() + discovery_info = dataclasses.replace(MOCK_SSDP_DISCOVERY_INFO_P_B) result = await hass.config_entries.flow.async_init( DOMAIN, context={CONF_SOURCE: SOURCE_SSDP}, data=discovery_info )