From 53106633aa856c71bd49e194a7f1d6e13ee738f9 Mon Sep 17 00:00:00 2001 From: Sebastian Muszynski Date: Mon, 27 Nov 2017 09:10:30 +0100 Subject: [PATCH 1/4] Unit tests for the Chuang Mi Plug V1. First draft. --- miio/plug_v1.py | 1 + miio/tests/test_plug_v1.py | 80 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 miio/tests/test_plug_v1.py diff --git a/miio/plug_v1.py b/miio/plug_v1.py index 330281078..c14de09ba 100644 --- a/miio/plug_v1.py +++ b/miio/plug_v1.py @@ -9,6 +9,7 @@ class PlugV1Status: """Container for status reports from the plug.""" def __init__(self, data: Dict[str, Any]) -> None: + # { 'power': True, 'usb_on': True, 'temperature': 32 } self.data = data @property diff --git a/miio/tests/test_plug_v1.py b/miio/tests/test_plug_v1.py new file mode 100644 index 000000000..fe0305381 --- /dev/null +++ b/miio/tests/test_plug_v1.py @@ -0,0 +1,80 @@ +from unittest import TestCase +from miio import PlugV1 +import pytest + + +class DummyPlugV1(PlugV1): + def __init__(self, *args, **kwargs): + self.state = { + 'power': True, + 'usb_on': True, + 'temperature': 32, + } + self.return_values = { + 'get_prop': self._get_state, + 'set_on': lambda: self._set_state("power", True), + 'set_off': lambda: self._set_state("power", False), + 'set_usb_on': lambda: self._set_state("usb_on", True), + 'set_usb_off': lambda: self._set_state("usb_on", False), + } + self.start_state = self.state.copy() + + def send(self, command: str, parameters=None, retry_count=3): + """Overridden send() to return values from `self.return_values`.""" + if parameters is None: + return self.return_values[command]() + + return self.return_values[command](parameters) + + def _reset_state(self): + """Revert back to the original state.""" + self.state = self.start_state.copy() + + def _set_state(self, var, value): + """Set a state of a variable, + the value is expected to be an array with length of 1.""" + # print("setting %s = %s" % (var, value)) + self.state[var] = value + + def _get_state(self, props): + """Return wanted properties""" + return [self.state[x] for x in props if x in self.state] + + + +@pytest.fixture(scope="class") +def plugv1(request): + request.cls.device = DummyPlugV1() + # TODO add ability to test on a real device + + +@pytest.mark.usefixtures("plugv1") +class TestPlugV1(TestCase): + def is_on(self): + return self.device.status().is_on + + def state(self): + return self.device.status() + + def test_on(self): + self.device.off() # ensure off + + start_state = self.is_on() + assert start_state is False + + self.device.on() + assert self.is_on() is True + + def test_off(self): + self.device.on() # ensure on + + assert self.is_on() is True + self.device.off() + assert self.is_on() is False + + def test_status(self): + self.device._reset_state() + + assert self.is_on() is True + assert self.state().usb_power is True + assert self.state().temperature == self.device.start_state["temperature"] From dbe7cc7dfb4ecc2e8fa39a86b48ea569c690b78f Mon Sep 17 00:00:00 2001 From: Sebastian Muszynski Date: Mon, 27 Nov 2017 13:50:55 +0100 Subject: [PATCH 2/4] Unit tests of the Chuang Mi Plug V1 completed. --- miio/tests/test_plug_v1.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/miio/tests/test_plug_v1.py b/miio/tests/test_plug_v1.py index fe0305381..9a1d8bae9 100644 --- a/miio/tests/test_plug_v1.py +++ b/miio/tests/test_plug_v1.py @@ -6,24 +6,21 @@ class DummyPlugV1(PlugV1): def __init__(self, *args, **kwargs): self.state = { - 'power': True, + 'on': True, 'usb_on': True, 'temperature': 32, } self.return_values = { 'get_prop': self._get_state, - 'set_on': lambda: self._set_state("power", True), - 'set_off': lambda: self._set_state("power", False), - 'set_usb_on': lambda: self._set_state("usb_on", True), - 'set_usb_off': lambda: self._set_state("usb_on", False), + 'set_on': lambda x: self._set_state("on", True), + 'set_off': lambda x: self._set_state("on", False), + 'set_usb_on': lambda x: self._set_state("usb_on", True), + 'set_usb_off': lambda x: self._set_state("usb_on", False), } self.start_state = self.state.copy() def send(self, command: str, parameters=None, retry_count=3): """Overridden send() to return values from `self.return_values`.""" - if parameters is None: - return self.return_values[command]() - return self.return_values[command](parameters) def _reset_state(self): @@ -31,9 +28,7 @@ def _reset_state(self): self.state = self.start_state.copy() def _set_state(self, var, value): - """Set a state of a variable, - the value is expected to be an array with length of 1.""" - # print("setting %s = %s" % (var, value)) + """Set a state of a variable""" self.state[var] = value def _get_state(self, props): From 2bbcde921e5523849731c4c9dc4b6fdc5626eed1 Mon Sep 17 00:00:00 2001 From: Sebastian Muszynski Date: Mon, 27 Nov 2017 13:53:05 +0100 Subject: [PATCH 3/4] Hound errors fixed. --- miio/tests/test_plug_v1.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/miio/tests/test_plug_v1.py b/miio/tests/test_plug_v1.py index 9a1d8bae9..a105cf444 100644 --- a/miio/tests/test_plug_v1.py +++ b/miio/tests/test_plug_v1.py @@ -36,7 +36,6 @@ def _get_state(self, props): return [self.state[x] for x in props if x in self.state] - @pytest.fixture(scope="class") def plugv1(request): request.cls.device = DummyPlugV1() @@ -72,4 +71,5 @@ def test_status(self): assert self.is_on() is True assert self.state().usb_power is True - assert self.state().temperature == self.device.start_state["temperature"] + assert self.state().temperature == self.device.start_state[ + "temperature"] From 5779e0ab74a228dd28c8cc3a7177efded4979957 Mon Sep 17 00:00:00 2001 From: Sebastian Muszynski Date: Mon, 27 Nov 2017 13:58:00 +0100 Subject: [PATCH 4/4] Test coverage improved. Two missing method calls added. --- miio/tests/test_plug_v1.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/miio/tests/test_plug_v1.py b/miio/tests/test_plug_v1.py index a105cf444..1e223b8fc 100644 --- a/miio/tests/test_plug_v1.py +++ b/miio/tests/test_plug_v1.py @@ -73,3 +73,17 @@ def test_status(self): assert self.state().usb_power is True assert self.state().temperature == self.device.start_state[ "temperature"] + + def test_usb_on(self): + self.device.usb_off() # ensure off + assert self.device.status().usb_power is False + + self.device.usb_on() + assert self.device.status().usb_power is True + + def test_usb_off(self): + self.device.usb_on() # ensure on + assert self.device.status().usb_power is True + + self.device.usb_off() + assert self.device.status().usb_power is False