Merge pull request #1390 from flyte/tcp-component-tests

Bring TCP component test coverage to 100%
pull/1394/head
Paulus Schoutsen 2016-02-24 07:33:34 -08:00
commit c2729211ad
2 changed files with 137 additions and 3 deletions

View File

@ -0,0 +1,60 @@
"""
tests.components.sensor.tcp
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tests TCP sensor.
"""
from copy import copy
from unittest.mock import Mock
from homeassistant.components.sensor import tcp
from homeassistant.components.binary_sensor import tcp as bin_tcp
from tests.common import get_test_home_assistant
from tests.components.sensor import test_tcp
def test_setup_platform_valid_config():
""" Should check the supplied config and call add_entities with Sensor. """
add_entities = Mock()
ret = bin_tcp.setup_platform(None, test_tcp.TEST_CONFIG, add_entities)
assert ret is None, "setup_platform() should return None if successful."
assert add_entities.called
assert isinstance(add_entities.call_args[0][0][0], bin_tcp.BinarySensor)
def test_setup_platform_invalid_config():
""" Should check the supplied config and return False if it is invalid. """
config = copy(test_tcp.TEST_CONFIG)
del config[tcp.CONF_HOST]
assert bin_tcp.setup_platform(None, config, None) is False
class TestTCPBinarySensor():
""" Test the TCP Binary Sensor. """
def setup_class(cls):
cls.hass = get_test_home_assistant()
def teardown_class(cls):
cls.hass.stop()
def test_requires_additional_values(self):
""" Should require the additional config values specified. """
config = copy(test_tcp.TEST_CONFIG)
for key in bin_tcp.BinarySensor.required:
del config[key]
assert len(config) != len(test_tcp.TEST_CONFIG)
assert not bin_tcp.BinarySensor.validate_config(config)
def test_is_on_true(self):
""" Should return True if _state is the same as value_on. """
sensor = bin_tcp.BinarySensor(self.hass, test_tcp.TEST_CONFIG)
sensor._state = test_tcp.TEST_CONFIG[tcp.CONF_VALUE_ON]
assert sensor.is_on
def test_is_on_false(self):
""" Should return False if _state is not the same as value_on. """
sensor = bin_tcp.BinarySensor(self.hass, test_tcp.TEST_CONFIG)
sensor._state = "%s abc" % test_tcp.TEST_CONFIG[tcp.CONF_VALUE_ON]
assert not sensor.is_on

View File

@ -6,10 +6,12 @@ Tests TCP sensor.
"""
import socket
from copy import copy
from uuid import uuid4
from unittest.mock import patch
from unittest.mock import patch, Mock
from homeassistant.components.sensor import tcp
from homeassistant.helpers.entity import Entity
from tests.common import get_test_home_assistant
@ -34,7 +36,22 @@ KEYS_AND_DEFAULTS = {
}
# class TestTCPSensor(unittest.TestCase):
def test_setup_platform_valid_config():
""" Should check the supplied config and call add_entities with Sensor. """
add_entities = Mock()
ret = tcp.setup_platform(None, TEST_CONFIG, add_entities)
assert ret is None, "setup_platform() should return None if successful."
assert add_entities.called
assert isinstance(add_entities.call_args[0][0][0], tcp.Sensor)
def test_setup_platform_invalid_config():
""" Should check the supplied config and return False if it is invalid. """
config = copy(TEST_CONFIG)
del config[tcp.CONF_HOST]
assert tcp.setup_platform(None, config, None) is False
class TestTCPSensor():
""" Test the TCP Sensor. """
@ -44,6 +61,31 @@ class TestTCPSensor():
def teardown_class(cls):
cls.hass.stop()
def test_name(self):
""" Should return the name if set in the config. """
sensor = tcp.Sensor(self.hass, TEST_CONFIG)
assert sensor.name == TEST_CONFIG[tcp.CONF_NAME]
def test_name_not_set(self):
""" Should return the superclass name property if not set in config """
config = copy(TEST_CONFIG)
del config[tcp.CONF_NAME]
entity = Entity()
sensor = tcp.Sensor(self.hass, config)
assert sensor.name == entity.name
def test_state(self):
""" Should return the contents of _state. """
sensor = tcp.Sensor(self.hass, TEST_CONFIG)
uuid = str(uuid4())
sensor._state = uuid
assert sensor.state == uuid
def test_unit_of_measurement(self):
""" Should return the configured unit of measurement. """
sensor = tcp.Sensor(self.hass, TEST_CONFIG)
assert sensor.unit_of_measurement == TEST_CONFIG[tcp.CONF_UNIT]
@patch("homeassistant.components.sensor.tcp.Sensor.update")
def test_config_valid_keys(self, *args):
"""
@ -142,7 +184,7 @@ class TestTCPSensor():
TEST_CONFIG[tcp.CONF_PORT]))
@patch("socket.socket.connect", side_effect=socket.error())
def test_update_returns_if_connecting_fails(self, mock_socket):
def test_update_returns_if_connecting_fails(self, *args):
"""
Should return if connecting to host fails.
"""
@ -150,6 +192,25 @@ class TestTCPSensor():
sensor = tcp.Sensor(self.hass, TEST_CONFIG)
assert sensor.update() is None
@patch("socket.socket.connect")
@patch("socket.socket.send", side_effect=socket.error())
def test_update_returns_if_sending_fails(self, *args):
"""
Should return if sending fails.
"""
with patch("homeassistant.components.sensor.tcp.Sensor.update"):
sensor = tcp.Sensor(self.hass, TEST_CONFIG)
assert sensor.update() is None
@patch("socket.socket.connect")
@patch("socket.socket.send")
@patch("select.select", return_value=(False, False, False))
def test_update_returns_if_select_fails(self, *args):
""" Should return if select fails to return a socket. """
with patch("homeassistant.components.sensor.tcp.Sensor.update"):
sensor = tcp.Sensor(self.hass, TEST_CONFIG)
assert sensor.update() is None
@patch("socket.socket")
@patch("select.select", return_value=(True, False, False))
def test_update_sends_payload(self, mock_select, mock_socket):
@ -201,3 +262,16 @@ class TestTCPSensor():
config[tcp.CONF_VALUE_TEMPLATE] = "{{ value }} {{ 1+1 }}"
sensor = tcp.Sensor(self.hass, config)
assert sensor._state == "%s 2" % test_value
@patch("socket.socket")
@patch("select.select", return_value=(True, False, False))
def test_update_returns_if_template_render_fails(
self, mock_select, mock_socket):
""" Should return None if rendering the template fails. """
test_value = "test_value"
mock_socket = mock_socket().__enter__()
mock_socket.recv.return_value = test_value.encode()
config = copy(TEST_CONFIG)
config[tcp.CONF_VALUE_TEMPLATE] = "{{ this won't work"
sensor = tcp.Sensor(self.hass, config)
assert sensor.update() is None