Dynalite Integration (#27841)
* Initial commit * ran hassfest and gen_requirements_all scripts * fixes per request from Paulus Schoutsen * ran gen_requirements_all * updated library version - removed some debug leftover * get_requirements again... * added documentation URL * ran isort * changed storage in hass.data[DOMAIN] to use entry_id instead of host * adopted unit tests to latest fix * Update const.py Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
This commit is contained in:
parent
b78d156f0e
commit
4467409e5c
15 changed files with 672 additions and 0 deletions
136
tests/components/dynalite/test_bridge.py
Executable file
136
tests/components/dynalite/test_bridge.py
Executable file
|
@ -0,0 +1,136 @@
|
|||
"""Test Dynalite bridge."""
|
||||
from unittest.mock import Mock, call, patch
|
||||
|
||||
from dynalite_lib import CONF_ALL
|
||||
import pytest
|
||||
|
||||
from homeassistant.components.dynalite import DATA_CONFIGS, DOMAIN
|
||||
from homeassistant.components.dynalite.bridge import BridgeError, DynaliteBridge
|
||||
|
||||
from tests.common import mock_coro
|
||||
|
||||
|
||||
async def test_bridge_setup():
|
||||
"""Test a successful setup."""
|
||||
hass = Mock()
|
||||
entry = Mock()
|
||||
host = "1.2.3.4"
|
||||
entry.data = {"host": host}
|
||||
hass.data = {DOMAIN: {DATA_CONFIGS: {host: {}}}}
|
||||
dyn_bridge = DynaliteBridge(hass, entry)
|
||||
|
||||
with patch.object(
|
||||
dyn_bridge.dynalite_devices, "async_setup", return_value=mock_coro(True)
|
||||
):
|
||||
assert await dyn_bridge.async_setup() is True
|
||||
|
||||
forward_entries = set(
|
||||
c[1][1] for c in hass.config_entries.async_forward_entry_setup.mock_calls
|
||||
)
|
||||
hass.config_entries.async_forward_entry_setup.assert_called_once()
|
||||
assert forward_entries == set(["light"])
|
||||
|
||||
|
||||
async def test_invalid_host():
|
||||
"""Test without host in hass.data."""
|
||||
hass = Mock()
|
||||
entry = Mock()
|
||||
host = "1.2.3.4"
|
||||
entry.data = {"host": host}
|
||||
hass.data = {DOMAIN: {DATA_CONFIGS: {}}}
|
||||
|
||||
dyn_bridge = None
|
||||
with pytest.raises(BridgeError):
|
||||
dyn_bridge = DynaliteBridge(hass, entry)
|
||||
assert dyn_bridge is None
|
||||
|
||||
|
||||
async def test_add_devices_then_register():
|
||||
"""Test that add_devices work."""
|
||||
hass = Mock()
|
||||
entry = Mock()
|
||||
host = "1.2.3.4"
|
||||
entry.data = {"host": host}
|
||||
hass.data = {DOMAIN: {DATA_CONFIGS: {host: {}}}}
|
||||
dyn_bridge = DynaliteBridge(hass, entry)
|
||||
|
||||
device1 = Mock()
|
||||
device1.category = "light"
|
||||
device2 = Mock()
|
||||
device2.category = "switch"
|
||||
dyn_bridge.add_devices([device1, device2])
|
||||
reg_func = Mock()
|
||||
dyn_bridge.register_add_entities(reg_func)
|
||||
reg_func.assert_called_once()
|
||||
assert reg_func.mock_calls[0][1][0][0].device is device1
|
||||
|
||||
|
||||
async def test_register_then_add_devices():
|
||||
"""Test that add_devices work after register_add_entities."""
|
||||
hass = Mock()
|
||||
entry = Mock()
|
||||
host = "1.2.3.4"
|
||||
entry.data = {"host": host}
|
||||
hass.data = {DOMAIN: {DATA_CONFIGS: {host: {}}}}
|
||||
dyn_bridge = DynaliteBridge(hass, entry)
|
||||
|
||||
device1 = Mock()
|
||||
device1.category = "light"
|
||||
device2 = Mock()
|
||||
device2.category = "switch"
|
||||
reg_func = Mock()
|
||||
dyn_bridge.register_add_entities(reg_func)
|
||||
dyn_bridge.add_devices([device1, device2])
|
||||
reg_func.assert_called_once()
|
||||
assert reg_func.mock_calls[0][1][0][0].device is device1
|
||||
|
||||
|
||||
async def test_update_device():
|
||||
"""Test the update_device callback."""
|
||||
hass = Mock()
|
||||
entry = Mock()
|
||||
host = "1.2.3.4"
|
||||
entry.data = {"host": host}
|
||||
hass.data = {DOMAIN: {DATA_CONFIGS: {host: {}}}}
|
||||
dyn_bridge = DynaliteBridge(hass, entry)
|
||||
with patch.object(dyn_bridge, "dynalite_devices") as devices_mock:
|
||||
# Single device update
|
||||
device1 = Mock()
|
||||
device1.unique_id = "testing1"
|
||||
device2 = Mock()
|
||||
device2.unique_id = "testing2"
|
||||
dyn_bridge.all_entities = {
|
||||
device1.unique_id: device1,
|
||||
device2.unique_id: device2,
|
||||
}
|
||||
dyn_bridge.update_device(device1)
|
||||
device1.try_schedule_ha.assert_called_once()
|
||||
device2.try_schedule_ha.assert_not_called()
|
||||
# connected to network - all devices update
|
||||
devices_mock.available = True
|
||||
dyn_bridge.update_device(CONF_ALL)
|
||||
assert device1.try_schedule_ha.call_count == 2
|
||||
device2.try_schedule_ha.assert_called_once()
|
||||
# disconnected from network - all devices update
|
||||
devices_mock.available = False
|
||||
dyn_bridge.update_device(CONF_ALL)
|
||||
assert device1.try_schedule_ha.call_count == 3
|
||||
assert device2.try_schedule_ha.call_count == 2
|
||||
|
||||
|
||||
async def test_async_reset():
|
||||
"""Test async_reset."""
|
||||
hass = Mock()
|
||||
hass.config_entries.async_forward_entry_unload = Mock(
|
||||
return_value=mock_coro(Mock())
|
||||
)
|
||||
entry = Mock()
|
||||
host = "1.2.3.4"
|
||||
entry.data = {"host": host}
|
||||
hass.data = {DOMAIN: {DATA_CONFIGS: {host: {}}}}
|
||||
dyn_bridge = DynaliteBridge(hass, entry)
|
||||
await dyn_bridge.async_reset()
|
||||
hass.config_entries.async_forward_entry_unload.assert_called_once()
|
||||
assert hass.config_entries.async_forward_entry_unload.mock_calls[0] == call(
|
||||
entry, "light"
|
||||
)
|
Loading…
Add table
Add a link
Reference in a new issue