core/tests/components/esphome/test_bluetooth.py

97 lines
3.6 KiB
Python

"""Test the ESPHome bluetooth integration."""
from unittest.mock import patch
from homeassistant.components import bluetooth
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr
from .conftest import MockESPHomeDevice
async def test_bluetooth_connect_with_raw_adv(
hass: HomeAssistant, mock_bluetooth_entry_with_raw_adv: MockESPHomeDevice
) -> None:
"""Test bluetooth connect with raw advertisements."""
scanner = bluetooth.async_scanner_by_source(hass, "11:22:33:44:55:AA")
assert scanner is not None
assert scanner.connectable is True
assert scanner.scanning is True
assert scanner.connector.can_connect() is False # no connection slots
await mock_bluetooth_entry_with_raw_adv.mock_disconnect(True)
await hass.async_block_till_done()
scanner = bluetooth.async_scanner_by_source(hass, "11:22:33:44:55:AA")
assert scanner is None
await mock_bluetooth_entry_with_raw_adv.mock_connect()
await hass.async_block_till_done()
scanner = bluetooth.async_scanner_by_source(hass, "11:22:33:44:55:AA")
assert scanner.scanning is True
async def test_bluetooth_connect_with_legacy_adv(
hass: HomeAssistant, mock_bluetooth_entry_with_legacy_adv: MockESPHomeDevice
) -> None:
"""Test bluetooth connect with legacy advertisements."""
scanner = bluetooth.async_scanner_by_source(hass, "11:22:33:44:55:AA")
assert scanner is not None
assert scanner.connectable is True
assert scanner.scanning is True
assert scanner.connector.can_connect() is False # no connection slots
await mock_bluetooth_entry_with_legacy_adv.mock_disconnect(True)
await hass.async_block_till_done()
scanner = bluetooth.async_scanner_by_source(hass, "11:22:33:44:55:AA")
assert scanner is None
await mock_bluetooth_entry_with_legacy_adv.mock_connect()
await hass.async_block_till_done()
scanner = bluetooth.async_scanner_by_source(hass, "11:22:33:44:55:AA")
assert scanner.scanning is True
async def test_bluetooth_device_linked_via_device(
hass: HomeAssistant,
mock_bluetooth_entry_with_raw_adv: MockESPHomeDevice,
device_registry: dr.DeviceRegistry,
) -> None:
"""Test the Bluetooth device is linked to the ESPHome device."""
scanner = bluetooth.async_scanner_by_source(hass, "11:22:33:44:55:AA")
assert scanner.connectable is True
entry = hass.config_entries.async_entry_for_domain_unique_id(
"bluetooth", "11:22:33:44:55:AA"
)
assert entry is not None
esp_device = device_registry.async_get_device(
connections={
(
dr.CONNECTION_NETWORK_MAC,
mock_bluetooth_entry_with_raw_adv.device_info.mac_address,
)
}
)
assert esp_device is not None
device = device_registry.async_get_device(
connections={(dr.CONNECTION_BLUETOOTH, "11:22:33:44:55:AA")}
)
assert device is not None
assert device.via_device_id == esp_device.id
async def test_bluetooth_cleanup_on_remove_entry(
hass: HomeAssistant, mock_bluetooth_entry_with_raw_adv: MockESPHomeDevice
) -> None:
"""Test bluetooth is cleaned up on entry removal."""
scanner = bluetooth.async_scanner_by_source(hass, "11:22:33:44:55:AA")
assert scanner.connectable is True
await hass.config_entries.async_unload(
mock_bluetooth_entry_with_raw_adv.entry.entry_id
)
with patch("homeassistant.components.esphome.async_remove_scanner") as remove_mock:
await hass.config_entries.async_remove(
mock_bluetooth_entry_with_raw_adv.entry.entry_id
)
await hass.async_block_till_done()
remove_mock.assert_called_once_with(hass, scanner.source)