Remove deprecated (old) Z-Wave integration (#67221)
* Remove deprecated (old) Z-Wave integration * Mark migration tests as skip, for later cleanup
This commit is contained in:
parent
35261a9089
commit
2686be921c
106 changed files with 6 additions and 13535 deletions
|
@ -1,49 +1,8 @@
|
|||
"""Test config init."""
|
||||
|
||||
from unittest.mock import patch
|
||||
|
||||
from homeassistant.components import config
|
||||
from homeassistant.const import EVENT_COMPONENT_LOADED
|
||||
from homeassistant.setup import ATTR_COMPONENT, async_setup_component
|
||||
|
||||
from tests.common import mock_component
|
||||
from homeassistant.setup import async_setup_component
|
||||
|
||||
|
||||
async def test_config_setup(hass, loop):
|
||||
"""Test it sets up hassbian."""
|
||||
await async_setup_component(hass, "config", {})
|
||||
assert "config" in hass.config.components
|
||||
|
||||
|
||||
async def test_load_on_demand_already_loaded(hass, aiohttp_client):
|
||||
"""Test getting suites."""
|
||||
mock_component(hass, "zwave")
|
||||
|
||||
with patch.object(config, "SECTIONS", []), patch.object(
|
||||
config, "ON_DEMAND", ["zwave"]
|
||||
), patch(
|
||||
"homeassistant.components.config.zwave.async_setup", return_value=True
|
||||
) as stp:
|
||||
|
||||
await async_setup_component(hass, "config", {})
|
||||
|
||||
await hass.async_block_till_done()
|
||||
assert stp.called
|
||||
|
||||
|
||||
async def test_load_on_demand_on_load(hass, aiohttp_client):
|
||||
"""Test getting suites."""
|
||||
with patch.object(config, "SECTIONS", []), patch.object(
|
||||
config, "ON_DEMAND", ["zwave"]
|
||||
):
|
||||
await async_setup_component(hass, "config", {})
|
||||
|
||||
assert "config.zwave" not in hass.config.components
|
||||
|
||||
with patch(
|
||||
"homeassistant.components.config.zwave.async_setup", return_value=True
|
||||
) as stp:
|
||||
hass.bus.async_fire(EVENT_COMPONENT_LOADED, {ATTR_COMPONENT: "zwave"})
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert stp.called
|
||||
|
|
|
@ -1,542 +0,0 @@
|
|||
"""Test Z-Wave config panel."""
|
||||
from http import HTTPStatus
|
||||
import json
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from homeassistant.bootstrap import async_setup_component
|
||||
from homeassistant.components import config
|
||||
from homeassistant.components.zwave import DATA_NETWORK, const
|
||||
|
||||
from tests.mock.zwave import MockEntityValues, MockNode, MockValue
|
||||
|
||||
VIEW_NAME = "api:config:zwave:device_config"
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def client(loop, hass, hass_client):
|
||||
"""Client to communicate with Z-Wave config views."""
|
||||
with patch.object(config, "SECTIONS", ["zwave"]):
|
||||
loop.run_until_complete(async_setup_component(hass, "config", {}))
|
||||
|
||||
return loop.run_until_complete(hass_client())
|
||||
|
||||
|
||||
async def test_get_device_config(client):
|
||||
"""Test getting device config."""
|
||||
|
||||
def mock_read(path):
|
||||
"""Mock reading data."""
|
||||
return {"hello.beer": {"free": "beer"}, "other.entity": {"do": "something"}}
|
||||
|
||||
with patch("homeassistant.components.config._read", mock_read):
|
||||
resp = await client.get("/api/config/zwave/device_config/hello.beer")
|
||||
|
||||
assert resp.status == HTTPStatus.OK
|
||||
result = await resp.json()
|
||||
|
||||
assert result == {"free": "beer"}
|
||||
|
||||
|
||||
async def test_update_device_config(client):
|
||||
"""Test updating device config."""
|
||||
orig_data = {
|
||||
"hello.beer": {"ignored": True},
|
||||
"other.entity": {"polling_intensity": 2},
|
||||
}
|
||||
|
||||
def mock_read(path):
|
||||
"""Mock reading data."""
|
||||
return orig_data
|
||||
|
||||
written = []
|
||||
|
||||
def mock_write(path, data):
|
||||
"""Mock writing data."""
|
||||
written.append(data)
|
||||
|
||||
with patch("homeassistant.components.config._read", mock_read), patch(
|
||||
"homeassistant.components.config._write", mock_write
|
||||
):
|
||||
resp = await client.post(
|
||||
"/api/config/zwave/device_config/hello.beer",
|
||||
data=json.dumps({"polling_intensity": 2}),
|
||||
)
|
||||
|
||||
assert resp.status == HTTPStatus.OK
|
||||
result = await resp.json()
|
||||
assert result == {"result": "ok"}
|
||||
|
||||
orig_data["hello.beer"]["polling_intensity"] = 2
|
||||
|
||||
assert written[0] == orig_data
|
||||
|
||||
|
||||
async def test_update_device_config_invalid_key(client):
|
||||
"""Test updating device config."""
|
||||
resp = await client.post(
|
||||
"/api/config/zwave/device_config/invalid_entity",
|
||||
data=json.dumps({"polling_intensity": 2}),
|
||||
)
|
||||
|
||||
assert resp.status == HTTPStatus.BAD_REQUEST
|
||||
|
||||
|
||||
async def test_update_device_config_invalid_data(client):
|
||||
"""Test updating device config."""
|
||||
resp = await client.post(
|
||||
"/api/config/zwave/device_config/hello.beer",
|
||||
data=json.dumps({"invalid_option": 2}),
|
||||
)
|
||||
|
||||
assert resp.status == HTTPStatus.BAD_REQUEST
|
||||
|
||||
|
||||
async def test_update_device_config_invalid_json(client):
|
||||
"""Test updating device config."""
|
||||
resp = await client.post(
|
||||
"/api/config/zwave/device_config/hello.beer", data="not json"
|
||||
)
|
||||
|
||||
assert resp.status == HTTPStatus.BAD_REQUEST
|
||||
|
||||
|
||||
async def test_get_values(hass, client):
|
||||
"""Test getting values on node."""
|
||||
node = MockNode(node_id=1)
|
||||
value = MockValue(
|
||||
value_id=123456,
|
||||
node=node,
|
||||
label="Test Label",
|
||||
instance=1,
|
||||
index=2,
|
||||
poll_intensity=4,
|
||||
)
|
||||
values = MockEntityValues(primary=value)
|
||||
node2 = MockNode(node_id=2)
|
||||
value2 = MockValue(value_id=234567, node=node2, label="Test Label 2")
|
||||
values2 = MockEntityValues(primary=value2)
|
||||
hass.data[const.DATA_ENTITY_VALUES] = [values, values2]
|
||||
|
||||
resp = await client.get("/api/zwave/values/1")
|
||||
|
||||
assert resp.status == HTTPStatus.OK
|
||||
result = await resp.json()
|
||||
|
||||
assert result == {
|
||||
"123456": {
|
||||
"label": "Test Label",
|
||||
"instance": 1,
|
||||
"index": 2,
|
||||
"poll_intensity": 4,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async def test_get_groups(hass, client):
|
||||
"""Test getting groupdata on node."""
|
||||
network = hass.data[DATA_NETWORK] = MagicMock()
|
||||
node = MockNode(node_id=2)
|
||||
node.groups.associations = "assoc"
|
||||
node.groups.associations_instances = "inst"
|
||||
node.groups.label = "the label"
|
||||
node.groups.max_associations = "max"
|
||||
node.groups = {1: node.groups}
|
||||
network.nodes = {2: node}
|
||||
|
||||
resp = await client.get("/api/zwave/groups/2")
|
||||
|
||||
assert resp.status == HTTPStatus.OK
|
||||
result = await resp.json()
|
||||
|
||||
assert result == {
|
||||
"1": {
|
||||
"association_instances": "inst",
|
||||
"associations": "assoc",
|
||||
"label": "the label",
|
||||
"max_associations": "max",
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async def test_get_groups_nogroups(hass, client):
|
||||
"""Test getting groupdata on node with no groups."""
|
||||
network = hass.data[DATA_NETWORK] = MagicMock()
|
||||
node = MockNode(node_id=2)
|
||||
|
||||
network.nodes = {2: node}
|
||||
|
||||
resp = await client.get("/api/zwave/groups/2")
|
||||
|
||||
assert resp.status == HTTPStatus.OK
|
||||
result = await resp.json()
|
||||
|
||||
assert result == {}
|
||||
|
||||
|
||||
async def test_get_groups_nonode(hass, client):
|
||||
"""Test getting groupdata on nonexisting node."""
|
||||
network = hass.data[DATA_NETWORK] = MagicMock()
|
||||
network.nodes = {1: 1, 5: 5}
|
||||
|
||||
resp = await client.get("/api/zwave/groups/2")
|
||||
|
||||
assert resp.status == HTTPStatus.NOT_FOUND
|
||||
result = await resp.json()
|
||||
|
||||
assert result == {"message": "Node not found"}
|
||||
|
||||
|
||||
async def test_get_config(hass, client):
|
||||
"""Test getting config on node."""
|
||||
network = hass.data[DATA_NETWORK] = MagicMock()
|
||||
node = MockNode(node_id=2)
|
||||
value = MockValue(index=12, command_class=const.COMMAND_CLASS_CONFIGURATION)
|
||||
value.label = "label"
|
||||
value.help = "help"
|
||||
value.type = "type"
|
||||
value.data = "data"
|
||||
value.data_items = ["item1", "item2"]
|
||||
value.max = "max"
|
||||
value.min = "min"
|
||||
node.values = {12: value}
|
||||
network.nodes = {2: node}
|
||||
node.get_values.return_value = node.values
|
||||
|
||||
resp = await client.get("/api/zwave/config/2")
|
||||
|
||||
assert resp.status == HTTPStatus.OK
|
||||
result = await resp.json()
|
||||
|
||||
assert result == {
|
||||
"12": {
|
||||
"data": "data",
|
||||
"data_items": ["item1", "item2"],
|
||||
"help": "help",
|
||||
"label": "label",
|
||||
"max": "max",
|
||||
"min": "min",
|
||||
"type": "type",
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async def test_get_config_noconfig_node(hass, client):
|
||||
"""Test getting config on node without config."""
|
||||
network = hass.data[DATA_NETWORK] = MagicMock()
|
||||
node = MockNode(node_id=2)
|
||||
|
||||
network.nodes = {2: node}
|
||||
node.get_values.return_value = node.values
|
||||
|
||||
resp = await client.get("/api/zwave/config/2")
|
||||
|
||||
assert resp.status == HTTPStatus.OK
|
||||
result = await resp.json()
|
||||
|
||||
assert result == {}
|
||||
|
||||
|
||||
async def test_get_config_nonode(hass, client):
|
||||
"""Test getting config on nonexisting node."""
|
||||
network = hass.data[DATA_NETWORK] = MagicMock()
|
||||
network.nodes = {1: 1, 5: 5}
|
||||
|
||||
resp = await client.get("/api/zwave/config/2")
|
||||
|
||||
assert resp.status == HTTPStatus.NOT_FOUND
|
||||
result = await resp.json()
|
||||
|
||||
assert result == {"message": "Node not found"}
|
||||
|
||||
|
||||
async def test_get_usercodes_nonode(hass, client):
|
||||
"""Test getting usercodes on nonexisting node."""
|
||||
network = hass.data[DATA_NETWORK] = MagicMock()
|
||||
network.nodes = {1: 1, 5: 5}
|
||||
|
||||
resp = await client.get("/api/zwave/usercodes/2")
|
||||
|
||||
assert resp.status == HTTPStatus.NOT_FOUND
|
||||
result = await resp.json()
|
||||
|
||||
assert result == {"message": "Node not found"}
|
||||
|
||||
|
||||
async def test_get_usercodes(hass, client):
|
||||
"""Test getting usercodes on node."""
|
||||
network = hass.data[DATA_NETWORK] = MagicMock()
|
||||
node = MockNode(node_id=18, command_classes=[const.COMMAND_CLASS_USER_CODE])
|
||||
value = MockValue(index=0, command_class=const.COMMAND_CLASS_USER_CODE)
|
||||
value.genre = const.GENRE_USER
|
||||
value.label = "label"
|
||||
value.data = "1234"
|
||||
node.values = {0: value}
|
||||
network.nodes = {18: node}
|
||||
node.get_values.return_value = node.values
|
||||
|
||||
resp = await client.get("/api/zwave/usercodes/18")
|
||||
|
||||
assert resp.status == HTTPStatus.OK
|
||||
result = await resp.json()
|
||||
|
||||
assert result == {"0": {"code": "1234", "label": "label", "length": 4}}
|
||||
|
||||
|
||||
async def test_get_usercode_nousercode_node(hass, client):
|
||||
"""Test getting usercodes on node without usercodes."""
|
||||
network = hass.data[DATA_NETWORK] = MagicMock()
|
||||
node = MockNode(node_id=18)
|
||||
|
||||
network.nodes = {18: node}
|
||||
node.get_values.return_value = node.values
|
||||
|
||||
resp = await client.get("/api/zwave/usercodes/18")
|
||||
|
||||
assert resp.status == HTTPStatus.OK
|
||||
result = await resp.json()
|
||||
|
||||
assert result == {}
|
||||
|
||||
|
||||
async def test_get_usercodes_no_genreuser(hass, client):
|
||||
"""Test getting usercodes on node missing genre user."""
|
||||
network = hass.data[DATA_NETWORK] = MagicMock()
|
||||
node = MockNode(node_id=18, command_classes=[const.COMMAND_CLASS_USER_CODE])
|
||||
value = MockValue(index=0, command_class=const.COMMAND_CLASS_USER_CODE)
|
||||
value.genre = const.GENRE_SYSTEM
|
||||
value.label = "label"
|
||||
value.data = "1234"
|
||||
node.values = {0: value}
|
||||
network.nodes = {18: node}
|
||||
node.get_values.return_value = node.values
|
||||
|
||||
resp = await client.get("/api/zwave/usercodes/18")
|
||||
|
||||
assert resp.status == HTTPStatus.OK
|
||||
result = await resp.json()
|
||||
|
||||
assert result == {}
|
||||
|
||||
|
||||
async def test_save_config_no_network(hass, client):
|
||||
"""Test saving configuration without network data."""
|
||||
resp = await client.post("/api/zwave/saveconfig")
|
||||
|
||||
assert resp.status == HTTPStatus.NOT_FOUND
|
||||
result = await resp.json()
|
||||
assert result == {"message": "No Z-Wave network data found"}
|
||||
|
||||
|
||||
async def test_save_config(hass, client):
|
||||
"""Test saving configuration."""
|
||||
network = hass.data[DATA_NETWORK] = MagicMock()
|
||||
|
||||
resp = await client.post("/api/zwave/saveconfig")
|
||||
|
||||
assert resp.status == HTTPStatus.OK
|
||||
result = await resp.json()
|
||||
assert network.write_config.called
|
||||
assert result == {"message": "Z-Wave configuration saved to file"}
|
||||
|
||||
|
||||
async def test_get_protection_values(hass, client):
|
||||
"""Test getting protection values on node."""
|
||||
network = hass.data[DATA_NETWORK] = MagicMock()
|
||||
node = MockNode(node_id=18, command_classes=[const.COMMAND_CLASS_PROTECTION])
|
||||
value = MockValue(
|
||||
value_id=123456,
|
||||
index=0,
|
||||
instance=1,
|
||||
command_class=const.COMMAND_CLASS_PROTECTION,
|
||||
)
|
||||
value.label = "Protection Test"
|
||||
value.data_items = [
|
||||
"Unprotected",
|
||||
"Protection by Sequence",
|
||||
"No Operation Possible",
|
||||
]
|
||||
value.data = "Unprotected"
|
||||
network.nodes = {18: node}
|
||||
node.value = value
|
||||
|
||||
node.get_protection_item.return_value = "Unprotected"
|
||||
node.get_protection_items.return_value = value.data_items
|
||||
node.get_protections.return_value = {value.value_id: "Object"}
|
||||
|
||||
resp = await client.get("/api/zwave/protection/18")
|
||||
|
||||
assert resp.status == HTTPStatus.OK
|
||||
result = await resp.json()
|
||||
assert node.get_protections.called
|
||||
assert node.get_protection_item.called
|
||||
assert node.get_protection_items.called
|
||||
assert result == {
|
||||
"value_id": "123456",
|
||||
"selected": "Unprotected",
|
||||
"options": ["Unprotected", "Protection by Sequence", "No Operation Possible"],
|
||||
}
|
||||
|
||||
|
||||
async def test_get_protection_values_nonexisting_node(hass, client):
|
||||
"""Test getting protection values on node with wrong nodeid."""
|
||||
network = hass.data[DATA_NETWORK] = MagicMock()
|
||||
node = MockNode(node_id=18, command_classes=[const.COMMAND_CLASS_PROTECTION])
|
||||
value = MockValue(
|
||||
value_id=123456,
|
||||
index=0,
|
||||
instance=1,
|
||||
command_class=const.COMMAND_CLASS_PROTECTION,
|
||||
)
|
||||
value.label = "Protection Test"
|
||||
value.data_items = [
|
||||
"Unprotected",
|
||||
"Protection by Sequence",
|
||||
"No Operation Possible",
|
||||
]
|
||||
value.data = "Unprotected"
|
||||
network.nodes = {17: node}
|
||||
node.value = value
|
||||
|
||||
resp = await client.get("/api/zwave/protection/18")
|
||||
|
||||
assert resp.status == HTTPStatus.NOT_FOUND
|
||||
result = await resp.json()
|
||||
assert not node.get_protections.called
|
||||
assert not node.get_protection_item.called
|
||||
assert not node.get_protection_items.called
|
||||
assert result == {"message": "Node not found"}
|
||||
|
||||
|
||||
async def test_get_protection_values_without_protectionclass(hass, client):
|
||||
"""Test getting protection values on node without protectionclass."""
|
||||
network = hass.data[DATA_NETWORK] = MagicMock()
|
||||
node = MockNode(node_id=18)
|
||||
value = MockValue(value_id=123456, index=0, instance=1)
|
||||
network.nodes = {18: node}
|
||||
node.value = value
|
||||
|
||||
resp = await client.get("/api/zwave/protection/18")
|
||||
|
||||
assert resp.status == HTTPStatus.OK
|
||||
result = await resp.json()
|
||||
assert not node.get_protections.called
|
||||
assert not node.get_protection_item.called
|
||||
assert not node.get_protection_items.called
|
||||
assert result == {}
|
||||
|
||||
|
||||
async def test_set_protection_value(hass, client):
|
||||
"""Test setting protection value on node."""
|
||||
network = hass.data[DATA_NETWORK] = MagicMock()
|
||||
node = MockNode(node_id=18, command_classes=[const.COMMAND_CLASS_PROTECTION])
|
||||
value = MockValue(
|
||||
value_id=123456,
|
||||
index=0,
|
||||
instance=1,
|
||||
command_class=const.COMMAND_CLASS_PROTECTION,
|
||||
)
|
||||
value.label = "Protection Test"
|
||||
value.data_items = [
|
||||
"Unprotected",
|
||||
"Protection by Sequence",
|
||||
"No Operation Possible",
|
||||
]
|
||||
value.data = "Unprotected"
|
||||
network.nodes = {18: node}
|
||||
node.value = value
|
||||
|
||||
resp = await client.post(
|
||||
"/api/zwave/protection/18",
|
||||
data=json.dumps({"value_id": "123456", "selection": "Protection by Sequence"}),
|
||||
)
|
||||
|
||||
assert resp.status == HTTPStatus.OK
|
||||
result = await resp.json()
|
||||
assert node.set_protection.called
|
||||
assert result == {"message": "Protection setting successfully set"}
|
||||
|
||||
|
||||
async def test_set_protection_value_failed(hass, client):
|
||||
"""Test setting protection value failed on node."""
|
||||
network = hass.data[DATA_NETWORK] = MagicMock()
|
||||
node = MockNode(node_id=18, command_classes=[const.COMMAND_CLASS_PROTECTION])
|
||||
value = MockValue(
|
||||
value_id=123456,
|
||||
index=0,
|
||||
instance=1,
|
||||
command_class=const.COMMAND_CLASS_PROTECTION,
|
||||
)
|
||||
value.label = "Protection Test"
|
||||
value.data_items = [
|
||||
"Unprotected",
|
||||
"Protection by Sequence",
|
||||
"No Operation Possible",
|
||||
]
|
||||
value.data = "Unprotected"
|
||||
network.nodes = {18: node}
|
||||
node.value = value
|
||||
node.set_protection.return_value = False
|
||||
|
||||
resp = await client.post(
|
||||
"/api/zwave/protection/18",
|
||||
data=json.dumps({"value_id": "123456", "selection": "Protecton by Sequence"}),
|
||||
)
|
||||
|
||||
assert resp.status == HTTPStatus.ACCEPTED
|
||||
result = await resp.json()
|
||||
assert node.set_protection.called
|
||||
assert result == {"message": "Protection setting did not complete"}
|
||||
|
||||
|
||||
async def test_set_protection_value_nonexisting_node(hass, client):
|
||||
"""Test setting protection value on nonexisting node."""
|
||||
network = hass.data[DATA_NETWORK] = MagicMock()
|
||||
node = MockNode(node_id=17, command_classes=[const.COMMAND_CLASS_PROTECTION])
|
||||
value = MockValue(
|
||||
value_id=123456,
|
||||
index=0,
|
||||
instance=1,
|
||||
command_class=const.COMMAND_CLASS_PROTECTION,
|
||||
)
|
||||
value.label = "Protection Test"
|
||||
value.data_items = [
|
||||
"Unprotected",
|
||||
"Protection by Sequence",
|
||||
"No Operation Possible",
|
||||
]
|
||||
value.data = "Unprotected"
|
||||
network.nodes = {17: node}
|
||||
node.value = value
|
||||
node.set_protection.return_value = False
|
||||
|
||||
resp = await client.post(
|
||||
"/api/zwave/protection/18",
|
||||
data=json.dumps({"value_id": "123456", "selection": "Protecton by Sequence"}),
|
||||
)
|
||||
|
||||
assert resp.status == HTTPStatus.NOT_FOUND
|
||||
result = await resp.json()
|
||||
assert not node.set_protection.called
|
||||
assert result == {"message": "Node not found"}
|
||||
|
||||
|
||||
async def test_set_protection_value_missing_class(hass, client):
|
||||
"""Test setting protection value on node without protectionclass."""
|
||||
network = hass.data[DATA_NETWORK] = MagicMock()
|
||||
node = MockNode(node_id=17)
|
||||
value = MockValue(value_id=123456, index=0, instance=1)
|
||||
network.nodes = {17: node}
|
||||
node.value = value
|
||||
node.set_protection.return_value = False
|
||||
|
||||
resp = await client.post(
|
||||
"/api/zwave/protection/17",
|
||||
data=json.dumps({"value_id": "123456", "selection": "Protecton by Sequence"}),
|
||||
)
|
||||
|
||||
assert resp.status == HTTPStatus.NOT_FOUND
|
||||
result = await resp.json()
|
||||
assert not node.set_protection.called
|
||||
assert result == {"message": "No protection commandclass on this node"}
|
|
@ -1 +0,0 @@
|
|||
"""Tests for the Z-Wave component."""
|
|
@ -1,80 +0,0 @@
|
|||
"""Fixtures for Z-Wave tests."""
|
||||
from unittest.mock import AsyncMock, MagicMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from homeassistant.components.zwave import const
|
||||
|
||||
from tests.components.light.conftest import mock_light_profiles # noqa: F401
|
||||
from tests.mock.zwave import MockNetwork, MockNode, MockOption, MockValue
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_openzwave():
|
||||
"""Mock out Open Z-Wave."""
|
||||
base_mock = MagicMock()
|
||||
libopenzwave = base_mock.libopenzwave
|
||||
libopenzwave.__file__ = "test"
|
||||
base_mock.network.ZWaveNetwork = MockNetwork
|
||||
base_mock.option.ZWaveOption = MockOption
|
||||
|
||||
with patch.dict(
|
||||
"sys.modules",
|
||||
{
|
||||
"libopenzwave": libopenzwave,
|
||||
"openzwave.option": base_mock.option,
|
||||
"openzwave.network": base_mock.network,
|
||||
"openzwave.group": base_mock.group,
|
||||
},
|
||||
):
|
||||
yield base_mock
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_discovery():
|
||||
"""Mock discovery."""
|
||||
discovery = MagicMock()
|
||||
discovery.async_load_platform = AsyncMock(return_value=None)
|
||||
yield discovery
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_import_module():
|
||||
"""Mock import module."""
|
||||
platform = MagicMock()
|
||||
mock_device = MagicMock()
|
||||
mock_device.name = "test_device"
|
||||
platform.get_device.return_value = mock_device
|
||||
|
||||
import_module = MagicMock()
|
||||
import_module.return_value = platform
|
||||
yield import_module
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_values():
|
||||
"""Mock values."""
|
||||
node = MockNode()
|
||||
mock_schema = {
|
||||
const.DISC_COMPONENT: "mock_component",
|
||||
const.DISC_VALUES: {
|
||||
const.DISC_PRIMARY: {const.DISC_COMMAND_CLASS: ["mock_primary_class"]},
|
||||
"secondary": {const.DISC_COMMAND_CLASS: ["mock_secondary_class"]},
|
||||
"optional": {
|
||||
const.DISC_COMMAND_CLASS: ["mock_optional_class"],
|
||||
const.DISC_OPTIONAL: True,
|
||||
},
|
||||
},
|
||||
}
|
||||
value_class = MagicMock()
|
||||
value_class.primary = MockValue(
|
||||
command_class="mock_primary_class", node=node, value_id=1000
|
||||
)
|
||||
value_class.secondary = MockValue(command_class="mock_secondary_class", node=node)
|
||||
value_class.duplicate_secondary = MockValue(
|
||||
command_class="mock_secondary_class", node=node
|
||||
)
|
||||
value_class.optional = MockValue(command_class="mock_optional_class", node=node)
|
||||
value_class.no_match_value = MockValue(command_class="mock_bad_class", node=node)
|
||||
|
||||
yield (node, value_class, mock_schema)
|
|
@ -1,103 +0,0 @@
|
|||
"""Test Z-Wave binary sensors."""
|
||||
import datetime
|
||||
from unittest.mock import patch
|
||||
|
||||
import pytest
|
||||
|
||||
from homeassistant.components.zwave import binary_sensor, const
|
||||
|
||||
from tests.mock.zwave import MockEntityValues, MockNode, MockValue, value_changed
|
||||
|
||||
# Integration is disabled
|
||||
pytest.skip("Integration has been disabled in the manifest", allow_module_level=True)
|
||||
|
||||
|
||||
def test_get_device_detects_none(mock_openzwave):
|
||||
"""Test device is not returned."""
|
||||
node = MockNode()
|
||||
value = MockValue(data=False, node=node)
|
||||
values = MockEntityValues(primary=value)
|
||||
|
||||
device = binary_sensor.get_device(node=node, values=values, node_config={})
|
||||
assert device is None
|
||||
|
||||
|
||||
def test_get_device_detects_trigger_sensor(mock_openzwave):
|
||||
"""Test device is a trigger sensor."""
|
||||
node = MockNode(manufacturer_id="013c", product_type="0002", product_id="0002")
|
||||
value = MockValue(data=False, node=node)
|
||||
values = MockEntityValues(primary=value)
|
||||
|
||||
device = binary_sensor.get_device(node=node, values=values, node_config={})
|
||||
assert isinstance(device, binary_sensor.ZWaveTriggerSensor)
|
||||
assert device.device_class == "motion"
|
||||
|
||||
|
||||
def test_get_device_detects_workaround_sensor(mock_openzwave):
|
||||
"""Test that workaround returns a binary sensor."""
|
||||
node = MockNode(manufacturer_id="010f", product_type="0b00")
|
||||
value = MockValue(
|
||||
data=False, node=node, command_class=const.COMMAND_CLASS_SENSOR_ALARM
|
||||
)
|
||||
values = MockEntityValues(primary=value)
|
||||
|
||||
device = binary_sensor.get_device(node=node, values=values, node_config={})
|
||||
assert isinstance(device, binary_sensor.ZWaveBinarySensor)
|
||||
|
||||
|
||||
def test_get_device_detects_sensor(mock_openzwave):
|
||||
"""Test that device returns a binary sensor."""
|
||||
node = MockNode()
|
||||
value = MockValue(
|
||||
data=False, node=node, command_class=const.COMMAND_CLASS_SENSOR_BINARY
|
||||
)
|
||||
values = MockEntityValues(primary=value)
|
||||
|
||||
device = binary_sensor.get_device(node=node, values=values, node_config={})
|
||||
assert isinstance(device, binary_sensor.ZWaveBinarySensor)
|
||||
|
||||
|
||||
def test_binary_sensor_value_changed(mock_openzwave):
|
||||
"""Test value changed for binary sensor."""
|
||||
node = MockNode()
|
||||
value = MockValue(
|
||||
data=False, node=node, command_class=const.COMMAND_CLASS_SENSOR_BINARY
|
||||
)
|
||||
values = MockEntityValues(primary=value)
|
||||
device = binary_sensor.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert not device.is_on
|
||||
|
||||
value.data = True
|
||||
value_changed(value)
|
||||
|
||||
assert device.is_on
|
||||
|
||||
|
||||
async def test_trigger_sensor_value_changed(hass, mock_openzwave):
|
||||
"""Test value changed for trigger sensor."""
|
||||
node = MockNode(manufacturer_id="013c", product_type="0002", product_id="0002")
|
||||
value = MockValue(data=False, node=node)
|
||||
value_off_delay = MockValue(data=15, node=node)
|
||||
values = MockEntityValues(primary=value, off_delay=value_off_delay)
|
||||
device = binary_sensor.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert not device.is_on
|
||||
|
||||
value.data = True
|
||||
await hass.async_add_executor_job(value_changed, value)
|
||||
assert device.invalidate_after is None
|
||||
|
||||
device.hass = hass
|
||||
|
||||
value.data = True
|
||||
await hass.async_add_executor_job(value_changed, value)
|
||||
assert device.is_on
|
||||
|
||||
test_time = device.invalidate_after - datetime.timedelta(seconds=1)
|
||||
with patch("homeassistant.util.dt.utcnow", return_value=test_time):
|
||||
assert device.is_on
|
||||
|
||||
test_time = device.invalidate_after
|
||||
with patch("homeassistant.util.dt.utcnow", return_value=test_time):
|
||||
assert not device.is_on
|
|
@ -1,893 +0,0 @@
|
|||
"""Test Z-Wave climate devices."""
|
||||
import pytest
|
||||
|
||||
from homeassistant.components.climate.const import (
|
||||
ATTR_TARGET_TEMP_HIGH,
|
||||
ATTR_TARGET_TEMP_LOW,
|
||||
CURRENT_HVAC_COOL,
|
||||
CURRENT_HVAC_HEAT,
|
||||
HVAC_MODE_COOL,
|
||||
HVAC_MODE_HEAT,
|
||||
HVAC_MODE_HEAT_COOL,
|
||||
HVAC_MODE_OFF,
|
||||
HVAC_MODES,
|
||||
PRESET_AWAY,
|
||||
PRESET_BOOST,
|
||||
PRESET_ECO,
|
||||
PRESET_NONE,
|
||||
SUPPORT_AUX_HEAT,
|
||||
SUPPORT_FAN_MODE,
|
||||
SUPPORT_PRESET_MODE,
|
||||
SUPPORT_SWING_MODE,
|
||||
SUPPORT_TARGET_TEMPERATURE,
|
||||
SUPPORT_TARGET_TEMPERATURE_RANGE,
|
||||
)
|
||||
from homeassistant.components.zwave import climate, const
|
||||
from homeassistant.components.zwave.climate import (
|
||||
AUX_HEAT_ZWAVE_MODE,
|
||||
DEFAULT_HVAC_MODES,
|
||||
)
|
||||
from homeassistant.const import ATTR_TEMPERATURE, TEMP_CELSIUS, TEMP_FAHRENHEIT
|
||||
|
||||
from tests.mock.zwave import MockEntityValues, MockNode, MockValue, value_changed
|
||||
|
||||
# Integration is disabled
|
||||
pytest.skip("Integration has been disabled in the manifest", allow_module_level=True)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def device(hass, mock_openzwave):
|
||||
"""Fixture to provide a precreated climate device."""
|
||||
node = MockNode()
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(
|
||||
command_class=const.COMMAND_CLASS_THERMOSTAT_MODE,
|
||||
data=HVAC_MODE_HEAT,
|
||||
data_items=[
|
||||
HVAC_MODE_OFF,
|
||||
HVAC_MODE_HEAT,
|
||||
HVAC_MODE_COOL,
|
||||
HVAC_MODE_HEAT_COOL,
|
||||
],
|
||||
node=node,
|
||||
),
|
||||
setpoint_heating=MockValue(data=1, node=node),
|
||||
setpoint_cooling=MockValue(data=10, node=node),
|
||||
temperature=MockValue(data=5, node=node, units=None),
|
||||
fan_mode=MockValue(data="test2", data_items=[3, 4, 5], node=node),
|
||||
operating_state=MockValue(data=CURRENT_HVAC_HEAT, node=node),
|
||||
fan_action=MockValue(data=7, node=node),
|
||||
)
|
||||
device = climate.get_device(hass, node=node, values=values, node_config={})
|
||||
|
||||
yield device
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def device_zxt_120(hass, mock_openzwave):
|
||||
"""Fixture to provide a precreated climate device."""
|
||||
node = MockNode(manufacturer_id="5254", product_id="8377")
|
||||
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(
|
||||
command_class=const.COMMAND_CLASS_THERMOSTAT_MODE,
|
||||
data=HVAC_MODE_HEAT,
|
||||
data_items=[
|
||||
HVAC_MODE_OFF,
|
||||
HVAC_MODE_HEAT,
|
||||
HVAC_MODE_COOL,
|
||||
HVAC_MODE_HEAT_COOL,
|
||||
],
|
||||
node=node,
|
||||
),
|
||||
setpoint_heating=MockValue(data=1, node=node),
|
||||
setpoint_cooling=MockValue(data=10, node=node),
|
||||
temperature=MockValue(data=5, node=node, units=None),
|
||||
fan_mode=MockValue(data="test2", data_items=[3, 4, 5], node=node),
|
||||
operating_state=MockValue(data=CURRENT_HVAC_HEAT, node=node),
|
||||
fan_action=MockValue(data=7, node=node),
|
||||
zxt_120_swing_mode=MockValue(data="test3", data_items=[6, 7, 8], node=node),
|
||||
)
|
||||
device = climate.get_device(hass, node=node, values=values, node_config={})
|
||||
|
||||
yield device
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def device_mapping(hass, mock_openzwave):
|
||||
"""Fixture to provide a precreated climate device. Test state mapping."""
|
||||
node = MockNode()
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(
|
||||
command_class=const.COMMAND_CLASS_THERMOSTAT_MODE,
|
||||
data="Heat",
|
||||
data_items=["Off", "Cool", "Heat", "Full Power", "Auto"],
|
||||
node=node,
|
||||
),
|
||||
setpoint_heating=MockValue(data=1, node=node),
|
||||
setpoint_cooling=MockValue(data=10, node=node),
|
||||
temperature=MockValue(data=5, node=node, units=None),
|
||||
fan_mode=MockValue(data="test2", data_items=[3, 4, 5], node=node),
|
||||
operating_state=MockValue(data="heating", node=node),
|
||||
fan_action=MockValue(data=7, node=node),
|
||||
)
|
||||
device = climate.get_device(hass, node=node, values=values, node_config={})
|
||||
|
||||
yield device
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def device_unknown(hass, mock_openzwave):
|
||||
"""Fixture to provide a precreated climate device. Test state unknown."""
|
||||
node = MockNode()
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(
|
||||
command_class=const.COMMAND_CLASS_THERMOSTAT_MODE,
|
||||
data="Heat",
|
||||
data_items=["Off", "Cool", "Heat", "heat_cool", "Abcdefg"],
|
||||
node=node,
|
||||
),
|
||||
setpoint_heating=MockValue(data=1, node=node),
|
||||
setpoint_cooling=MockValue(data=10, node=node),
|
||||
temperature=MockValue(data=5, node=node, units=None),
|
||||
fan_mode=MockValue(data="test2", data_items=[3, 4, 5], node=node),
|
||||
operating_state=MockValue(data="test4", node=node),
|
||||
fan_action=MockValue(data=7, node=node),
|
||||
)
|
||||
device = climate.get_device(hass, node=node, values=values, node_config={})
|
||||
|
||||
yield device
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def device_heat_cool(hass, mock_openzwave):
|
||||
"""Fixture to provide a precreated climate device. Test state heat only."""
|
||||
node = MockNode()
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(
|
||||
command_class=const.COMMAND_CLASS_THERMOSTAT_MODE,
|
||||
data=HVAC_MODE_HEAT,
|
||||
data_items=[
|
||||
HVAC_MODE_OFF,
|
||||
HVAC_MODE_HEAT,
|
||||
HVAC_MODE_COOL,
|
||||
"Heat Eco",
|
||||
"Cool Eco",
|
||||
],
|
||||
node=node,
|
||||
),
|
||||
setpoint_heating=MockValue(data=1, node=node),
|
||||
setpoint_cooling=MockValue(data=10, node=node),
|
||||
temperature=MockValue(data=5, node=node, units=None),
|
||||
fan_mode=MockValue(data="test2", data_items=[3, 4, 5], node=node),
|
||||
operating_state=MockValue(data="test4", node=node),
|
||||
fan_action=MockValue(data=7, node=node),
|
||||
)
|
||||
device = climate.get_device(hass, node=node, values=values, node_config={})
|
||||
|
||||
yield device
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def device_heat_cool_range(hass, mock_openzwave):
|
||||
"""Fixture to provide a precreated climate device. Target range mode."""
|
||||
node = MockNode()
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(
|
||||
command_class=const.COMMAND_CLASS_THERMOSTAT_MODE,
|
||||
data=HVAC_MODE_HEAT_COOL,
|
||||
data_items=[
|
||||
HVAC_MODE_OFF,
|
||||
HVAC_MODE_HEAT,
|
||||
HVAC_MODE_COOL,
|
||||
HVAC_MODE_HEAT_COOL,
|
||||
],
|
||||
node=node,
|
||||
),
|
||||
setpoint_heating=MockValue(data=1, node=node),
|
||||
setpoint_cooling=MockValue(data=10, node=node),
|
||||
temperature=MockValue(data=5, node=node, units=None),
|
||||
fan_mode=MockValue(data="test2", data_items=[3, 4, 5], node=node),
|
||||
operating_state=MockValue(data="test4", node=node),
|
||||
fan_action=MockValue(data=7, node=node),
|
||||
)
|
||||
device = climate.get_device(hass, node=node, values=values, node_config={})
|
||||
|
||||
yield device
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def device_heat_cool_away(hass, mock_openzwave):
|
||||
"""Fixture to provide a precreated climate device. Target range mode."""
|
||||
node = MockNode()
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(
|
||||
command_class=const.COMMAND_CLASS_THERMOSTAT_MODE,
|
||||
data=HVAC_MODE_HEAT_COOL,
|
||||
data_items=[
|
||||
HVAC_MODE_OFF,
|
||||
HVAC_MODE_HEAT,
|
||||
HVAC_MODE_COOL,
|
||||
HVAC_MODE_HEAT_COOL,
|
||||
PRESET_AWAY,
|
||||
],
|
||||
node=node,
|
||||
),
|
||||
setpoint_heating=MockValue(data=2, node=node),
|
||||
setpoint_cooling=MockValue(data=9, node=node),
|
||||
setpoint_away_heating=MockValue(data=1, node=node),
|
||||
setpoint_away_cooling=MockValue(data=10, node=node),
|
||||
temperature=MockValue(data=5, node=node, units=None),
|
||||
fan_mode=MockValue(data="test2", data_items=[3, 4, 5], node=node),
|
||||
operating_state=MockValue(data="test4", node=node),
|
||||
fan_action=MockValue(data=7, node=node),
|
||||
)
|
||||
device = climate.get_device(hass, node=node, values=values, node_config={})
|
||||
|
||||
yield device
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def device_heat_eco(hass, mock_openzwave):
|
||||
"""Fixture to provide a precreated climate device. heat/heat eco."""
|
||||
node = MockNode()
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(
|
||||
command_class=const.COMMAND_CLASS_THERMOSTAT_MODE,
|
||||
data=HVAC_MODE_HEAT,
|
||||
data_items=[HVAC_MODE_OFF, HVAC_MODE_HEAT, "heat econ"],
|
||||
node=node,
|
||||
),
|
||||
setpoint_heating=MockValue(data=2, node=node),
|
||||
setpoint_eco_heating=MockValue(data=1, node=node),
|
||||
temperature=MockValue(data=5, node=node, units=None),
|
||||
fan_mode=MockValue(data="test2", data_items=[3, 4, 5], node=node),
|
||||
operating_state=MockValue(data="test4", node=node),
|
||||
fan_action=MockValue(data=7, node=node),
|
||||
)
|
||||
device = climate.get_device(hass, node=node, values=values, node_config={})
|
||||
|
||||
yield device
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def device_aux_heat(hass, mock_openzwave):
|
||||
"""Fixture to provide a precreated climate device. aux heat."""
|
||||
node = MockNode()
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(
|
||||
command_class=const.COMMAND_CLASS_THERMOSTAT_MODE,
|
||||
data=HVAC_MODE_HEAT,
|
||||
data_items=[HVAC_MODE_OFF, HVAC_MODE_HEAT, "Aux Heat"],
|
||||
node=node,
|
||||
),
|
||||
setpoint_heating=MockValue(data=2, node=node),
|
||||
setpoint_eco_heating=MockValue(data=1, node=node),
|
||||
temperature=MockValue(data=5, node=node, units=None),
|
||||
fan_mode=MockValue(data="test2", data_items=[3, 4, 5], node=node),
|
||||
operating_state=MockValue(data="test4", node=node),
|
||||
fan_action=MockValue(data=7, node=node),
|
||||
)
|
||||
device = climate.get_device(hass, node=node, values=values, node_config={})
|
||||
|
||||
yield device
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def device_single_setpoint(hass, mock_openzwave):
|
||||
"""Fixture to provide a precreated climate device.
|
||||
|
||||
SETPOINT_THERMOSTAT device class.
|
||||
"""
|
||||
|
||||
node = MockNode()
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(
|
||||
command_class=const.COMMAND_CLASS_THERMOSTAT_SETPOINT, data=1, node=node
|
||||
),
|
||||
mode=None,
|
||||
temperature=MockValue(data=5, node=node, units=None),
|
||||
fan_mode=MockValue(data="test2", data_items=[3, 4, 5], node=node),
|
||||
operating_state=MockValue(data=CURRENT_HVAC_HEAT, node=node),
|
||||
fan_action=MockValue(data=7, node=node),
|
||||
)
|
||||
device = climate.get_device(hass, node=node, values=values, node_config={})
|
||||
|
||||
yield device
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def device_single_setpoint_with_mode(hass, mock_openzwave):
|
||||
"""Fixture to provide a precreated climate device.
|
||||
|
||||
SETPOINT_THERMOSTAT device class with COMMAND_CLASS_THERMOSTAT_MODE command class
|
||||
"""
|
||||
|
||||
node = MockNode()
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(
|
||||
command_class=const.COMMAND_CLASS_THERMOSTAT_SETPOINT, data=1, node=node
|
||||
),
|
||||
mode=MockValue(
|
||||
command_class=const.COMMAND_CLASS_THERMOSTAT_MODE,
|
||||
data=HVAC_MODE_HEAT,
|
||||
data_items=[HVAC_MODE_OFF, HVAC_MODE_HEAT],
|
||||
node=node,
|
||||
),
|
||||
temperature=MockValue(data=5, node=node, units=None),
|
||||
fan_mode=MockValue(data="test2", data_items=[3, 4, 5], node=node),
|
||||
operating_state=MockValue(data=CURRENT_HVAC_HEAT, node=node),
|
||||
fan_action=MockValue(data=7, node=node),
|
||||
)
|
||||
device = climate.get_device(hass, node=node, values=values, node_config={})
|
||||
|
||||
yield device
|
||||
|
||||
|
||||
def test_get_device_detects_none(hass, mock_openzwave):
|
||||
"""Test get_device returns None."""
|
||||
node = MockNode()
|
||||
value = MockValue(data=0, node=node)
|
||||
values = MockEntityValues(primary=value)
|
||||
|
||||
device = climate.get_device(hass, node=node, values=values, node_config={})
|
||||
assert device is None
|
||||
|
||||
|
||||
def test_get_device_detects_multiple_setpoint_device(device):
|
||||
"""Test get_device returns a Z-Wave multiple setpoint device."""
|
||||
assert isinstance(device, climate.ZWaveClimateMultipleSetpoint)
|
||||
|
||||
|
||||
def test_get_device_detects_single_setpoint_device(device_single_setpoint):
|
||||
"""Test get_device returns a Z-Wave single setpoint device."""
|
||||
assert isinstance(device_single_setpoint, climate.ZWaveClimateSingleSetpoint)
|
||||
|
||||
|
||||
def test_default_hvac_modes():
|
||||
"""Test whether all hvac modes are included in default_hvac_modes."""
|
||||
for hvac_mode in HVAC_MODES:
|
||||
assert hvac_mode in DEFAULT_HVAC_MODES
|
||||
|
||||
|
||||
def test_supported_features(device):
|
||||
"""Test supported features flags."""
|
||||
assert (
|
||||
device.supported_features
|
||||
== SUPPORT_FAN_MODE
|
||||
+ SUPPORT_TARGET_TEMPERATURE
|
||||
+ SUPPORT_TARGET_TEMPERATURE_RANGE
|
||||
)
|
||||
|
||||
|
||||
def test_supported_features_temp_range(device_heat_cool_range):
|
||||
"""Test supported features flags with target temp range."""
|
||||
device = device_heat_cool_range
|
||||
assert (
|
||||
device.supported_features
|
||||
== SUPPORT_FAN_MODE
|
||||
+ SUPPORT_TARGET_TEMPERATURE
|
||||
+ SUPPORT_TARGET_TEMPERATURE_RANGE
|
||||
)
|
||||
|
||||
|
||||
def test_supported_features_preset_mode(device_mapping):
|
||||
"""Test supported features flags with swing mode."""
|
||||
device = device_mapping
|
||||
assert (
|
||||
device.supported_features
|
||||
== SUPPORT_FAN_MODE
|
||||
+ SUPPORT_TARGET_TEMPERATURE
|
||||
+ SUPPORT_TARGET_TEMPERATURE_RANGE
|
||||
+ SUPPORT_PRESET_MODE
|
||||
)
|
||||
|
||||
|
||||
def test_supported_features_preset_mode_away(device_heat_cool_away):
|
||||
"""Test supported features flags with swing mode."""
|
||||
device = device_heat_cool_away
|
||||
assert (
|
||||
device.supported_features
|
||||
== SUPPORT_FAN_MODE
|
||||
+ SUPPORT_TARGET_TEMPERATURE
|
||||
+ SUPPORT_TARGET_TEMPERATURE_RANGE
|
||||
+ SUPPORT_PRESET_MODE
|
||||
)
|
||||
|
||||
|
||||
def test_supported_features_swing_mode(device_zxt_120):
|
||||
"""Test supported features flags with swing mode."""
|
||||
device = device_zxt_120
|
||||
assert (
|
||||
device.supported_features
|
||||
== SUPPORT_FAN_MODE
|
||||
+ SUPPORT_TARGET_TEMPERATURE
|
||||
+ SUPPORT_TARGET_TEMPERATURE_RANGE
|
||||
+ SUPPORT_SWING_MODE
|
||||
)
|
||||
|
||||
|
||||
def test_supported_features_aux_heat(device_aux_heat):
|
||||
"""Test supported features flags with aux heat."""
|
||||
device = device_aux_heat
|
||||
assert (
|
||||
device.supported_features
|
||||
== SUPPORT_FAN_MODE + SUPPORT_TARGET_TEMPERATURE + SUPPORT_AUX_HEAT
|
||||
)
|
||||
|
||||
|
||||
def test_supported_features_single_setpoint(device_single_setpoint):
|
||||
"""Test supported features flags for SETPOINT_THERMOSTAT."""
|
||||
device = device_single_setpoint
|
||||
assert device.supported_features == SUPPORT_FAN_MODE + SUPPORT_TARGET_TEMPERATURE
|
||||
|
||||
|
||||
def test_supported_features_single_setpoint_with_mode(device_single_setpoint_with_mode):
|
||||
"""Test supported features flags for SETPOINT_THERMOSTAT."""
|
||||
device = device_single_setpoint_with_mode
|
||||
assert device.supported_features == SUPPORT_FAN_MODE + SUPPORT_TARGET_TEMPERATURE
|
||||
|
||||
|
||||
def test_zxt_120_swing_mode(device_zxt_120):
|
||||
"""Test operation of the zxt 120 swing mode."""
|
||||
device = device_zxt_120
|
||||
|
||||
assert device.swing_modes == [6, 7, 8]
|
||||
assert device._zxt_120 == 1
|
||||
|
||||
# Test set mode
|
||||
assert device.values.zxt_120_swing_mode.data == "test3"
|
||||
device.set_swing_mode("test_swing_set")
|
||||
assert device.values.zxt_120_swing_mode.data == "test_swing_set"
|
||||
|
||||
# Test mode changed
|
||||
value_changed(device.values.zxt_120_swing_mode)
|
||||
assert device.swing_mode == "test_swing_set"
|
||||
device.values.zxt_120_swing_mode.data = "test_swing_updated"
|
||||
value_changed(device.values.zxt_120_swing_mode)
|
||||
assert device.swing_mode == "test_swing_updated"
|
||||
|
||||
|
||||
def test_temperature_unit(device):
|
||||
"""Test temperature unit."""
|
||||
assert device.temperature_unit == TEMP_CELSIUS
|
||||
device.values.temperature.units = "F"
|
||||
value_changed(device.values.temperature)
|
||||
assert device.temperature_unit == TEMP_FAHRENHEIT
|
||||
device.values.temperature.units = "C"
|
||||
value_changed(device.values.temperature)
|
||||
assert device.temperature_unit == TEMP_CELSIUS
|
||||
|
||||
|
||||
def test_data_lists(device):
|
||||
"""Test data lists from zwave value items."""
|
||||
assert device.fan_modes == [3, 4, 5]
|
||||
assert device.hvac_modes == [
|
||||
HVAC_MODE_OFF,
|
||||
HVAC_MODE_HEAT,
|
||||
HVAC_MODE_COOL,
|
||||
HVAC_MODE_HEAT_COOL,
|
||||
]
|
||||
assert device.preset_modes == []
|
||||
device.values.primary = None
|
||||
assert device.preset_modes == []
|
||||
|
||||
|
||||
def test_data_lists_single_setpoint(device_single_setpoint):
|
||||
"""Test data lists from zwave value items."""
|
||||
device = device_single_setpoint
|
||||
assert device.fan_modes == [3, 4, 5]
|
||||
assert device.hvac_modes == []
|
||||
assert device.preset_modes == []
|
||||
|
||||
|
||||
def test_data_lists_single_setpoint_with_mode(device_single_setpoint_with_mode):
|
||||
"""Test data lists from zwave value items."""
|
||||
device = device_single_setpoint_with_mode
|
||||
assert device.fan_modes == [3, 4, 5]
|
||||
assert device.hvac_modes == [HVAC_MODE_OFF, HVAC_MODE_HEAT]
|
||||
assert device.preset_modes == []
|
||||
|
||||
|
||||
def test_data_lists_mapping(device_mapping):
|
||||
"""Test data lists from zwave value items."""
|
||||
device = device_mapping
|
||||
assert device.hvac_modes == ["off", "cool", "heat", "heat_cool"]
|
||||
assert device.preset_modes == ["boost", "none"]
|
||||
device.values.primary = None
|
||||
assert device.preset_modes == []
|
||||
|
||||
|
||||
def test_target_value_set(device):
|
||||
"""Test values changed for climate device."""
|
||||
assert device.values.setpoint_heating.data == 1
|
||||
assert device.values.setpoint_cooling.data == 10
|
||||
device.set_temperature()
|
||||
assert device.values.setpoint_heating.data == 1
|
||||
assert device.values.setpoint_cooling.data == 10
|
||||
device.set_temperature(**{ATTR_TEMPERATURE: 2})
|
||||
assert device.values.setpoint_heating.data == 2
|
||||
assert device.values.setpoint_cooling.data == 10
|
||||
device.set_hvac_mode(HVAC_MODE_COOL)
|
||||
value_changed(device.values.primary)
|
||||
assert device.values.setpoint_heating.data == 2
|
||||
assert device.values.setpoint_cooling.data == 10
|
||||
device.set_temperature(**{ATTR_TEMPERATURE: 9})
|
||||
assert device.values.setpoint_heating.data == 2
|
||||
assert device.values.setpoint_cooling.data == 9
|
||||
|
||||
|
||||
def test_target_value_set_range(device_heat_cool_range):
|
||||
"""Test values changed for climate device."""
|
||||
device = device_heat_cool_range
|
||||
assert device.values.setpoint_heating.data == 1
|
||||
assert device.values.setpoint_cooling.data == 10
|
||||
device.set_temperature()
|
||||
assert device.values.setpoint_heating.data == 1
|
||||
assert device.values.setpoint_cooling.data == 10
|
||||
device.set_temperature(**{ATTR_TARGET_TEMP_LOW: 2})
|
||||
assert device.values.setpoint_heating.data == 2
|
||||
assert device.values.setpoint_cooling.data == 10
|
||||
device.set_temperature(**{ATTR_TARGET_TEMP_HIGH: 9})
|
||||
assert device.values.setpoint_heating.data == 2
|
||||
assert device.values.setpoint_cooling.data == 9
|
||||
device.set_temperature(**{ATTR_TARGET_TEMP_LOW: 3, ATTR_TARGET_TEMP_HIGH: 8})
|
||||
assert device.values.setpoint_heating.data == 3
|
||||
assert device.values.setpoint_cooling.data == 8
|
||||
|
||||
|
||||
def test_target_value_set_range_away(device_heat_cool_away):
|
||||
"""Test values changed for climate device."""
|
||||
device = device_heat_cool_away
|
||||
assert device.values.setpoint_heating.data == 2
|
||||
assert device.values.setpoint_cooling.data == 9
|
||||
assert device.values.setpoint_away_heating.data == 1
|
||||
assert device.values.setpoint_away_cooling.data == 10
|
||||
device.set_preset_mode(PRESET_AWAY)
|
||||
device.set_temperature(**{ATTR_TARGET_TEMP_LOW: 0, ATTR_TARGET_TEMP_HIGH: 11})
|
||||
assert device.values.setpoint_heating.data == 2
|
||||
assert device.values.setpoint_cooling.data == 9
|
||||
assert device.values.setpoint_away_heating.data == 0
|
||||
assert device.values.setpoint_away_cooling.data == 11
|
||||
|
||||
|
||||
def test_target_value_set_eco(device_heat_eco):
|
||||
"""Test values changed for climate device."""
|
||||
device = device_heat_eco
|
||||
assert device.values.setpoint_heating.data == 2
|
||||
assert device.values.setpoint_eco_heating.data == 1
|
||||
device.set_preset_mode("heat econ")
|
||||
device.set_temperature(**{ATTR_TEMPERATURE: 0})
|
||||
assert device.values.setpoint_heating.data == 2
|
||||
assert device.values.setpoint_eco_heating.data == 0
|
||||
|
||||
|
||||
def test_target_value_set_single_setpoint(device_single_setpoint):
|
||||
"""Test values changed for climate device."""
|
||||
device = device_single_setpoint
|
||||
assert device.values.primary.data == 1
|
||||
device.set_temperature(**{ATTR_TEMPERATURE: 2})
|
||||
assert device.values.primary.data == 2
|
||||
|
||||
|
||||
def test_operation_value_set(device):
|
||||
"""Test values changed for climate device."""
|
||||
assert device.values.primary.data == HVAC_MODE_HEAT
|
||||
device.set_hvac_mode(HVAC_MODE_COOL)
|
||||
assert device.values.primary.data == HVAC_MODE_COOL
|
||||
device.set_preset_mode(PRESET_ECO)
|
||||
assert device.values.primary.data == PRESET_ECO
|
||||
device.set_preset_mode(PRESET_NONE)
|
||||
assert device.values.primary.data == HVAC_MODE_HEAT_COOL
|
||||
device.values.primary = None
|
||||
device.set_hvac_mode("test_set_failes")
|
||||
assert device.values.primary is None
|
||||
device.set_preset_mode("test_set_failes")
|
||||
assert device.values.primary is None
|
||||
|
||||
|
||||
def test_operation_value_set_mapping(device_mapping):
|
||||
"""Test values changed for climate device. Mapping."""
|
||||
device = device_mapping
|
||||
assert device.values.primary.data == "Heat"
|
||||
device.set_hvac_mode(HVAC_MODE_COOL)
|
||||
assert device.values.primary.data == "Cool"
|
||||
device.set_hvac_mode(HVAC_MODE_OFF)
|
||||
assert device.values.primary.data == "Off"
|
||||
device.set_preset_mode(PRESET_BOOST)
|
||||
assert device.values.primary.data == "Full Power"
|
||||
device.set_preset_mode(PRESET_ECO)
|
||||
assert device.values.primary.data == "eco"
|
||||
|
||||
|
||||
def test_operation_value_set_unknown(device_unknown):
|
||||
"""Test values changed for climate device. Unknown."""
|
||||
device = device_unknown
|
||||
assert device.values.primary.data == "Heat"
|
||||
device.set_preset_mode("Abcdefg")
|
||||
assert device.values.primary.data == "Abcdefg"
|
||||
device.set_preset_mode(PRESET_NONE)
|
||||
assert device.values.primary.data == HVAC_MODE_HEAT_COOL
|
||||
|
||||
|
||||
def test_operation_value_set_heat_cool(device_heat_cool):
|
||||
"""Test values changed for climate device. Heat/Cool only."""
|
||||
device = device_heat_cool
|
||||
assert device.values.primary.data == HVAC_MODE_HEAT
|
||||
device.set_preset_mode("Heat Eco")
|
||||
assert device.values.primary.data == "Heat Eco"
|
||||
device.set_preset_mode(PRESET_NONE)
|
||||
assert device.values.primary.data == HVAC_MODE_HEAT
|
||||
device.set_preset_mode("Cool Eco")
|
||||
assert device.values.primary.data == "Cool Eco"
|
||||
device.set_preset_mode(PRESET_NONE)
|
||||
assert device.values.primary.data == HVAC_MODE_COOL
|
||||
|
||||
|
||||
def test_fan_mode_value_set(device):
|
||||
"""Test values changed for climate device."""
|
||||
assert device.values.fan_mode.data == "test2"
|
||||
device.set_fan_mode("test_fan_set")
|
||||
assert device.values.fan_mode.data == "test_fan_set"
|
||||
device.values.fan_mode = None
|
||||
device.set_fan_mode("test_fan_set_failes")
|
||||
assert device.values.fan_mode is None
|
||||
|
||||
|
||||
def test_target_value_changed(device):
|
||||
"""Test values changed for climate device."""
|
||||
assert device.target_temperature == 1
|
||||
device.values.setpoint_heating.data = 2
|
||||
value_changed(device.values.setpoint_heating)
|
||||
assert device.target_temperature == 2
|
||||
device.values.primary.data = HVAC_MODE_COOL
|
||||
value_changed(device.values.primary)
|
||||
assert device.target_temperature == 10
|
||||
device.values.setpoint_cooling.data = 9
|
||||
value_changed(device.values.setpoint_cooling)
|
||||
assert device.target_temperature == 9
|
||||
|
||||
|
||||
def test_target_range_changed(device_heat_cool_range):
|
||||
"""Test values changed for climate device."""
|
||||
device = device_heat_cool_range
|
||||
assert device.target_temperature_low == 1
|
||||
assert device.target_temperature_high == 10
|
||||
device.values.setpoint_heating.data = 2
|
||||
value_changed(device.values.setpoint_heating)
|
||||
assert device.target_temperature_low == 2
|
||||
assert device.target_temperature_high == 10
|
||||
device.values.setpoint_cooling.data = 9
|
||||
value_changed(device.values.setpoint_cooling)
|
||||
assert device.target_temperature_low == 2
|
||||
assert device.target_temperature_high == 9
|
||||
|
||||
|
||||
def test_target_changed_preset_range(device_heat_cool_away):
|
||||
"""Test values changed for climate device."""
|
||||
device = device_heat_cool_away
|
||||
assert device.target_temperature_low == 2
|
||||
assert device.target_temperature_high == 9
|
||||
device.values.primary.data = PRESET_AWAY
|
||||
value_changed(device.values.primary)
|
||||
assert device.target_temperature_low == 1
|
||||
assert device.target_temperature_high == 10
|
||||
device.values.setpoint_away_heating.data = 0
|
||||
value_changed(device.values.setpoint_away_heating)
|
||||
device.values.setpoint_away_cooling.data = 11
|
||||
value_changed(device.values.setpoint_away_cooling)
|
||||
assert device.target_temperature_low == 0
|
||||
assert device.target_temperature_high == 11
|
||||
device.values.primary.data = HVAC_MODE_HEAT_COOL
|
||||
value_changed(device.values.primary)
|
||||
assert device.target_temperature_low == 2
|
||||
assert device.target_temperature_high == 9
|
||||
|
||||
|
||||
def test_target_changed_eco(device_heat_eco):
|
||||
"""Test values changed for climate device."""
|
||||
device = device_heat_eco
|
||||
assert device.target_temperature == 2
|
||||
device.values.primary.data = "heat econ"
|
||||
value_changed(device.values.primary)
|
||||
assert device.target_temperature == 1
|
||||
device.values.setpoint_eco_heating.data = 0
|
||||
value_changed(device.values.setpoint_eco_heating)
|
||||
assert device.target_temperature == 0
|
||||
device.values.primary.data = HVAC_MODE_HEAT
|
||||
value_changed(device.values.primary)
|
||||
assert device.target_temperature == 2
|
||||
|
||||
|
||||
def test_target_changed_with_mode(device):
|
||||
"""Test values changed for climate device."""
|
||||
assert device.hvac_mode == HVAC_MODE_HEAT
|
||||
assert device.target_temperature == 1
|
||||
device.values.primary.data = HVAC_MODE_COOL
|
||||
value_changed(device.values.primary)
|
||||
assert device.target_temperature == 10
|
||||
device.values.primary.data = HVAC_MODE_HEAT_COOL
|
||||
value_changed(device.values.primary)
|
||||
assert device.target_temperature_low == 1
|
||||
assert device.target_temperature_high == 10
|
||||
|
||||
|
||||
def test_target_value_changed_single_setpoint(device_single_setpoint):
|
||||
"""Test values changed for climate device."""
|
||||
device = device_single_setpoint
|
||||
assert device.target_temperature == 1
|
||||
device.values.primary.data = 2
|
||||
value_changed(device.values.primary)
|
||||
assert device.target_temperature == 2
|
||||
|
||||
|
||||
def test_temperature_value_changed(device):
|
||||
"""Test values changed for climate device."""
|
||||
assert device.current_temperature == 5
|
||||
device.values.temperature.data = 3
|
||||
value_changed(device.values.temperature)
|
||||
assert device.current_temperature == 3
|
||||
|
||||
|
||||
def test_operation_value_changed(device):
|
||||
"""Test values changed for climate device."""
|
||||
assert device.hvac_mode == HVAC_MODE_HEAT
|
||||
assert device.preset_mode == PRESET_NONE
|
||||
device.values.primary.data = HVAC_MODE_COOL
|
||||
value_changed(device.values.primary)
|
||||
assert device.hvac_mode == HVAC_MODE_COOL
|
||||
assert device.preset_mode == PRESET_NONE
|
||||
device.values.primary.data = HVAC_MODE_OFF
|
||||
value_changed(device.values.primary)
|
||||
assert device.hvac_mode == HVAC_MODE_OFF
|
||||
assert device.preset_mode == PRESET_NONE
|
||||
device.values.primary = None
|
||||
assert device.hvac_mode == HVAC_MODE_HEAT_COOL
|
||||
assert device.preset_mode == PRESET_NONE
|
||||
|
||||
|
||||
def test_operation_value_changed_preset(device_mapping):
|
||||
"""Test preset changed for climate device."""
|
||||
device = device_mapping
|
||||
assert device.hvac_mode == HVAC_MODE_HEAT
|
||||
assert device.preset_mode == PRESET_NONE
|
||||
device.values.primary.data = PRESET_ECO
|
||||
value_changed(device.values.primary)
|
||||
assert device.hvac_mode == HVAC_MODE_HEAT_COOL
|
||||
assert device.preset_mode == PRESET_ECO
|
||||
|
||||
|
||||
def test_operation_value_changed_mapping(device_mapping):
|
||||
"""Test values changed for climate device. Mapping."""
|
||||
device = device_mapping
|
||||
assert device.hvac_mode == HVAC_MODE_HEAT
|
||||
assert device.preset_mode == PRESET_NONE
|
||||
device.values.primary.data = "Off"
|
||||
value_changed(device.values.primary)
|
||||
assert device.hvac_mode == HVAC_MODE_OFF
|
||||
assert device.preset_mode == PRESET_NONE
|
||||
device.values.primary.data = "Cool"
|
||||
value_changed(device.values.primary)
|
||||
assert device.hvac_mode == HVAC_MODE_COOL
|
||||
assert device.preset_mode == PRESET_NONE
|
||||
|
||||
|
||||
def test_operation_value_changed_mapping_preset(device_mapping):
|
||||
"""Test values changed for climate device. Mapping with presets."""
|
||||
device = device_mapping
|
||||
assert device.hvac_mode == HVAC_MODE_HEAT
|
||||
assert device.preset_mode == PRESET_NONE
|
||||
device.values.primary.data = "Full Power"
|
||||
value_changed(device.values.primary)
|
||||
assert device.hvac_mode == HVAC_MODE_HEAT_COOL
|
||||
assert device.preset_mode == PRESET_BOOST
|
||||
device.values.primary = None
|
||||
assert device.hvac_mode == HVAC_MODE_HEAT_COOL
|
||||
assert device.preset_mode == PRESET_NONE
|
||||
|
||||
|
||||
def test_operation_value_changed_unknown(device_unknown):
|
||||
"""Test preset changed for climate device. Unknown."""
|
||||
device = device_unknown
|
||||
assert device.hvac_mode == HVAC_MODE_HEAT
|
||||
assert device.preset_mode == PRESET_NONE
|
||||
device.values.primary.data = "Abcdefg"
|
||||
value_changed(device.values.primary)
|
||||
assert device.hvac_mode == HVAC_MODE_HEAT_COOL
|
||||
assert device.preset_mode == "Abcdefg"
|
||||
|
||||
|
||||
def test_operation_value_changed_heat_cool(device_heat_cool):
|
||||
"""Test preset changed for climate device. Heat/Cool only."""
|
||||
device = device_heat_cool
|
||||
assert device.hvac_mode == HVAC_MODE_HEAT
|
||||
assert device.preset_mode == PRESET_NONE
|
||||
device.values.primary.data = "Cool Eco"
|
||||
value_changed(device.values.primary)
|
||||
assert device.hvac_mode == HVAC_MODE_COOL
|
||||
assert device.preset_mode == "Cool Eco"
|
||||
device.values.primary.data = "Heat Eco"
|
||||
value_changed(device.values.primary)
|
||||
assert device.hvac_mode == HVAC_MODE_HEAT
|
||||
assert device.preset_mode == "Heat Eco"
|
||||
|
||||
|
||||
def test_fan_mode_value_changed(device):
|
||||
"""Test values changed for climate device."""
|
||||
assert device.fan_mode == "test2"
|
||||
device.values.fan_mode.data = "test_updated_fan"
|
||||
value_changed(device.values.fan_mode)
|
||||
assert device.fan_mode == "test_updated_fan"
|
||||
|
||||
|
||||
def test_hvac_action_value_changed(device):
|
||||
"""Test values changed for climate device."""
|
||||
assert device.hvac_action == CURRENT_HVAC_HEAT
|
||||
device.values.operating_state.data = CURRENT_HVAC_COOL
|
||||
value_changed(device.values.operating_state)
|
||||
assert device.hvac_action == CURRENT_HVAC_COOL
|
||||
|
||||
|
||||
def test_hvac_action_value_changed_mapping(device_mapping):
|
||||
"""Test values changed for climate device."""
|
||||
device = device_mapping
|
||||
assert device.hvac_action == CURRENT_HVAC_HEAT
|
||||
device.values.operating_state.data = "cooling"
|
||||
value_changed(device.values.operating_state)
|
||||
assert device.hvac_action == CURRENT_HVAC_COOL
|
||||
|
||||
|
||||
def test_hvac_action_value_changed_unknown(device_unknown):
|
||||
"""Test values changed for climate device."""
|
||||
device = device_unknown
|
||||
assert device.hvac_action == "test4"
|
||||
device.values.operating_state.data = "another_hvac_action"
|
||||
value_changed(device.values.operating_state)
|
||||
assert device.hvac_action == "another_hvac_action"
|
||||
|
||||
|
||||
def test_fan_action_value_changed(device):
|
||||
"""Test values changed for climate device."""
|
||||
assert device.extra_state_attributes[climate.ATTR_FAN_ACTION] == 7
|
||||
device.values.fan_action.data = 9
|
||||
value_changed(device.values.fan_action)
|
||||
assert device.extra_state_attributes[climate.ATTR_FAN_ACTION] == 9
|
||||
|
||||
|
||||
def test_aux_heat_unsupported_set(device):
|
||||
"""Test aux heat for climate device."""
|
||||
assert device.values.primary.data == HVAC_MODE_HEAT
|
||||
device.turn_aux_heat_on()
|
||||
assert device.values.primary.data == HVAC_MODE_HEAT
|
||||
device.turn_aux_heat_off()
|
||||
assert device.values.primary.data == HVAC_MODE_HEAT
|
||||
|
||||
|
||||
def test_aux_heat_unsupported_value_changed(device):
|
||||
"""Test aux heat for climate device."""
|
||||
assert device.is_aux_heat is None
|
||||
device.values.primary.data = HVAC_MODE_HEAT
|
||||
value_changed(device.values.primary)
|
||||
assert device.is_aux_heat is None
|
||||
|
||||
|
||||
def test_aux_heat_set(device_aux_heat):
|
||||
"""Test aux heat for climate device."""
|
||||
device = device_aux_heat
|
||||
assert device.values.primary.data == HVAC_MODE_HEAT
|
||||
device.turn_aux_heat_on()
|
||||
assert device.values.primary.data == AUX_HEAT_ZWAVE_MODE
|
||||
device.turn_aux_heat_off()
|
||||
assert device.values.primary.data == HVAC_MODE_HEAT
|
||||
|
||||
|
||||
def test_aux_heat_value_changed(device_aux_heat):
|
||||
"""Test aux heat for climate device."""
|
||||
device = device_aux_heat
|
||||
assert device.is_aux_heat is False
|
||||
device.values.primary.data = AUX_HEAT_ZWAVE_MODE
|
||||
value_changed(device.values.primary)
|
||||
assert device.is_aux_heat is True
|
||||
device.values.primary.data = HVAC_MODE_HEAT
|
||||
value_changed(device.values.primary)
|
||||
assert device.is_aux_heat is False
|
|
@ -1,292 +0,0 @@
|
|||
"""Test Z-Wave cover devices."""
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
import pytest
|
||||
|
||||
from homeassistant.components.cover import SUPPORT_CLOSE, SUPPORT_OPEN
|
||||
from homeassistant.components.zwave import (
|
||||
CONF_INVERT_OPENCLOSE_BUTTONS,
|
||||
CONF_INVERT_PERCENT,
|
||||
const,
|
||||
cover,
|
||||
)
|
||||
|
||||
from tests.mock.zwave import MockEntityValues, MockNode, MockValue, value_changed
|
||||
|
||||
# Integration is disabled
|
||||
pytest.skip("Integration has been disabled in the manifest", allow_module_level=True)
|
||||
|
||||
|
||||
def test_get_device_detects_none(hass, mock_openzwave):
|
||||
"""Test device returns none."""
|
||||
node = MockNode()
|
||||
value = MockValue(data=0, node=node)
|
||||
values = MockEntityValues(primary=value, node=node)
|
||||
|
||||
device = cover.get_device(hass=hass, node=node, values=values, node_config={})
|
||||
assert device is None
|
||||
|
||||
|
||||
def test_get_device_detects_rollershutter(hass, mock_openzwave):
|
||||
"""Test device returns rollershutter."""
|
||||
hass.data[const.DATA_NETWORK] = MagicMock()
|
||||
node = MockNode()
|
||||
value = MockValue(
|
||||
data=0, node=node, command_class=const.COMMAND_CLASS_SWITCH_MULTILEVEL
|
||||
)
|
||||
values = MockEntityValues(primary=value, open=None, close=None, node=node)
|
||||
|
||||
device = cover.get_device(hass=hass, node=node, values=values, node_config={})
|
||||
assert isinstance(device, cover.ZwaveRollershutter)
|
||||
|
||||
|
||||
def test_get_device_detects_garagedoor_switch(hass, mock_openzwave):
|
||||
"""Test device returns garage door."""
|
||||
node = MockNode()
|
||||
value = MockValue(
|
||||
data=False, node=node, command_class=const.COMMAND_CLASS_SWITCH_BINARY
|
||||
)
|
||||
values = MockEntityValues(primary=value, node=node)
|
||||
|
||||
device = cover.get_device(hass=hass, node=node, values=values, node_config={})
|
||||
assert isinstance(device, cover.ZwaveGarageDoorSwitch)
|
||||
assert device.device_class == "garage"
|
||||
assert device.supported_features == SUPPORT_OPEN | SUPPORT_CLOSE
|
||||
|
||||
|
||||
def test_get_device_detects_garagedoor_barrier(hass, mock_openzwave):
|
||||
"""Test device returns garage door."""
|
||||
node = MockNode()
|
||||
value = MockValue(
|
||||
data="Closed", node=node, command_class=const.COMMAND_CLASS_BARRIER_OPERATOR
|
||||
)
|
||||
values = MockEntityValues(primary=value, node=node)
|
||||
|
||||
device = cover.get_device(hass=hass, node=node, values=values, node_config={})
|
||||
assert isinstance(device, cover.ZwaveGarageDoorBarrier)
|
||||
assert device.device_class == "garage"
|
||||
assert device.supported_features == SUPPORT_OPEN | SUPPORT_CLOSE
|
||||
|
||||
|
||||
def test_roller_no_position_workaround(hass, mock_openzwave):
|
||||
"""Test position changed."""
|
||||
hass.data[const.DATA_NETWORK] = MagicMock()
|
||||
node = MockNode(manufacturer_id="0047", product_type="5a52")
|
||||
value = MockValue(
|
||||
data=45, node=node, command_class=const.COMMAND_CLASS_SWITCH_MULTILEVEL
|
||||
)
|
||||
values = MockEntityValues(primary=value, open=None, close=None, node=node)
|
||||
device = cover.get_device(hass=hass, node=node, values=values, node_config={})
|
||||
|
||||
assert device.current_cover_position is None
|
||||
|
||||
|
||||
def test_roller_value_changed(hass, mock_openzwave):
|
||||
"""Test position changed."""
|
||||
hass.data[const.DATA_NETWORK] = MagicMock()
|
||||
node = MockNode()
|
||||
value = MockValue(
|
||||
data=None, node=node, command_class=const.COMMAND_CLASS_SWITCH_MULTILEVEL
|
||||
)
|
||||
values = MockEntityValues(primary=value, open=None, close=None, node=node)
|
||||
device = cover.get_device(hass=hass, node=node, values=values, node_config={})
|
||||
|
||||
assert device.current_cover_position is None
|
||||
assert device.is_closed is None
|
||||
|
||||
value.data = 2
|
||||
value_changed(value)
|
||||
|
||||
assert device.current_cover_position == 0
|
||||
assert device.is_closed
|
||||
|
||||
value.data = 35
|
||||
value_changed(value)
|
||||
|
||||
assert device.current_cover_position == 35
|
||||
assert not device.is_closed
|
||||
|
||||
value.data = 97
|
||||
value_changed(value)
|
||||
|
||||
assert device.current_cover_position == 100
|
||||
assert not device.is_closed
|
||||
|
||||
|
||||
def test_roller_commands(hass, mock_openzwave):
|
||||
"""Test position changed."""
|
||||
mock_network = hass.data[const.DATA_NETWORK] = MagicMock()
|
||||
node = MockNode()
|
||||
value = MockValue(
|
||||
data=50, node=node, command_class=const.COMMAND_CLASS_SWITCH_MULTILEVEL
|
||||
)
|
||||
open_value = MockValue(data=False, node=node)
|
||||
close_value = MockValue(data=False, node=node)
|
||||
values = MockEntityValues(
|
||||
primary=value, open=open_value, close=close_value, node=node
|
||||
)
|
||||
device = cover.get_device(hass=hass, node=node, values=values, node_config={})
|
||||
|
||||
device.set_cover_position(position=25)
|
||||
assert node.set_dimmer.called
|
||||
value_id, brightness = node.set_dimmer.mock_calls[0][1]
|
||||
assert value_id == value.value_id
|
||||
assert brightness == 25
|
||||
|
||||
device.open_cover()
|
||||
assert mock_network.manager.pressButton.called
|
||||
(value_id,) = mock_network.manager.pressButton.mock_calls.pop(0)[1]
|
||||
assert value_id == open_value.value_id
|
||||
|
||||
device.close_cover()
|
||||
assert mock_network.manager.pressButton.called
|
||||
(value_id,) = mock_network.manager.pressButton.mock_calls.pop(0)[1]
|
||||
assert value_id == close_value.value_id
|
||||
|
||||
device.stop_cover()
|
||||
assert mock_network.manager.releaseButton.called
|
||||
(value_id,) = mock_network.manager.releaseButton.mock_calls.pop(0)[1]
|
||||
assert value_id == open_value.value_id
|
||||
|
||||
|
||||
def test_roller_invert_percent(hass, mock_openzwave):
|
||||
"""Test position changed."""
|
||||
mock_network = hass.data[const.DATA_NETWORK] = MagicMock()
|
||||
node = MockNode()
|
||||
value = MockValue(
|
||||
data=50, node=node, command_class=const.COMMAND_CLASS_SWITCH_MULTILEVEL
|
||||
)
|
||||
open_value = MockValue(data=False, node=node)
|
||||
close_value = MockValue(data=False, node=node)
|
||||
values = MockEntityValues(
|
||||
primary=value, open=open_value, close=close_value, node=node
|
||||
)
|
||||
device = cover.get_device(
|
||||
hass=hass, node=node, values=values, node_config={CONF_INVERT_PERCENT: True}
|
||||
)
|
||||
|
||||
device.set_cover_position(position=25)
|
||||
assert node.set_dimmer.called
|
||||
value_id, brightness = node.set_dimmer.mock_calls[0][1]
|
||||
assert value_id == value.value_id
|
||||
assert brightness == 75
|
||||
|
||||
device.open_cover()
|
||||
assert mock_network.manager.pressButton.called
|
||||
(value_id,) = mock_network.manager.pressButton.mock_calls.pop(0)[1]
|
||||
assert value_id == open_value.value_id
|
||||
|
||||
|
||||
def test_roller_reverse_open_close(hass, mock_openzwave):
|
||||
"""Test position changed."""
|
||||
mock_network = hass.data[const.DATA_NETWORK] = MagicMock()
|
||||
node = MockNode()
|
||||
value = MockValue(
|
||||
data=50, node=node, command_class=const.COMMAND_CLASS_SWITCH_MULTILEVEL
|
||||
)
|
||||
open_value = MockValue(data=False, node=node)
|
||||
close_value = MockValue(data=False, node=node)
|
||||
values = MockEntityValues(
|
||||
primary=value, open=open_value, close=close_value, node=node
|
||||
)
|
||||
device = cover.get_device(
|
||||
hass=hass,
|
||||
node=node,
|
||||
values=values,
|
||||
node_config={CONF_INVERT_OPENCLOSE_BUTTONS: True},
|
||||
)
|
||||
|
||||
device.open_cover()
|
||||
assert mock_network.manager.pressButton.called
|
||||
(value_id,) = mock_network.manager.pressButton.mock_calls.pop(0)[1]
|
||||
assert value_id == close_value.value_id
|
||||
|
||||
device.close_cover()
|
||||
assert mock_network.manager.pressButton.called
|
||||
(value_id,) = mock_network.manager.pressButton.mock_calls.pop(0)[1]
|
||||
assert value_id == open_value.value_id
|
||||
|
||||
device.stop_cover()
|
||||
assert mock_network.manager.releaseButton.called
|
||||
(value_id,) = mock_network.manager.releaseButton.mock_calls.pop(0)[1]
|
||||
assert value_id == close_value.value_id
|
||||
|
||||
|
||||
def test_switch_garage_value_changed(hass, mock_openzwave):
|
||||
"""Test position changed."""
|
||||
node = MockNode()
|
||||
value = MockValue(
|
||||
data=False, node=node, command_class=const.COMMAND_CLASS_SWITCH_BINARY
|
||||
)
|
||||
values = MockEntityValues(primary=value, node=node)
|
||||
device = cover.get_device(hass=hass, node=node, values=values, node_config={})
|
||||
|
||||
assert device.is_closed
|
||||
|
||||
value.data = True
|
||||
value_changed(value)
|
||||
assert not device.is_closed
|
||||
|
||||
|
||||
def test_switch_garage_commands(hass, mock_openzwave):
|
||||
"""Test position changed."""
|
||||
node = MockNode()
|
||||
value = MockValue(
|
||||
data=False, node=node, command_class=const.COMMAND_CLASS_SWITCH_BINARY
|
||||
)
|
||||
values = MockEntityValues(primary=value, node=node)
|
||||
device = cover.get_device(hass=hass, node=node, values=values, node_config={})
|
||||
|
||||
assert value.data is False
|
||||
device.open_cover()
|
||||
assert value.data is True
|
||||
device.close_cover()
|
||||
assert value.data is False
|
||||
|
||||
|
||||
def test_barrier_garage_value_changed(hass, mock_openzwave):
|
||||
"""Test position changed."""
|
||||
node = MockNode()
|
||||
value = MockValue(
|
||||
data="Closed", node=node, command_class=const.COMMAND_CLASS_BARRIER_OPERATOR
|
||||
)
|
||||
values = MockEntityValues(primary=value, node=node)
|
||||
device = cover.get_device(hass=hass, node=node, values=values, node_config={})
|
||||
|
||||
assert device.is_closed
|
||||
assert not device.is_opening
|
||||
assert not device.is_closing
|
||||
|
||||
value.data = "Opening"
|
||||
value_changed(value)
|
||||
assert not device.is_closed
|
||||
assert device.is_opening
|
||||
assert not device.is_closing
|
||||
|
||||
value.data = "Opened"
|
||||
value_changed(value)
|
||||
assert not device.is_closed
|
||||
assert not device.is_opening
|
||||
assert not device.is_closing
|
||||
|
||||
value.data = "Closing"
|
||||
value_changed(value)
|
||||
assert not device.is_closed
|
||||
assert not device.is_opening
|
||||
assert device.is_closing
|
||||
|
||||
|
||||
def test_barrier_garage_commands(hass, mock_openzwave):
|
||||
"""Test position changed."""
|
||||
node = MockNode()
|
||||
value = MockValue(
|
||||
data="Closed", node=node, command_class=const.COMMAND_CLASS_BARRIER_OPERATOR
|
||||
)
|
||||
values = MockEntityValues(primary=value, node=node)
|
||||
device = cover.get_device(hass=hass, node=node, values=values, node_config={})
|
||||
|
||||
assert value.data == "Closed"
|
||||
device.open_cover()
|
||||
assert value.data == "Opened"
|
||||
device.close_cover()
|
||||
assert value.data == "Closed"
|
|
@ -1,91 +0,0 @@
|
|||
"""Test Z-Wave fans."""
|
||||
import pytest
|
||||
|
||||
from homeassistant.components.fan import SUPPORT_SET_SPEED
|
||||
from homeassistant.components.zwave import fan
|
||||
|
||||
from tests.mock.zwave import MockEntityValues, MockNode, MockValue
|
||||
|
||||
# Integration is disabled
|
||||
pytest.skip("Integration has been disabled in the manifest", allow_module_level=True)
|
||||
|
||||
|
||||
def test_get_device_detects_fan(mock_openzwave):
|
||||
"""Test get_device returns a zwave fan."""
|
||||
node = MockNode()
|
||||
value = MockValue(data=0, node=node)
|
||||
values = MockEntityValues(primary=value)
|
||||
|
||||
device = fan.get_device(node=node, values=values, node_config={})
|
||||
assert isinstance(device, fan.ZwaveFan)
|
||||
assert device.supported_features == SUPPORT_SET_SPEED
|
||||
|
||||
|
||||
def test_fan_turn_on(mock_openzwave):
|
||||
"""Test turning on a zwave fan."""
|
||||
node = MockNode()
|
||||
value = MockValue(data=0, node=node)
|
||||
values = MockEntityValues(primary=value)
|
||||
device = fan.get_device(node=node, values=values, node_config={})
|
||||
|
||||
device.turn_on()
|
||||
|
||||
assert node.set_dimmer.called
|
||||
value_id, brightness = node.set_dimmer.mock_calls[0][1]
|
||||
assert value_id == value.value_id
|
||||
assert brightness == 255
|
||||
|
||||
node.reset_mock()
|
||||
|
||||
device.turn_on(percentage=0)
|
||||
|
||||
assert node.set_dimmer.called
|
||||
value_id, brightness = node.set_dimmer.mock_calls[0][1]
|
||||
|
||||
assert value_id == value.value_id
|
||||
assert brightness == 0
|
||||
|
||||
node.reset_mock()
|
||||
|
||||
device.turn_on(percentage=1)
|
||||
|
||||
assert node.set_dimmer.called
|
||||
value_id, brightness = node.set_dimmer.mock_calls[0][1]
|
||||
|
||||
assert value_id == value.value_id
|
||||
assert brightness == 1
|
||||
|
||||
node.reset_mock()
|
||||
|
||||
device.turn_on(percentage=50)
|
||||
|
||||
assert node.set_dimmer.called
|
||||
value_id, brightness = node.set_dimmer.mock_calls[0][1]
|
||||
|
||||
assert value_id == value.value_id
|
||||
assert brightness == 50
|
||||
|
||||
node.reset_mock()
|
||||
|
||||
device.turn_on(percentage=100)
|
||||
|
||||
assert node.set_dimmer.called
|
||||
value_id, brightness = node.set_dimmer.mock_calls[0][1]
|
||||
|
||||
assert value_id == value.value_id
|
||||
assert brightness == 99
|
||||
|
||||
|
||||
def test_fan_turn_off(mock_openzwave):
|
||||
"""Test turning off a dimmable zwave fan."""
|
||||
node = MockNode()
|
||||
value = MockValue(data=46, node=node)
|
||||
values = MockEntityValues(primary=value)
|
||||
device = fan.get_device(node=node, values=values, node_config={})
|
||||
|
||||
device.turn_off()
|
||||
|
||||
assert node.set_dimmer.called
|
||||
value_id, brightness = node.set_dimmer.mock_calls[0][1]
|
||||
assert value_id == value.value_id
|
||||
assert brightness == 0
|
File diff suppressed because it is too large
Load diff
|
@ -1,481 +0,0 @@
|
|||
"""Test Z-Wave lights."""
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from homeassistant.components import zwave
|
||||
from homeassistant.components.light import (
|
||||
ATTR_BRIGHTNESS,
|
||||
ATTR_COLOR_TEMP,
|
||||
ATTR_RGB_COLOR,
|
||||
ATTR_RGBW_COLOR,
|
||||
ATTR_TRANSITION,
|
||||
COLOR_MODE_BRIGHTNESS,
|
||||
COLOR_MODE_COLOR_TEMP,
|
||||
COLOR_MODE_RGB,
|
||||
COLOR_MODE_RGBW,
|
||||
SUPPORT_TRANSITION,
|
||||
)
|
||||
from homeassistant.components.zwave import const, light
|
||||
|
||||
from tests.mock.zwave import MockEntityValues, MockNode, MockValue, value_changed
|
||||
|
||||
# Integration is disabled
|
||||
pytest.skip("Integration has been disabled in the manifest", allow_module_level=True)
|
||||
|
||||
|
||||
class MockLightValues(MockEntityValues):
|
||||
"""Mock Z-Wave light values."""
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
"""Initialize the mock zwave values."""
|
||||
self.dimming_duration = None
|
||||
self.color = None
|
||||
self.color_channels = None
|
||||
super().__init__(**kwargs)
|
||||
|
||||
|
||||
def test_get_device_detects_dimmer(mock_openzwave):
|
||||
"""Test get_device returns a normal dimmer."""
|
||||
node = MockNode()
|
||||
value = MockValue(data=0, node=node)
|
||||
values = MockLightValues(primary=value)
|
||||
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
assert isinstance(device, light.ZwaveDimmer)
|
||||
assert device.color_mode == COLOR_MODE_BRIGHTNESS
|
||||
assert device.supported_features == 0
|
||||
assert device.supported_color_modes == {COLOR_MODE_BRIGHTNESS}
|
||||
|
||||
|
||||
def test_get_device_detects_colorlight(mock_openzwave):
|
||||
"""Test get_device returns a color light."""
|
||||
node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR])
|
||||
value = MockValue(data=0, node=node)
|
||||
values = MockLightValues(primary=value)
|
||||
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
assert isinstance(device, light.ZwaveColorLight)
|
||||
assert device.color_mode == COLOR_MODE_RGB
|
||||
assert device.supported_features == 0
|
||||
assert device.supported_color_modes == {COLOR_MODE_RGB}
|
||||
|
||||
|
||||
def test_get_device_detects_zw098(mock_openzwave):
|
||||
"""Test get_device returns a zw098 color light."""
|
||||
node = MockNode(
|
||||
manufacturer_id="0086",
|
||||
product_id="0062",
|
||||
command_classes=[const.COMMAND_CLASS_SWITCH_COLOR],
|
||||
)
|
||||
value = MockValue(data=0, node=node)
|
||||
values = MockLightValues(primary=value)
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
assert isinstance(device, light.ZwaveColorLight)
|
||||
assert device.color_mode == COLOR_MODE_RGB
|
||||
assert device.supported_features == 0
|
||||
assert device.supported_color_modes == {COLOR_MODE_COLOR_TEMP, COLOR_MODE_RGB}
|
||||
|
||||
|
||||
def test_get_device_detects_rgbw_light(mock_openzwave):
|
||||
"""Test get_device returns a color light."""
|
||||
node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR])
|
||||
value = MockValue(data=0, node=node)
|
||||
color = MockValue(data="#0000000000", node=node)
|
||||
color_channels = MockValue(data=0x1D, node=node)
|
||||
values = MockLightValues(primary=value, color=color, color_channels=color_channels)
|
||||
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
device.value_added()
|
||||
assert isinstance(device, light.ZwaveColorLight)
|
||||
assert device.color_mode == COLOR_MODE_RGBW
|
||||
assert device.supported_features == 0
|
||||
assert device.supported_color_modes == {COLOR_MODE_RGBW}
|
||||
|
||||
|
||||
def test_dimmer_turn_on(mock_openzwave):
|
||||
"""Test turning on a dimmable Z-Wave light."""
|
||||
node = MockNode()
|
||||
value = MockValue(data=0, node=node)
|
||||
values = MockLightValues(primary=value)
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
|
||||
device.turn_on()
|
||||
|
||||
assert node.set_dimmer.called
|
||||
value_id, brightness = node.set_dimmer.mock_calls[0][1]
|
||||
assert value_id == value.value_id
|
||||
assert brightness == 255
|
||||
|
||||
node.reset_mock()
|
||||
|
||||
device.turn_on(**{ATTR_BRIGHTNESS: 224})
|
||||
|
||||
assert node.set_dimmer.called
|
||||
value_id, brightness = node.set_dimmer.mock_calls[0][1]
|
||||
|
||||
assert value_id == value.value_id
|
||||
assert brightness == 87 # round(224 / 255 * 99)
|
||||
|
||||
node.reset_mock()
|
||||
|
||||
device.turn_on(**{ATTR_BRIGHTNESS: 120})
|
||||
|
||||
assert node.set_dimmer.called
|
||||
value_id, brightness = node.set_dimmer.mock_calls[0][1]
|
||||
|
||||
assert value_id == value.value_id
|
||||
assert brightness == 47 # round(120 / 255 * 99)
|
||||
|
||||
with patch.object(light, "_LOGGER", MagicMock()) as mock_logger:
|
||||
device.turn_on(**{ATTR_TRANSITION: 35})
|
||||
assert mock_logger.debug.called
|
||||
assert node.set_dimmer.called
|
||||
msg, entity_id = mock_logger.debug.mock_calls[0][1]
|
||||
assert entity_id == device.entity_id
|
||||
|
||||
|
||||
def test_dimmer_min_brightness(mock_openzwave):
|
||||
"""Test turning on a dimmable Z-Wave light to its minimum brightness."""
|
||||
node = MockNode()
|
||||
value = MockValue(data=0, node=node)
|
||||
values = MockLightValues(primary=value)
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert not device.is_on
|
||||
|
||||
device.turn_on(**{ATTR_BRIGHTNESS: 1})
|
||||
|
||||
assert device.is_on
|
||||
assert device.brightness == 1
|
||||
|
||||
device.turn_on(**{ATTR_BRIGHTNESS: 0})
|
||||
|
||||
assert device.is_on
|
||||
assert device.brightness == 0
|
||||
|
||||
|
||||
def test_dimmer_transitions(mock_openzwave):
|
||||
"""Test dimming transition on a dimmable Z-Wave light."""
|
||||
node = MockNode()
|
||||
value = MockValue(data=0, node=node)
|
||||
duration = MockValue(data=0, node=node)
|
||||
values = MockLightValues(primary=value, dimming_duration=duration)
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
assert device.color_mode == COLOR_MODE_BRIGHTNESS
|
||||
assert device.supported_features == SUPPORT_TRANSITION
|
||||
assert device.supported_color_modes == {COLOR_MODE_BRIGHTNESS}
|
||||
|
||||
# Test turn_on
|
||||
# Factory Default
|
||||
device.turn_on()
|
||||
assert duration.data == 0xFF
|
||||
|
||||
# Seconds transition
|
||||
device.turn_on(**{ATTR_TRANSITION: 45})
|
||||
assert duration.data == 45
|
||||
|
||||
# Minutes transition
|
||||
device.turn_on(**{ATTR_TRANSITION: 245})
|
||||
assert duration.data == 0x83
|
||||
|
||||
# Clipped transition
|
||||
device.turn_on(**{ATTR_TRANSITION: 10000})
|
||||
assert duration.data == 0xFE
|
||||
|
||||
# Test turn_off
|
||||
# Factory Default
|
||||
device.turn_off()
|
||||
assert duration.data == 0xFF
|
||||
|
||||
# Seconds transition
|
||||
device.turn_off(**{ATTR_TRANSITION: 45})
|
||||
assert duration.data == 45
|
||||
|
||||
# Minutes transition
|
||||
device.turn_off(**{ATTR_TRANSITION: 245})
|
||||
assert duration.data == 0x83
|
||||
|
||||
# Clipped transition
|
||||
device.turn_off(**{ATTR_TRANSITION: 10000})
|
||||
assert duration.data == 0xFE
|
||||
|
||||
|
||||
def test_dimmer_turn_off(mock_openzwave):
|
||||
"""Test turning off a dimmable Z-Wave light."""
|
||||
node = MockNode()
|
||||
value = MockValue(data=46, node=node)
|
||||
values = MockLightValues(primary=value)
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
|
||||
device.turn_off()
|
||||
|
||||
assert node.set_dimmer.called
|
||||
value_id, brightness = node.set_dimmer.mock_calls[0][1]
|
||||
assert value_id == value.value_id
|
||||
assert brightness == 0
|
||||
|
||||
|
||||
def test_dimmer_value_changed(mock_openzwave):
|
||||
"""Test value changed for dimmer lights."""
|
||||
node = MockNode()
|
||||
value = MockValue(data=0, node=node)
|
||||
values = MockLightValues(primary=value)
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert not device.is_on
|
||||
|
||||
value.data = 46
|
||||
value_changed(value)
|
||||
|
||||
assert device.is_on
|
||||
assert device.brightness == 118
|
||||
|
||||
|
||||
def test_dimmer_refresh_value(mock_openzwave):
|
||||
"""Test value changed for dimmer lights."""
|
||||
node = MockNode()
|
||||
value = MockValue(data=0, node=node)
|
||||
values = MockLightValues(primary=value)
|
||||
device = light.get_device(
|
||||
node=node,
|
||||
values=values,
|
||||
node_config={zwave.CONF_REFRESH_VALUE: True, zwave.CONF_REFRESH_DELAY: 5},
|
||||
)
|
||||
|
||||
assert not device.is_on
|
||||
|
||||
with patch.object(light, "Timer") as mock_timer:
|
||||
value.data = 46
|
||||
value_changed(value)
|
||||
|
||||
assert not device.is_on
|
||||
assert mock_timer.called
|
||||
assert len(mock_timer.mock_calls) == 2
|
||||
timeout, callback = mock_timer.mock_calls[0][1][:2]
|
||||
assert timeout == 5
|
||||
assert mock_timer().start.called
|
||||
assert len(mock_timer().start.mock_calls) == 1
|
||||
|
||||
with patch.object(light, "Timer") as mock_timer_2:
|
||||
value_changed(value)
|
||||
assert not device.is_on
|
||||
assert mock_timer().cancel.called
|
||||
assert len(mock_timer_2.mock_calls) == 2
|
||||
timeout, callback = mock_timer_2.mock_calls[0][1][:2]
|
||||
assert timeout == 5
|
||||
assert mock_timer_2().start.called
|
||||
assert len(mock_timer_2().start.mock_calls) == 1
|
||||
|
||||
callback()
|
||||
assert device.is_on
|
||||
assert device.brightness == 118
|
||||
|
||||
|
||||
def test_set_rgb_color(mock_openzwave):
|
||||
"""Test setting zwave light color."""
|
||||
node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR])
|
||||
value = MockValue(data=0, node=node)
|
||||
color = MockValue(data="#0000000000", node=node)
|
||||
# Supports RGB only
|
||||
color_channels = MockValue(data=0x1C, node=node)
|
||||
values = MockLightValues(primary=value, color=color, color_channels=color_channels)
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert color.data == "#0000000000"
|
||||
|
||||
device.turn_on(**{ATTR_RGB_COLOR: (0xFF, 0xBF, 0x7F)})
|
||||
|
||||
assert color.data == "#ffbf7f0000"
|
||||
|
||||
|
||||
def test_set_white_value(mock_openzwave):
|
||||
"""Test setting zwave light color."""
|
||||
node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR])
|
||||
value = MockValue(data=0, node=node)
|
||||
color = MockValue(data="#0000000000", node=node)
|
||||
# Supports RGBW
|
||||
color_channels = MockValue(data=0x1D, node=node)
|
||||
values = MockLightValues(primary=value, color=color, color_channels=color_channels)
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert color.data == "#0000000000"
|
||||
|
||||
device.turn_on(**{ATTR_RGBW_COLOR: (0xFF, 0xFF, 0xFF, 0xC8)})
|
||||
|
||||
assert color.data == "#ffffffc800"
|
||||
|
||||
|
||||
def test_disable_white_if_set_color(mock_openzwave):
|
||||
"""
|
||||
Test that _white is set to 0 if turn_on with ATTR_RGB_COLOR.
|
||||
|
||||
See Issue #13930 - many RGBW ZWave bulbs will only activate the RGB LED to
|
||||
produce color if _white is set to zero.
|
||||
"""
|
||||
node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR])
|
||||
value = MockValue(data=0, node=node)
|
||||
color = MockValue(data="#0000000000", node=node)
|
||||
# Supports RGB only
|
||||
color_channels = MockValue(data=0x1C, node=node)
|
||||
values = MockLightValues(primary=value, color=color, color_channels=color_channels)
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
device._white = 234
|
||||
|
||||
assert color.data == "#0000000000"
|
||||
assert device.rgbw_color == (0, 0, 0, 234)
|
||||
|
||||
device.turn_on(**{ATTR_RGB_COLOR: (0xFF, 0xBF, 0x7F)})
|
||||
|
||||
assert color.data == "#ffbf7f0000"
|
||||
assert device.rgbw_color == (0xFF, 0xBF, 0x7F, 0x00)
|
||||
|
||||
|
||||
def test_zw098_set_color_temp(mock_openzwave):
|
||||
"""Test setting zwave light color."""
|
||||
node = MockNode(
|
||||
manufacturer_id="0086",
|
||||
product_id="0062",
|
||||
command_classes=[const.COMMAND_CLASS_SWITCH_COLOR],
|
||||
)
|
||||
value = MockValue(data=0, node=node)
|
||||
color = MockValue(data="#0000000000", node=node)
|
||||
# Supports RGB, warm white, cold white
|
||||
color_channels = MockValue(data=0x1F, node=node)
|
||||
values = MockLightValues(primary=value, color=color, color_channels=color_channels)
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert color.data == "#0000000000"
|
||||
|
||||
device.turn_on(**{ATTR_COLOR_TEMP: 200})
|
||||
|
||||
assert color.data == "#00000000ff"
|
||||
|
||||
device.turn_on(**{ATTR_COLOR_TEMP: 400})
|
||||
|
||||
assert color.data == "#000000ff00"
|
||||
|
||||
|
||||
def test_rgb_not_supported(mock_openzwave):
|
||||
"""Test value changed for rgb lights."""
|
||||
node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR])
|
||||
value = MockValue(data=0, node=node)
|
||||
color = MockValue(data="#0000000000", node=node)
|
||||
# Supports color temperature only
|
||||
color_channels = MockValue(data=0x01, node=node)
|
||||
values = MockLightValues(primary=value, color=color, color_channels=color_channels)
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert device.rgb_color is None
|
||||
assert device.rgbw_color is None
|
||||
|
||||
|
||||
def test_no_color_value(mock_openzwave):
|
||||
"""Test value changed for rgb lights."""
|
||||
node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR])
|
||||
value = MockValue(data=0, node=node)
|
||||
values = MockLightValues(primary=value)
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert device.rgb_color is None
|
||||
assert device.rgbw_color is None
|
||||
|
||||
|
||||
def test_no_color_channels_value(mock_openzwave):
|
||||
"""Test value changed for rgb lights."""
|
||||
node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR])
|
||||
value = MockValue(data=0, node=node)
|
||||
color = MockValue(data="#0000000000", node=node)
|
||||
values = MockLightValues(primary=value, color=color)
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert device.rgb_color is None
|
||||
assert device.rgbw_color is None
|
||||
|
||||
|
||||
def test_rgb_value_changed(mock_openzwave):
|
||||
"""Test value changed for rgb lights."""
|
||||
node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR])
|
||||
value = MockValue(data=0, node=node)
|
||||
color = MockValue(data="#0000000000", node=node)
|
||||
# Supports RGB only
|
||||
color_channels = MockValue(data=0x1C, node=node)
|
||||
values = MockLightValues(primary=value, color=color, color_channels=color_channels)
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert device.rgb_color == (0, 0, 0)
|
||||
|
||||
color.data = "#ffbf800000"
|
||||
value_changed(color)
|
||||
|
||||
assert device.rgb_color == (0xFF, 0xBF, 0x80)
|
||||
|
||||
|
||||
def test_rgbww_value_changed(mock_openzwave):
|
||||
"""Test value changed for rgb lights."""
|
||||
node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR])
|
||||
value = MockValue(data=0, node=node)
|
||||
color = MockValue(data="#0000000000", node=node)
|
||||
# Supports RGB, Warm White
|
||||
color_channels = MockValue(data=0x1D, node=node)
|
||||
values = MockLightValues(primary=value, color=color, color_channels=color_channels)
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert device.rgbw_color == (0, 0, 0, 0)
|
||||
|
||||
color.data = "#c86400c800"
|
||||
value_changed(color)
|
||||
|
||||
assert device.rgbw_color == (0xC8, 0x64, 0x00, 0xC8)
|
||||
|
||||
|
||||
def test_rgbcw_value_changed(mock_openzwave):
|
||||
"""Test value changed for rgb lights."""
|
||||
node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR])
|
||||
value = MockValue(data=0, node=node)
|
||||
color = MockValue(data="#0000000000", node=node)
|
||||
# Supports RGB, Cold White
|
||||
color_channels = MockValue(data=0x1E, node=node)
|
||||
values = MockLightValues(primary=value, color=color, color_channels=color_channels)
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert device.rgbw_color == (0, 0, 0, 0)
|
||||
|
||||
color.data = "#c86400c800"
|
||||
value_changed(color)
|
||||
|
||||
assert device.rgbw_color == (0xC8, 0x64, 0x00, 0xC8)
|
||||
|
||||
|
||||
def test_ct_value_changed(mock_openzwave):
|
||||
"""Test value changed for zw098 lights."""
|
||||
node = MockNode(
|
||||
manufacturer_id="0086",
|
||||
product_id="0062",
|
||||
command_classes=[const.COMMAND_CLASS_SWITCH_COLOR],
|
||||
)
|
||||
value = MockValue(data=0, node=node)
|
||||
color = MockValue(data="#0000000000", node=node)
|
||||
# Supports RGB, Cold White
|
||||
color_channels = MockValue(data=0x1F, node=node)
|
||||
values = MockLightValues(primary=value, color=color, color_channels=color_channels)
|
||||
device = light.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert device.color_mode == COLOR_MODE_RGB
|
||||
assert device.color_temp is None
|
||||
|
||||
color.data = "#000000ff00"
|
||||
value_changed(color)
|
||||
|
||||
assert device.color_mode == COLOR_MODE_COLOR_TEMP
|
||||
assert device.color_temp == light.TEMP_WARM_HASS
|
||||
|
||||
color.data = "#00000000ff"
|
||||
value_changed(color)
|
||||
|
||||
assert device.color_mode == COLOR_MODE_COLOR_TEMP
|
||||
assert device.color_temp == light.TEMP_COLD_HASS
|
||||
|
||||
color.data = "#ff00000000"
|
||||
value_changed(color)
|
||||
assert device.color_mode == COLOR_MODE_RGB
|
|
@ -1,389 +0,0 @@
|
|||
"""Test Z-Wave locks."""
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from homeassistant import config_entries
|
||||
from homeassistant.components.zwave import const, lock
|
||||
|
||||
from tests.mock.zwave import MockEntityValues, MockNode, MockValue, value_changed
|
||||
|
||||
# Integration is disabled
|
||||
pytest.skip("Integration has been disabled in the manifest", allow_module_level=True)
|
||||
|
||||
|
||||
def test_get_device_detects_lock(mock_openzwave):
|
||||
"""Test get_device returns a Z-Wave lock."""
|
||||
node = MockNode()
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(data=None, node=node),
|
||||
access_control=None,
|
||||
alarm_type=None,
|
||||
alarm_level=None,
|
||||
)
|
||||
|
||||
device = lock.get_device(node=node, values=values, node_config={})
|
||||
assert isinstance(device, lock.ZwaveLock)
|
||||
|
||||
|
||||
def test_lock_turn_on_and_off(mock_openzwave):
|
||||
"""Test turning on a Z-Wave lock."""
|
||||
node = MockNode()
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(data=None, node=node),
|
||||
access_control=None,
|
||||
alarm_type=None,
|
||||
alarm_level=None,
|
||||
)
|
||||
device = lock.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert not values.primary.data
|
||||
|
||||
device.lock()
|
||||
assert values.primary.data
|
||||
|
||||
device.unlock()
|
||||
assert not values.primary.data
|
||||
|
||||
|
||||
def test_lock_value_changed(mock_openzwave):
|
||||
"""Test value changed for Z-Wave lock."""
|
||||
node = MockNode()
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(data=None, node=node),
|
||||
access_control=None,
|
||||
alarm_type=None,
|
||||
alarm_level=None,
|
||||
)
|
||||
device = lock.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert not device.is_locked
|
||||
|
||||
values.primary.data = True
|
||||
value_changed(values.primary)
|
||||
|
||||
assert device.is_locked
|
||||
|
||||
|
||||
def test_lock_state_workaround(mock_openzwave):
|
||||
"""Test value changed for Z-Wave lock using notification state."""
|
||||
node = MockNode(manufacturer_id="0090", product_id="0440")
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(data=True, node=node),
|
||||
access_control=MockValue(data=1, node=node),
|
||||
alarm_type=None,
|
||||
alarm_level=None,
|
||||
)
|
||||
device = lock.get_device(node=node, values=values)
|
||||
assert device.is_locked
|
||||
values.access_control.data = 2
|
||||
value_changed(values.access_control)
|
||||
assert not device.is_locked
|
||||
|
||||
|
||||
def test_track_message_workaround(mock_openzwave):
|
||||
"""Test value changed for Z-Wave lock by alarm-clearing workaround."""
|
||||
node = MockNode(
|
||||
manufacturer_id="003B",
|
||||
product_id="5044",
|
||||
stats={"lastReceivedMessage": [0] * 6},
|
||||
)
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(data=True, node=node),
|
||||
access_control=None,
|
||||
alarm_type=None,
|
||||
alarm_level=None,
|
||||
)
|
||||
|
||||
# Here we simulate an RF lock. The first lock.get_device will call
|
||||
# update properties, simulating the first DoorLock report. We then trigger
|
||||
# a change, simulating the openzwave automatic refreshing behavior (which
|
||||
# is enabled for at least the lock that needs this workaround)
|
||||
node.stats["lastReceivedMessage"][5] = const.COMMAND_CLASS_DOOR_LOCK
|
||||
device = lock.get_device(node=node, values=values)
|
||||
value_changed(values.primary)
|
||||
assert device.is_locked
|
||||
assert device.extra_state_attributes[lock.ATTR_NOTIFICATION] == "RF Lock"
|
||||
|
||||
# Simulate a keypad unlock. We trigger a value_changed() which simulates
|
||||
# the Alarm notification received from the lock. Then, we trigger
|
||||
# value_changed() to simulate the automatic refreshing behavior.
|
||||
values.access_control = MockValue(data=6, node=node)
|
||||
values.alarm_type = MockValue(data=19, node=node)
|
||||
values.alarm_level = MockValue(data=3, node=node)
|
||||
node.stats["lastReceivedMessage"][5] = const.COMMAND_CLASS_ALARM
|
||||
value_changed(values.access_control)
|
||||
node.stats["lastReceivedMessage"][5] = const.COMMAND_CLASS_DOOR_LOCK
|
||||
values.primary.data = False
|
||||
value_changed(values.primary)
|
||||
assert not device.is_locked
|
||||
assert (
|
||||
device.extra_state_attributes[lock.ATTR_LOCK_STATUS]
|
||||
== "Unlocked with Keypad by user 3"
|
||||
)
|
||||
|
||||
# Again, simulate an RF lock.
|
||||
device.lock()
|
||||
node.stats["lastReceivedMessage"][5] = const.COMMAND_CLASS_DOOR_LOCK
|
||||
value_changed(values.primary)
|
||||
assert device.is_locked
|
||||
assert device.extra_state_attributes[lock.ATTR_NOTIFICATION] == "RF Lock"
|
||||
|
||||
|
||||
def test_v2btze_value_changed(mock_openzwave):
|
||||
"""Test value changed for v2btze Z-Wave lock."""
|
||||
node = MockNode(manufacturer_id="010e", product_id="0002")
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(data=None, node=node),
|
||||
v2btze_advanced=MockValue(data="Advanced", node=node),
|
||||
access_control=MockValue(data=19, node=node),
|
||||
alarm_type=None,
|
||||
alarm_level=None,
|
||||
)
|
||||
device = lock.get_device(node=node, values=values, node_config={})
|
||||
assert device._v2btze
|
||||
|
||||
assert not device.is_locked
|
||||
|
||||
values.access_control.data = 24
|
||||
value_changed(values.primary)
|
||||
|
||||
assert device.is_locked
|
||||
|
||||
|
||||
def test_alarm_type_workaround(mock_openzwave):
|
||||
"""Test value changed for Z-Wave lock using alarm type."""
|
||||
node = MockNode(manufacturer_id="0109", product_id="0000")
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(data=True, node=node),
|
||||
access_control=None,
|
||||
alarm_type=MockValue(data=16, node=node),
|
||||
alarm_level=None,
|
||||
)
|
||||
device = lock.get_device(node=node, values=values)
|
||||
assert not device.is_locked
|
||||
|
||||
values.alarm_type.data = 18
|
||||
value_changed(values.alarm_type)
|
||||
assert device.is_locked
|
||||
|
||||
values.alarm_type.data = 19
|
||||
value_changed(values.alarm_type)
|
||||
assert not device.is_locked
|
||||
|
||||
values.alarm_type.data = 21
|
||||
value_changed(values.alarm_type)
|
||||
assert device.is_locked
|
||||
|
||||
values.alarm_type.data = 22
|
||||
value_changed(values.alarm_type)
|
||||
assert not device.is_locked
|
||||
|
||||
values.alarm_type.data = 24
|
||||
value_changed(values.alarm_type)
|
||||
assert device.is_locked
|
||||
|
||||
values.alarm_type.data = 25
|
||||
value_changed(values.alarm_type)
|
||||
assert not device.is_locked
|
||||
|
||||
values.alarm_type.data = 27
|
||||
value_changed(values.alarm_type)
|
||||
assert device.is_locked
|
||||
|
||||
|
||||
def test_lock_access_control(mock_openzwave):
|
||||
"""Test access control for Z-Wave lock."""
|
||||
node = MockNode()
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(data=None, node=node),
|
||||
access_control=MockValue(data=11, node=node),
|
||||
alarm_type=None,
|
||||
alarm_level=None,
|
||||
)
|
||||
device = lock.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert device.extra_state_attributes[lock.ATTR_NOTIFICATION] == "Lock Jammed"
|
||||
|
||||
|
||||
def test_lock_alarm_type(mock_openzwave):
|
||||
"""Test alarm type for Z-Wave lock."""
|
||||
node = MockNode()
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(data=None, node=node),
|
||||
access_control=None,
|
||||
alarm_type=MockValue(data=None, node=node),
|
||||
alarm_level=None,
|
||||
)
|
||||
device = lock.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert lock.ATTR_LOCK_STATUS not in device.extra_state_attributes
|
||||
|
||||
values.alarm_type.data = 21
|
||||
value_changed(values.alarm_type)
|
||||
assert (
|
||||
device.extra_state_attributes[lock.ATTR_LOCK_STATUS] == "Manually Locked None"
|
||||
)
|
||||
|
||||
values.alarm_type.data = 18
|
||||
value_changed(values.alarm_type)
|
||||
assert (
|
||||
device.extra_state_attributes[lock.ATTR_LOCK_STATUS]
|
||||
== "Locked with Keypad by user None"
|
||||
)
|
||||
|
||||
values.alarm_type.data = 161
|
||||
value_changed(values.alarm_type)
|
||||
assert device.extra_state_attributes[lock.ATTR_LOCK_STATUS] == "Tamper Alarm: None"
|
||||
|
||||
values.alarm_type.data = 9
|
||||
value_changed(values.alarm_type)
|
||||
assert device.extra_state_attributes[lock.ATTR_LOCK_STATUS] == "Deadbolt Jammed"
|
||||
|
||||
|
||||
def test_lock_alarm_level(mock_openzwave):
|
||||
"""Test alarm level for Z-Wave lock."""
|
||||
node = MockNode()
|
||||
values = MockEntityValues(
|
||||
primary=MockValue(data=None, node=node),
|
||||
access_control=None,
|
||||
alarm_type=MockValue(data=None, node=node),
|
||||
alarm_level=MockValue(data=None, node=node),
|
||||
)
|
||||
device = lock.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert lock.ATTR_LOCK_STATUS not in device.extra_state_attributes
|
||||
|
||||
values.alarm_type.data = 21
|
||||
values.alarm_level.data = 1
|
||||
value_changed(values.alarm_type)
|
||||
value_changed(values.alarm_level)
|
||||
assert (
|
||||
device.extra_state_attributes[lock.ATTR_LOCK_STATUS]
|
||||
== "Manually Locked by Key Cylinder or Inside thumb turn"
|
||||
)
|
||||
|
||||
values.alarm_type.data = 18
|
||||
values.alarm_level.data = "alice"
|
||||
value_changed(values.alarm_type)
|
||||
value_changed(values.alarm_level)
|
||||
assert (
|
||||
device.extra_state_attributes[lock.ATTR_LOCK_STATUS]
|
||||
== "Locked with Keypad by user alice"
|
||||
)
|
||||
|
||||
values.alarm_type.data = 161
|
||||
values.alarm_level.data = 1
|
||||
value_changed(values.alarm_type)
|
||||
value_changed(values.alarm_level)
|
||||
assert (
|
||||
device.extra_state_attributes[lock.ATTR_LOCK_STATUS]
|
||||
== "Tamper Alarm: Too many keypresses"
|
||||
)
|
||||
|
||||
|
||||
async def setup_ozw(hass, mock_openzwave):
|
||||
"""Set up the mock ZWave config entry."""
|
||||
hass.config.components.add("zwave")
|
||||
config_entry = config_entries.ConfigEntry(
|
||||
1,
|
||||
"zwave",
|
||||
"Mock Title",
|
||||
{"usb_path": "mock-path", "network_key": "mock-key"},
|
||||
"test",
|
||||
)
|
||||
await hass.config_entries.async_forward_entry_setup(config_entry, "lock")
|
||||
await hass.async_block_till_done()
|
||||
|
||||
|
||||
async def test_lock_set_usercode_service(hass, mock_openzwave):
|
||||
"""Test the zwave lock set_usercode service."""
|
||||
mock_network = hass.data[const.DATA_NETWORK] = MagicMock()
|
||||
|
||||
node = MockNode(node_id=12)
|
||||
value0 = MockValue(data=" ", node=node, index=0)
|
||||
value1 = MockValue(data=" ", node=node, index=1)
|
||||
|
||||
node.get_values.return_value = {value0.value_id: value0, value1.value_id: value1}
|
||||
|
||||
mock_network.nodes = {node.node_id: node}
|
||||
|
||||
await setup_ozw(hass, mock_openzwave)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
await hass.services.async_call(
|
||||
lock.DOMAIN,
|
||||
lock.SERVICE_SET_USERCODE,
|
||||
{
|
||||
const.ATTR_NODE_ID: node.node_id,
|
||||
lock.ATTR_USERCODE: "1234",
|
||||
lock.ATTR_CODE_SLOT: 1,
|
||||
},
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert value1.data == "1234"
|
||||
|
||||
mock_network.nodes = {node.node_id: node}
|
||||
await hass.services.async_call(
|
||||
lock.DOMAIN,
|
||||
lock.SERVICE_SET_USERCODE,
|
||||
{
|
||||
const.ATTR_NODE_ID: node.node_id,
|
||||
lock.ATTR_USERCODE: "123",
|
||||
lock.ATTR_CODE_SLOT: 1,
|
||||
},
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert value1.data == "1234"
|
||||
|
||||
|
||||
async def test_lock_get_usercode_service(hass, mock_openzwave):
|
||||
"""Test the zwave lock get_usercode service."""
|
||||
mock_network = hass.data[const.DATA_NETWORK] = MagicMock()
|
||||
node = MockNode(node_id=12)
|
||||
value0 = MockValue(data=None, node=node, index=0)
|
||||
value1 = MockValue(data="1234", node=node, index=1)
|
||||
|
||||
node.get_values.return_value = {value0.value_id: value0, value1.value_id: value1}
|
||||
|
||||
await setup_ozw(hass, mock_openzwave)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
with patch.object(lock, "_LOGGER") as mock_logger:
|
||||
mock_network.nodes = {node.node_id: node}
|
||||
await hass.services.async_call(
|
||||
lock.DOMAIN,
|
||||
lock.SERVICE_GET_USERCODE,
|
||||
{const.ATTR_NODE_ID: node.node_id, lock.ATTR_CODE_SLOT: 1},
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
# This service only seems to write to the log
|
||||
assert mock_logger.info.called
|
||||
assert len(mock_logger.info.mock_calls) == 1
|
||||
assert mock_logger.info.mock_calls[0][1][2] == "1234"
|
||||
|
||||
|
||||
async def test_lock_clear_usercode_service(hass, mock_openzwave):
|
||||
"""Test the zwave lock clear_usercode service."""
|
||||
mock_network = hass.data[const.DATA_NETWORK] = MagicMock()
|
||||
node = MockNode(node_id=12)
|
||||
value0 = MockValue(data=None, node=node, index=0)
|
||||
value1 = MockValue(data="123", node=node, index=1)
|
||||
|
||||
node.get_values.return_value = {value0.value_id: value0, value1.value_id: value1}
|
||||
|
||||
mock_network.nodes = {node.node_id: node}
|
||||
|
||||
await setup_ozw(hass, mock_openzwave)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
await hass.services.async_call(
|
||||
lock.DOMAIN,
|
||||
lock.SERVICE_CLEAR_USERCODE,
|
||||
{const.ATTR_NODE_ID: node.node_id, lock.ATTR_CODE_SLOT: 1},
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert value1.data == "\0\0\0"
|
|
@ -1,723 +0,0 @@
|
|||
"""Test Z-Wave node entity."""
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from homeassistant.components.zwave import const, node_entity
|
||||
from homeassistant.const import ATTR_ENTITY_ID
|
||||
|
||||
import tests.mock.zwave as mock_zwave
|
||||
|
||||
# Integration is disabled
|
||||
pytest.skip("Integration has been disabled in the manifest", allow_module_level=True)
|
||||
|
||||
|
||||
async def test_maybe_schedule_update(hass, mock_openzwave):
|
||||
"""Test maybe schedule update."""
|
||||
base_entity = node_entity.ZWaveBaseEntity()
|
||||
base_entity.entity_id = "zwave.bla"
|
||||
base_entity.hass = hass
|
||||
|
||||
with patch.object(hass.loop, "call_later") as mock_call_later:
|
||||
base_entity._schedule_update()
|
||||
assert mock_call_later.called
|
||||
|
||||
base_entity._schedule_update()
|
||||
assert len(mock_call_later.mock_calls) == 1
|
||||
assert base_entity._update_scheduled is True
|
||||
|
||||
do_update = mock_call_later.mock_calls[0][1][1]
|
||||
|
||||
do_update()
|
||||
assert base_entity._update_scheduled is False
|
||||
|
||||
base_entity._schedule_update()
|
||||
assert len(mock_call_later.mock_calls) == 2
|
||||
|
||||
|
||||
async def test_node_event_activated(hass, mock_openzwave):
|
||||
"""Test Node event activated event."""
|
||||
mock_receivers = []
|
||||
|
||||
def mock_connect(receiver, signal, *args, **kwargs):
|
||||
if signal == mock_zwave.MockNetwork.SIGNAL_NODE_EVENT:
|
||||
mock_receivers.append(receiver)
|
||||
|
||||
node = mock_zwave.MockNode(node_id=11)
|
||||
|
||||
with patch("pydispatch.dispatcher.connect", new=mock_connect):
|
||||
entity = node_entity.ZWaveNodeEntity(node, mock_openzwave)
|
||||
|
||||
assert len(mock_receivers) == 1
|
||||
|
||||
events = []
|
||||
|
||||
def listener(event):
|
||||
events.append(event)
|
||||
|
||||
hass.bus.async_listen(const.EVENT_NODE_EVENT, listener)
|
||||
|
||||
# Test event before entity added to hass
|
||||
value = 234
|
||||
hass.async_add_job(mock_receivers[0], node, value)
|
||||
await hass.async_block_till_done()
|
||||
assert len(events) == 0
|
||||
|
||||
# Add entity to hass
|
||||
entity.hass = hass
|
||||
entity.entity_id = "zwave.mock_node"
|
||||
|
||||
value = 234
|
||||
hass.async_add_job(mock_receivers[0], node, value)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert len(events) == 1
|
||||
assert events[0].data[ATTR_ENTITY_ID] == "zwave.mock_node"
|
||||
assert events[0].data[const.ATTR_NODE_ID] == 11
|
||||
assert events[0].data[const.ATTR_BASIC_LEVEL] == value
|
||||
|
||||
|
||||
async def test_scene_activated(hass, mock_openzwave):
|
||||
"""Test scene activated event."""
|
||||
mock_receivers = []
|
||||
|
||||
def mock_connect(receiver, signal, *args, **kwargs):
|
||||
if signal == mock_zwave.MockNetwork.SIGNAL_SCENE_EVENT:
|
||||
mock_receivers.append(receiver)
|
||||
|
||||
node = mock_zwave.MockNode(node_id=11)
|
||||
|
||||
with patch("pydispatch.dispatcher.connect", new=mock_connect):
|
||||
entity = node_entity.ZWaveNodeEntity(node, mock_openzwave)
|
||||
|
||||
assert len(mock_receivers) == 1
|
||||
|
||||
events = []
|
||||
|
||||
def listener(event):
|
||||
events.append(event)
|
||||
|
||||
hass.bus.async_listen(const.EVENT_SCENE_ACTIVATED, listener)
|
||||
|
||||
# Test event before entity added to hass
|
||||
scene_id = 123
|
||||
hass.async_add_job(mock_receivers[0], node, scene_id)
|
||||
await hass.async_block_till_done()
|
||||
assert len(events) == 0
|
||||
|
||||
# Add entity to hass
|
||||
entity.hass = hass
|
||||
entity.entity_id = "zwave.mock_node"
|
||||
|
||||
scene_id = 123
|
||||
hass.async_add_job(mock_receivers[0], node, scene_id)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert len(events) == 1
|
||||
assert events[0].data[ATTR_ENTITY_ID] == "zwave.mock_node"
|
||||
assert events[0].data[const.ATTR_NODE_ID] == 11
|
||||
assert events[0].data[const.ATTR_SCENE_ID] == scene_id
|
||||
|
||||
|
||||
async def test_central_scene_activated(hass, mock_openzwave):
|
||||
"""Test central scene activated event."""
|
||||
mock_receivers = []
|
||||
|
||||
def mock_connect(receiver, signal, *args, **kwargs):
|
||||
if signal == mock_zwave.MockNetwork.SIGNAL_VALUE_CHANGED:
|
||||
mock_receivers.append(receiver)
|
||||
|
||||
node = mock_zwave.MockNode(node_id=11)
|
||||
|
||||
with patch("pydispatch.dispatcher.connect", new=mock_connect):
|
||||
entity = node_entity.ZWaveNodeEntity(node, mock_openzwave)
|
||||
|
||||
assert len(mock_receivers) == 1
|
||||
|
||||
events = []
|
||||
|
||||
def listener(event):
|
||||
events.append(event)
|
||||
|
||||
hass.bus.async_listen(const.EVENT_SCENE_ACTIVATED, listener)
|
||||
|
||||
# Test event before entity added to hass
|
||||
scene_id = 1
|
||||
scene_data = 3
|
||||
value = mock_zwave.MockValue(
|
||||
command_class=const.COMMAND_CLASS_CENTRAL_SCENE, index=scene_id, data=scene_data
|
||||
)
|
||||
hass.async_add_job(mock_receivers[0], node, value)
|
||||
await hass.async_block_till_done()
|
||||
assert len(events) == 0
|
||||
|
||||
# Add entity to hass
|
||||
entity.hass = hass
|
||||
entity.entity_id = "zwave.mock_node"
|
||||
|
||||
scene_id = 1
|
||||
scene_data = 3
|
||||
value = mock_zwave.MockValue(
|
||||
command_class=const.COMMAND_CLASS_CENTRAL_SCENE, index=scene_id, data=scene_data
|
||||
)
|
||||
hass.async_add_job(mock_receivers[0], node, value)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert len(events) == 1
|
||||
assert events[0].data[ATTR_ENTITY_ID] == "zwave.mock_node"
|
||||
assert events[0].data[const.ATTR_NODE_ID] == 11
|
||||
assert events[0].data[const.ATTR_SCENE_ID] == scene_id
|
||||
assert events[0].data[const.ATTR_SCENE_DATA] == scene_data
|
||||
|
||||
|
||||
async def test_application_version(hass, mock_openzwave):
|
||||
"""Test application version."""
|
||||
mock_receivers = {}
|
||||
|
||||
signal_mocks = [
|
||||
mock_zwave.MockNetwork.SIGNAL_VALUE_CHANGED,
|
||||
mock_zwave.MockNetwork.SIGNAL_VALUE_ADDED,
|
||||
]
|
||||
|
||||
def mock_connect(receiver, signal, *args, **kwargs):
|
||||
if signal in signal_mocks:
|
||||
mock_receivers[signal] = receiver
|
||||
|
||||
node = mock_zwave.MockNode(node_id=11)
|
||||
|
||||
with patch("pydispatch.dispatcher.connect", new=mock_connect):
|
||||
entity = node_entity.ZWaveNodeEntity(node, mock_openzwave)
|
||||
|
||||
for signal_mock in signal_mocks:
|
||||
assert signal_mock in mock_receivers.keys()
|
||||
|
||||
events = []
|
||||
|
||||
def listener(event):
|
||||
events.append(event)
|
||||
|
||||
# Make sure application version isn't set before
|
||||
assert (
|
||||
node_entity.ATTR_APPLICATION_VERSION not in entity.extra_state_attributes.keys()
|
||||
)
|
||||
|
||||
# Add entity to hass
|
||||
entity.hass = hass
|
||||
entity.entity_id = "zwave.mock_node"
|
||||
|
||||
# Fire off an added value
|
||||
value = mock_zwave.MockValue(
|
||||
command_class=const.COMMAND_CLASS_VERSION,
|
||||
label="Application Version",
|
||||
data="5.10",
|
||||
)
|
||||
hass.async_add_job(
|
||||
mock_receivers[mock_zwave.MockNetwork.SIGNAL_VALUE_ADDED], node, value
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert entity.extra_state_attributes[node_entity.ATTR_APPLICATION_VERSION] == "5.10"
|
||||
|
||||
# Fire off a changed
|
||||
value = mock_zwave.MockValue(
|
||||
command_class=const.COMMAND_CLASS_VERSION,
|
||||
label="Application Version",
|
||||
data="4.14",
|
||||
)
|
||||
hass.async_add_job(
|
||||
mock_receivers[mock_zwave.MockNetwork.SIGNAL_VALUE_CHANGED], node, value
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert entity.extra_state_attributes[node_entity.ATTR_APPLICATION_VERSION] == "4.14"
|
||||
|
||||
|
||||
async def test_network_node_changed_from_value(hass, mock_openzwave):
|
||||
"""Test for network_node_changed."""
|
||||
zwave_network = MagicMock()
|
||||
node = mock_zwave.MockNode()
|
||||
entity = node_entity.ZWaveNodeEntity(node, zwave_network)
|
||||
value = mock_zwave.MockValue(node=node)
|
||||
with patch.object(entity, "maybe_schedule_update") as mock:
|
||||
mock_zwave.value_changed(value)
|
||||
mock.assert_called_once_with()
|
||||
|
||||
|
||||
async def test_network_node_changed_from_node(hass, mock_openzwave):
|
||||
"""Test for network_node_changed."""
|
||||
zwave_network = MagicMock()
|
||||
node = mock_zwave.MockNode()
|
||||
entity = node_entity.ZWaveNodeEntity(node, zwave_network)
|
||||
with patch.object(entity, "maybe_schedule_update") as mock:
|
||||
mock_zwave.node_changed(node)
|
||||
mock.assert_called_once_with()
|
||||
|
||||
|
||||
async def test_network_node_changed_from_another_node(hass, mock_openzwave):
|
||||
"""Test for network_node_changed."""
|
||||
zwave_network = MagicMock()
|
||||
node = mock_zwave.MockNode()
|
||||
entity = node_entity.ZWaveNodeEntity(node, zwave_network)
|
||||
with patch.object(entity, "maybe_schedule_update") as mock:
|
||||
another_node = mock_zwave.MockNode(node_id=1024)
|
||||
mock_zwave.node_changed(another_node)
|
||||
assert not mock.called
|
||||
|
||||
|
||||
async def test_network_node_changed_from_notification(hass, mock_openzwave):
|
||||
"""Test for network_node_changed."""
|
||||
zwave_network = MagicMock()
|
||||
node = mock_zwave.MockNode()
|
||||
entity = node_entity.ZWaveNodeEntity(node, zwave_network)
|
||||
with patch.object(entity, "maybe_schedule_update") as mock:
|
||||
mock_zwave.notification(node_id=node.node_id)
|
||||
mock.assert_called_once_with()
|
||||
|
||||
|
||||
async def test_network_node_changed_from_another_notification(hass, mock_openzwave):
|
||||
"""Test for network_node_changed."""
|
||||
zwave_network = MagicMock()
|
||||
node = mock_zwave.MockNode()
|
||||
entity = node_entity.ZWaveNodeEntity(node, zwave_network)
|
||||
with patch.object(entity, "maybe_schedule_update") as mock:
|
||||
mock_zwave.notification(node_id=1024)
|
||||
assert not mock.called
|
||||
|
||||
|
||||
async def test_node_changed(hass, mock_openzwave):
|
||||
"""Test node_changed function."""
|
||||
zwave_network = MagicMock()
|
||||
node = mock_zwave.MockNode(
|
||||
query_stage="Dynamic",
|
||||
is_awake=True,
|
||||
is_ready=False,
|
||||
is_failed=False,
|
||||
is_info_received=True,
|
||||
max_baud_rate=40000,
|
||||
is_zwave_plus=False,
|
||||
capabilities=[],
|
||||
neighbors=[],
|
||||
location=None,
|
||||
)
|
||||
entity = node_entity.ZWaveNodeEntity(node, zwave_network)
|
||||
|
||||
assert {
|
||||
"node_id": node.node_id,
|
||||
"node_name": "Mock Node",
|
||||
"manufacturer_name": "Test Manufacturer",
|
||||
"product_name": "Test Product",
|
||||
} == entity.extra_state_attributes
|
||||
|
||||
node.get_values.return_value = {1: mock_zwave.MockValue(data=1800)}
|
||||
zwave_network.manager.getNodeStatistics.return_value = {
|
||||
"receivedCnt": 4,
|
||||
"ccData": [
|
||||
{"receivedCnt": 0, "commandClassId": 134, "sentCnt": 0},
|
||||
{"receivedCnt": 1, "commandClassId": 133, "sentCnt": 1},
|
||||
{"receivedCnt": 1, "commandClassId": 115, "sentCnt": 1},
|
||||
{"receivedCnt": 0, "commandClassId": 114, "sentCnt": 0},
|
||||
{"receivedCnt": 0, "commandClassId": 112, "sentCnt": 0},
|
||||
{"receivedCnt": 1, "commandClassId": 32, "sentCnt": 1},
|
||||
{"receivedCnt": 0, "commandClassId": 0, "sentCnt": 0},
|
||||
],
|
||||
"receivedUnsolicited": 0,
|
||||
"sentTS": "2017-03-27 15:38:15:620 ",
|
||||
"averageRequestRTT": 2462,
|
||||
"lastResponseRTT": 3679,
|
||||
"retries": 0,
|
||||
"sentFailed": 1,
|
||||
"sentCnt": 7,
|
||||
"quality": 0,
|
||||
"lastRequestRTT": 1591,
|
||||
"lastReceivedMessage": [
|
||||
0,
|
||||
4,
|
||||
0,
|
||||
15,
|
||||
3,
|
||||
32,
|
||||
3,
|
||||
0,
|
||||
221,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
],
|
||||
"receivedDups": 1,
|
||||
"averageResponseRTT": 2443,
|
||||
"receivedTS": "2017-03-27 15:38:19:298 ",
|
||||
}
|
||||
entity.node_changed()
|
||||
assert {
|
||||
"node_id": node.node_id,
|
||||
"node_name": "Mock Node",
|
||||
"manufacturer_name": "Test Manufacturer",
|
||||
"product_name": "Test Product",
|
||||
"query_stage": "Dynamic",
|
||||
"is_awake": True,
|
||||
"is_ready": False,
|
||||
"is_failed": False,
|
||||
"is_info_received": True,
|
||||
"max_baud_rate": 40000,
|
||||
"is_zwave_plus": False,
|
||||
"battery_level": 42,
|
||||
"wake_up_interval": 1800,
|
||||
"averageRequestRTT": 2462,
|
||||
"averageResponseRTT": 2443,
|
||||
"lastRequestRTT": 1591,
|
||||
"lastResponseRTT": 3679,
|
||||
"receivedCnt": 4,
|
||||
"receivedDups": 1,
|
||||
"receivedTS": "2017-03-27 15:38:19:298 ",
|
||||
"receivedUnsolicited": 0,
|
||||
"retries": 0,
|
||||
"sentCnt": 7,
|
||||
"sentFailed": 1,
|
||||
"sentTS": "2017-03-27 15:38:15:620 ",
|
||||
} == entity.extra_state_attributes
|
||||
|
||||
node.can_wake_up_value = False
|
||||
entity.node_changed()
|
||||
|
||||
assert "wake_up_interval" not in entity.extra_state_attributes
|
||||
|
||||
|
||||
async def test_name(hass, mock_openzwave):
|
||||
"""Test name property."""
|
||||
zwave_network = MagicMock()
|
||||
node = mock_zwave.MockNode()
|
||||
entity = node_entity.ZWaveNodeEntity(node, zwave_network)
|
||||
assert entity.name == "Mock Node"
|
||||
|
||||
|
||||
async def test_state_before_update(hass, mock_openzwave):
|
||||
"""Test state before update was called."""
|
||||
zwave_network = MagicMock()
|
||||
node = mock_zwave.MockNode()
|
||||
entity = node_entity.ZWaveNodeEntity(node, zwave_network)
|
||||
assert entity.state is None
|
||||
|
||||
|
||||
async def test_state_not_ready(hass, mock_openzwave):
|
||||
"""Test state property."""
|
||||
zwave_network = MagicMock()
|
||||
node = mock_zwave.MockNode(
|
||||
query_stage="Dynamic",
|
||||
is_awake=True,
|
||||
is_ready=False,
|
||||
is_failed=False,
|
||||
is_info_received=True,
|
||||
)
|
||||
entity = node_entity.ZWaveNodeEntity(node, zwave_network)
|
||||
|
||||
node.is_ready = False
|
||||
entity.node_changed()
|
||||
assert entity.state == "initializing"
|
||||
|
||||
node.is_failed = True
|
||||
node.query_stage = "Complete"
|
||||
entity.node_changed()
|
||||
assert entity.state == "dead"
|
||||
|
||||
node.is_failed = False
|
||||
node.is_awake = False
|
||||
entity.node_changed()
|
||||
assert entity.state == "sleeping"
|
||||
|
||||
|
||||
async def test_state_ready(hass, mock_openzwave):
|
||||
"""Test state property."""
|
||||
zwave_network = MagicMock()
|
||||
node = mock_zwave.MockNode(
|
||||
query_stage="Dynamic",
|
||||
is_awake=True,
|
||||
is_ready=False,
|
||||
is_failed=False,
|
||||
is_info_received=True,
|
||||
)
|
||||
entity = node_entity.ZWaveNodeEntity(node, zwave_network)
|
||||
|
||||
node.query_stage = "Complete"
|
||||
node.is_ready = True
|
||||
entity.node_changed()
|
||||
await hass.async_block_till_done()
|
||||
assert entity.state == "ready"
|
||||
|
||||
node.is_failed = True
|
||||
entity.node_changed()
|
||||
assert entity.state == "dead"
|
||||
|
||||
node.is_failed = False
|
||||
node.is_awake = False
|
||||
entity.node_changed()
|
||||
assert entity.state == "sleeping"
|
||||
|
||||
|
||||
async def test_not_polled(hass, mock_openzwave):
|
||||
"""Test should_poll property."""
|
||||
zwave_network = MagicMock()
|
||||
node = mock_zwave.MockNode()
|
||||
entity = node_entity.ZWaveNodeEntity(node, zwave_network)
|
||||
assert not entity.should_poll
|
||||
|
||||
|
||||
async def test_unique_id(hass, mock_openzwave):
|
||||
"""Test unique_id."""
|
||||
zwave_network = MagicMock()
|
||||
node = mock_zwave.MockNode()
|
||||
entity = node_entity.ZWaveNodeEntity(node, zwave_network)
|
||||
assert entity.unique_id == "node-567"
|
||||
|
||||
|
||||
async def test_unique_id_missing_data(hass, mock_openzwave):
|
||||
"""Test unique_id."""
|
||||
zwave_network = MagicMock()
|
||||
node = mock_zwave.MockNode()
|
||||
node.manufacturer_name = None
|
||||
node.name = None
|
||||
node.is_ready = False
|
||||
entity = node_entity.ZWaveNodeEntity(node, zwave_network)
|
||||
|
||||
assert entity.unique_id is None
|
|
@ -1,183 +0,0 @@
|
|||
"""Test Z-Wave sensor."""
|
||||
import pytest
|
||||
|
||||
from homeassistant.components.sensor import SensorDeviceClass
|
||||
from homeassistant.components.zwave import const, sensor
|
||||
import homeassistant.const
|
||||
|
||||
from tests.mock.zwave import MockEntityValues, MockNode, MockValue, value_changed
|
||||
|
||||
# Integration is disabled
|
||||
pytest.skip("Integration has been disabled in the manifest", allow_module_level=True)
|
||||
|
||||
|
||||
def test_get_device_detects_none(mock_openzwave):
|
||||
"""Test get_device returns None."""
|
||||
node = MockNode()
|
||||
value = MockValue(data=0, node=node)
|
||||
values = MockEntityValues(primary=value)
|
||||
|
||||
device = sensor.get_device(node=node, values=values, node_config={})
|
||||
assert device is None
|
||||
|
||||
|
||||
def test_get_device_detects_alarmsensor(mock_openzwave):
|
||||
"""Test get_device returns a Z-Wave alarmsensor."""
|
||||
node = MockNode(
|
||||
command_classes=[const.COMMAND_CLASS_ALARM, const.COMMAND_CLASS_SENSOR_ALARM]
|
||||
)
|
||||
value = MockValue(data=0, node=node)
|
||||
values = MockEntityValues(primary=value)
|
||||
|
||||
device = sensor.get_device(node=node, values=values, node_config={})
|
||||
assert isinstance(device, sensor.ZWaveAlarmSensor)
|
||||
|
||||
|
||||
def test_get_device_detects_multilevelsensor(mock_openzwave):
|
||||
"""Test get_device returns a Z-Wave multilevel sensor."""
|
||||
node = MockNode(
|
||||
command_classes=[
|
||||
const.COMMAND_CLASS_SENSOR_MULTILEVEL,
|
||||
const.COMMAND_CLASS_METER,
|
||||
]
|
||||
)
|
||||
value = MockValue(data=0, node=node)
|
||||
values = MockEntityValues(primary=value)
|
||||
|
||||
device = sensor.get_device(node=node, values=values, node_config={})
|
||||
assert isinstance(device, sensor.ZWaveMultilevelSensor)
|
||||
assert device.force_update
|
||||
|
||||
|
||||
def test_get_device_detects_multilevel_meter(mock_openzwave):
|
||||
"""Test get_device returns a Z-Wave multilevel sensor."""
|
||||
node = MockNode(command_classes=[const.COMMAND_CLASS_METER])
|
||||
value = MockValue(data=0, node=node, type=const.TYPE_DECIMAL)
|
||||
values = MockEntityValues(primary=value)
|
||||
|
||||
device = sensor.get_device(node=node, values=values, node_config={})
|
||||
assert isinstance(device, sensor.ZWaveMultilevelSensor)
|
||||
|
||||
|
||||
def test_get_device_detects_battery_sensor(mock_openzwave):
|
||||
"""Test get_device returns a Z-Wave battery sensor."""
|
||||
|
||||
node = MockNode(command_classes=[const.COMMAND_CLASS_BATTERY])
|
||||
value = MockValue(
|
||||
data=0,
|
||||
node=node,
|
||||
type=const.TYPE_DECIMAL,
|
||||
command_class=const.COMMAND_CLASS_BATTERY,
|
||||
)
|
||||
values = MockEntityValues(primary=value)
|
||||
|
||||
device = sensor.get_device(node=node, values=values, node_config={})
|
||||
assert isinstance(device, sensor.ZWaveBatterySensor)
|
||||
assert device.device_class is SensorDeviceClass.BATTERY
|
||||
|
||||
|
||||
def test_multilevelsensor_value_changed_temp_fahrenheit(hass, mock_openzwave):
|
||||
"""Test value changed for Z-Wave multilevel sensor for temperature."""
|
||||
hass.config.units.temperature_unit = homeassistant.const.TEMP_FAHRENHEIT
|
||||
|
||||
node = MockNode(
|
||||
command_classes=[
|
||||
const.COMMAND_CLASS_SENSOR_MULTILEVEL,
|
||||
const.COMMAND_CLASS_METER,
|
||||
]
|
||||
)
|
||||
value = MockValue(data=190.95555, units="F", node=node)
|
||||
values = MockEntityValues(primary=value)
|
||||
|
||||
device = sensor.get_device(node=node, values=values, node_config={})
|
||||
device.hass = hass
|
||||
assert device.state == 191.0
|
||||
assert device.unit_of_measurement == homeassistant.const.TEMP_FAHRENHEIT
|
||||
assert device.device_class is SensorDeviceClass.TEMPERATURE
|
||||
value.data = 197.95555
|
||||
value_changed(value)
|
||||
assert device.state == 198.0
|
||||
|
||||
|
||||
def test_multilevelsensor_value_changed_temp_celsius(hass, mock_openzwave):
|
||||
"""Test value changed for Z-Wave multilevel sensor for temperature."""
|
||||
hass.config.units.temperature_unit = homeassistant.const.TEMP_CELSIUS
|
||||
node = MockNode(
|
||||
command_classes=[
|
||||
const.COMMAND_CLASS_SENSOR_MULTILEVEL,
|
||||
const.COMMAND_CLASS_METER,
|
||||
]
|
||||
)
|
||||
value = MockValue(data=38.85555, units="C", node=node)
|
||||
values = MockEntityValues(primary=value)
|
||||
|
||||
device = sensor.get_device(node=node, values=values, node_config={})
|
||||
device.hass = hass
|
||||
assert device.state == 38.9
|
||||
assert device.unit_of_measurement == homeassistant.const.TEMP_CELSIUS
|
||||
assert device.device_class is SensorDeviceClass.TEMPERATURE
|
||||
value.data = 37.95555
|
||||
value_changed(value)
|
||||
assert device.state == 38.0
|
||||
|
||||
|
||||
def test_multilevelsensor_value_changed_other_units(hass, mock_openzwave):
|
||||
"""Test value changed for Z-Wave multilevel sensor for other units."""
|
||||
node = MockNode(
|
||||
command_classes=[
|
||||
const.COMMAND_CLASS_SENSOR_MULTILEVEL,
|
||||
const.COMMAND_CLASS_METER,
|
||||
]
|
||||
)
|
||||
value = MockValue(
|
||||
data=190.95555, units=homeassistant.const.ENERGY_KILO_WATT_HOUR, node=node
|
||||
)
|
||||
values = MockEntityValues(primary=value)
|
||||
|
||||
device = sensor.get_device(node=node, values=values, node_config={})
|
||||
device.hass = hass
|
||||
assert device.state == 190.96
|
||||
assert device.unit_of_measurement == homeassistant.const.ENERGY_KILO_WATT_HOUR
|
||||
assert device.device_class is None
|
||||
value.data = 197.95555
|
||||
value_changed(value)
|
||||
assert device.state == 197.96
|
||||
|
||||
|
||||
def test_multilevelsensor_value_changed_integer(hass, mock_openzwave):
|
||||
"""Test value changed for Z-Wave multilevel sensor for other units."""
|
||||
node = MockNode(
|
||||
command_classes=[
|
||||
const.COMMAND_CLASS_SENSOR_MULTILEVEL,
|
||||
const.COMMAND_CLASS_METER,
|
||||
]
|
||||
)
|
||||
value = MockValue(data=5, units="counts", node=node)
|
||||
values = MockEntityValues(primary=value)
|
||||
|
||||
device = sensor.get_device(node=node, values=values, node_config={})
|
||||
device.hass = hass
|
||||
assert device.state == 5
|
||||
assert device.unit_of_measurement == "counts"
|
||||
assert device.device_class is None
|
||||
value.data = 6
|
||||
value_changed(value)
|
||||
assert device.state == 6
|
||||
|
||||
|
||||
def test_alarm_sensor_value_changed(hass, mock_openzwave):
|
||||
"""Test value changed for Z-Wave sensor."""
|
||||
node = MockNode(
|
||||
command_classes=[const.COMMAND_CLASS_ALARM, const.COMMAND_CLASS_SENSOR_ALARM]
|
||||
)
|
||||
value = MockValue(data=12.34, node=node, units=homeassistant.const.PERCENTAGE)
|
||||
values = MockEntityValues(primary=value)
|
||||
|
||||
device = sensor.get_device(node=node, values=values, node_config={})
|
||||
device.hass = hass
|
||||
assert device.state == 12.34
|
||||
assert device.unit_of_measurement == homeassistant.const.PERCENTAGE
|
||||
assert device.device_class is None
|
||||
value.data = 45.67
|
||||
value_changed(value)
|
||||
assert device.state == 45.67
|
|
@ -1,85 +0,0 @@
|
|||
"""Test Z-Wave switches."""
|
||||
from unittest.mock import patch
|
||||
|
||||
import pytest
|
||||
|
||||
from homeassistant.components.zwave import switch
|
||||
|
||||
from tests.mock.zwave import MockEntityValues, MockNode, MockValue, value_changed
|
||||
|
||||
# Integration is disabled
|
||||
pytest.skip("Integration has been disabled in the manifest", allow_module_level=True)
|
||||
|
||||
|
||||
def test_get_device_detects_switch(mock_openzwave):
|
||||
"""Test get_device returns a Z-Wave switch."""
|
||||
node = MockNode()
|
||||
value = MockValue(data=0, node=node)
|
||||
values = MockEntityValues(primary=value)
|
||||
|
||||
device = switch.get_device(node=node, values=values, node_config={})
|
||||
assert isinstance(device, switch.ZwaveSwitch)
|
||||
|
||||
|
||||
def test_switch_turn_on_and_off(mock_openzwave):
|
||||
"""Test turning on a Z-Wave switch."""
|
||||
node = MockNode()
|
||||
value = MockValue(data=0, node=node)
|
||||
values = MockEntityValues(primary=value)
|
||||
device = switch.get_device(node=node, values=values, node_config={})
|
||||
|
||||
device.turn_on()
|
||||
|
||||
assert node.set_switch.called
|
||||
value_id, state = node.set_switch.mock_calls[0][1]
|
||||
assert value_id == value.value_id
|
||||
assert state is True
|
||||
node.reset_mock()
|
||||
|
||||
device.turn_off()
|
||||
|
||||
assert node.set_switch.called
|
||||
value_id, state = node.set_switch.mock_calls[0][1]
|
||||
assert value_id == value.value_id
|
||||
assert state is False
|
||||
|
||||
|
||||
def test_switch_value_changed(mock_openzwave):
|
||||
"""Test value changed for Z-Wave switch."""
|
||||
node = MockNode()
|
||||
value = MockValue(data=False, node=node)
|
||||
values = MockEntityValues(primary=value)
|
||||
device = switch.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert not device.is_on
|
||||
|
||||
value.data = True
|
||||
value_changed(value)
|
||||
|
||||
assert device.is_on
|
||||
|
||||
|
||||
@patch("time.perf_counter")
|
||||
def test_switch_refresh_on_update(mock_counter, mock_openzwave):
|
||||
"""Test value changed for refresh on update Z-Wave switch."""
|
||||
mock_counter.return_value = 10
|
||||
node = MockNode(manufacturer_id="013c", product_type="0001", product_id="0005")
|
||||
value = MockValue(data=False, node=node, instance=1)
|
||||
values = MockEntityValues(primary=value)
|
||||
device = switch.get_device(node=node, values=values, node_config={})
|
||||
|
||||
assert not device.is_on
|
||||
|
||||
mock_counter.return_value = 15
|
||||
value.data = True
|
||||
value_changed(value)
|
||||
|
||||
assert device.is_on
|
||||
assert not node.request_state.called
|
||||
|
||||
mock_counter.return_value = 45
|
||||
value.data = False
|
||||
value_changed(value)
|
||||
|
||||
assert not device.is_on
|
||||
assert node.request_state.called
|
|
@ -1,95 +0,0 @@
|
|||
"""Test Z-Wave Websocket API."""
|
||||
from unittest.mock import call, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from homeassistant import config_entries
|
||||
from homeassistant.bootstrap import async_setup_component
|
||||
from homeassistant.components.zwave.const import (
|
||||
CONF_AUTOHEAL,
|
||||
CONF_NETWORK_KEY,
|
||||
CONF_POLLING_INTERVAL,
|
||||
CONF_USB_STICK_PATH,
|
||||
)
|
||||
from homeassistant.components.zwave.websocket_api import ID, TYPE
|
||||
|
||||
NETWORK_KEY = "0xTE, 0xST, 0xTE, 0xST, 0xTE, 0xST, 0xTE, 0xST, 0xTE, 0xST, 0xTE, 0xST, 0xTE, 0xST, 0xTE, 0xST"
|
||||
|
||||
|
||||
# Integration is disabled
|
||||
pytest.skip("Integration has been disabled in the manifest", allow_module_level=True)
|
||||
|
||||
|
||||
async def test_zwave_ws_api(hass, mock_openzwave, hass_ws_client):
|
||||
"""Test Z-Wave websocket API."""
|
||||
|
||||
await async_setup_component(
|
||||
hass,
|
||||
"zwave",
|
||||
{
|
||||
"zwave": {
|
||||
CONF_AUTOHEAL: False,
|
||||
CONF_USB_STICK_PATH: "/dev/zwave",
|
||||
CONF_POLLING_INTERVAL: 6000,
|
||||
CONF_NETWORK_KEY: NETWORK_KEY,
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
await hass.async_block_till_done()
|
||||
|
||||
client = await hass_ws_client(hass)
|
||||
|
||||
await client.send_json({ID: 5, TYPE: "zwave/get_config"})
|
||||
|
||||
msg = await client.receive_json()
|
||||
result = msg["result"]
|
||||
|
||||
assert result[CONF_USB_STICK_PATH] == "/dev/zwave"
|
||||
assert not result[CONF_AUTOHEAL]
|
||||
assert result[CONF_POLLING_INTERVAL] == 6000
|
||||
|
||||
|
||||
async def test_zwave_zwave_js_migration_api(hass, mock_openzwave, hass_ws_client):
|
||||
"""Test Z-Wave to Z-Wave JS websocket migration API."""
|
||||
|
||||
await async_setup_component(
|
||||
hass,
|
||||
"zwave",
|
||||
{
|
||||
"zwave": {
|
||||
CONF_AUTOHEAL: False,
|
||||
CONF_USB_STICK_PATH: "/dev/zwave",
|
||||
CONF_POLLING_INTERVAL: 6000,
|
||||
CONF_NETWORK_KEY: NETWORK_KEY,
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
await hass.async_block_till_done()
|
||||
|
||||
client = await hass_ws_client(hass)
|
||||
|
||||
await client.send_json({ID: 6, TYPE: "zwave/get_migration_config"})
|
||||
msg = await client.receive_json()
|
||||
result = msg["result"]
|
||||
|
||||
assert result[CONF_USB_STICK_PATH] == "/dev/zwave"
|
||||
assert result[CONF_NETWORK_KEY] == NETWORK_KEY
|
||||
|
||||
with patch(
|
||||
"homeassistant.config_entries.ConfigEntriesFlowManager.async_init"
|
||||
) as async_init:
|
||||
|
||||
async_init.return_value = {"flow_id": "mock_flow_id"}
|
||||
await client.send_json({ID: 7, TYPE: "zwave/start_zwave_js_config_flow"})
|
||||
msg = await client.receive_json()
|
||||
|
||||
result = msg["result"]
|
||||
|
||||
assert result["flow_id"] == "mock_flow_id"
|
||||
assert async_init.call_args == call(
|
||||
"zwave_js",
|
||||
context={"source": config_entries.SOURCE_IMPORT},
|
||||
data={"usb_path": "/dev/zwave", "network_key": NETWORK_KEY},
|
||||
)
|
|
@ -1,71 +0,0 @@
|
|||
"""Test Z-Wave workarounds."""
|
||||
import pytest
|
||||
|
||||
from homeassistant.components.zwave import const, workaround
|
||||
|
||||
from tests.mock.zwave import MockNode, MockValue
|
||||
|
||||
# Integration is disabled
|
||||
pytest.skip("Integration has been disabled in the manifest", allow_module_level=True)
|
||||
|
||||
|
||||
def test_get_device_no_component_mapping():
|
||||
"""Test that None is returned."""
|
||||
node = MockNode(manufacturer_id=" ")
|
||||
value = MockValue(data=0, node=node)
|
||||
assert workaround.get_device_component_mapping(value) is None
|
||||
|
||||
|
||||
def test_get_device_component_mapping():
|
||||
"""Test that component is returned."""
|
||||
node = MockNode(manufacturer_id="010f", product_type="0b00")
|
||||
value = MockValue(data=0, node=node, command_class=const.COMMAND_CLASS_SENSOR_ALARM)
|
||||
assert workaround.get_device_component_mapping(value) == "binary_sensor"
|
||||
|
||||
|
||||
def test_get_device_component_mapping_mti():
|
||||
"""Test that component is returned."""
|
||||
# GE Fan controller
|
||||
node = MockNode(manufacturer_id="0063", product_type="4944", product_id="3034")
|
||||
value = MockValue(
|
||||
data=0, node=node, command_class=const.COMMAND_CLASS_SWITCH_MULTILEVEL
|
||||
)
|
||||
assert workaround.get_device_component_mapping(value) == "fan"
|
||||
|
||||
# GE Dimmer
|
||||
node = MockNode(manufacturer_id="0063", product_type="4944", product_id="3031")
|
||||
value = MockValue(
|
||||
data=0, node=node, command_class=const.COMMAND_CLASS_SWITCH_MULTILEVEL
|
||||
)
|
||||
assert workaround.get_device_component_mapping(value) is None
|
||||
|
||||
|
||||
def test_get_device_no_mapping():
|
||||
"""Test that no device mapping is returned."""
|
||||
node = MockNode(manufacturer_id=" ")
|
||||
value = MockValue(data=0, node=node)
|
||||
assert workaround.get_device_mapping(value) is None
|
||||
|
||||
|
||||
def test_get_device_mapping_mt():
|
||||
"""Test that device mapping mt is returned."""
|
||||
node = MockNode(manufacturer_id="0047", product_type="5a52")
|
||||
value = MockValue(data=0, node=node)
|
||||
assert workaround.get_device_mapping(value) == "workaround_no_position"
|
||||
|
||||
|
||||
def test_get_device_mapping_mtii():
|
||||
"""Test that device mapping mtii is returned."""
|
||||
node = MockNode(manufacturer_id="013c", product_type="0002", product_id="0002")
|
||||
value = MockValue(data=0, node=node, index=0)
|
||||
assert workaround.get_device_mapping(value) == "trigger_no_off_event"
|
||||
|
||||
|
||||
def test_get_device_mapping_mti_instance():
|
||||
"""Test that device mapping mti_instance is returned."""
|
||||
node = MockNode(manufacturer_id="013c", product_type="0001", product_id="0005")
|
||||
value = MockValue(data=0, node=node, instance=1)
|
||||
assert workaround.get_device_mapping(value) == "refresh_node_on_update"
|
||||
|
||||
value = MockValue(data=0, node=node, instance=2)
|
||||
assert workaround.get_device_mapping(value) is None
|
|
@ -217,6 +217,7 @@ def zwave_integration_fixture(hass, zwave_migration_data):
|
|||
yield zwave_config_entry
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="The old zwave integration has been removed.")
|
||||
async def test_migrate_zwave(
|
||||
hass,
|
||||
zwave_integration,
|
||||
|
@ -353,7 +354,7 @@ async def test_migrate_zwave(
|
|||
assert not await hass.config_entries.async_setup(zwave_config_entry.entry_id)
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="The old zwave integration has been disabled.")
|
||||
@pytest.mark.skip(reason="The old zwave integration has been removed.")
|
||||
async def test_migrate_zwave_dry_run(
|
||||
hass,
|
||||
zwave_integration,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue