Add tests for Tuya dynamic add/remove device (#168824)

This commit is contained in:
epenet
2026-04-22 17:13:56 +02:00
committed by GitHub
parent a16f6f965e
commit ea3e8cf9b0
2 changed files with 87 additions and 1 deletions

View File

@@ -44,6 +44,22 @@ class MockDeviceListener(DeviceListener):
self.update_device(device, updated_status_properties, dp_timestamps)
await self.hass.async_block_till_done()
async def async_send_add_device(
self, manager: Manager, device: CustomerDevice
) -> None:
"""Mock add device from the manager."""
manager.device_map[device.id] = device
self.add_device(device)
await self.hass.async_block_till_done()
async def async_send_remove_device(
self, manager: Manager, device: CustomerDevice
) -> None:
"""Mock remove device from the manager."""
manager.device_map.pop(device.id, None)
self.remove_device(device.id)
await self.hass.async_block_till_done()
async def async_mock_online(self, device: CustomerDevice) -> None:
"""Mock online event from the manager."""
device.online = True

View File

@@ -18,7 +18,13 @@ from homeassistant.components.tuya.diagnostics import _REDACTED_DPCODES
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr, entity_registry as er
from . import DEVICE_MOCKS, create_device, create_manager, initialize_entry
from . import (
DEVICE_MOCKS,
MockDeviceListener,
create_device,
create_manager,
initialize_entry,
)
from tests.common import MockConfigEntry, async_load_json_object_fixture
@@ -136,6 +142,70 @@ async def test_device_registry(
)
async def test_dynamic_add_device(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_manager: Manager,
mock_listener: MockDeviceListener,
device_registry: dr.DeviceRegistry,
) -> None:
"""Ensure add device event works correctly."""
# Initialize with a single device
main_device = await create_device(hass, "mcs_8yhypbo7")
second_device = await create_device(hass, "clkg_y7j64p60glp8qpx7")
await initialize_entry(hass, mock_manager, mock_config_entry, [main_device])
all_entries = dr.async_entries_for_config_entry(
device_registry, mock_config_entry.entry_id
)
assert len(all_entries) == 1
# Trigger add second device from the manager
await mock_listener.async_send_add_device(mock_manager, second_device)
# Should now have two devices in the registry
all_entries = dr.async_entries_for_config_entry(
device_registry, mock_config_entry.entry_id
)
assert len(all_entries) == 2
assert any(
(DOMAIN, second_device.id) in device_registry_entry.identifiers
for device_registry_entry in all_entries
)
async def test_dynamic_remove_device(
hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
mock_manager: Manager,
mock_listener: MockDeviceListener,
device_registry: dr.DeviceRegistry,
) -> None:
"""Ensure remove device event works correctly."""
# Initialize with two devices
main_device = await create_device(hass, "mcs_8yhypbo7")
second_device = await create_device(hass, "clkg_y7j64p60glp8qpx7")
await initialize_entry(
hass, mock_manager, mock_config_entry, [main_device, second_device]
)
all_entries = dr.async_entries_for_config_entry(
device_registry, mock_config_entry.entry_id
)
assert len(all_entries) == 2
# Trigger remove second device from the manager
await mock_listener.async_send_remove_device(mock_manager, second_device)
# Only the main device should remain
all_entries = dr.async_entries_for_config_entry(
device_registry, mock_config_entry.entry_id
)
assert len(all_entries) == 1
assert (
device_registry.async_get_device(identifiers={(DOMAIN, main_device.id)})
in all_entries
)
async def test_fixtures_valid(hass: HomeAssistant) -> None:
"""Ensure Tuya fixture files are valid."""
# We want to ensure that the fixture files do not contain