diff --git a/.coveragerc b/.coveragerc index b501db31a04..752bebe6123 100644 --- a/.coveragerc +++ b/.coveragerc @@ -177,7 +177,6 @@ omit = homeassistant/components/cover/rpi_gpio.py homeassistant/components/cover/scsgate.py homeassistant/components/cover/wink.py - homeassistant/components/cover/zwave.py homeassistant/components/device_tracker/actiontec.py homeassistant/components/device_tracker/aruba.py homeassistant/components/device_tracker/asuswrt.py diff --git a/tests/components/cover/test_zwave.py b/tests/components/cover/test_zwave.py new file mode 100644 index 00000000000..1b4ce015987 --- /dev/null +++ b/tests/components/cover/test_zwave.py @@ -0,0 +1,176 @@ +"""Test Z-Wave cover devices.""" +from unittest.mock import patch + +from homeassistant.components.cover import zwave, SUPPORT_OPEN, SUPPORT_CLOSE +from homeassistant.components.zwave import const + +from tests.mock.zwave import ( + MockNode, MockValue, MockEntityValues, value_changed) + + +def test_get_device_detects_none(mock_openzwave): + """Test device returns none.""" + node = MockNode() + value = MockValue(data=0, node=node) + values = MockEntityValues(primary=value, node=node) + + device = zwave.get_device(node=node, values=values, node_config={}) + assert device is None + + +def test_get_device_detects_rollershutter(mock_openzwave): + """Test device returns rollershutter.""" + 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 = zwave.get_device(node=node, values=values, node_config={}) + assert isinstance(device, zwave.ZwaveRollershutter) + + +def test_get_device_detects_garagedoor(mock_openzwave): + """Test device returns garage door.""" + node = MockNode() + value = MockValue(data=0, node=node, + command_class=const.COMMAND_CLASS_BARRIER_OPERATOR) + values = MockEntityValues(primary=value, node=node) + + device = zwave.get_device(node=node, values=values, node_config={}) + assert isinstance(device, zwave.ZwaveGarageDoor) + assert device.device_class == "garage" + assert device.supported_features == SUPPORT_OPEN | SUPPORT_CLOSE + + +def test_roller_no_position_workaround(mock_openzwave): + """Test position changed.""" + 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 = zwave.get_device(node=node, values=values, node_config={}) + + assert device.current_cover_position is None + + +def test_roller_value_changed(mock_openzwave): + """Test position changed.""" + 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 = zwave.get_device(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 + + +@patch('homeassistant.components.zwave.NETWORK') +def test_roller_commands(mock_network, mock_openzwave): + """Test position changed.""" + 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 = zwave.get_device(node=node, values=values, node_config={}) + + device.set_cover_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 + + +@patch('homeassistant.components.zwave.NETWORK') +def test_roller_reverse_open_close(mock_network, mock_openzwave): + """Test position changed.""" + node = MockNode(manufacturer_id='010f', product_type='0301') + 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 = zwave.get_device(node=node, values=values, node_config={}) + + 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_garage_value_changed(mock_openzwave): + """Test position changed.""" + node = MockNode() + value = MockValue(data=False, node=node, + command_class=const.COMMAND_CLASS_BARRIER_OPERATOR) + values = MockEntityValues(primary=value, node=node) + device = zwave.get_device(node=node, values=values, node_config={}) + + assert device.is_closed + + value.data = True + value_changed(value) + + assert not device.is_closed + + +def test_garage_commands(mock_openzwave): + """Test position changed.""" + node = MockNode() + value = MockValue(data=False, node=node, + command_class=const.COMMAND_CLASS_BARRIER_OPERATOR) + values = MockEntityValues(primary=value, node=node) + device = zwave.get_device(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