From 895ddc8433bcb6bef57d7fcbf94f2238dfd93bab Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Tue, 9 Feb 2016 02:32:00 +0000 Subject: [PATCH] Add tests for mFi sensors Note that some of the indirection here is so that I can reuse a few things for mFi switch tests to follow. --- .coveragerc | 1 - tests/components/sensor/test_mfi.py | 138 ++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 tests/components/sensor/test_mfi.py diff --git a/.coveragerc b/.coveragerc index efe03b51aae..dc99b695f25 100644 --- a/.coveragerc +++ b/.coveragerc @@ -122,7 +122,6 @@ omit = homeassistant/components/sensor/eliqonline.py homeassistant/components/sensor/forecast.py homeassistant/components/sensor/glances.py - homeassistant/components/sensor/mfi.py homeassistant/components/sensor/netatmo.py homeassistant/components/sensor/onewire.py homeassistant/components/sensor/openweathermap.py diff --git a/tests/components/sensor/test_mfi.py b/tests/components/sensor/test_mfi.py new file mode 100644 index 00000000000..bda8032fb49 --- /dev/null +++ b/tests/components/sensor/test_mfi.py @@ -0,0 +1,138 @@ +""" +tests.components.sensor.test_mfi +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Tests mFi sensor. +""" +import unittest +import unittest.mock as mock + +import homeassistant.core as ha +import homeassistant.components.sensor as sensor +import homeassistant.components.sensor.mfi as mfi +from homeassistant.const import TEMP_CELCIUS + + +class TestMfiSensorSetup(unittest.TestCase): + PLATFORM = mfi + COMPONENT = sensor + THING = 'sensor' + GOOD_CONFIG = { + 'sensor': { + 'platform': 'mfi', + 'host': 'foo', + 'port': 6123, + 'username': 'user', + 'password': 'pass', + } + } + + def setup_method(self, method): + self.hass = ha.HomeAssistant() + self.hass.config.latitude = 32.87336 + self.hass.config.longitude = 117.22743 + + def teardown_method(self, method): + """ Stop down stuff we started. """ + self.hass.stop() + + def test_setup_missing_config(self): + config = { + 'sensor': { + 'platform': 'mfi', + } + } + self.assertFalse(self.PLATFORM.setup_platform(self.hass, config, None)) + + @mock.patch('mficlient.client') + def test_setup_failed_login(self, mock_client): + mock_client.FailedToLogin = Exception() + mock_client.MFiClient.side_effect = mock_client.FailedToLogin + self.assertFalse( + self.PLATFORM.setup_platform(self.hass, + dict(self.GOOD_CONFIG), + None)) + + @mock.patch('mficlient.client.MFiClient') + def test_setup_minimum(self, mock_client): + config = dict(self.GOOD_CONFIG) + del config[self.THING]['port'] + assert self.COMPONENT.setup(self.hass, config) + mock_client.assert_called_once_with('foo', 'user', 'pass', + port=6443) + + @mock.patch('mficlient.client.MFiClient') + def test_setup_with_port(self, mock_client): + config = dict(self.GOOD_CONFIG) + config[self.THING]['port'] = 6123 + assert self.COMPONENT.setup(self.hass, config) + mock_client.assert_called_once_with('foo', 'user', 'pass', + port=6123) + + @mock.patch('mficlient.client.MFiClient') + @mock.patch('homeassistant.components.sensor.mfi.MfiSensor') + def test_setup_adds_proper_devices(self, mock_sensor, mock_client): + ports = {i: mock.MagicMock(model=model) + for i, model in enumerate(mfi.SENSOR_MODELS)} + ports['bad'] = mock.MagicMock(model='notasensor') + print(ports['bad'].model) + mock_client.return_value.get_devices.return_value = \ + [mock.MagicMock(ports=ports)] + assert sensor.setup(self.hass, self.GOOD_CONFIG) + for ident, port in ports.items(): + if ident != 'bad': + mock_sensor.assert_any_call(port, self.hass) + assert mock.call(ports['bad'], self.hass) not in mock_sensor.mock_calls + + +class TestMfiSensor(unittest.TestCase): + def setup_method(self, method): + self.hass = ha.HomeAssistant() + self.hass.config.latitude = 32.87336 + self.hass.config.longitude = 117.22743 + self.port = mock.MagicMock() + self.sensor = mfi.MfiSensor(self.port, self.hass) + + def teardown_method(self, method): + """ Stop down stuff we started. """ + self.hass.stop() + + def test_name(self): + self.assertEqual(self.port.label, self.sensor.name) + + def test_uom_temp(self): + self.port.tag = 'temperature' + self.assertEqual(TEMP_CELCIUS, self.sensor.unit_of_measurement) + + def test_uom_power(self): + self.port.tag = 'active_pwr' + self.assertEqual('Watts', self.sensor.unit_of_measurement) + + def test_uom_digital(self): + self.port.model = 'Input Digital' + self.assertEqual('State', self.sensor.unit_of_measurement) + + def test_uom_unknown(self): + self.port.tag = 'balloons' + self.assertEqual('balloons', self.sensor.unit_of_measurement) + + def test_state_digital(self): + self.port.model = 'Input Digital' + self.port.value = 0 + self.assertEqual(mfi.STATE_OFF, self.sensor.state) + self.port.value = 1 + self.assertEqual(mfi.STATE_ON, self.sensor.state) + self.port.value = 2 + self.assertEqual(mfi.STATE_ON, self.sensor.state) + + def test_state_digits(self): + self.port.tag = 'didyoucheckthedict?' + self.port.value = 1.25 + with mock.patch.dict(mfi.DIGITS, {'didyoucheckthedict?': 1}): + self.assertEqual(1.2, self.sensor.state) + with mock.patch.dict(mfi.DIGITS, {}): + self.assertEqual(1.0, self.sensor.state) + + def test_update(self): + self.sensor.update() + self.port.refresh.assert_called_once_with()