Skip to content

Commit

Permalink
Fix manual specification of multiple advertise_ip with HomeKit (#95548)
Browse files Browse the repository at this point in the history
fixes #95508
  • Loading branch information
bdraco authored and balloob committed Jun 29, 2023
1 parent 8f88b71 commit 2a42622
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 1 deletion.
2 changes: 1 addition & 1 deletion homeassistant/components/homekit/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ def _has_all_unique_names_and_ports(
vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
vol.Optional(CONF_IP_ADDRESS): vol.All(ipaddress.ip_address, cv.string),
vol.Optional(CONF_ADVERTISE_IP): vol.All(
cv.ensure_list, ipaddress.ip_address, cv.string
cv.ensure_list, [ipaddress.ip_address], [cv.string]
),
vol.Optional(CONF_FILTER, default={}): BASE_FILTER_SCHEMA,
vol.Optional(CONF_ENTITY_CONFIG, default={}): validate_entity_config,
Expand Down
76 changes: 76 additions & 0 deletions tests/components/homekit/test_homekit.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from __future__ import annotations

import asyncio
from typing import Any
from unittest.mock import ANY, AsyncMock, MagicMock, Mock, patch
from uuid import uuid1

Expand All @@ -24,6 +25,7 @@
from homeassistant.components.homekit.const import (
BRIDGE_NAME,
BRIDGE_SERIAL_NUMBER,
CONF_ADVERTISE_IP,
DEFAULT_PORT,
DOMAIN,
HOMEKIT,
Expand Down Expand Up @@ -322,6 +324,80 @@ async def test_homekit_setup_ip_address(
)


async def test_homekit_with_single_advertise_ips(
hass: HomeAssistant,
hk_driver,
mock_async_zeroconf: None,
hass_storage: dict[str, Any],
) -> None:
"""Test setup with a single advertise ips."""
entry = MockConfigEntry(
domain=DOMAIN,
data={CONF_NAME: "mock_name", CONF_PORT: 12345, CONF_ADVERTISE_IP: "1.3.4.4"},
source=SOURCE_IMPORT,
)
entry.add_to_hass(hass)
with patch(f"{PATH_HOMEKIT}.HomeDriver", return_value=hk_driver) as mock_driver:
mock_driver.async_start = AsyncMock()
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()

mock_driver.assert_called_with(
hass,
entry.entry_id,
ANY,
entry.title,
loop=hass.loop,
address=[None],
port=ANY,
persist_file=ANY,
advertised_address="1.3.4.4",
async_zeroconf_instance=mock_async_zeroconf,
zeroconf_server=ANY,
loader=ANY,
iid_storage=ANY,
)


async def test_homekit_with_many_advertise_ips(
hass: HomeAssistant,
hk_driver,
mock_async_zeroconf: None,
hass_storage: dict[str, Any],
) -> None:
"""Test setup with many advertise ips."""
entry = MockConfigEntry(
domain=DOMAIN,
data={
CONF_NAME: "mock_name",
CONF_PORT: 12345,
CONF_ADVERTISE_IP: ["1.3.4.4", "4.3.2.2"],
},
source=SOURCE_IMPORT,
)
entry.add_to_hass(hass)
with patch(f"{PATH_HOMEKIT}.HomeDriver", return_value=hk_driver) as mock_driver:
mock_driver.async_start = AsyncMock()
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()

mock_driver.assert_called_with(
hass,
entry.entry_id,
ANY,
entry.title,
loop=hass.loop,
address=[None],
port=ANY,
persist_file=ANY,
advertised_address=["1.3.4.4", "4.3.2.2"],
async_zeroconf_instance=mock_async_zeroconf,
zeroconf_server=ANY,
loader=ANY,
iid_storage=ANY,
)


async def test_homekit_setup_advertise_ips(
hass: HomeAssistant, hk_driver, mock_async_zeroconf: None
) -> None:
Expand Down

0 comments on commit 2a42622

Please sign in to comment.