Use new ServiceInfo location in component tests (part 3) (#136064)

This commit is contained in:
epenet 2025-01-20 13:16:59 +01:00 committed by GitHub
parent fe010289b4
commit af40b6524e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
43 changed files with 377 additions and 314 deletions

View File

@ -7,12 +7,12 @@ from aiohttp import ClientError, web_exceptions
from pydaikin.exceptions import DaikinException from pydaikin.exceptions import DaikinException
import pytest import pytest
from homeassistant.components import zeroconf
from homeassistant.components.daikin.const import KEY_MAC from homeassistant.components.daikin.const import KEY_MAC
from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF
from homeassistant.const import CONF_API_KEY, CONF_HOST, CONF_PASSWORD from homeassistant.const import CONF_API_KEY, CONF_HOST, CONF_PASSWORD
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -121,7 +121,7 @@ async def test_api_password_abort(hass: HomeAssistant) -> None:
[ [
( (
SOURCE_ZEROCONF, SOURCE_ZEROCONF,
zeroconf.ZeroconfServiceInfo( ZeroconfServiceInfo(
ip_address=ip_address(HOST), ip_address=ip_address(HOST),
ip_addresses=[ip_address(HOST)], ip_addresses=[ip_address(HOST)],
hostname="mock_hostname", hostname="mock_hostname",

View File

@ -6,7 +6,6 @@ from unittest.mock import patch
import pydeconz import pydeconz
import pytest import pytest
from homeassistant.components import ssdp
from homeassistant.components.deconz.config_flow import ( from homeassistant.components.deconz.config_flow import (
CONF_MANUAL_INPUT, CONF_MANUAL_INPUT,
CONF_SERIAL, CONF_SERIAL,
@ -28,6 +27,7 @@ from homeassistant.helpers.service_info.hassio import HassioServiceInfo
from homeassistant.helpers.service_info.ssdp import ( from homeassistant.helpers.service_info.ssdp import (
ATTR_UPNP_MANUFACTURER_URL, ATTR_UPNP_MANUFACTURER_URL,
ATTR_UPNP_SERIAL, ATTR_UPNP_SERIAL,
SsdpServiceInfo,
) )
from .conftest import API_KEY, BRIDGE_ID from .conftest import API_KEY, BRIDGE_ID
@ -438,7 +438,7 @@ async def test_flow_ssdp_discovery(
"""Test that config flow for one discovered bridge works.""" """Test that config flow for one discovered bridge works."""
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DECONZ_DOMAIN, DECONZ_DOMAIN,
data=ssdp.SsdpServiceInfo( data=SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location="http://1.2.3.4:80/", ssdp_location="http://1.2.3.4:80/",
@ -486,7 +486,7 @@ async def test_ssdp_discovery_update_configuration(
) as mock_setup_entry: ) as mock_setup_entry:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DECONZ_DOMAIN, DECONZ_DOMAIN,
data=ssdp.SsdpServiceInfo( data=SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location="http://2.3.4.5:80/", ssdp_location="http://2.3.4.5:80/",
@ -512,7 +512,7 @@ async def test_ssdp_discovery_dont_update_configuration(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DECONZ_DOMAIN, DECONZ_DOMAIN,
data=ssdp.SsdpServiceInfo( data=SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location="http://1.2.3.4:80/", ssdp_location="http://1.2.3.4:80/",
@ -536,7 +536,7 @@ async def test_ssdp_discovery_dont_update_existing_hassio_configuration(
"""Test to ensure the SSDP discovery does not update an Hass.io entry.""" """Test to ensure the SSDP discovery does not update an Hass.io entry."""
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DECONZ_DOMAIN, DECONZ_DOMAIN,
data=ssdp.SsdpServiceInfo( data=SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location="http://1.2.3.4:80/", ssdp_location="http://1.2.3.4:80/",

View File

@ -6,7 +6,6 @@ from pydeconz.websocket import State
import pytest import pytest
from syrupy import SnapshotAssertion from syrupy import SnapshotAssertion
from homeassistant.components import ssdp
from homeassistant.components.deconz.config_flow import DECONZ_MANUFACTURERURL from homeassistant.components.deconz.config_flow import DECONZ_MANUFACTURERURL
from homeassistant.components.deconz.const import DOMAIN as DECONZ_DOMAIN from homeassistant.components.deconz.const import DOMAIN as DECONZ_DOMAIN
from homeassistant.config_entries import SOURCE_SSDP from homeassistant.config_entries import SOURCE_SSDP
@ -17,6 +16,7 @@ from homeassistant.helpers.service_info.ssdp import (
ATTR_UPNP_MANUFACTURER_URL, ATTR_UPNP_MANUFACTURER_URL,
ATTR_UPNP_SERIAL, ATTR_UPNP_SERIAL,
ATTR_UPNP_UDN, ATTR_UPNP_UDN,
SsdpServiceInfo,
) )
from .conftest import BRIDGE_ID from .conftest import BRIDGE_ID
@ -81,7 +81,7 @@ async def test_update_address(
): ):
await hass.config_entries.flow.async_init( await hass.config_entries.flow.async_init(
DECONZ_DOMAIN, DECONZ_DOMAIN,
data=ssdp.SsdpServiceInfo( data=SsdpServiceInfo(
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_location="http://2.3.4.5:80/", ssdp_location="http://2.3.4.5:80/",

View File

@ -5,7 +5,6 @@ from unittest.mock import patch
import pytest import pytest
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import ssdp
from homeassistant.components.denonavr.config_flow import ( from homeassistant.components.denonavr.config_flow import (
CONF_MANUFACTURER, CONF_MANUFACTURER,
CONF_SERIAL_NUMBER, CONF_SERIAL_NUMBER,
@ -21,6 +20,12 @@ from homeassistant.components.denonavr.config_flow import (
from homeassistant.const import CONF_HOST, CONF_MODEL from homeassistant.const import CONF_HOST, CONF_MODEL
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.ssdp import (
ATTR_UPNP_MANUFACTURER,
ATTR_UPNP_MODEL_NAME,
ATTR_UPNP_SERIAL,
SsdpServiceInfo,
)
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -313,14 +318,14 @@ async def test_config_flow_ssdp(hass: HomeAssistant) -> None:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_SSDP}, context={"source": config_entries.SOURCE_SSDP},
data=ssdp.SsdpServiceInfo( data=SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location=TEST_SSDP_LOCATION, ssdp_location=TEST_SSDP_LOCATION,
upnp={ upnp={
ssdp.ATTR_UPNP_MANUFACTURER: TEST_MANUFACTURER, ATTR_UPNP_MANUFACTURER: TEST_MANUFACTURER,
ssdp.ATTR_UPNP_MODEL_NAME: TEST_MODEL, ATTR_UPNP_MODEL_NAME: TEST_MODEL,
ssdp.ATTR_UPNP_SERIAL: TEST_SERIALNUMBER, ATTR_UPNP_SERIAL: TEST_SERIALNUMBER,
}, },
), ),
) )
@ -353,14 +358,14 @@ async def test_config_flow_ssdp_not_denon(hass: HomeAssistant) -> None:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_SSDP}, context={"source": config_entries.SOURCE_SSDP},
data=ssdp.SsdpServiceInfo( data=SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location=TEST_SSDP_LOCATION, ssdp_location=TEST_SSDP_LOCATION,
upnp={ upnp={
ssdp.ATTR_UPNP_MANUFACTURER: "NotSupported", ATTR_UPNP_MANUFACTURER: "NotSupported",
ssdp.ATTR_UPNP_MODEL_NAME: TEST_MODEL, ATTR_UPNP_MODEL_NAME: TEST_MODEL,
ssdp.ATTR_UPNP_SERIAL: TEST_SERIALNUMBER, ATTR_UPNP_SERIAL: TEST_SERIALNUMBER,
}, },
), ),
) )
@ -377,12 +382,12 @@ async def test_config_flow_ssdp_missing_info(hass: HomeAssistant) -> None:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_SSDP}, context={"source": config_entries.SOURCE_SSDP},
data=ssdp.SsdpServiceInfo( data=SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location=TEST_SSDP_LOCATION, ssdp_location=TEST_SSDP_LOCATION,
upnp={ upnp={
ssdp.ATTR_UPNP_MANUFACTURER: TEST_MANUFACTURER, ATTR_UPNP_MANUFACTURER: TEST_MANUFACTURER,
}, },
), ),
) )
@ -399,14 +404,14 @@ async def test_config_flow_ssdp_ignored_model(hass: HomeAssistant) -> None:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_SSDP}, context={"source": config_entries.SOURCE_SSDP},
data=ssdp.SsdpServiceInfo( data=SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location=TEST_SSDP_LOCATION, ssdp_location=TEST_SSDP_LOCATION,
upnp={ upnp={
ssdp.ATTR_UPNP_MANUFACTURER: TEST_MANUFACTURER, ATTR_UPNP_MANUFACTURER: TEST_MANUFACTURER,
ssdp.ATTR_UPNP_MODEL_NAME: TEST_IGNORED_MODEL, ATTR_UPNP_MODEL_NAME: TEST_IGNORED_MODEL,
ssdp.ATTR_UPNP_SERIAL: TEST_SERIALNUMBER, ATTR_UPNP_SERIAL: TEST_SERIALNUMBER,
}, },
), ),
) )

View File

@ -5,10 +5,10 @@ from ipaddress import ip_address
from aiohttp import ClientError as ServerTimeoutError from aiohttp import ClientError as ServerTimeoutError
from devialet.const import UrlSuffix from devialet.const import UrlSuffix
from homeassistant.components import zeroconf
from homeassistant.components.devialet.const import DOMAIN from homeassistant.components.devialet.const import DOMAIN
from homeassistant.const import CONF_HOST, CONF_NAME, CONTENT_TYPE_JSON from homeassistant.const import CONF_HOST, CONF_NAME, CONTENT_TYPE_JSON
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from tests.common import MockConfigEntry, load_fixture from tests.common import MockConfigEntry, load_fixture
from tests.test_util.aiohttp import AiohttpClientMocker from tests.test_util.aiohttp import AiohttpClientMocker
@ -25,7 +25,7 @@ CONF_DATA = {
MOCK_CONFIG = {DOMAIN: [{CONF_HOST: HOST}]} MOCK_CONFIG = {DOMAIN: [{CONF_HOST: HOST}]}
MOCK_USER_INPUT = {CONF_HOST: HOST} MOCK_USER_INPUT = {CONF_HOST: HOST}
MOCK_ZEROCONF_DATA = zeroconf.ZeroconfServiceInfo( MOCK_ZEROCONF_DATA = ZeroconfServiceInfo(
ip_address=ip_address(HOST), ip_address=ip_address(HOST),
ip_addresses=[ip_address(HOST)], ip_addresses=[ip_address(HOST)],
hostname="PhantomISilver-L00P00000AB11.local.", hostname="PhantomISilver-L00P00000AB11.local.",

View File

@ -2,9 +2,9 @@
from ipaddress import ip_address from ipaddress import ip_address
from homeassistant.components import zeroconf from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
DISCOVERY_INFO = zeroconf.ZeroconfServiceInfo( DISCOVERY_INFO = ZeroconfServiceInfo(
ip_address=ip_address("192.168.0.1"), ip_address=ip_address("192.168.0.1"),
ip_addresses=[ip_address("192.168.0.1")], ip_addresses=[ip_address("192.168.0.1")],
port=14791, port=14791,
@ -22,7 +22,7 @@ DISCOVERY_INFO = zeroconf.ZeroconfServiceInfo(
}, },
) )
DISCOVERY_INFO_WRONG_DEVOLO_DEVICE = zeroconf.ZeroconfServiceInfo( DISCOVERY_INFO_WRONG_DEVOLO_DEVICE = ZeroconfServiceInfo(
ip_address=ip_address("192.168.0.1"), ip_address=ip_address("192.168.0.1"),
ip_addresses=[ip_address("192.168.0.1")], ip_addresses=[ip_address("192.168.0.1")],
hostname="mock_hostname", hostname="mock_hostname",
@ -32,7 +32,7 @@ DISCOVERY_INFO_WRONG_DEVOLO_DEVICE = zeroconf.ZeroconfServiceInfo(
type="mock_type", type="mock_type",
) )
DISCOVERY_INFO_WRONG_DEVICE = zeroconf.ZeroconfServiceInfo( DISCOVERY_INFO_WRONG_DEVICE = ZeroconfServiceInfo(
ip_address=ip_address("192.168.0.1"), ip_address=ip_address("192.168.0.1"),
ip_addresses=[ip_address("192.168.0.1")], ip_addresses=[ip_address("192.168.0.1")],
hostname="mock_hostname", hostname="mock_hostname",

View File

@ -2,10 +2,10 @@
from http import HTTPStatus from http import HTTPStatus
from homeassistant.components import ssdp
from homeassistant.components.directv.const import CONF_RECEIVER_ID, DOMAIN from homeassistant.components.directv.const import CONF_RECEIVER_ID, DOMAIN
from homeassistant.const import CONF_HOST, CONTENT_TYPE_JSON from homeassistant.const import CONF_HOST, CONTENT_TYPE_JSON
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.service_info.ssdp import SsdpServiceInfo
from tests.common import MockConfigEntry, load_fixture from tests.common import MockConfigEntry, load_fixture
from tests.test_util.aiohttp import AiohttpClientMocker from tests.test_util.aiohttp import AiohttpClientMocker
@ -16,7 +16,7 @@ SSDP_LOCATION = "http://127.0.0.1/"
UPNP_SERIAL = "RID-028877455858" UPNP_SERIAL = "RID-028877455858"
MOCK_CONFIG = {DOMAIN: [{CONF_HOST: HOST}]} MOCK_CONFIG = {DOMAIN: [{CONF_HOST: HOST}]}
MOCK_SSDP_DISCOVERY_INFO = ssdp.SsdpServiceInfo( MOCK_SSDP_DISCOVERY_INFO = SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location=SSDP_LOCATION, ssdp_location=SSDP_LOCATION,

View File

@ -6,11 +6,11 @@ from unittest.mock import MagicMock, patch
import pytest import pytest
from homeassistant.components import dhcp
from homeassistant.components.dlink.const import CONF_USE_LEGACY_PROTOCOL, DOMAIN from homeassistant.components.dlink.const import CONF_USE_LEGACY_PROTOCOL, DOMAIN
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import format_mac from homeassistant.helpers.device_registry import format_mac
from homeassistant.helpers.service_info.dhcp import DhcpServiceInfo
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -29,13 +29,13 @@ CONF_DHCP_DATA = {
CONF_DATA = CONF_DHCP_DATA | {CONF_HOST: HOST} CONF_DATA = CONF_DHCP_DATA | {CONF_HOST: HOST}
CONF_DHCP_FLOW = dhcp.DhcpServiceInfo( CONF_DHCP_FLOW = DhcpServiceInfo(
ip=HOST, ip=HOST,
macaddress=DHCP_FORMATTED_MAC, macaddress=DHCP_FORMATTED_MAC,
hostname="dsp-w215", hostname="dsp-w215",
) )
CONF_DHCP_FLOW_NEW_IP = dhcp.DhcpServiceInfo( CONF_DHCP_FLOW_NEW_IP = DhcpServiceInfo(
ip="5.6.7.8", ip="5.6.7.8",
macaddress=DHCP_FORMATTED_MAC, macaddress=DHCP_FORMATTED_MAC,
hostname="dsp-w215", hostname="dsp-w215",

View File

@ -2,12 +2,12 @@
from unittest.mock import MagicMock, patch from unittest.mock import MagicMock, patch
from homeassistant.components import dhcp
from homeassistant.components.dlink.const import DEFAULT_NAME, DOMAIN from homeassistant.components.dlink.const import DEFAULT_NAME, DOMAIN
from homeassistant.config_entries import SOURCE_DHCP, SOURCE_USER from homeassistant.config_entries import SOURCE_DHCP, SOURCE_USER
from homeassistant.const import CONF_HOST from homeassistant.const import CONF_HOST
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.dhcp import DhcpServiceInfo
from .conftest import ( from .conftest import (
CONF_DATA, CONF_DATA,
@ -160,7 +160,7 @@ async def test_dhcp_unique_id_assignment(
hass: HomeAssistant, mocked_plug: MagicMock hass: HomeAssistant, mocked_plug: MagicMock
) -> None: ) -> None:
"""Test dhcp initialized flow with no unique id for matching entry.""" """Test dhcp initialized flow with no unique id for matching entry."""
dhcp_data = dhcp.DhcpServiceInfo( dhcp_data = DhcpServiceInfo(
ip="2.3.4.5", ip="2.3.4.5",
macaddress="11:22:33:44:55:66", macaddress="11:22:33:44:55:66",
hostname="dsp-w215", hostname="dsp-w215",

View File

@ -12,7 +12,6 @@ from async_upnp_client.exceptions import UpnpError
import pytest import pytest
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import ssdp
from homeassistant.components.dlna_dmr.const import ( from homeassistant.components.dlna_dmr.const import (
CONF_BROWSE_UNFILTERED, CONF_BROWSE_UNFILTERED,
CONF_CALLBACK_URL_OVERRIDE, CONF_CALLBACK_URL_OVERRIDE,
@ -23,6 +22,15 @@ from homeassistant.components.dlna_dmr.const import (
from homeassistant.const import CONF_DEVICE_ID, CONF_HOST, CONF_MAC, CONF_TYPE, CONF_URL from homeassistant.const import CONF_DEVICE_ID, CONF_HOST, CONF_MAC, CONF_TYPE, CONF_URL
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.ssdp import (
ATTR_UPNP_DEVICE_TYPE,
ATTR_UPNP_FRIENDLY_NAME,
ATTR_UPNP_MANUFACTURER,
ATTR_UPNP_MODEL_NAME,
ATTR_UPNP_SERVICE_LIST,
ATTR_UPNP_UDN,
SsdpServiceInfo,
)
from .conftest import ( from .conftest import (
MOCK_DEVICE_HOST_ADDR, MOCK_DEVICE_HOST_ADDR,
@ -48,17 +56,17 @@ CHANGED_DEVICE_UDN = "uuid:7cc6da13-7f5d-4ace-9729-badbadbadbad"
MOCK_ROOT_DEVICE_UDN = "ROOT_DEVICE" MOCK_ROOT_DEVICE_UDN = "ROOT_DEVICE"
MOCK_DISCOVERY = ssdp.SsdpServiceInfo( MOCK_DISCOVERY = SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_location=MOCK_DEVICE_LOCATION, ssdp_location=MOCK_DEVICE_LOCATION,
ssdp_udn=MOCK_DEVICE_UDN, ssdp_udn=MOCK_DEVICE_UDN,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
ssdp_headers={"_host": MOCK_DEVICE_HOST_ADDR}, ssdp_headers={"_host": MOCK_DEVICE_HOST_ADDR},
upnp={ upnp={
ssdp.ATTR_UPNP_UDN: MOCK_ROOT_DEVICE_UDN, ATTR_UPNP_UDN: MOCK_ROOT_DEVICE_UDN,
ssdp.ATTR_UPNP_DEVICE_TYPE: MOCK_DEVICE_TYPE, ATTR_UPNP_DEVICE_TYPE: MOCK_DEVICE_TYPE,
ssdp.ATTR_UPNP_FRIENDLY_NAME: MOCK_DEVICE_NAME, ATTR_UPNP_FRIENDLY_NAME: MOCK_DEVICE_NAME,
ssdp.ATTR_UPNP_SERVICE_LIST: { ATTR_UPNP_SERVICE_LIST: {
"service": [ "service": [
{ {
"SCPDURL": "/AVTransport/scpd.xml", "SCPDURL": "/AVTransport/scpd.xml",
@ -358,15 +366,15 @@ async def test_ssdp_flow_existing(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DLNA_DOMAIN, DLNA_DOMAIN,
context={"source": config_entries.SOURCE_SSDP}, context={"source": config_entries.SOURCE_SSDP},
data=ssdp.SsdpServiceInfo( data=SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location=NEW_DEVICE_LOCATION, ssdp_location=NEW_DEVICE_LOCATION,
ssdp_udn=MOCK_DEVICE_UDN, ssdp_udn=MOCK_DEVICE_UDN,
upnp={ upnp={
ssdp.ATTR_UPNP_UDN: MOCK_ROOT_DEVICE_UDN, ATTR_UPNP_UDN: MOCK_ROOT_DEVICE_UDN,
ssdp.ATTR_UPNP_DEVICE_TYPE: MOCK_DEVICE_TYPE, ATTR_UPNP_DEVICE_TYPE: MOCK_DEVICE_TYPE,
ssdp.ATTR_UPNP_FRIENDLY_NAME: MOCK_DEVICE_NAME, ATTR_UPNP_FRIENDLY_NAME: MOCK_DEVICE_NAME,
}, },
), ),
) )
@ -492,15 +500,15 @@ async def test_ssdp_flow_upnp_udn(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DLNA_DOMAIN, DLNA_DOMAIN,
context={"source": config_entries.SOURCE_SSDP}, context={"source": config_entries.SOURCE_SSDP},
data=ssdp.SsdpServiceInfo( data=SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_location=NEW_DEVICE_LOCATION, ssdp_location=NEW_DEVICE_LOCATION,
ssdp_udn=MOCK_DEVICE_UDN, ssdp_udn=MOCK_DEVICE_UDN,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
upnp={ upnp={
ssdp.ATTR_UPNP_UDN: "DIFFERENT_ROOT_DEVICE", ATTR_UPNP_UDN: "DIFFERENT_ROOT_DEVICE",
ssdp.ATTR_UPNP_DEVICE_TYPE: MOCK_DEVICE_TYPE, ATTR_UPNP_DEVICE_TYPE: MOCK_DEVICE_TYPE,
ssdp.ATTR_UPNP_FRIENDLY_NAME: MOCK_DEVICE_NAME, ATTR_UPNP_FRIENDLY_NAME: MOCK_DEVICE_NAME,
}, },
), ),
) )
@ -514,7 +522,7 @@ async def test_ssdp_missing_services(hass: HomeAssistant) -> None:
# No service list at all # No service list at all
discovery = dataclasses.replace(MOCK_DISCOVERY) discovery = dataclasses.replace(MOCK_DISCOVERY)
discovery.upnp = dict(discovery.upnp) discovery.upnp = dict(discovery.upnp)
del discovery.upnp[ssdp.ATTR_UPNP_SERVICE_LIST] del discovery.upnp[ATTR_UPNP_SERVICE_LIST]
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DLNA_DOMAIN, DLNA_DOMAIN,
context={"source": config_entries.SOURCE_SSDP}, context={"source": config_entries.SOURCE_SSDP},
@ -526,7 +534,7 @@ async def test_ssdp_missing_services(hass: HomeAssistant) -> None:
# Service list does not contain services # Service list does not contain services
discovery = dataclasses.replace(MOCK_DISCOVERY) discovery = dataclasses.replace(MOCK_DISCOVERY)
discovery.upnp = discovery.upnp.copy() discovery.upnp = discovery.upnp.copy()
discovery.upnp[ssdp.ATTR_UPNP_SERVICE_LIST] = {"bad_key": "bad_value"} discovery.upnp[ATTR_UPNP_SERVICE_LIST] = {"bad_key": "bad_value"}
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DLNA_DOMAIN, DLNA_DOMAIN,
context={"source": config_entries.SOURCE_SSDP}, context={"source": config_entries.SOURCE_SSDP},
@ -538,10 +546,10 @@ async def test_ssdp_missing_services(hass: HomeAssistant) -> None:
# AVTransport service is missing # AVTransport service is missing
discovery = dataclasses.replace(MOCK_DISCOVERY) discovery = dataclasses.replace(MOCK_DISCOVERY)
discovery.upnp = dict(discovery.upnp) discovery.upnp = dict(discovery.upnp)
discovery.upnp[ssdp.ATTR_UPNP_SERVICE_LIST] = { discovery.upnp[ATTR_UPNP_SERVICE_LIST] = {
"service": [ "service": [
service service
for service in discovery.upnp[ssdp.ATTR_UPNP_SERVICE_LIST]["service"] for service in discovery.upnp[ATTR_UPNP_SERVICE_LIST]["service"]
if service.get("serviceId") != "urn:upnp-org:serviceId:AVTransport" if service.get("serviceId") != "urn:upnp-org:serviceId:AVTransport"
] ]
} }
@ -560,10 +568,10 @@ async def test_ssdp_single_service(hass: HomeAssistant) -> None:
""" """
discovery = dataclasses.replace(MOCK_DISCOVERY) discovery = dataclasses.replace(MOCK_DISCOVERY)
discovery.upnp = discovery.upnp.copy() discovery.upnp = discovery.upnp.copy()
service_list = discovery.upnp[ssdp.ATTR_UPNP_SERVICE_LIST].copy() service_list = discovery.upnp[ATTR_UPNP_SERVICE_LIST].copy()
# Turn mock's list of service dicts into a single dict # Turn mock's list of service dicts into a single dict
service_list["service"] = service_list["service"][0] service_list["service"] = service_list["service"][0]
discovery.upnp[ssdp.ATTR_UPNP_SERVICE_LIST] = service_list discovery.upnp[ATTR_UPNP_SERVICE_LIST] = service_list
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DLNA_DOMAIN, DLNA_DOMAIN,
@ -589,9 +597,7 @@ async def test_ssdp_ignore_device(hass: HomeAssistant) -> None:
discovery = dataclasses.replace(MOCK_DISCOVERY) discovery = dataclasses.replace(MOCK_DISCOVERY)
discovery.upnp = dict(discovery.upnp) discovery.upnp = dict(discovery.upnp)
discovery.upnp[ssdp.ATTR_UPNP_DEVICE_TYPE] = ( discovery.upnp[ATTR_UPNP_DEVICE_TYPE] = "urn:schemas-upnp-org:device:ZonePlayer:1"
"urn:schemas-upnp-org:device:ZonePlayer:1"
)
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DLNA_DOMAIN, DLNA_DOMAIN,
context={"source": config_entries.SOURCE_SSDP}, context={"source": config_entries.SOURCE_SSDP},
@ -608,8 +614,8 @@ async def test_ssdp_ignore_device(hass: HomeAssistant) -> None:
): ):
discovery = dataclasses.replace(MOCK_DISCOVERY) discovery = dataclasses.replace(MOCK_DISCOVERY)
discovery.upnp = dict(discovery.upnp) discovery.upnp = dict(discovery.upnp)
discovery.upnp[ssdp.ATTR_UPNP_MANUFACTURER] = manufacturer discovery.upnp[ATTR_UPNP_MANUFACTURER] = manufacturer
discovery.upnp[ssdp.ATTR_UPNP_MODEL_NAME] = model discovery.upnp[ATTR_UPNP_MODEL_NAME] = model
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DLNA_DOMAIN, DLNA_DOMAIN,
context={"source": config_entries.SOURCE_SSDP}, context={"source": config_entries.SOURCE_SSDP},

View File

@ -47,6 +47,7 @@ from homeassistant.const import (
from homeassistant.core import CoreState, HomeAssistant from homeassistant.core import CoreState, HomeAssistant
from homeassistant.helpers import device_registry as dr, entity_registry as er from homeassistant.helpers import device_registry as dr, entity_registry as er
from homeassistant.helpers.entity_component import async_update_entity from homeassistant.helpers.entity_component import async_update_entity
from homeassistant.helpers.service_info.ssdp import SsdpServiceInfo
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from .conftest import ( from .conftest import (
@ -1413,7 +1414,7 @@ async def test_become_available(
# Send an SSDP notification from the now alive device # Send an SSDP notification from the now alive device
ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=NEW_DEVICE_LOCATION, ssdp_location=NEW_DEVICE_LOCATION,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
@ -1484,7 +1485,7 @@ async def test_alive_but_gone(
# Send an SSDP notification from the still missing device # Send an SSDP notification from the still missing device
ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=NEW_DEVICE_LOCATION, ssdp_location=NEW_DEVICE_LOCATION,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
@ -1506,7 +1507,7 @@ async def test_alive_but_gone(
# Send the same SSDP notification, expecting no extra connection attempts # Send the same SSDP notification, expecting no extra connection attempts
domain_data_mock.upnp_factory.async_create_device.reset_mock() domain_data_mock.upnp_factory.async_create_device.reset_mock()
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=NEW_DEVICE_LOCATION, ssdp_location=NEW_DEVICE_LOCATION,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
@ -1525,7 +1526,7 @@ async def test_alive_but_gone(
# Send an SSDP notification with a new BOOTID, indicating the device has rebooted # Send an SSDP notification with a new BOOTID, indicating the device has rebooted
domain_data_mock.upnp_factory.async_create_device.reset_mock() domain_data_mock.upnp_factory.async_create_device.reset_mock()
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=NEW_DEVICE_LOCATION, ssdp_location=NEW_DEVICE_LOCATION,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
@ -1546,7 +1547,7 @@ async def test_alive_but_gone(
# should result in a reconnect attempt even with same BOOTID. # should result in a reconnect attempt even with same BOOTID.
domain_data_mock.upnp_factory.async_create_device.reset_mock() domain_data_mock.upnp_factory.async_create_device.reset_mock()
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
upnp={}, upnp={},
@ -1554,7 +1555,7 @@ async def test_alive_but_gone(
ssdp.SsdpChange.BYEBYE, ssdp.SsdpChange.BYEBYE,
) )
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=NEW_DEVICE_LOCATION, ssdp_location=NEW_DEVICE_LOCATION,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
@ -1597,7 +1598,7 @@ async def test_multiple_ssdp_alive(
# Send two SSDP notifications with the new device URL # Send two SSDP notifications with the new device URL
ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=NEW_DEVICE_LOCATION, ssdp_location=NEW_DEVICE_LOCATION,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
@ -1606,7 +1607,7 @@ async def test_multiple_ssdp_alive(
ssdp.SsdpChange.ALIVE, ssdp.SsdpChange.ALIVE,
) )
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=NEW_DEVICE_LOCATION, ssdp_location=NEW_DEVICE_LOCATION,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
@ -1637,7 +1638,7 @@ async def test_ssdp_byebye(
# First byebye will cause a disconnect # First byebye will cause a disconnect
ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_udn=MOCK_DEVICE_UDN, ssdp_udn=MOCK_DEVICE_UDN,
ssdp_headers={"NTS": "ssdp:byebye"}, ssdp_headers={"NTS": "ssdp:byebye"},
@ -1656,7 +1657,7 @@ async def test_ssdp_byebye(
# Second byebye will do nothing # Second byebye will do nothing
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_udn=MOCK_DEVICE_UDN, ssdp_udn=MOCK_DEVICE_UDN,
ssdp_headers={"NTS": "ssdp:byebye"}, ssdp_headers={"NTS": "ssdp:byebye"},
@ -1689,7 +1690,7 @@ async def test_ssdp_update_seen_bootid(
# Send SSDP alive with boot ID # Send SSDP alive with boot ID
ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=MOCK_DEVICE_LOCATION, ssdp_location=MOCK_DEVICE_LOCATION,
ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "1"}, ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "1"},
@ -1702,7 +1703,7 @@ async def test_ssdp_update_seen_bootid(
# Send SSDP update with next boot ID # Send SSDP update with next boot ID
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_udn=MOCK_DEVICE_UDN, ssdp_udn=MOCK_DEVICE_UDN,
ssdp_headers={ ssdp_headers={
@ -1727,7 +1728,7 @@ async def test_ssdp_update_seen_bootid(
# Send SSDP update with same next boot ID, again # Send SSDP update with same next boot ID, again
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_udn=MOCK_DEVICE_UDN, ssdp_udn=MOCK_DEVICE_UDN,
ssdp_headers={ ssdp_headers={
@ -1752,7 +1753,7 @@ async def test_ssdp_update_seen_bootid(
# Send SSDP update with bad next boot ID # Send SSDP update with bad next boot ID
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_udn=MOCK_DEVICE_UDN, ssdp_udn=MOCK_DEVICE_UDN,
ssdp_headers={ ssdp_headers={
@ -1777,7 +1778,7 @@ async def test_ssdp_update_seen_bootid(
# Send a new SSDP alive with the new boot ID, device should not reconnect # Send a new SSDP alive with the new boot ID, device should not reconnect
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=MOCK_DEVICE_LOCATION, ssdp_location=MOCK_DEVICE_LOCATION,
ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "2"}, ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "2"},
@ -1816,7 +1817,7 @@ async def test_ssdp_update_missed_bootid(
# Send SSDP alive with boot ID # Send SSDP alive with boot ID
ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=MOCK_DEVICE_LOCATION, ssdp_location=MOCK_DEVICE_LOCATION,
ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "1"}, ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "1"},
@ -1829,7 +1830,7 @@ async def test_ssdp_update_missed_bootid(
# Send SSDP update with skipped boot ID (not previously seen) # Send SSDP update with skipped boot ID (not previously seen)
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_udn=MOCK_DEVICE_UDN, ssdp_udn=MOCK_DEVICE_UDN,
ssdp_headers={ ssdp_headers={
@ -1854,7 +1855,7 @@ async def test_ssdp_update_missed_bootid(
# Send a new SSDP alive with the new boot ID, device should reconnect # Send a new SSDP alive with the new boot ID, device should reconnect
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=MOCK_DEVICE_LOCATION, ssdp_location=MOCK_DEVICE_LOCATION,
ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "3"}, ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "3"},
@ -1893,7 +1894,7 @@ async def test_ssdp_bootid(
# Send SSDP alive with boot ID # Send SSDP alive with boot ID
ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=MOCK_DEVICE_LOCATION, ssdp_location=MOCK_DEVICE_LOCATION,
ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "1"}, ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "1"},
@ -1913,7 +1914,7 @@ async def test_ssdp_bootid(
# Send SSDP alive with same boot ID, nothing should happen # Send SSDP alive with same boot ID, nothing should happen
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=MOCK_DEVICE_LOCATION, ssdp_location=MOCK_DEVICE_LOCATION,
ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "1"}, ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "1"},
@ -1933,7 +1934,7 @@ async def test_ssdp_bootid(
# Send a new SSDP alive with an incremented boot ID, device should be dis/reconnected # Send a new SSDP alive with an incremented boot ID, device should be dis/reconnected
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=MOCK_DEVICE_LOCATION, ssdp_location=MOCK_DEVICE_LOCATION,
ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "2"}, ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "2"},
@ -2354,7 +2355,7 @@ async def test_connections_restored(
# Send an SSDP notification from the now alive device # Send an SSDP notification from the now alive device
ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=NEW_DEVICE_LOCATION, ssdp_location=NEW_DEVICE_LOCATION,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,

View File

@ -12,11 +12,17 @@ from async_upnp_client.exceptions import UpnpError
import pytest import pytest
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import ssdp
from homeassistant.components.dlna_dms.const import CONF_SOURCE_ID, DOMAIN from homeassistant.components.dlna_dms.const import CONF_SOURCE_ID, DOMAIN
from homeassistant.const import CONF_DEVICE_ID, CONF_HOST, CONF_URL from homeassistant.const import CONF_DEVICE_ID, CONF_HOST, CONF_URL
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.ssdp import (
ATTR_UPNP_DEVICE_TYPE,
ATTR_UPNP_FRIENDLY_NAME,
ATTR_UPNP_SERVICE_LIST,
ATTR_UPNP_UDN,
SsdpServiceInfo,
)
from .conftest import ( from .conftest import (
MOCK_DEVICE_HOST, MOCK_DEVICE_HOST,
@ -35,16 +41,16 @@ WRONG_DEVICE_TYPE: Final = "urn:schemas-upnp-org:device:InternetGatewayDevice:1"
MOCK_ROOT_DEVICE_UDN: Final = "ROOT_DEVICE" MOCK_ROOT_DEVICE_UDN: Final = "ROOT_DEVICE"
MOCK_DISCOVERY: Final = ssdp.SsdpServiceInfo( MOCK_DISCOVERY: Final = SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=MOCK_DEVICE_LOCATION, ssdp_location=MOCK_DEVICE_LOCATION,
ssdp_udn=MOCK_DEVICE_UDN, ssdp_udn=MOCK_DEVICE_UDN,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
upnp={ upnp={
ssdp.ATTR_UPNP_UDN: MOCK_ROOT_DEVICE_UDN, ATTR_UPNP_UDN: MOCK_ROOT_DEVICE_UDN,
ssdp.ATTR_UPNP_DEVICE_TYPE: MOCK_DEVICE_TYPE, ATTR_UPNP_DEVICE_TYPE: MOCK_DEVICE_TYPE,
ssdp.ATTR_UPNP_FRIENDLY_NAME: MOCK_DEVICE_NAME, ATTR_UPNP_FRIENDLY_NAME: MOCK_DEVICE_NAME,
ssdp.ATTR_UPNP_SERVICE_LIST: { ATTR_UPNP_SERVICE_LIST: {
"service": [ "service": [
{ {
"SCPDURL": "/ContentDirectory/scpd.xml", "SCPDURL": "/ContentDirectory/scpd.xml",
@ -195,15 +201,15 @@ async def test_ssdp_flow_existing(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_SSDP}, context={"source": config_entries.SOURCE_SSDP},
data=ssdp.SsdpServiceInfo( data=SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location=NEW_DEVICE_LOCATION, ssdp_location=NEW_DEVICE_LOCATION,
ssdp_udn=MOCK_DEVICE_UDN, ssdp_udn=MOCK_DEVICE_UDN,
upnp={ upnp={
ssdp.ATTR_UPNP_UDN: MOCK_ROOT_DEVICE_UDN, ATTR_UPNP_UDN: MOCK_ROOT_DEVICE_UDN,
ssdp.ATTR_UPNP_DEVICE_TYPE: MOCK_DEVICE_TYPE, ATTR_UPNP_DEVICE_TYPE: MOCK_DEVICE_TYPE,
ssdp.ATTR_UPNP_FRIENDLY_NAME: MOCK_DEVICE_NAME, ATTR_UPNP_FRIENDLY_NAME: MOCK_DEVICE_NAME,
}, },
), ),
) )
@ -279,7 +285,7 @@ async def test_duplicate_name(
ssdp_udn=new_device_udn, ssdp_udn=new_device_udn,
) )
discovery.upnp = dict(discovery.upnp) discovery.upnp = dict(discovery.upnp)
discovery.upnp[ssdp.ATTR_UPNP_UDN] = new_device_udn discovery.upnp[ATTR_UPNP_UDN] = new_device_udn
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
@ -312,15 +318,15 @@ async def test_ssdp_flow_upnp_udn(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_SSDP}, context={"source": config_entries.SOURCE_SSDP},
data=ssdp.SsdpServiceInfo( data=SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=NEW_DEVICE_LOCATION, ssdp_location=NEW_DEVICE_LOCATION,
ssdp_udn=MOCK_DEVICE_UDN, ssdp_udn=MOCK_DEVICE_UDN,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
upnp={ upnp={
ssdp.ATTR_UPNP_UDN: "DIFFERENT_ROOT_DEVICE", ATTR_UPNP_UDN: "DIFFERENT_ROOT_DEVICE",
ssdp.ATTR_UPNP_DEVICE_TYPE: MOCK_DEVICE_TYPE, ATTR_UPNP_DEVICE_TYPE: MOCK_DEVICE_TYPE,
ssdp.ATTR_UPNP_FRIENDLY_NAME: MOCK_DEVICE_NAME, ATTR_UPNP_FRIENDLY_NAME: MOCK_DEVICE_NAME,
}, },
), ),
) )
@ -334,7 +340,7 @@ async def test_ssdp_missing_services(hass: HomeAssistant) -> None:
# No service list at all # No service list at all
discovery = dataclasses.replace(MOCK_DISCOVERY) discovery = dataclasses.replace(MOCK_DISCOVERY)
discovery.upnp = dict(discovery.upnp) discovery.upnp = dict(discovery.upnp)
del discovery.upnp[ssdp.ATTR_UPNP_SERVICE_LIST] del discovery.upnp[ATTR_UPNP_SERVICE_LIST]
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_SSDP}, context={"source": config_entries.SOURCE_SSDP},
@ -346,7 +352,7 @@ async def test_ssdp_missing_services(hass: HomeAssistant) -> None:
# Service list does not contain services # Service list does not contain services
discovery = dataclasses.replace(MOCK_DISCOVERY) discovery = dataclasses.replace(MOCK_DISCOVERY)
discovery.upnp = dict(discovery.upnp) discovery.upnp = dict(discovery.upnp)
discovery.upnp[ssdp.ATTR_UPNP_SERVICE_LIST] = {"bad_key": "bad_value"} discovery.upnp[ATTR_UPNP_SERVICE_LIST] = {"bad_key": "bad_value"}
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_SSDP}, context={"source": config_entries.SOURCE_SSDP},
@ -358,10 +364,10 @@ async def test_ssdp_missing_services(hass: HomeAssistant) -> None:
# ContentDirectory service is missing # ContentDirectory service is missing
discovery = dataclasses.replace(MOCK_DISCOVERY) discovery = dataclasses.replace(MOCK_DISCOVERY)
discovery.upnp = dict(discovery.upnp) discovery.upnp = dict(discovery.upnp)
discovery.upnp[ssdp.ATTR_UPNP_SERVICE_LIST] = { discovery.upnp[ATTR_UPNP_SERVICE_LIST] = {
"service": [ "service": [
service service
for service in discovery.upnp[ssdp.ATTR_UPNP_SERVICE_LIST]["service"] for service in discovery.upnp[ATTR_UPNP_SERVICE_LIST]["service"]
if service.get("serviceId") != "urn:upnp-org:serviceId:ContentDirectory" if service.get("serviceId") != "urn:upnp-org:serviceId:ContentDirectory"
] ]
} }
@ -380,10 +386,10 @@ async def test_ssdp_single_service(hass: HomeAssistant) -> None:
""" """
discovery = dataclasses.replace(MOCK_DISCOVERY) discovery = dataclasses.replace(MOCK_DISCOVERY)
discovery.upnp = dict(discovery.upnp) discovery.upnp = dict(discovery.upnp)
service_list = dict(discovery.upnp[ssdp.ATTR_UPNP_SERVICE_LIST]) service_list = dict(discovery.upnp[ATTR_UPNP_SERVICE_LIST])
# Turn mock's list of service dicts into a single dict # Turn mock's list of service dicts into a single dict
service_list["service"] = service_list["service"][0] service_list["service"] = service_list["service"][0]
discovery.upnp[ssdp.ATTR_UPNP_SERVICE_LIST] = service_list discovery.upnp[ATTR_UPNP_SERVICE_LIST] = service_list
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,

View File

@ -18,6 +18,7 @@ from homeassistant.components.dlna_dms.dms import get_domain_data
from homeassistant.components.media_player import BrowseError from homeassistant.components.media_player import BrowseError
from homeassistant.components.media_source import Unresolvable from homeassistant.components.media_source import Unresolvable
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.service_info.ssdp import SsdpServiceInfo
from .conftest import ( from .conftest import (
MOCK_DEVICE_LOCATION, MOCK_DEVICE_LOCATION,
@ -179,7 +180,7 @@ async def test_become_available(
# Send an SSDP notification from the now alive device # Send an SSDP notification from the now alive device
ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=NEW_DEVICE_LOCATION, ssdp_location=NEW_DEVICE_LOCATION,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
@ -207,7 +208,7 @@ async def test_alive_but_gone(
# Send an SSDP notification from the still missing device # Send an SSDP notification from the still missing device
ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=NEW_DEVICE_LOCATION, ssdp_location=NEW_DEVICE_LOCATION,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
@ -227,7 +228,7 @@ async def test_alive_but_gone(
# Send the same SSDP notification, expecting no extra connection attempts # Send the same SSDP notification, expecting no extra connection attempts
upnp_factory_mock.async_create_device.reset_mock() upnp_factory_mock.async_create_device.reset_mock()
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=NEW_DEVICE_LOCATION, ssdp_location=NEW_DEVICE_LOCATION,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
@ -244,7 +245,7 @@ async def test_alive_but_gone(
# Send an SSDP notification with a new BOOTID, indicating the device has rebooted # Send an SSDP notification with a new BOOTID, indicating the device has rebooted
upnp_factory_mock.async_create_device.reset_mock() upnp_factory_mock.async_create_device.reset_mock()
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=NEW_DEVICE_LOCATION, ssdp_location=NEW_DEVICE_LOCATION,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
@ -263,7 +264,7 @@ async def test_alive_but_gone(
# should result in a reconnect attempt even with same BOOTID. # should result in a reconnect attempt even with same BOOTID.
upnp_factory_mock.async_create_device.reset_mock() upnp_factory_mock.async_create_device.reset_mock()
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
upnp={}, upnp={},
@ -271,7 +272,7 @@ async def test_alive_but_gone(
ssdp.SsdpChange.BYEBYE, ssdp.SsdpChange.BYEBYE,
) )
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=NEW_DEVICE_LOCATION, ssdp_location=NEW_DEVICE_LOCATION,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
@ -310,7 +311,7 @@ async def test_multiple_ssdp_alive(
# Send two SSDP notifications with the new device URL # Send two SSDP notifications with the new device URL
ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=NEW_DEVICE_LOCATION, ssdp_location=NEW_DEVICE_LOCATION,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
@ -319,7 +320,7 @@ async def test_multiple_ssdp_alive(
ssdp.SsdpChange.ALIVE, ssdp.SsdpChange.ALIVE,
) )
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=NEW_DEVICE_LOCATION, ssdp_location=NEW_DEVICE_LOCATION,
ssdp_st=MOCK_DEVICE_TYPE, ssdp_st=MOCK_DEVICE_TYPE,
@ -345,7 +346,7 @@ async def test_ssdp_byebye(
# First byebye will cause a disconnect # First byebye will cause a disconnect
ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_udn=MOCK_DEVICE_UDN, ssdp_udn=MOCK_DEVICE_UDN,
ssdp_headers={"NTS": "ssdp:byebye"}, ssdp_headers={"NTS": "ssdp:byebye"},
@ -360,7 +361,7 @@ async def test_ssdp_byebye(
# Second byebye will do nothing # Second byebye will do nothing
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_udn=MOCK_DEVICE_UDN, ssdp_udn=MOCK_DEVICE_UDN,
ssdp_headers={"NTS": "ssdp:byebye"}, ssdp_headers={"NTS": "ssdp:byebye"},
@ -388,7 +389,7 @@ async def test_ssdp_update_seen_bootid(
# Send SSDP alive with boot ID # Send SSDP alive with boot ID
ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=MOCK_DEVICE_LOCATION, ssdp_location=MOCK_DEVICE_LOCATION,
ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "1"}, ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "1"},
@ -405,7 +406,7 @@ async def test_ssdp_update_seen_bootid(
# Send SSDP update with next boot ID # Send SSDP update with next boot ID
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_udn=MOCK_DEVICE_UDN, ssdp_udn=MOCK_DEVICE_UDN,
ssdp_headers={ ssdp_headers={
@ -426,7 +427,7 @@ async def test_ssdp_update_seen_bootid(
# Send SSDP update with same next boot ID, again # Send SSDP update with same next boot ID, again
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_udn=MOCK_DEVICE_UDN, ssdp_udn=MOCK_DEVICE_UDN,
ssdp_headers={ ssdp_headers={
@ -447,7 +448,7 @@ async def test_ssdp_update_seen_bootid(
# Send SSDP update with bad next boot ID # Send SSDP update with bad next boot ID
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_udn=MOCK_DEVICE_UDN, ssdp_udn=MOCK_DEVICE_UDN,
ssdp_headers={ ssdp_headers={
@ -468,7 +469,7 @@ async def test_ssdp_update_seen_bootid(
# Send a new SSDP alive with the new boot ID, device should not reconnect # Send a new SSDP alive with the new boot ID, device should not reconnect
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=MOCK_DEVICE_LOCATION, ssdp_location=MOCK_DEVICE_LOCATION,
ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "2"}, ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "2"},
@ -500,7 +501,7 @@ async def test_ssdp_update_missed_bootid(
# Send SSDP alive with boot ID # Send SSDP alive with boot ID
ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=MOCK_DEVICE_LOCATION, ssdp_location=MOCK_DEVICE_LOCATION,
ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "1"}, ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "1"},
@ -517,7 +518,7 @@ async def test_ssdp_update_missed_bootid(
# Send SSDP update with skipped boot ID (not previously seen) # Send SSDP update with skipped boot ID (not previously seen)
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_udn=MOCK_DEVICE_UDN, ssdp_udn=MOCK_DEVICE_UDN,
ssdp_headers={ ssdp_headers={
@ -538,7 +539,7 @@ async def test_ssdp_update_missed_bootid(
# Send a new SSDP alive with the new boot ID, device should reconnect # Send a new SSDP alive with the new boot ID, device should reconnect
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=MOCK_DEVICE_LOCATION, ssdp_location=MOCK_DEVICE_LOCATION,
ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "3"}, ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "3"},
@ -570,7 +571,7 @@ async def test_ssdp_bootid(
# Send SSDP alive with boot ID # Send SSDP alive with boot ID
ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=MOCK_DEVICE_LOCATION, ssdp_location=MOCK_DEVICE_LOCATION,
ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "1"}, ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "1"},
@ -586,7 +587,7 @@ async def test_ssdp_bootid(
# Send SSDP alive with same boot ID, nothing should happen # Send SSDP alive with same boot ID, nothing should happen
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=MOCK_DEVICE_LOCATION, ssdp_location=MOCK_DEVICE_LOCATION,
ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "1"}, ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "1"},
@ -602,7 +603,7 @@ async def test_ssdp_bootid(
# Send a new SSDP alive with an incremented boot ID, device should be dis/reconnected # Send a new SSDP alive with an incremented boot ID, device should be dis/reconnected
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_location=MOCK_DEVICE_LOCATION, ssdp_location=MOCK_DEVICE_LOCATION,
ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "2"}, ssdp_headers={ssdp.ATTR_SSDP_BOOTID: "2"},

View File

@ -16,6 +16,7 @@ from homeassistant.components.dlna_dms.dms import DidlPlayMedia
from homeassistant.components.media_player import BrowseError from homeassistant.components.media_player import BrowseError
from homeassistant.components.media_source import BrowseMediaSource, Unresolvable from homeassistant.components.media_source import BrowseMediaSource, Unresolvable
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.service_info.ssdp import SsdpServiceInfo
from .conftest import ( from .conftest import (
MOCK_DEVICE_BASE_URL, MOCK_DEVICE_BASE_URL,
@ -68,7 +69,7 @@ async def test_catch_request_error_unavailable(
# DmsDevice notifies of disconnect via SSDP # DmsDevice notifies of disconnect via SSDP
ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target ssdp_callback = ssdp_scanner_mock.async_register_callback.call_args.args[0].target
await ssdp_callback( await ssdp_callback(
ssdp.SsdpServiceInfo( SsdpServiceInfo(
ssdp_usn=MOCK_DEVICE_USN, ssdp_usn=MOCK_DEVICE_USN,
ssdp_udn=MOCK_DEVICE_UDN, ssdp_udn=MOCK_DEVICE_UDN,
ssdp_headers={"NTS": "ssdp:byebye"}, ssdp_headers={"NTS": "ssdp:byebye"},

View File

@ -8,7 +8,6 @@ from doorbirdpy import DoorBird
import pytest import pytest
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import zeroconf
from homeassistant.components.doorbird.const import ( from homeassistant.components.doorbird.const import (
CONF_EVENTS, CONF_EVENTS,
DEFAULT_DOORBELL_EVENT, DEFAULT_DOORBELL_EVENT,
@ -18,6 +17,7 @@ from homeassistant.components.doorbird.const import (
from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PASSWORD, CONF_USERNAME from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PASSWORD, CONF_USERNAME
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from . import ( from . import (
VALID_CONFIG, VALID_CONFIG,
@ -74,7 +74,7 @@ async def test_form_zeroconf_wrong_oui(hass: HomeAssistant) -> None:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_ZEROCONF}, context={"source": config_entries.SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("192.168.1.8"), ip_address=ip_address("192.168.1.8"),
ip_addresses=[ip_address("192.168.1.8")], ip_addresses=[ip_address("192.168.1.8")],
hostname="mock_hostname", hostname="mock_hostname",
@ -94,7 +94,7 @@ async def test_form_zeroconf_link_local_ignored(hass: HomeAssistant) -> None:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_ZEROCONF}, context={"source": config_entries.SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("169.254.103.61"), ip_address=ip_address("169.254.103.61"),
ip_addresses=[ip_address("169.254.103.61")], ip_addresses=[ip_address("169.254.103.61")],
hostname="mock_hostname", hostname="mock_hostname",
@ -121,7 +121,7 @@ async def test_form_zeroconf_ipv4_address(hass: HomeAssistant) -> None:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_ZEROCONF}, context={"source": config_entries.SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("4.4.4.4"), ip_address=ip_address("4.4.4.4"),
ip_addresses=[ip_address("4.4.4.4")], ip_addresses=[ip_address("4.4.4.4")],
hostname="mock_hostname", hostname="mock_hostname",
@ -142,7 +142,7 @@ async def test_form_zeroconf_non_ipv4_ignored(hass: HomeAssistant) -> None:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_ZEROCONF}, context={"source": config_entries.SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("fd00::b27c:63bb:cc85:4ea0"), ip_address=ip_address("fd00::b27c:63bb:cc85:4ea0"),
ip_addresses=[ip_address("fd00::b27c:63bb:cc85:4ea0")], ip_addresses=[ip_address("fd00::b27c:63bb:cc85:4ea0")],
hostname="mock_hostname", hostname="mock_hostname",
@ -164,7 +164,7 @@ async def test_form_zeroconf_correct_oui(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_ZEROCONF}, context={"source": config_entries.SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("192.168.1.5"), ip_address=ip_address("192.168.1.5"),
ip_addresses=[ip_address("192.168.1.5")], ip_addresses=[ip_address("192.168.1.5")],
hostname="mock_hostname", hostname="mock_hostname",
@ -230,7 +230,7 @@ async def test_form_zeroconf_correct_oui_wrong_device(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_ZEROCONF}, context={"source": config_entries.SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("192.168.1.5"), ip_address=ip_address("192.168.1.5"),
ip_addresses=[ip_address("192.168.1.5")], ip_addresses=[ip_address("192.168.1.5")],
hostname="mock_hostname", hostname="mock_hostname",

View File

@ -6,12 +6,12 @@ from unittest.mock import AsyncMock, MagicMock
from elgato import ElgatoConnectionError from elgato import ElgatoConnectionError
import pytest import pytest
from homeassistant.components import zeroconf
from homeassistant.components.elgato.const import DOMAIN from homeassistant.components.elgato.const import DOMAIN
from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF
from homeassistant.const import CONF_HOST, CONF_MAC, CONF_SOURCE from homeassistant.const import CONF_HOST, CONF_MAC, CONF_SOURCE
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -57,7 +57,7 @@ async def test_full_zeroconf_flow_implementation(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": SOURCE_ZEROCONF}, context={"source": SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("127.0.0.1"), ip_address=ip_address("127.0.0.1"),
ip_addresses=[ip_address("127.0.0.1")], ip_addresses=[ip_address("127.0.0.1")],
hostname="example.local.", hostname="example.local.",
@ -141,7 +141,7 @@ async def test_zeroconf_connection_error(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": SOURCE_ZEROCONF}, context={"source": SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("127.0.0.1"), ip_address=ip_address("127.0.0.1"),
ip_addresses=[ip_address("127.0.0.1")], ip_addresses=[ip_address("127.0.0.1")],
hostname="mock_hostname", hostname="mock_hostname",
@ -181,7 +181,7 @@ async def test_zeroconf_device_exists_abort(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={CONF_SOURCE: SOURCE_ZEROCONF}, context={CONF_SOURCE: SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("127.0.0.1"), ip_address=ip_address("127.0.0.1"),
ip_addresses=[ip_address("127.0.0.1")], ip_addresses=[ip_address("127.0.0.1")],
hostname="mock_hostname", hostname="mock_hostname",
@ -202,7 +202,7 @@ async def test_zeroconf_device_exists_abort(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={CONF_SOURCE: SOURCE_ZEROCONF}, context={CONF_SOURCE: SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("127.0.0.2"), ip_address=ip_address("127.0.0.2"),
ip_addresses=[ip_address("127.0.0.2")], ip_addresses=[ip_address("127.0.0.2")],
hostname="mock_hostname", hostname="mock_hostname",
@ -230,7 +230,7 @@ async def test_zeroconf_during_onboarding(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": SOURCE_ZEROCONF}, context={"source": SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("127.0.0.1"), ip_address=ip_address("127.0.0.1"),
ip_addresses=[ip_address("127.0.0.1")], ip_addresses=[ip_address("127.0.0.1")],
hostname="example.local.", hostname="example.local.",

View File

@ -7,12 +7,12 @@ from elkm1_lib.discovery import ElkSystem
import pytest import pytest
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import dhcp
from homeassistant.components.elkm1.const import DOMAIN from homeassistant.components.elkm1.const import DOMAIN
from homeassistant.const import CONF_HOST, CONF_PASSWORD from homeassistant.const import CONF_HOST, CONF_PASSWORD
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers import device_registry as dr from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.service_info.dhcp import DhcpServiceInfo
from . import ( from . import (
ELK_DISCOVERY, ELK_DISCOVERY,
@ -27,7 +27,7 @@ from . import (
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
DHCP_DISCOVERY = dhcp.DhcpServiceInfo( DHCP_DISCOVERY = DhcpServiceInfo(
MOCK_IP_ADDRESS, "", dr.format_mac(MOCK_MAC).replace(":", "") MOCK_IP_ADDRESS, "", dr.format_mac(MOCK_MAC).replace(":", "")
) )
ELK_DISCOVERY_INFO = asdict(ELK_DISCOVERY) ELK_DISCOVERY_INFO = asdict(ELK_DISCOVERY)
@ -1141,7 +1141,7 @@ async def test_discovered_by_discovery_and_dhcp(hass: HomeAssistant) -> None:
result3 = await hass.config_entries.flow.async_init( result3 = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_DHCP}, context={"source": config_entries.SOURCE_DHCP},
data=dhcp.DhcpServiceInfo( data=DhcpServiceInfo(
hostname="any", hostname="any",
ip=MOCK_IP_ADDRESS, ip=MOCK_IP_ADDRESS,
macaddress="00:00:00:00:00:00", macaddress="00:00:00:00:00:00",

View File

@ -5,7 +5,6 @@ from unittest.mock import patch
from elmax_api.exceptions import ElmaxBadLoginError, ElmaxBadPinError, ElmaxNetworkError from elmax_api.exceptions import ElmaxBadLoginError, ElmaxBadPinError, ElmaxNetworkError
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import zeroconf
from homeassistant.components.elmax.const import ( from homeassistant.components.elmax.const import (
CONF_ELMAX_MODE, CONF_ELMAX_MODE,
CONF_ELMAX_MODE_CLOUD, CONF_ELMAX_MODE_CLOUD,
@ -23,6 +22,7 @@ from homeassistant.components.elmax.const import (
) )
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from . import ( from . import (
MOCK_DIRECT_CERT, MOCK_DIRECT_CERT,
@ -40,7 +40,7 @@ from . import (
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
MOCK_ZEROCONF_DISCOVERY_INFO = zeroconf.ZeroconfServiceInfo( MOCK_ZEROCONF_DISCOVERY_INFO = ZeroconfServiceInfo(
ip_address=MOCK_DIRECT_HOST, ip_address=MOCK_DIRECT_HOST,
ip_addresses=[MOCK_DIRECT_HOST], ip_addresses=[MOCK_DIRECT_HOST],
hostname="VideoBox.local", hostname="VideoBox.local",
@ -54,7 +54,7 @@ MOCK_ZEROCONF_DISCOVERY_INFO = zeroconf.ZeroconfServiceInfo(
}, },
type="_elmax-ssl._tcp", type="_elmax-ssl._tcp",
) )
MOCK_ZEROCONF_DISCOVERY_CHANGED_INFO = zeroconf.ZeroconfServiceInfo( MOCK_ZEROCONF_DISCOVERY_CHANGED_INFO = ZeroconfServiceInfo(
ip_address=MOCK_DIRECT_HOST_CHANGED, ip_address=MOCK_DIRECT_HOST_CHANGED,
ip_addresses=[MOCK_DIRECT_HOST_CHANGED], ip_addresses=[MOCK_DIRECT_HOST_CHANGED],
hostname="VideoBox.local", hostname="VideoBox.local",
@ -68,7 +68,7 @@ MOCK_ZEROCONF_DISCOVERY_CHANGED_INFO = zeroconf.ZeroconfServiceInfo(
}, },
type="_elmax-ssl._tcp", type="_elmax-ssl._tcp",
) )
MOCK_ZEROCONF_DISCOVERY_INFO_NOT_SUPPORTED = zeroconf.ZeroconfServiceInfo( MOCK_ZEROCONF_DISCOVERY_INFO_NOT_SUPPORTED = ZeroconfServiceInfo(
ip_address=MOCK_DIRECT_HOST, ip_address=MOCK_DIRECT_HOST,
ip_addresses=[MOCK_DIRECT_HOST], ip_addresses=[MOCK_DIRECT_HOST],
hostname="VideoBox.local", hostname="VideoBox.local",

View File

@ -6,15 +6,15 @@ from aioemonitor.monitor import EmonitorNetwork, EmonitorStatus
import aiohttp import aiohttp
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import dhcp
from homeassistant.components.emonitor.const import DOMAIN from homeassistant.components.emonitor.const import DOMAIN
from homeassistant.const import CONF_HOST from homeassistant.const import CONF_HOST
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.dhcp import DhcpServiceInfo
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
DHCP_SERVICE_INFO = dhcp.DhcpServiceInfo( DHCP_SERVICE_INFO = DhcpServiceInfo(
hostname="emonitor", hostname="emonitor",
ip="1.2.3.4", ip="1.2.3.4",
macaddress="aabbccddeeff", macaddress="aabbccddeeff",

View File

@ -7,7 +7,6 @@ from unittest.mock import AsyncMock
from pyenphase import EnvoyAuthenticationError, EnvoyError from pyenphase import EnvoyAuthenticationError, EnvoyError
import pytest import pytest
from homeassistant.components import zeroconf
from homeassistant.components.enphase_envoy.const import ( from homeassistant.components.enphase_envoy.const import (
DOMAIN, DOMAIN,
OPTION_DIAGNOSTICS_INCLUDE_FIXTURES, OPTION_DIAGNOSTICS_INCLUDE_FIXTURES,
@ -19,6 +18,7 @@ from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF
from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PASSWORD, CONF_USERNAME from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PASSWORD, CONF_USERNAME
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from . import setup_integration from . import setup_integration
@ -163,7 +163,7 @@ async def test_zeroconf(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": SOURCE_ZEROCONF}, context={"source": SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("1.1.1.1"), ip_address=ip_address("1.1.1.1"),
ip_addresses=[ip_address("1.1.1.1")], ip_addresses=[ip_address("1.1.1.1")],
hostname="mock_hostname", hostname="mock_hostname",
@ -273,7 +273,7 @@ async def test_zeroconf_serial_already_exists(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": SOURCE_ZEROCONF}, context={"source": SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("4.4.4.4"), ip_address=ip_address("4.4.4.4"),
ip_addresses=[ip_address("4.4.4.4")], ip_addresses=[ip_address("4.4.4.4")],
hostname="mock_hostname", hostname="mock_hostname",
@ -301,7 +301,7 @@ async def test_zeroconf_serial_already_exists_ignores_ipv6(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": SOURCE_ZEROCONF}, context={"source": SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("fd00::b27c:63bb:cc85:4ea0"), ip_address=ip_address("fd00::b27c:63bb:cc85:4ea0"),
ip_addresses=[ip_address("fd00::b27c:63bb:cc85:4ea0")], ip_addresses=[ip_address("fd00::b27c:63bb:cc85:4ea0")],
hostname="mock_hostname", hostname="mock_hostname",
@ -330,7 +330,7 @@ async def test_zeroconf_host_already_exists(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": SOURCE_ZEROCONF}, context={"source": SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("1.1.1.1"), ip_address=ip_address("1.1.1.1"),
ip_addresses=[ip_address("1.1.1.1")], ip_addresses=[ip_address("1.1.1.1")],
hostname="mock_hostname", hostname="mock_hostname",
@ -363,7 +363,7 @@ async def test_zero_conf_while_form(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": SOURCE_ZEROCONF}, context={"source": SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("1.1.1.1"), ip_address=ip_address("1.1.1.1"),
ip_addresses=[ip_address("1.1.1.1")], ip_addresses=[ip_address("1.1.1.1")],
hostname="mock_hostname", hostname="mock_hostname",
@ -396,7 +396,7 @@ async def test_zero_conf_second_envoy_while_form(
result2 = await hass.config_entries.flow.async_init( result2 = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": SOURCE_ZEROCONF}, context={"source": SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("4.4.4.4"), ip_address=ip_address("4.4.4.4"),
ip_addresses=[ip_address("4.4.4.4")], ip_addresses=[ip_address("4.4.4.4")],
hostname="mock_hostname", hostname="mock_hostname",
@ -455,7 +455,7 @@ async def test_zero_conf_old_blank_entry(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": SOURCE_ZEROCONF}, context={"source": SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("1.1.1.1"), ip_address=ip_address("1.1.1.1"),
ip_addresses=[ip_address("1.1.1.1"), ip_address("1.1.1.2")], ip_addresses=[ip_address("1.1.1.1"), ip_address("1.1.1.2")],
hostname="mock_hostname", hostname="mock_hostname",
@ -496,7 +496,7 @@ async def test_zero_conf_old_blank_entry_standard_title(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": SOURCE_ZEROCONF}, context={"source": SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("1.1.1.1"), ip_address=ip_address("1.1.1.1"),
ip_addresses=[ip_address("1.1.1.1"), ip_address("1.1.1.2")], ip_addresses=[ip_address("1.1.1.1"), ip_address("1.1.1.2")],
hostname="mock_hostname", hostname="mock_hostname",
@ -537,7 +537,7 @@ async def test_zero_conf_old_blank_entry_user_title(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": SOURCE_ZEROCONF}, context={"source": SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("1.1.1.1"), ip_address=ip_address("1.1.1.1"),
ip_addresses=[ip_address("1.1.1.1"), ip_address("1.1.1.2")], ip_addresses=[ip_address("1.1.1.1"), ip_address("1.1.1.2")],
hostname="mock_hostname", hostname="mock_hostname",

View File

@ -18,7 +18,6 @@ import aiohttp
import pytest import pytest
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import dhcp, zeroconf
from homeassistant.components.esphome import dashboard from homeassistant.components.esphome import dashboard
from homeassistant.components.esphome.const import ( from homeassistant.components.esphome.const import (
CONF_ALLOW_SERVICE_CALLS, CONF_ALLOW_SERVICE_CALLS,
@ -30,8 +29,10 @@ from homeassistant.components.esphome.const import (
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.dhcp import DhcpServiceInfo
from homeassistant.helpers.service_info.hassio import HassioServiceInfo from homeassistant.helpers.service_info.hassio import HassioServiceInfo
from homeassistant.helpers.service_info.mqtt import MqttServiceInfo from homeassistant.helpers.service_info.mqtt import MqttServiceInfo
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from . import VALID_NOISE_PSK from . import VALID_NOISE_PSK
@ -126,7 +127,7 @@ async def test_user_sets_unique_id(
hass: HomeAssistant, mock_client, mock_setup_entry: None hass: HomeAssistant, mock_client, mock_setup_entry: None
) -> None: ) -> None:
"""Test that the user flow sets the unique id.""" """Test that the user flow sets the unique id."""
service_info = zeroconf.ZeroconfServiceInfo( service_info = ZeroconfServiceInfo(
ip_address=ip_address("192.168.43.183"), ip_address=ip_address("192.168.43.183"),
ip_addresses=[ip_address("192.168.43.183")], ip_addresses=[ip_address("192.168.43.183")],
hostname="test8266.local.", hostname="test8266.local.",
@ -205,7 +206,7 @@ async def test_user_causes_zeroconf_to_abort(
hass: HomeAssistant, mock_client, mock_setup_entry: None hass: HomeAssistant, mock_client, mock_setup_entry: None
) -> None: ) -> None:
"""Test that the user flow sets the unique id and aborts the zeroconf flow.""" """Test that the user flow sets the unique id and aborts the zeroconf flow."""
service_info = zeroconf.ZeroconfServiceInfo( service_info = ZeroconfServiceInfo(
ip_address=ip_address("192.168.43.183"), ip_address=ip_address("192.168.43.183"),
ip_addresses=[ip_address("192.168.43.183")], ip_addresses=[ip_address("192.168.43.183")],
hostname="test8266.local.", hostname="test8266.local.",
@ -568,7 +569,7 @@ async def test_discovery_initiation(
hass: HomeAssistant, mock_client, mock_setup_entry: None hass: HomeAssistant, mock_client, mock_setup_entry: None
) -> None: ) -> None:
"""Test discovery importing works.""" """Test discovery importing works."""
service_info = zeroconf.ZeroconfServiceInfo( service_info = ZeroconfServiceInfo(
ip_address=ip_address("192.168.43.183"), ip_address=ip_address("192.168.43.183"),
ip_addresses=[ip_address("192.168.43.183")], ip_addresses=[ip_address("192.168.43.183")],
hostname="test.local.", hostname="test.local.",
@ -601,7 +602,7 @@ async def test_discovery_no_mac(
hass: HomeAssistant, mock_client, mock_setup_entry: None hass: HomeAssistant, mock_client, mock_setup_entry: None
) -> None: ) -> None:
"""Test discovery aborted if old ESPHome without mac in zeroconf.""" """Test discovery aborted if old ESPHome without mac in zeroconf."""
service_info = zeroconf.ZeroconfServiceInfo( service_info = ZeroconfServiceInfo(
ip_address=ip_address("192.168.43.183"), ip_address=ip_address("192.168.43.183"),
ip_addresses=[ip_address("192.168.43.183")], ip_addresses=[ip_address("192.168.43.183")],
hostname="test8266.local.", hostname="test8266.local.",
@ -629,7 +630,7 @@ async def test_discovery_already_configured(
entry.add_to_hass(hass) entry.add_to_hass(hass)
service_info = zeroconf.ZeroconfServiceInfo( service_info = ZeroconfServiceInfo(
ip_address=ip_address("192.168.43.183"), ip_address=ip_address("192.168.43.183"),
ip_addresses=[ip_address("192.168.43.183")], ip_addresses=[ip_address("192.168.43.183")],
hostname="test8266.local.", hostname="test8266.local.",
@ -650,7 +651,7 @@ async def test_discovery_duplicate_data(
hass: HomeAssistant, mock_client: APIClient, mock_setup_entry: None hass: HomeAssistant, mock_client: APIClient, mock_setup_entry: None
) -> None: ) -> None:
"""Test discovery aborts if same mDNS packet arrives.""" """Test discovery aborts if same mDNS packet arrives."""
service_info = zeroconf.ZeroconfServiceInfo( service_info = ZeroconfServiceInfo(
ip_address=ip_address("192.168.43.183"), ip_address=ip_address("192.168.43.183"),
ip_addresses=[ip_address("192.168.43.183")], ip_addresses=[ip_address("192.168.43.183")],
hostname="test.local.", hostname="test.local.",
@ -685,7 +686,7 @@ async def test_discovery_updates_unique_id(
entry.add_to_hass(hass) entry.add_to_hass(hass)
service_info = zeroconf.ZeroconfServiceInfo( service_info = ZeroconfServiceInfo(
ip_address=ip_address("192.168.43.183"), ip_address=ip_address("192.168.43.183"),
ip_addresses=[ip_address("192.168.43.183")], ip_addresses=[ip_address("192.168.43.183")],
hostname="test8266.local.", hostname="test8266.local.",
@ -1056,7 +1057,7 @@ async def test_discovery_dhcp_updates_host(
) )
entry.add_to_hass(hass) entry.add_to_hass(hass)
service_info = dhcp.DhcpServiceInfo( service_info = DhcpServiceInfo(
ip="192.168.43.184", ip="192.168.43.184",
hostname="test8266", hostname="test8266",
macaddress="1122334455aa", macaddress="1122334455aa",
@ -1083,7 +1084,7 @@ async def test_discovery_dhcp_no_changes(
mock_client.device_info = AsyncMock(return_value=DeviceInfo(name="test8266")) mock_client.device_info = AsyncMock(return_value=DeviceInfo(name="test8266"))
service_info = dhcp.DhcpServiceInfo( service_info = DhcpServiceInfo(
ip="192.168.43.183", ip="192.168.43.183",
hostname="test8266", hostname="test8266",
macaddress="000000000000", macaddress="000000000000",
@ -1132,7 +1133,7 @@ async def test_zeroconf_encryption_key_via_dashboard(
mock_setup_entry: None, mock_setup_entry: None,
) -> None: ) -> None:
"""Test encryption key retrieved from dashboard.""" """Test encryption key retrieved from dashboard."""
service_info = zeroconf.ZeroconfServiceInfo( service_info = ZeroconfServiceInfo(
ip_address=ip_address("192.168.43.183"), ip_address=ip_address("192.168.43.183"),
ip_addresses=[ip_address("192.168.43.183")], ip_addresses=[ip_address("192.168.43.183")],
hostname="test8266.local.", hostname="test8266.local.",
@ -1198,7 +1199,7 @@ async def test_zeroconf_encryption_key_via_dashboard_with_api_encryption_prop(
mock_setup_entry: None, mock_setup_entry: None,
) -> None: ) -> None:
"""Test encryption key retrieved from dashboard with api_encryption property set.""" """Test encryption key retrieved from dashboard with api_encryption property set."""
service_info = zeroconf.ZeroconfServiceInfo( service_info = ZeroconfServiceInfo(
ip_address=ip_address("192.168.43.183"), ip_address=ip_address("192.168.43.183"),
ip_addresses=[ip_address("192.168.43.183")], ip_addresses=[ip_address("192.168.43.183")],
hostname="test8266.local.", hostname="test8266.local.",
@ -1264,7 +1265,7 @@ async def test_zeroconf_no_encryption_key_via_dashboard(
mock_setup_entry: None, mock_setup_entry: None,
) -> None: ) -> None:
"""Test encryption key not retrieved from dashboard.""" """Test encryption key not retrieved from dashboard."""
service_info = zeroconf.ZeroconfServiceInfo( service_info = ZeroconfServiceInfo(
ip_address=ip_address("192.168.43.183"), ip_address=ip_address("192.168.43.183"),
ip_addresses=[ip_address("192.168.43.183")], ip_addresses=[ip_address("192.168.43.183")],
hostname="test8266.local.", hostname="test8266.local.",

View File

@ -21,7 +21,6 @@ from aioesphomeapi import (
import pytest import pytest
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import dhcp
from homeassistant.components.esphome.const import ( from homeassistant.components.esphome.const import (
CONF_ALLOW_SERVICE_CALLS, CONF_ALLOW_SERVICE_CALLS,
CONF_DEVICE_NAME, CONF_DEVICE_NAME,
@ -37,6 +36,7 @@ from homeassistant.const import (
from homeassistant.core import HomeAssistant, ServiceCall from homeassistant.core import HomeAssistant, ServiceCall
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers import device_registry as dr, issue_registry as ir from homeassistant.helpers import device_registry as dr, issue_registry as ir
from homeassistant.helpers.service_info.dhcp import DhcpServiceInfo
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from .conftest import MockESPHomeDevice from .conftest import MockESPHomeDevice
@ -598,7 +598,7 @@ async def test_connection_aborted_wrong_device(
mock_client.disconnect = AsyncMock() mock_client.disconnect = AsyncMock()
caplog.clear() caplog.clear()
# Make sure discovery triggers a reconnect # Make sure discovery triggers a reconnect
service_info = dhcp.DhcpServiceInfo( service_info = DhcpServiceInfo(
ip="192.168.43.184", ip="192.168.43.184",
hostname="test", hostname="test",
macaddress="1122334455aa", macaddress="1122334455aa",

View File

@ -24,12 +24,12 @@ from flux_led.protocol import (
) )
from flux_led.scanner import FluxLEDDiscovery from flux_led.scanner import FluxLEDDiscovery
from homeassistant.components import dhcp
from homeassistant.components.flux_led.const import DOMAIN from homeassistant.components.flux_led.const import DOMAIN
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST, CONF_NAME from homeassistant.const import CONF_HOST, CONF_NAME
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import format_mac from homeassistant.helpers.device_registry import format_mac
from homeassistant.helpers.service_info.dhcp import DhcpServiceInfo
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -49,7 +49,7 @@ SHORT_MAC_ADDRESS = "DDEEFF"
DEFAULT_ENTRY_TITLE = f"{MODEL_DESCRIPTION} {SHORT_MAC_ADDRESS}" DEFAULT_ENTRY_TITLE = f"{MODEL_DESCRIPTION} {SHORT_MAC_ADDRESS}"
DHCP_DISCOVERY = dhcp.DhcpServiceInfo( DHCP_DISCOVERY = DhcpServiceInfo(
hostname=MODEL, hostname=MODEL,
ip=IP_ADDRESS, ip=IP_ADDRESS,
macaddress=format_mac(MAC_ADDRESS).replace(":", ""), macaddress=format_mac(MAC_ADDRESS).replace(":", ""),

View File

@ -7,7 +7,6 @@ from unittest.mock import patch
import pytest import pytest
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import dhcp
from homeassistant.components.flux_led.config_flow import FluxLedConfigFlow from homeassistant.components.flux_led.config_flow import FluxLedConfigFlow
from homeassistant.components.flux_led.const import ( from homeassistant.components.flux_led.const import (
CONF_CUSTOM_EFFECT_COLORS, CONF_CUSTOM_EFFECT_COLORS,
@ -27,6 +26,7 @@ from homeassistant.components.flux_led.const import (
from homeassistant.const import CONF_DEVICE, CONF_HOST, CONF_MODEL from homeassistant.const import CONF_DEVICE, CONF_HOST, CONF_MODEL
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.dhcp import DhcpServiceInfo
from . import ( from . import (
DEFAULT_ENTRY_TITLE, DEFAULT_ENTRY_TITLE,
@ -424,7 +424,7 @@ async def test_discovered_by_discovery_and_dhcp(hass: HomeAssistant) -> None:
result3 = await hass.config_entries.flow.async_init( result3 = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_DHCP}, context={"source": config_entries.SOURCE_DHCP},
data=dhcp.DhcpServiceInfo( data=DhcpServiceInfo(
hostname="any", hostname="any",
ip=IP_ADDRESS, ip=IP_ADDRESS,
macaddress="000000000000", macaddress="000000000000",

View File

@ -5,7 +5,6 @@ from unittest.mock import AsyncMock, MagicMock, patch
import pytest import pytest
from homeassistant.components import zeroconf
from homeassistant.components.forked_daapd.const import ( from homeassistant.components.forked_daapd.const import (
CONF_LIBRESPOT_JAVA_PORT, CONF_LIBRESPOT_JAVA_PORT,
CONF_MAX_PLAYLISTS, CONF_MAX_PLAYLISTS,
@ -19,6 +18,7 @@ from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.exceptions import PlatformNotReady from homeassistant.exceptions import PlatformNotReady
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -109,7 +109,7 @@ async def test_zeroconf_updates_title(
MockConfigEntry(domain=DOMAIN, data={CONF_HOST: "different host"}).add_to_hass(hass) MockConfigEntry(domain=DOMAIN, data={CONF_HOST: "different host"}).add_to_hass(hass)
config_entry.add_to_hass(hass) config_entry.add_to_hass(hass)
assert len(hass.config_entries.async_entries(DOMAIN)) == 2 assert len(hass.config_entries.async_entries(DOMAIN)) == 2
discovery_info = zeroconf.ZeroconfServiceInfo( discovery_info = ZeroconfServiceInfo(
ip_address=ip_address("192.168.1.1"), ip_address=ip_address("192.168.1.1"),
ip_addresses=[ip_address("192.168.1.1")], ip_addresses=[ip_address("192.168.1.1")],
hostname="mock_hostname", hostname="mock_hostname",
@ -146,7 +146,7 @@ async def test_config_flow_no_websocket(
async def test_config_flow_zeroconf_invalid(hass: HomeAssistant) -> None: async def test_config_flow_zeroconf_invalid(hass: HomeAssistant) -> None:
"""Test that an invalid zeroconf entry doesn't work.""" """Test that an invalid zeroconf entry doesn't work."""
# test with no discovery properties # test with no discovery properties
discovery_info = zeroconf.ZeroconfServiceInfo( discovery_info = ZeroconfServiceInfo(
ip_address=ip_address("127.0.0.1"), ip_address=ip_address("127.0.0.1"),
ip_addresses=[ip_address("127.0.0.1")], ip_addresses=[ip_address("127.0.0.1")],
hostname="mock_hostname", hostname="mock_hostname",
@ -161,7 +161,7 @@ async def test_config_flow_zeroconf_invalid(hass: HomeAssistant) -> None:
assert result["type"] is FlowResultType.ABORT assert result["type"] is FlowResultType.ABORT
assert result["reason"] == "not_forked_daapd" assert result["reason"] == "not_forked_daapd"
# test with forked-daapd version < 27 # test with forked-daapd version < 27
discovery_info = zeroconf.ZeroconfServiceInfo( discovery_info = ZeroconfServiceInfo(
ip_address=ip_address("127.0.0.1"), ip_address=ip_address("127.0.0.1"),
ip_addresses=[ip_address("127.0.0.1")], ip_addresses=[ip_address("127.0.0.1")],
hostname="mock_hostname", hostname="mock_hostname",
@ -176,7 +176,7 @@ async def test_config_flow_zeroconf_invalid(hass: HomeAssistant) -> None:
assert result["type"] is FlowResultType.ABORT assert result["type"] is FlowResultType.ABORT
assert result["reason"] == "not_forked_daapd" assert result["reason"] == "not_forked_daapd"
# test with verbose mtd-version from Firefly # test with verbose mtd-version from Firefly
discovery_info = zeroconf.ZeroconfServiceInfo( discovery_info = ZeroconfServiceInfo(
ip_address=ip_address("127.0.0.1"), ip_address=ip_address("127.0.0.1"),
ip_addresses=[ip_address("127.0.0.1")], ip_addresses=[ip_address("127.0.0.1")],
hostname="mock_hostname", hostname="mock_hostname",
@ -191,7 +191,7 @@ async def test_config_flow_zeroconf_invalid(hass: HomeAssistant) -> None:
assert result["type"] is FlowResultType.ABORT assert result["type"] is FlowResultType.ABORT
assert result["reason"] == "not_forked_daapd" assert result["reason"] == "not_forked_daapd"
# test with svn mtd-version from Firefly # test with svn mtd-version from Firefly
discovery_info = zeroconf.ZeroconfServiceInfo( discovery_info = ZeroconfServiceInfo(
ip_address=ip_address("127.0.0.1"), ip_address=ip_address("127.0.0.1"),
ip_addresses=[ip_address("127.0.0.1")], ip_addresses=[ip_address("127.0.0.1")],
hostname="mock_hostname", hostname="mock_hostname",
@ -209,7 +209,7 @@ async def test_config_flow_zeroconf_invalid(hass: HomeAssistant) -> None:
async def test_config_flow_zeroconf_valid(hass: HomeAssistant) -> None: async def test_config_flow_zeroconf_valid(hass: HomeAssistant) -> None:
"""Test that a valid zeroconf entry works.""" """Test that a valid zeroconf entry works."""
discovery_info = zeroconf.ZeroconfServiceInfo( discovery_info = ZeroconfServiceInfo(
ip_address=ip_address("192.168.1.1"), ip_address=ip_address("192.168.1.1"),
ip_addresses=[ip_address("192.168.1.1")], ip_addresses=[ip_address("192.168.1.1")],
hostname="mock_hostname", hostname="mock_hostname",

View File

@ -9,18 +9,18 @@ from freebox_api.exceptions import (
InvalidTokenError, InvalidTokenError,
) )
from homeassistant.components import zeroconf
from homeassistant.components.freebox.const import DOMAIN from homeassistant.components.freebox.const import DOMAIN
from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF
from homeassistant.const import CONF_HOST, CONF_PORT from homeassistant.const import CONF_HOST, CONF_PORT
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from .const import MOCK_HOST, MOCK_PORT from .const import MOCK_HOST, MOCK_PORT
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
MOCK_ZEROCONF_DATA = zeroconf.ZeroconfServiceInfo( MOCK_ZEROCONF_DATA = ZeroconfServiceInfo(
ip_address=ip_address("192.168.0.254"), ip_address=ip_address("192.168.0.254"),
ip_addresses=[ip_address("192.168.0.254")], ip_addresses=[ip_address("192.168.0.254")],
port=80, port=80,

View File

@ -1,6 +1,5 @@
"""Common stuff for Fritz!Tools tests.""" """Common stuff for Fritz!Tools tests."""
from homeassistant.components import ssdp
from homeassistant.components.fritz.const import DOMAIN from homeassistant.components.fritz.const import DOMAIN
from homeassistant.const import ( from homeassistant.const import (
CONF_DEVICES, CONF_DEVICES,
@ -13,6 +12,7 @@ from homeassistant.const import (
from homeassistant.helpers.service_info.ssdp import ( from homeassistant.helpers.service_info.ssdp import (
ATTR_UPNP_FRIENDLY_NAME, ATTR_UPNP_FRIENDLY_NAME,
ATTR_UPNP_UDN, ATTR_UPNP_UDN,
SsdpServiceInfo,
) )
ATTR_HOST = "host" ATTR_HOST = "host"
@ -944,7 +944,7 @@ MOCK_DEVICE_INFO = {
ATTR_HOST: MOCK_HOST, ATTR_HOST: MOCK_HOST,
ATTR_NEW_SERIAL_NUMBER: MOCK_SERIAL_NUMBER, ATTR_NEW_SERIAL_NUMBER: MOCK_SERIAL_NUMBER,
} }
MOCK_SSDP_DATA = ssdp.SsdpServiceInfo( MOCK_SSDP_DATA = SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location=f"https://{MOCK_IPS['fritz.box']}:12345/test", ssdp_location=f"https://{MOCK_IPS['fritz.box']}:12345/test",

View File

@ -10,7 +10,6 @@ from fritzconnection.core.exceptions import (
) )
import pytest import pytest
from homeassistant.components import ssdp
from homeassistant.components.device_tracker import ( from homeassistant.components.device_tracker import (
CONF_CONSIDER_HOME, CONF_CONSIDER_HOME,
DEFAULT_CONSIDER_HOME, DEFAULT_CONSIDER_HOME,
@ -33,6 +32,11 @@ from homeassistant.const import (
) )
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.ssdp import (
ATTR_UPNP_FRIENDLY_NAME,
ATTR_UPNP_UDN,
SsdpServiceInfo,
)
from .const import ( from .const import (
MOCK_FIRMWARE_INFO, MOCK_FIRMWARE_INFO,
@ -644,7 +648,7 @@ async def test_ssdp_already_in_progress_host(
MOCK_NO_UNIQUE_ID = dataclasses.replace(MOCK_SSDP_DATA) MOCK_NO_UNIQUE_ID = dataclasses.replace(MOCK_SSDP_DATA)
MOCK_NO_UNIQUE_ID.upnp = MOCK_NO_UNIQUE_ID.upnp.copy() MOCK_NO_UNIQUE_ID.upnp = MOCK_NO_UNIQUE_ID.upnp.copy()
del MOCK_NO_UNIQUE_ID.upnp[ssdp.ATTR_UPNP_UDN] del MOCK_NO_UNIQUE_ID.upnp[ATTR_UPNP_UDN]
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": SOURCE_SSDP}, data=MOCK_NO_UNIQUE_ID DOMAIN, context={"source": SOURCE_SSDP}, data=MOCK_NO_UNIQUE_ID
) )
@ -745,13 +749,13 @@ async def test_ssdp_ipv6_link_local(hass: HomeAssistant) -> None:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": SOURCE_SSDP}, context={"source": SOURCE_SSDP},
data=ssdp.SsdpServiceInfo( data=SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location="https://[fe80::1ff:fe23:4567:890a]:12345/test", ssdp_location="https://[fe80::1ff:fe23:4567:890a]:12345/test",
upnp={ upnp={
ssdp.ATTR_UPNP_FRIENDLY_NAME: "fake_name", ATTR_UPNP_FRIENDLY_NAME: "fake_name",
ssdp.ATTR_UPNP_UDN: "uuid:only-a-test", ATTR_UPNP_UDN: "uuid:only-a-test",
}, },
), ),
) )

View File

@ -9,7 +9,6 @@ from pyfritzhome import LoginError
import pytest import pytest
from requests.exceptions import HTTPError from requests.exceptions import HTTPError
from homeassistant.components import ssdp
from homeassistant.components.fritzbox.const import DOMAIN from homeassistant.components.fritzbox.const import DOMAIN
from homeassistant.config_entries import SOURCE_SSDP, SOURCE_USER from homeassistant.config_entries import SOURCE_SSDP, SOURCE_USER
from homeassistant.const import CONF_DEVICES, CONF_HOST, CONF_PASSWORD, CONF_USERNAME from homeassistant.const import CONF_DEVICES, CONF_HOST, CONF_PASSWORD, CONF_USERNAME
@ -18,6 +17,7 @@ from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.ssdp import ( from homeassistant.helpers.service_info.ssdp import (
ATTR_UPNP_FRIENDLY_NAME, ATTR_UPNP_FRIENDLY_NAME,
ATTR_UPNP_UDN, ATTR_UPNP_UDN,
SsdpServiceInfo,
) )
from .const import CONF_FAKE_NAME, MOCK_CONFIG from .const import CONF_FAKE_NAME, MOCK_CONFIG
@ -26,7 +26,7 @@ from tests.common import MockConfigEntry
MOCK_USER_DATA = MOCK_CONFIG[DOMAIN][CONF_DEVICES][0] MOCK_USER_DATA = MOCK_CONFIG[DOMAIN][CONF_DEVICES][0]
MOCK_SSDP_DATA = { MOCK_SSDP_DATA = {
"ip4_valid": ssdp.SsdpServiceInfo( "ip4_valid": SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location="https://10.0.0.1:12345/test", ssdp_location="https://10.0.0.1:12345/test",
@ -35,7 +35,7 @@ MOCK_SSDP_DATA = {
ATTR_UPNP_UDN: "uuid:only-a-test", ATTR_UPNP_UDN: "uuid:only-a-test",
}, },
), ),
"ip6_valid": ssdp.SsdpServiceInfo( "ip6_valid": SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location="https://[1234::1]:12345/test", ssdp_location="https://[1234::1]:12345/test",
@ -44,7 +44,7 @@ MOCK_SSDP_DATA = {
ATTR_UPNP_UDN: "uuid:only-a-test", ATTR_UPNP_UDN: "uuid:only-a-test",
}, },
), ),
"ip6_invalid": ssdp.SsdpServiceInfo( "ip6_invalid": SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location="https://[fe80::1%1]:12345/test", ssdp_location="https://[fe80::1%1]:12345/test",
@ -267,7 +267,7 @@ async def test_reconfigure_failed(hass: HomeAssistant, fritz: Mock) -> None:
async def test_ssdp( async def test_ssdp(
hass: HomeAssistant, hass: HomeAssistant,
fritz: Mock, fritz: Mock,
test_data: ssdp.SsdpServiceInfo, test_data: SsdpServiceInfo,
expected_result: str, expected_result: str,
) -> None: ) -> None:
"""Test starting a flow from discovery.""" """Test starting a flow from discovery."""

View File

@ -6,7 +6,6 @@ from afsapi import ConnectionError, InvalidPinException, NotImplementedException
import pytest import pytest
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import ssdp
from homeassistant.components.frontier_silicon.const import ( from homeassistant.components.frontier_silicon.const import (
CONF_WEBFSAPI_URL, CONF_WEBFSAPI_URL,
DEFAULT_PIN, DEFAULT_PIN,
@ -15,13 +14,14 @@ from homeassistant.components.frontier_silicon.const import (
from homeassistant.const import CONF_HOST, CONF_PIN, CONF_PORT from homeassistant.const import CONF_HOST, CONF_PIN, CONF_PORT
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.ssdp import SsdpServiceInfo
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
pytestmark = pytest.mark.usefixtures("mock_setup_entry") pytestmark = pytest.mark.usefixtures("mock_setup_entry")
MOCK_DISCOVERY = ssdp.SsdpServiceInfo( MOCK_DISCOVERY = SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_udn="uuid:3dcc7100-f76c-11dd-87af-00226124ca30", ssdp_udn="uuid:3dcc7100-f76c-11dd-87af-00226124ca30",
ssdp_st="mock_st", ssdp_st="mock_st",
@ -30,7 +30,7 @@ MOCK_DISCOVERY = ssdp.SsdpServiceInfo(
upnp={"SPEAKER-NAME": "Speaker Name"}, upnp={"SPEAKER-NAME": "Speaker Name"},
) )
INVALID_MOCK_DISCOVERY = ssdp.SsdpServiceInfo( INVALID_MOCK_DISCOVERY = SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_udn="uuid:3dcc7100-f76c-11dd-87af-00226124ca30", ssdp_udn="uuid:3dcc7100-f76c-11dd-87af-00226124ca30",
ssdp_st="mock_st", ssdp_st="mock_st",

View File

@ -2,11 +2,11 @@
from unittest.mock import AsyncMock, patch from unittest.mock import AsyncMock, patch
from homeassistant.components import dhcp
from homeassistant.components.goalzero.const import DEFAULT_NAME, DOMAIN from homeassistant.components.goalzero.const import DEFAULT_NAME, DOMAIN
from homeassistant.const import CONF_HOST, CONF_NAME from homeassistant.const import CONF_HOST, CONF_NAME
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import format_mac from homeassistant.helpers.device_registry import format_mac
from homeassistant.helpers.service_info.dhcp import DhcpServiceInfo
from tests.common import MockConfigEntry, load_fixture from tests.common import MockConfigEntry, load_fixture
from tests.test_util.aiohttp import AiohttpClientMocker from tests.test_util.aiohttp import AiohttpClientMocker
@ -19,7 +19,7 @@ CONF_DATA = {
CONF_NAME: DEFAULT_NAME, CONF_NAME: DEFAULT_NAME,
} }
CONF_DHCP_FLOW = dhcp.DhcpServiceInfo( CONF_DHCP_FLOW = DhcpServiceInfo(
ip=HOST, ip=HOST,
macaddress=format_mac("AA:BB:CC:DD:EE:FF").replace(":", ""), macaddress=format_mac("AA:BB:CC:DD:EE:FF").replace(":", ""),
hostname="yeti", hostname="yeti",

View File

@ -8,7 +8,6 @@ from ismartgate.common import ApiError
from ismartgate.const import GogoGate2ApiErrorCode from ismartgate.const import GogoGate2ApiErrorCode
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import dhcp, zeroconf
from homeassistant.components.gogogate2.const import ( from homeassistant.components.gogogate2.const import (
DEVICE_TYPE_GOGOGATE2, DEVICE_TYPE_GOGOGATE2,
DEVICE_TYPE_ISMARTGATE, DEVICE_TYPE_ISMARTGATE,
@ -23,6 +22,11 @@ from homeassistant.const import (
) )
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.dhcp import DhcpServiceInfo
from homeassistant.helpers.service_info.zeroconf import (
ATTR_PROPERTIES_ID,
ZeroconfServiceInfo,
)
from . import _mocked_ismartgate_closed_door_response from . import _mocked_ismartgate_closed_door_response
@ -105,13 +109,13 @@ async def test_form_homekit_unique_id_already_setup(hass: HomeAssistant) -> None
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_HOMEKIT}, context={"source": config_entries.SOURCE_HOMEKIT},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("1.2.3.4"), ip_address=ip_address("1.2.3.4"),
ip_addresses=[ip_address("1.2.3.4")], ip_addresses=[ip_address("1.2.3.4")],
hostname="mock_hostname", hostname="mock_hostname",
name="mock_name", name="mock_name",
port=None, port=None,
properties={zeroconf.ATTR_PROPERTIES_ID: MOCK_MAC_ADDR}, properties={ATTR_PROPERTIES_ID: MOCK_MAC_ADDR},
type="mock_type", type="mock_type",
), ),
) )
@ -133,13 +137,13 @@ async def test_form_homekit_unique_id_already_setup(hass: HomeAssistant) -> None
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_HOMEKIT}, context={"source": config_entries.SOURCE_HOMEKIT},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("1.2.3.4"), ip_address=ip_address("1.2.3.4"),
ip_addresses=[ip_address("1.2.3.4")], ip_addresses=[ip_address("1.2.3.4")],
hostname="mock_hostname", hostname="mock_hostname",
name="mock_name", name="mock_name",
port=None, port=None,
properties={zeroconf.ATTR_PROPERTIES_ID: MOCK_MAC_ADDR}, properties={ATTR_PROPERTIES_ID: MOCK_MAC_ADDR},
type="mock_type", type="mock_type",
), ),
) )
@ -158,13 +162,13 @@ async def test_form_homekit_ip_address_already_setup(hass: HomeAssistant) -> Non
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_HOMEKIT}, context={"source": config_entries.SOURCE_HOMEKIT},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("1.2.3.4"), ip_address=ip_address("1.2.3.4"),
ip_addresses=[ip_address("1.2.3.4")], ip_addresses=[ip_address("1.2.3.4")],
hostname="mock_hostname", hostname="mock_hostname",
name="mock_name", name="mock_name",
port=None, port=None,
properties={zeroconf.ATTR_PROPERTIES_ID: MOCK_MAC_ADDR}, properties={ATTR_PROPERTIES_ID: MOCK_MAC_ADDR},
type="mock_type", type="mock_type",
), ),
) )
@ -177,13 +181,13 @@ async def test_form_homekit_ip_address(hass: HomeAssistant) -> None:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_HOMEKIT}, context={"source": config_entries.SOURCE_HOMEKIT},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("1.2.3.4"), ip_address=ip_address("1.2.3.4"),
ip_addresses=[ip_address("1.2.3.4")], ip_addresses=[ip_address("1.2.3.4")],
hostname="mock_hostname", hostname="mock_hostname",
name="mock_name", name="mock_name",
port=None, port=None,
properties={zeroconf.ATTR_PROPERTIES_ID: MOCK_MAC_ADDR}, properties={ATTR_PROPERTIES_ID: MOCK_MAC_ADDR},
type="mock_type", type="mock_type",
), ),
) )
@ -213,7 +217,7 @@ async def test_discovered_dhcp(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_DHCP}, context={"source": config_entries.SOURCE_DHCP},
data=dhcp.DhcpServiceInfo( data=DhcpServiceInfo(
ip="1.2.3.4", macaddress=MOCK_MAC_ADDR, hostname="mock_hostname" ip="1.2.3.4", macaddress=MOCK_MAC_ADDR, hostname="mock_hostname"
), ),
) )
@ -260,13 +264,13 @@ async def test_discovered_by_homekit_and_dhcp(hass: HomeAssistant) -> None:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_HOMEKIT}, context={"source": config_entries.SOURCE_HOMEKIT},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("1.2.3.4"), ip_address=ip_address("1.2.3.4"),
ip_addresses=[ip_address("1.2.3.4")], ip_addresses=[ip_address("1.2.3.4")],
hostname="mock_hostname", hostname="mock_hostname",
name="mock_name", name="mock_name",
port=None, port=None,
properties={zeroconf.ATTR_PROPERTIES_ID: MOCK_MAC_ADDR}, properties={ATTR_PROPERTIES_ID: MOCK_MAC_ADDR},
type="mock_type", type="mock_type",
), ),
) )
@ -276,7 +280,7 @@ async def test_discovered_by_homekit_and_dhcp(hass: HomeAssistant) -> None:
result2 = await hass.config_entries.flow.async_init( result2 = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_DHCP}, context={"source": config_entries.SOURCE_DHCP},
data=dhcp.DhcpServiceInfo( data=DhcpServiceInfo(
ip="1.2.3.4", macaddress=MOCK_MAC_ADDR, hostname="mock_hostname" ip="1.2.3.4", macaddress=MOCK_MAC_ADDR, hostname="mock_hostname"
), ),
) )
@ -286,7 +290,7 @@ async def test_discovered_by_homekit_and_dhcp(hass: HomeAssistant) -> None:
result3 = await hass.config_entries.flow.async_init( result3 = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_DHCP}, context={"source": config_entries.SOURCE_DHCP},
data=dhcp.DhcpServiceInfo( data=DhcpServiceInfo(
ip="1.2.3.4", macaddress="00:00:00:00:00:00", hostname="mock_hostname" ip="1.2.3.4", macaddress="00:00:00:00:00:00", hostname="mock_hostname"
), ),
) )

View File

@ -7,7 +7,6 @@ from unittest.mock import patch
from aioguardian.errors import GuardianError from aioguardian.errors import GuardianError
import pytest import pytest
from homeassistant.components import dhcp, zeroconf
from homeassistant.components.guardian import CONF_UID, DOMAIN from homeassistant.components.guardian import CONF_UID, DOMAIN
from homeassistant.components.guardian.config_flow import ( from homeassistant.components.guardian.config_flow import (
async_get_pin_from_discovery_hostname, async_get_pin_from_discovery_hostname,
@ -17,6 +16,8 @@ from homeassistant.config_entries import SOURCE_DHCP, SOURCE_USER, SOURCE_ZEROCO
from homeassistant.const import CONF_IP_ADDRESS, CONF_PORT from homeassistant.const import CONF_IP_ADDRESS, CONF_PORT
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.dhcp import DhcpServiceInfo
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -82,7 +83,7 @@ async def test_step_user(hass: HomeAssistant, config: dict[str, Any]) -> None:
@pytest.mark.usefixtures("setup_guardian") @pytest.mark.usefixtures("setup_guardian")
async def test_step_zeroconf(hass: HomeAssistant) -> None: async def test_step_zeroconf(hass: HomeAssistant) -> None:
"""Test the zeroconf step.""" """Test the zeroconf step."""
zeroconf_data = zeroconf.ZeroconfServiceInfo( zeroconf_data = ZeroconfServiceInfo(
ip_address=ip_address("192.168.1.100"), ip_address=ip_address("192.168.1.100"),
ip_addresses=[ip_address("192.168.1.100")], ip_addresses=[ip_address("192.168.1.100")],
port=7777, port=7777,
@ -112,7 +113,7 @@ async def test_step_zeroconf(hass: HomeAssistant) -> None:
async def test_step_zeroconf_already_in_progress(hass: HomeAssistant) -> None: async def test_step_zeroconf_already_in_progress(hass: HomeAssistant) -> None:
"""Test the zeroconf step aborting because it's already in progress.""" """Test the zeroconf step aborting because it's already in progress."""
zeroconf_data = zeroconf.ZeroconfServiceInfo( zeroconf_data = ZeroconfServiceInfo(
ip_address=ip_address("192.168.1.100"), ip_address=ip_address("192.168.1.100"),
ip_addresses=[ip_address("192.168.1.100")], ip_addresses=[ip_address("192.168.1.100")],
port=7777, port=7777,
@ -138,7 +139,7 @@ async def test_step_zeroconf_already_in_progress(hass: HomeAssistant) -> None:
@pytest.mark.usefixtures("setup_guardian") @pytest.mark.usefixtures("setup_guardian")
async def test_step_dhcp(hass: HomeAssistant) -> None: async def test_step_dhcp(hass: HomeAssistant) -> None:
"""Test the dhcp step.""" """Test the dhcp step."""
dhcp_data = dhcp.DhcpServiceInfo( dhcp_data = DhcpServiceInfo(
ip="192.168.1.100", ip="192.168.1.100",
hostname="GVC1-ABCD.local.", hostname="GVC1-ABCD.local.",
macaddress="aabbccddeeff", macaddress="aabbccddeeff",
@ -164,7 +165,7 @@ async def test_step_dhcp(hass: HomeAssistant) -> None:
async def test_step_dhcp_already_in_progress(hass: HomeAssistant) -> None: async def test_step_dhcp_already_in_progress(hass: HomeAssistant) -> None:
"""Test the zeroconf step aborting because it's already in progress.""" """Test the zeroconf step aborting because it's already in progress."""
dhcp_data = dhcp.DhcpServiceInfo( dhcp_data = DhcpServiceInfo(
ip="192.168.1.100", ip="192.168.1.100",
hostname="GVC1-ABCD.local.", hostname="GVC1-ABCD.local.",
macaddress="aabbccddeeff", macaddress="aabbccddeeff",
@ -193,7 +194,7 @@ async def test_step_dhcp_already_setup_match_mac(hass: HomeAssistant) -> None:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": SOURCE_DHCP}, context={"source": SOURCE_DHCP},
data=dhcp.DhcpServiceInfo( data=DhcpServiceInfo(
ip="192.168.1.100", ip="192.168.1.100",
hostname="GVC1-ABCD.local.", hostname="GVC1-ABCD.local.",
macaddress="aabbccddabcd", macaddress="aabbccddabcd",
@ -215,7 +216,7 @@ async def test_step_dhcp_already_setup_match_ip(hass: HomeAssistant) -> None:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": SOURCE_DHCP}, context={"source": SOURCE_DHCP},
data=dhcp.DhcpServiceInfo( data=DhcpServiceInfo(
ip="192.168.1.100", ip="192.168.1.100",
hostname="GVC1-ABCD.local.", hostname="GVC1-ABCD.local.",
macaddress="aabbccddabcd", macaddress="aabbccddabcd",

View File

@ -5,12 +5,12 @@ from unittest.mock import AsyncMock, MagicMock, patch
import aiohttp import aiohttp
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import ssdp
from homeassistant.components.harmony.config_flow import CannotConnect from homeassistant.components.harmony.config_flow import CannotConnect
from homeassistant.components.harmony.const import DOMAIN, PREVIOUS_ACTIVE_ACTIVITY from homeassistant.components.harmony.const import DOMAIN, PREVIOUS_ACTIVE_ACTIVITY
from homeassistant.const import CONF_HOST, CONF_NAME from homeassistant.const import CONF_HOST, CONF_NAME
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.ssdp import SsdpServiceInfo
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -65,7 +65,7 @@ async def test_form_ssdp(hass: HomeAssistant) -> None:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_SSDP}, context={"source": config_entries.SOURCE_SSDP},
data=ssdp.SsdpServiceInfo( data=SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location="http://192.168.1.12:8088/description", ssdp_location="http://192.168.1.12:8088/description",
@ -120,7 +120,7 @@ async def test_form_ssdp_fails_to_get_remote_id(hass: HomeAssistant) -> None:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_SSDP}, context={"source": config_entries.SOURCE_SSDP},
data=ssdp.SsdpServiceInfo( data=SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location="http://192.168.1.12:8088/description", ssdp_location="http://192.168.1.12:8088/description",
@ -159,7 +159,7 @@ async def test_form_ssdp_aborts_before_checking_remoteid_if_host_known(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_SSDP}, context={"source": config_entries.SOURCE_SSDP},
data=ssdp.SsdpServiceInfo( data=SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location="http://2.2.2.2:8088/description", ssdp_location="http://2.2.2.2:8088/description",

View File

@ -24,7 +24,6 @@ from pyheos import (
import pytest import pytest
import pytest_asyncio import pytest_asyncio
from homeassistant.components import ssdp
from homeassistant.components.heos import ( from homeassistant.components.heos import (
CONF_PASSWORD, CONF_PASSWORD,
DOMAIN, DOMAIN,
@ -34,6 +33,16 @@ from homeassistant.components.heos import (
SourceManager, SourceManager,
) )
from homeassistant.const import CONF_HOST, CONF_USERNAME from homeassistant.const import CONF_HOST, CONF_USERNAME
from homeassistant.helpers.service_info.ssdp import (
ATTR_UPNP_DEVICE_TYPE,
ATTR_UPNP_FRIENDLY_NAME,
ATTR_UPNP_MANUFACTURER,
ATTR_UPNP_MODEL_NAME,
ATTR_UPNP_MODEL_NUMBER,
ATTR_UPNP_SERIAL,
ATTR_UPNP_UDN,
SsdpServiceInfo,
)
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -236,18 +245,18 @@ async def dispatcher_fixture() -> Dispatcher:
@pytest.fixture(name="discovery_data") @pytest.fixture(name="discovery_data")
def discovery_data_fixture() -> dict: def discovery_data_fixture() -> dict:
"""Return mock discovery data for testing.""" """Return mock discovery data for testing."""
return ssdp.SsdpServiceInfo( return SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location="http://127.0.0.1:60006/upnp/desc/aios_device/aios_device.xml", ssdp_location="http://127.0.0.1:60006/upnp/desc/aios_device/aios_device.xml",
upnp={ upnp={
ssdp.ATTR_UPNP_DEVICE_TYPE: "urn:schemas-denon-com:device:AiosDevice:1", ATTR_UPNP_DEVICE_TYPE: "urn:schemas-denon-com:device:AiosDevice:1",
ssdp.ATTR_UPNP_FRIENDLY_NAME: "Office", ATTR_UPNP_FRIENDLY_NAME: "Office",
ssdp.ATTR_UPNP_MANUFACTURER: "Denon", ATTR_UPNP_MANUFACTURER: "Denon",
ssdp.ATTR_UPNP_MODEL_NAME: "HEOS Drive", ATTR_UPNP_MODEL_NAME: "HEOS Drive",
ssdp.ATTR_UPNP_MODEL_NUMBER: "DWSA-10 4.0", ATTR_UPNP_MODEL_NUMBER: "DWSA-10 4.0",
ssdp.ATTR_UPNP_SERIAL: None, ATTR_UPNP_SERIAL: None,
ssdp.ATTR_UPNP_UDN: "uuid:e61de70c-2250-1c22-0080-0005cdf512be", ATTR_UPNP_UDN: "uuid:e61de70c-2250-1c22-0080-0005cdf512be",
}, },
) )
@ -255,18 +264,18 @@ def discovery_data_fixture() -> dict:
@pytest.fixture(name="discovery_data_bedroom") @pytest.fixture(name="discovery_data_bedroom")
def discovery_data_fixture_bedroom() -> dict: def discovery_data_fixture_bedroom() -> dict:
"""Return mock discovery data for testing.""" """Return mock discovery data for testing."""
return ssdp.SsdpServiceInfo( return SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="mock_st", ssdp_st="mock_st",
ssdp_location="http://127.0.0.2:60006/upnp/desc/aios_device/aios_device.xml", ssdp_location="http://127.0.0.2:60006/upnp/desc/aios_device/aios_device.xml",
upnp={ upnp={
ssdp.ATTR_UPNP_DEVICE_TYPE: "urn:schemas-denon-com:device:AiosDevice:1", ATTR_UPNP_DEVICE_TYPE: "urn:schemas-denon-com:device:AiosDevice:1",
ssdp.ATTR_UPNP_FRIENDLY_NAME: "Bedroom", ATTR_UPNP_FRIENDLY_NAME: "Bedroom",
ssdp.ATTR_UPNP_MANUFACTURER: "Denon", ATTR_UPNP_MANUFACTURER: "Denon",
ssdp.ATTR_UPNP_MODEL_NAME: "HEOS Drive", ATTR_UPNP_MODEL_NAME: "HEOS Drive",
ssdp.ATTR_UPNP_MODEL_NUMBER: "DWSA-10 4.0", ATTR_UPNP_MODEL_NUMBER: "DWSA-10 4.0",
ssdp.ATTR_UPNP_SERIAL: None, ATTR_UPNP_SERIAL: None,
ssdp.ATTR_UPNP_UDN: "uuid:e61de70c-2250-1c22-0080-0005cdf512be", ATTR_UPNP_UDN: "uuid:e61de70c-2250-1c22-0080-0005cdf512be",
}, },
) )

View File

@ -3,12 +3,13 @@
from pyheos import CommandAuthenticationError, CommandFailedError, HeosError from pyheos import CommandAuthenticationError, CommandFailedError, HeosError
import pytest import pytest
from homeassistant.components import heos, ssdp from homeassistant.components import heos
from homeassistant.components.heos.const import DOMAIN from homeassistant.components.heos.const import DOMAIN
from homeassistant.config_entries import SOURCE_SSDP, SOURCE_USER from homeassistant.config_entries import SOURCE_SSDP, SOURCE_USER
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.ssdp import SsdpServiceInfo
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -86,8 +87,8 @@ async def test_create_entry_when_friendly_name_valid(
async def test_discovery_shows_create_form( async def test_discovery_shows_create_form(
hass: HomeAssistant, hass: HomeAssistant,
controller, controller,
discovery_data: ssdp.SsdpServiceInfo, discovery_data: SsdpServiceInfo,
discovery_data_bedroom: ssdp.SsdpServiceInfo, discovery_data_bedroom: SsdpServiceInfo,
) -> None: ) -> None:
"""Test discovery shows form to confirm setup.""" """Test discovery shows form to confirm setup."""
@ -112,7 +113,7 @@ async def test_discovery_shows_create_form(
async def test_discovery_flow_aborts_already_setup( async def test_discovery_flow_aborts_already_setup(
hass: HomeAssistant, controller, discovery_data: ssdp.SsdpServiceInfo, config_entry hass: HomeAssistant, controller, discovery_data: SsdpServiceInfo, config_entry
) -> None: ) -> None:
"""Test discovery flow aborts when entry already setup.""" """Test discovery flow aborts when entry already setup."""
config_entry.add_to_hass(hass) config_entry.add_to_hass(hass)

View File

@ -15,7 +15,6 @@ from bleak.exc import BleakError
import pytest import pytest
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import zeroconf
from homeassistant.components.homekit_controller import config_flow from homeassistant.components.homekit_controller import config_flow
from homeassistant.components.homekit_controller.const import KNOWN_DEVICES from homeassistant.components.homekit_controller.const import KNOWN_DEVICES
from homeassistant.components.homekit_controller.storage import async_get_entity_storage from homeassistant.components.homekit_controller.storage import async_get_entity_storage
@ -23,6 +22,10 @@ from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers import device_registry as dr from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.service_info.bluetooth import BluetoothServiceInfo from homeassistant.helpers.service_info.bluetooth import BluetoothServiceInfo
from homeassistant.helpers.service_info.zeroconf import (
ATTR_PROPERTIES_ID,
ZeroconfServiceInfo,
)
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -176,9 +179,9 @@ def get_flow_context(
def get_device_discovery_info( def get_device_discovery_info(
device, upper_case_props=False, missing_csharp=False, paired=False device, upper_case_props=False, missing_csharp=False, paired=False
) -> zeroconf.ZeroconfServiceInfo: ) -> ZeroconfServiceInfo:
"""Turn a aiohomekit format zeroconf entry into a homeassistant one.""" """Turn a aiohomekit format zeroconf entry into a homeassistant one."""
result = zeroconf.ZeroconfServiceInfo( result = ZeroconfServiceInfo(
ip_address=ip_address("127.0.0.1"), ip_address=ip_address("127.0.0.1"),
ip_addresses=[ip_address("127.0.0.1")], ip_addresses=[ip_address("127.0.0.1")],
hostname=device.description.name, hostname=device.description.name,
@ -187,7 +190,7 @@ def get_device_discovery_info(
properties={ properties={
"md": device.description.model, "md": device.description.model,
"pv": "1.0", "pv": "1.0",
zeroconf.ATTR_PROPERTIES_ID: device.description.id, ATTR_PROPERTIES_ID: device.description.id,
"c#": device.description.config_num, "c#": device.description.config_num,
"s#": device.description.state_num, "s#": device.description.state_num,
"ff": "0", "ff": "0",
@ -330,7 +333,7 @@ async def test_id_missing(hass: HomeAssistant, controller) -> None:
discovery_info = get_device_discovery_info(device) discovery_info = get_device_discovery_info(device)
# Remove id from device # Remove id from device
del discovery_info.properties[zeroconf.ATTR_PROPERTIES_ID] del discovery_info.properties[ATTR_PROPERTIES_ID]
# Device is discovered # Device is discovered
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
@ -346,7 +349,7 @@ async def test_discovery_ignored_model(hass: HomeAssistant, controller) -> None:
"""Already paired.""" """Already paired."""
device = setup_mock_accessory(controller) device = setup_mock_accessory(controller)
discovery_info = get_device_discovery_info(device) discovery_info = get_device_discovery_info(device)
discovery_info.properties[zeroconf.ATTR_PROPERTIES_ID] = "AA:BB:CC:DD:EE:FF" discovery_info.properties[ATTR_PROPERTIES_ID] = "AA:BB:CC:DD:EE:FF"
discovery_info.properties["md"] = "HHKBridge1,1" discovery_info.properties["md"] = "HHKBridge1,1"
# Device is discovered # Device is discovered
@ -375,7 +378,7 @@ async def test_discovery_ignored_hk_bridge(
connections={(dr.CONNECTION_NETWORK_MAC, formatted_mac)}, connections={(dr.CONNECTION_NETWORK_MAC, formatted_mac)},
) )
discovery_info.properties[zeroconf.ATTR_PROPERTIES_ID] = "AA:BB:CC:DD:EE:FF" discovery_info.properties[ATTR_PROPERTIES_ID] = "AA:BB:CC:DD:EE:FF"
# Device is discovered # Device is discovered
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
@ -403,7 +406,7 @@ async def test_discovery_does_not_ignore_non_homekit(
connections={(dr.CONNECTION_NETWORK_MAC, formatted_mac)}, connections={(dr.CONNECTION_NETWORK_MAC, formatted_mac)},
) )
discovery_info.properties[zeroconf.ATTR_PROPERTIES_ID] = "AA:BB:CC:DD:EE:FF" discovery_info.properties[ATTR_PROPERTIES_ID] = "AA:BB:CC:DD:EE:FF"
# Device is discovered # Device is discovered
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
@ -582,7 +585,7 @@ async def test_discovery_already_configured_update_csharp(
# Set device as already paired # Set device as already paired
discovery_info.properties["sf"] = 0x00 discovery_info.properties["sf"] = 0x00
discovery_info.properties["c#"] = 99999 discovery_info.properties["c#"] = 99999
discovery_info.properties[zeroconf.ATTR_PROPERTIES_ID] = "AA:BB:CC:DD:EE:FF" discovery_info.properties[ATTR_PROPERTIES_ID] = "AA:BB:CC:DD:EE:FF"
# Device is discovered # Device is discovered
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
@ -967,7 +970,7 @@ async def test_discovery_dismiss_existing_flow_on_paired(
# Set device as already not paired # Set device as already not paired
discovery_info.properties["sf"] = 0x01 discovery_info.properties["sf"] = 0x01
discovery_info.properties["c#"] = 99999 discovery_info.properties["c#"] = 99999
discovery_info.properties[zeroconf.ATTR_PROPERTIES_ID] = "AA:BB:CC:DD:EE:FF" discovery_info.properties[ATTR_PROPERTIES_ID] = "AA:BB:CC:DD:EE:FF"
# Device is discovered # Device is discovered
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
@ -1201,7 +1204,7 @@ async def test_discovery_updates_ip_when_config_entry_set_up(
# Set device as already paired # Set device as already paired
discovery_info.properties["sf"] = 0x00 discovery_info.properties["sf"] = 0x00
discovery_info.properties[zeroconf.ATTR_PROPERTIES_ID] = "Aa:bB:cC:dD:eE:fF" discovery_info.properties[ATTR_PROPERTIES_ID] = "Aa:bB:cC:dD:eE:fF"
# Device is discovered # Device is discovered
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
@ -1239,7 +1242,7 @@ async def test_discovery_updates_ip_config_entry_not_set_up(
# Set device as already paired # Set device as already paired
discovery_info.properties["sf"] = 0x00 discovery_info.properties["sf"] = 0x00
discovery_info.properties[zeroconf.ATTR_PROPERTIES_ID] = "Aa:bB:cC:dD:eE:fF" discovery_info.properties[ATTR_PROPERTIES_ID] = "Aa:bB:cC:dD:eE:fF"
# Device is discovered # Device is discovered
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(

View File

@ -8,11 +8,12 @@ import pytest
from syrupy.assertion import SnapshotAssertion from syrupy.assertion import SnapshotAssertion
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import dhcp, zeroconf
from homeassistant.components.homewizard.const import DOMAIN from homeassistant.components.homewizard.const import DOMAIN
from homeassistant.const import CONF_IP_ADDRESS from homeassistant.const import CONF_IP_ADDRESS
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.dhcp import DhcpServiceInfo
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -54,7 +55,7 @@ async def test_discovery_flow_works(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_ZEROCONF}, context={"source": config_entries.SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("127.0.0.1"), ip_address=ip_address("127.0.0.1"),
ip_addresses=[ip_address("127.0.0.1")], ip_addresses=[ip_address("127.0.0.1")],
port=80, port=80,
@ -100,7 +101,7 @@ async def test_discovery_flow_during_onboarding(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_ZEROCONF}, context={"source": config_entries.SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("127.0.0.1"), ip_address=ip_address("127.0.0.1"),
ip_addresses=[ip_address("127.0.0.1")], ip_addresses=[ip_address("127.0.0.1")],
port=80, port=80,
@ -137,7 +138,7 @@ async def test_discovery_flow_during_onboarding_disabled_api(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_ZEROCONF}, context={"source": config_entries.SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("127.0.0.1"), ip_address=ip_address("127.0.0.1"),
ip_addresses=[ip_address("127.0.0.1")], ip_addresses=[ip_address("127.0.0.1")],
port=80, port=80,
@ -181,7 +182,7 @@ async def test_discovery_disabled_api(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_ZEROCONF}, context={"source": config_entries.SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("127.0.0.1"), ip_address=ip_address("127.0.0.1"),
ip_addresses=[ip_address("127.0.0.1")], ip_addresses=[ip_address("127.0.0.1")],
port=80, port=80,
@ -216,7 +217,7 @@ async def test_discovery_missing_data_in_service_info(hass: HomeAssistant) -> No
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_ZEROCONF}, context={"source": config_entries.SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("127.0.0.1"), ip_address=ip_address("127.0.0.1"),
ip_addresses=[ip_address("127.0.0.1")], ip_addresses=[ip_address("127.0.0.1")],
port=80, port=80,
@ -242,7 +243,7 @@ async def test_discovery_invalid_api(hass: HomeAssistant) -> None:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_ZEROCONF}, context={"source": config_entries.SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("127.0.0.1"), ip_address=ip_address("127.0.0.1"),
ip_addresses=[ip_address("127.0.0.1")], ip_addresses=[ip_address("127.0.0.1")],
port=80, port=80,
@ -274,7 +275,7 @@ async def test_dhcp_discovery_updates_entry(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_DHCP}, context={"source": config_entries.SOURCE_DHCP},
data=dhcp.DhcpServiceInfo( data=DhcpServiceInfo(
ip="1.0.0.127", ip="1.0.0.127",
hostname="HW-p1meter-aabbcc", hostname="HW-p1meter-aabbcc",
macaddress="5c2fafabcdef", macaddress="5c2fafabcdef",
@ -304,7 +305,7 @@ async def test_dhcp_discovery_updates_entry_fails(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_DHCP}, context={"source": config_entries.SOURCE_DHCP},
data=dhcp.DhcpServiceInfo( data=DhcpServiceInfo(
ip="1.0.0.127", ip="1.0.0.127",
hostname="HW-p1meter-aabbcc", hostname="HW-p1meter-aabbcc",
macaddress="5c2fafabcdef", macaddress="5c2fafabcdef",
@ -326,7 +327,7 @@ async def test_dhcp_discovery_ignores_unknown(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_DHCP}, context={"source": config_entries.SOURCE_DHCP},
data=dhcp.DhcpServiceInfo( data=DhcpServiceInfo(
ip="127.0.0.1", ip="127.0.0.1",
hostname="HW-p1meter-aabbcc", hostname="HW-p1meter-aabbcc",
macaddress="5c2fafabcdef", macaddress="5c2fafabcdef",
@ -350,7 +351,7 @@ async def test_discovery_flow_updates_new_ip(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context={"source": config_entries.SOURCE_ZEROCONF}, context={"source": config_entries.SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("1.0.0.127"), ip_address=ip_address("1.0.0.127"),
ip_addresses=[ip_address("1.0.0.127")], ip_addresses=[ip_address("1.0.0.127")],
port=80, port=80,

View File

@ -13,7 +13,6 @@ import requests_mock
from requests_mock import ANY from requests_mock import ANY
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import ssdp
from homeassistant.components.huawei_lte.const import CONF_UNAUTHENTICATED_MODE, DOMAIN from homeassistant.components.huawei_lte.const import CONF_UNAUTHENTICATED_MODE, DOMAIN
from homeassistant.const import ( from homeassistant.const import (
CONF_NAME, CONF_NAME,
@ -25,6 +24,18 @@ from homeassistant.const import (
) )
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers.service_info.ssdp import (
ATTR_UPNP_DEVICE_TYPE,
ATTR_UPNP_FRIENDLY_NAME,
ATTR_UPNP_MANUFACTURER,
ATTR_UPNP_MANUFACTURER_URL,
ATTR_UPNP_MODEL_NAME,
ATTR_UPNP_MODEL_NUMBER,
ATTR_UPNP_PRESENTATION_URL,
ATTR_UPNP_SERIAL,
ATTR_UPNP_UDN,
SsdpServiceInfo,
)
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -267,8 +278,8 @@ async def test_success(hass: HomeAssistant, login_requests_mock, scheme: str) ->
"text": "<response><devicename>Mock device</devicename></response>", "text": "<response><devicename>Mock device</devicename></response>",
}, },
{ {
ssdp.ATTR_UPNP_FRIENDLY_NAME: "Mobile Wi-Fi", ATTR_UPNP_FRIENDLY_NAME: "Mobile Wi-Fi",
ssdp.ATTR_UPNP_SERIAL: "00000000", ATTR_UPNP_SERIAL: "00000000",
}, },
{ {
"type": FlowResultType.FORM, "type": FlowResultType.FORM,
@ -283,8 +294,8 @@ async def test_success(hass: HomeAssistant, login_requests_mock, scheme: str) ->
"text": "<error><code>100002</code><message/></error>", "text": "<error><code>100002</code><message/></error>",
}, },
{ {
ssdp.ATTR_UPNP_FRIENDLY_NAME: "Mobile Wi-Fi", ATTR_UPNP_FRIENDLY_NAME: "Mobile Wi-Fi",
# No ssdp.ATTR_UPNP_SERIAL # No ATTR_UPNP_SERIAL
}, },
{ {
"type": FlowResultType.FORM, "type": FlowResultType.FORM,
@ -322,18 +333,18 @@ async def test_ssdp(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
context=context, context=context,
data=ssdp.SsdpServiceInfo( data=SsdpServiceInfo(
ssdp_usn="mock_usn", ssdp_usn="mock_usn",
ssdp_st="upnp:rootdevice", ssdp_st="upnp:rootdevice",
ssdp_location=f"{url}:60957/rootDesc.xml", ssdp_location=f"{url}:60957/rootDesc.xml",
upnp={ upnp={
ssdp.ATTR_UPNP_DEVICE_TYPE: "urn:schemas-upnp-org:device:InternetGatewayDevice:1", ATTR_UPNP_DEVICE_TYPE: "urn:schemas-upnp-org:device:InternetGatewayDevice:1",
ssdp.ATTR_UPNP_MANUFACTURER: "Huawei", ATTR_UPNP_MANUFACTURER: "Huawei",
ssdp.ATTR_UPNP_MANUFACTURER_URL: "http://www.huawei.com/", ATTR_UPNP_MANUFACTURER_URL: "http://www.huawei.com/",
ssdp.ATTR_UPNP_MODEL_NAME: "Huawei router", ATTR_UPNP_MODEL_NAME: "Huawei router",
ssdp.ATTR_UPNP_MODEL_NUMBER: "12345678", ATTR_UPNP_MODEL_NUMBER: "12345678",
ssdp.ATTR_UPNP_PRESENTATION_URL: url, ATTR_UPNP_PRESENTATION_URL: url,
ssdp.ATTR_UPNP_UDN: "uuid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", ATTR_UPNP_UDN: "uuid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
**upnp_data, **upnp_data,
}, },
), ),

View File

@ -9,12 +9,15 @@ import pytest
import voluptuous as vol import voluptuous as vol
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import zeroconf
from homeassistant.components.hue import config_flow, const from homeassistant.components.hue import config_flow, const
from homeassistant.components.hue.errors import CannotConnect from homeassistant.components.hue.errors import CannotConnect
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
from homeassistant.helpers import device_registry as dr from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.service_info.zeroconf import (
ATTR_PROPERTIES_ID,
ZeroconfServiceInfo,
)
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
from tests.test_util.aiohttp import AiohttpClientMocker, ClientError from tests.test_util.aiohttp import AiohttpClientMocker, ClientError
@ -424,13 +427,13 @@ async def test_bridge_homekit(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
const.DOMAIN, const.DOMAIN,
context={"source": config_entries.SOURCE_HOMEKIT}, context={"source": config_entries.SOURCE_HOMEKIT},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("0.0.0.0"), ip_address=ip_address("0.0.0.0"),
ip_addresses=[ip_address("0.0.0.0")], ip_addresses=[ip_address("0.0.0.0")],
hostname="mock_hostname", hostname="mock_hostname",
name="mock_name", name="mock_name",
port=None, port=None,
properties={zeroconf.ATTR_PROPERTIES_ID: "aa:bb:cc:dd:ee:ff"}, properties={ATTR_PROPERTIES_ID: "aa:bb:cc:dd:ee:ff"},
type="mock_type", type="mock_type",
), ),
) )
@ -474,13 +477,13 @@ async def test_bridge_homekit_already_configured(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
const.DOMAIN, const.DOMAIN,
context={"source": config_entries.SOURCE_HOMEKIT}, context={"source": config_entries.SOURCE_HOMEKIT},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("0.0.0.0"), ip_address=ip_address("0.0.0.0"),
ip_addresses=[ip_address("0.0.0.0")], ip_addresses=[ip_address("0.0.0.0")],
hostname="mock_hostname", hostname="mock_hostname",
name="mock_name", name="mock_name",
port=None, port=None,
properties={zeroconf.ATTR_PROPERTIES_ID: "aa:bb:cc:dd:ee:ff"}, properties={ATTR_PROPERTIES_ID: "aa:bb:cc:dd:ee:ff"},
type="mock_type", type="mock_type",
), ),
) )
@ -578,7 +581,7 @@ async def test_bridge_zeroconf(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
const.DOMAIN, const.DOMAIN,
context={"source": config_entries.SOURCE_ZEROCONF}, context={"source": config_entries.SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("192.168.1.217"), ip_address=ip_address("192.168.1.217"),
ip_addresses=[ip_address("192.168.1.217")], ip_addresses=[ip_address("192.168.1.217")],
port=443, port=443,
@ -614,7 +617,7 @@ async def test_bridge_zeroconf_already_exists(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
const.DOMAIN, const.DOMAIN,
context={"source": config_entries.SOURCE_ZEROCONF}, context={"source": config_entries.SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("192.168.1.217"), ip_address=ip_address("192.168.1.217"),
ip_addresses=[ip_address("192.168.1.217")], ip_addresses=[ip_address("192.168.1.217")],
port=443, port=443,
@ -639,7 +642,7 @@ async def test_bridge_zeroconf_ipv6(hass: HomeAssistant) -> None:
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
const.DOMAIN, const.DOMAIN,
context={"source": config_entries.SOURCE_ZEROCONF}, context={"source": config_entries.SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("fd00::eeb5:faff:fe84:b17d"), ip_address=ip_address("fd00::eeb5:faff:fe84:b17d"),
ip_addresses=[ip_address("fd00::eeb5:faff:fe84:b17d")], ip_addresses=[ip_address("fd00::eeb5:faff:fe84:b17d")],
port=443, port=443,
@ -687,7 +690,7 @@ async def test_bridge_connection_failed(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
const.DOMAIN, const.DOMAIN,
context={"source": config_entries.SOURCE_ZEROCONF}, context={"source": config_entries.SOURCE_ZEROCONF},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("1.2.3.4"), ip_address=ip_address("1.2.3.4"),
ip_addresses=[ip_address("1.2.3.4")], ip_addresses=[ip_address("1.2.3.4")],
port=443, port=443,
@ -708,13 +711,13 @@ async def test_bridge_connection_failed(
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
const.DOMAIN, const.DOMAIN,
context={"source": config_entries.SOURCE_HOMEKIT}, context={"source": config_entries.SOURCE_HOMEKIT},
data=zeroconf.ZeroconfServiceInfo( data=ZeroconfServiceInfo(
ip_address=ip_address("0.0.0.0"), ip_address=ip_address("0.0.0.0"),
ip_addresses=[ip_address("0.0.0.0")], ip_addresses=[ip_address("0.0.0.0")],
hostname="mock_hostname", hostname="mock_hostname",
name="mock_name", name="mock_name",
port=None, port=None,
properties={zeroconf.ATTR_PROPERTIES_ID: "aa:bb:cc:dd:ee:ff"}, properties={ATTR_PROPERTIES_ID: "aa:bb:cc:dd:ee:ff"},
type="mock_type", type="mock_type",
), ),
) )

View File

@ -3,32 +3,36 @@
from ipaddress import IPv4Address from ipaddress import IPv4Address
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import dhcp, zeroconf from homeassistant.helpers.service_info.dhcp import DhcpServiceInfo
from homeassistant.helpers.service_info.zeroconf import (
ATTR_PROPERTIES_ID,
ZeroconfServiceInfo,
)
MOCK_MAC = "AA::BB::CC::DD::EE::FF" MOCK_MAC = "AA::BB::CC::DD::EE::FF"
MOCK_SERIAL = "A1B2C3D4E5G6H7" MOCK_SERIAL = "A1B2C3D4E5G6H7"
HOMEKIT_DISCOVERY_GEN2 = zeroconf.ZeroconfServiceInfo( HOMEKIT_DISCOVERY_GEN2 = ZeroconfServiceInfo(
ip_address="1.2.3.4", ip_address="1.2.3.4",
ip_addresses=[IPv4Address("1.2.3.4")], ip_addresses=[IPv4Address("1.2.3.4")],
hostname="mock_hostname", hostname="mock_hostname",
name="Powerview Generation 2._hap._tcp.local.", name="Powerview Generation 2._hap._tcp.local.",
port=None, port=None,
properties={zeroconf.ATTR_PROPERTIES_ID: MOCK_MAC}, properties={ATTR_PROPERTIES_ID: MOCK_MAC},
type="mock_type", type="mock_type",
) )
HOMEKIT_DISCOVERY_GEN3 = zeroconf.ZeroconfServiceInfo( HOMEKIT_DISCOVERY_GEN3 = ZeroconfServiceInfo(
ip_address="1.2.3.4", ip_address="1.2.3.4",
ip_addresses=[IPv4Address("1.2.3.4")], ip_addresses=[IPv4Address("1.2.3.4")],
hostname="mock_hostname", hostname="mock_hostname",
name="Powerview Generation 3._hap._tcp.local.", name="Powerview Generation 3._hap._tcp.local.",
port=None, port=None,
properties={zeroconf.ATTR_PROPERTIES_ID: MOCK_MAC}, properties={ATTR_PROPERTIES_ID: MOCK_MAC},
type="mock_type", type="mock_type",
) )
ZEROCONF_DISCOVERY_GEN2 = zeroconf.ZeroconfServiceInfo( ZEROCONF_DISCOVERY_GEN2 = ZeroconfServiceInfo(
ip_address="1.2.3.4", ip_address="1.2.3.4",
ip_addresses=[IPv4Address("1.2.3.4")], ip_addresses=[IPv4Address("1.2.3.4")],
hostname="mock_hostname", hostname="mock_hostname",
@ -38,7 +42,7 @@ ZEROCONF_DISCOVERY_GEN2 = zeroconf.ZeroconfServiceInfo(
type="mock_type", type="mock_type",
) )
ZEROCONF_DISCOVERY_GEN3 = zeroconf.ZeroconfServiceInfo( ZEROCONF_DISCOVERY_GEN3 = ZeroconfServiceInfo(
ip_address="1.2.3.4", ip_address="1.2.3.4",
ip_addresses=[IPv4Address("1.2.3.4")], ip_addresses=[IPv4Address("1.2.3.4")],
hostname="mock_hostname", hostname="mock_hostname",
@ -48,19 +52,19 @@ ZEROCONF_DISCOVERY_GEN3 = zeroconf.ZeroconfServiceInfo(
type="mock_type", type="mock_type",
) )
DHCP_DISCOVERY_GEN2 = dhcp.DhcpServiceInfo( DHCP_DISCOVERY_GEN2 = DhcpServiceInfo(
hostname="Powerview Generation 2", hostname="Powerview Generation 2",
ip="1.2.3.4", ip="1.2.3.4",
macaddress="aabbccddeeff", macaddress="aabbccddeeff",
) )
DHCP_DISCOVERY_GEN2_NO_NAME = dhcp.DhcpServiceInfo( DHCP_DISCOVERY_GEN2_NO_NAME = DhcpServiceInfo(
hostname="", hostname="",
ip="1.2.3.4", ip="1.2.3.4",
macaddress="aabbccddeeff", macaddress="aabbccddeeff",
) )
DHCP_DISCOVERY_GEN3 = dhcp.DhcpServiceInfo( DHCP_DISCOVERY_GEN3 = DhcpServiceInfo(
hostname="Powerview Generation 3", hostname="Powerview Generation 3",
ip="1.2.3.4", ip="1.2.3.4",
macaddress="aabbccddeeff", macaddress="aabbccddeeff",

View File

@ -5,12 +5,13 @@ from unittest.mock import MagicMock, patch
import pytest import pytest
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import dhcp, zeroconf
from homeassistant.components.hunterdouglas_powerview.const import DOMAIN from homeassistant.components.hunterdouglas_powerview.const import DOMAIN
from homeassistant.const import CONF_API_VERSION, CONF_HOST, CONF_NAME from homeassistant.const import CONF_API_VERSION, CONF_HOST, CONF_NAME
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResultType from homeassistant.data_entry_flow import FlowResultType
import homeassistant.helpers.entity_registry as er import homeassistant.helpers.entity_registry as er
from homeassistant.helpers.service_info.dhcp import DhcpServiceInfo
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from .const import DHCP_DATA, DISCOVERY_DATA, HOMEKIT_DATA, MOCK_SERIAL from .const import DHCP_DATA, DISCOVERY_DATA, HOMEKIT_DATA, MOCK_SERIAL
@ -65,7 +66,7 @@ async def test_form_homekit_and_dhcp_cannot_connect(
hass: HomeAssistant, hass: HomeAssistant,
mock_setup_entry: MagicMock, mock_setup_entry: MagicMock,
source: str, source: str,
discovery_info: dhcp.DhcpServiceInfo, discovery_info: DhcpServiceInfo,
api_version: int, api_version: int,
) -> None: ) -> None:
"""Test we get the form with homekit and dhcp source.""" """Test we get the form with homekit and dhcp source."""
@ -112,7 +113,7 @@ async def test_form_homekit_and_dhcp(
hass: HomeAssistant, hass: HomeAssistant,
mock_setup_entry: MagicMock, mock_setup_entry: MagicMock,
source: str, source: str,
discovery_info: dhcp.DhcpServiceInfo | zeroconf.ZeroconfServiceInfo, discovery_info: DhcpServiceInfo | ZeroconfServiceInfo,
api_version: int, api_version: int,
) -> None: ) -> None:
"""Test we get the form with homekit and dhcp source.""" """Test we get the form with homekit and dhcp source."""
@ -166,10 +167,10 @@ async def test_discovered_by_homekit_and_dhcp(
hass: HomeAssistant, hass: HomeAssistant,
mock_setup_entry: MagicMock, mock_setup_entry: MagicMock,
homekit_source: str, homekit_source: str,
homekit_discovery: zeroconf.ZeroconfServiceInfo, homekit_discovery: ZeroconfServiceInfo,
api_version: int, api_version: int,
dhcp_source: str, dhcp_source: str,
dhcp_discovery: dhcp.DhcpServiceInfo, dhcp_discovery: DhcpServiceInfo,
dhcp_api_version: int, dhcp_api_version: int,
) -> None: ) -> None:
"""Test we get the form with homekit and abort for dhcp source when we get both.""" """Test we get the form with homekit and abort for dhcp source when we get both."""

View File

@ -10,7 +10,6 @@ from unittest.mock import AsyncMock, Mock, patch
from hyperion import const from hyperion import const
from homeassistant.components import ssdp
from homeassistant.components.hyperion.const import ( from homeassistant.components.hyperion.const import (
CONF_AUTH_ID, CONF_AUTH_ID,
CONF_CREATE_TOKEN, CONF_CREATE_TOKEN,
@ -30,6 +29,7 @@ from homeassistant.const import (
) )
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResult, FlowResultType from homeassistant.data_entry_flow import FlowResult, FlowResultType
from homeassistant.helpers.service_info.ssdp import SsdpServiceInfo
from . import ( from . import (
TEST_AUTH_REQUIRED_RESP, TEST_AUTH_REQUIRED_RESP,
@ -67,7 +67,7 @@ TEST_REQUEST_TOKEN_FAIL = {
"error": "Token request timeout or denied", "error": "Token request timeout or denied",
} }
TEST_SSDP_SERVICE_INFO = ssdp.SsdpServiceInfo( TEST_SSDP_SERVICE_INFO = SsdpServiceInfo(
ssdp_st="upnp:rootdevice", ssdp_st="upnp:rootdevice",
ssdp_location=f"http://{TEST_HOST}:{TEST_PORT_UI}/description.xml", ssdp_location=f"http://{TEST_HOST}:{TEST_PORT_UI}/description.xml",
ssdp_usn=f"uuid:{TEST_SYSINFO_ID}", ssdp_usn=f"uuid:{TEST_SYSINFO_ID}",