-
-
Notifications
You must be signed in to change notification settings - Fork 561
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Unit tests for philips lights #133
Changes from all commits
73ec545
49184f1
2199a43
dd0fed8
8fd6e18
7987a87
0bf3dca
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,12 +6,16 @@ | |
_LOGGER = logging.getLogger(__name__) | ||
|
||
|
||
class PhilipsEyecareException(Exception): | ||
pass | ||
|
||
|
||
class PhilipsEyecareStatus: | ||
"""Container for status reports from Xiaomi Philips Eyecare Smart Lamp 2""" | ||
|
||
def __init__(self, data: Dict[str, Any]) -> None: | ||
# ['power': 'off', 'bright': 5, 'notifystatus': 'off', | ||
# 'ambstatus': 'off': 'ambvalue': 41, 'eyecare': 'on', | ||
# 'ambstatus': 'off', 'ambvalue': 41, 'eyecare': 'on', | ||
# 'scene_num': 3, 'bls': 'on', 'dvalue': 0] | ||
self.data = data | ||
|
||
|
@@ -118,14 +122,25 @@ def eyecare_off(self): | |
|
||
def set_brightness(self, level: int): | ||
"""Set brightness level.""" | ||
if level < 1 or level > 100: | ||
raise PhilipsEyecareException("Invalid brightness: %s" % level) | ||
|
||
return self.send("set_bright", [level]) | ||
|
||
def set_scene(self, num: int): | ||
def set_scene(self, number: int): | ||
"""Set eyecare user scene.""" | ||
return self.send("set_user_scene", [num]) | ||
if number < 1 or number > 4: | ||
raise PhilipsEyecareException("Invalid fixed scene number: %s" % number) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. line too long (84 > 79 characters) |
||
|
||
return self.send("set_user_scene", [number]) | ||
|
||
def delay_off(self, minutes: int): | ||
"""Set delay off minutes.""" | ||
|
||
if minutes < 0: | ||
raise PhilipsEyecareException( | ||
"Invalid value for a delayed turn off: %s" % minutes) | ||
|
||
return self.send("delay_off", [minutes]) | ||
|
||
def smart_night_light_on(self): | ||
|
@@ -154,4 +169,8 @@ def ambient_off(self): | |
|
||
def set_ambient_brightness(self, level: int): | ||
"""Set Ambient Light brightness level.""" | ||
if level < 1 or level > 100: | ||
raise PhilipsEyecareException( | ||
"Invalid ambient brightness: %s" % level) | ||
|
||
return self.send("set_amb_bright", [level]) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
from unittest import TestCase | ||
from miio import Ceil | ||
from .dummies import DummyDevice | ||
import pytest | ||
|
||
|
||
class DummyCeil(DummyDevice, Ceil): | ||
def __init__(self, *args, **kwargs): | ||
self.state = {'power': 'on', | ||
'bright': 50, | ||
'snm': 4, | ||
'dv': 0, | ||
'cctsw': [[0, 3], [0, 2], [0, 1]], | ||
'bl': 1, | ||
'mb': 1, | ||
'ac': 1, | ||
'mssw': 1, | ||
'cct': 99 | ||
} | ||
self.return_values = { | ||
'get_prop': self._get_state, | ||
'set_power': lambda x: self._set_state("power", x), | ||
'set_bright': lambda x: self._set_state("bright", x), | ||
'apply_fixed_scene': lambda x: self._set_state("snm", x), | ||
'delay_off': lambda x: self._set_state("dv", x), | ||
'enable_bl': lambda x: self._set_state("bl", x), | ||
'enable_ac': lambda x: self._set_state("ac", x), | ||
'set_cct': lambda x: self._set_state("cct", x), | ||
} | ||
super().__init__(args, kwargs) | ||
|
||
|
||
@pytest.fixture(scope="class") | ||
def ceil(request): | ||
request.cls.device = DummyCeil() | ||
# TODO add ability to test on a real device | ||
|
||
|
||
@pytest.mark.usefixtures("ceil") | ||
class TestCeil(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 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Considering quite a few devices has the ability for turning on and off, maybe it makes sense to have a single set of tests for all of those devices. For now this is fine though. |
||
|
||
def test_status(self): | ||
self.device._reset_state() | ||
|
||
assert self.is_on() is True | ||
assert self.state().brightness == self.device.start_state["bright"] | ||
assert self.state().color_temperature == self.device.start_state["cct"] | ||
assert self.state().scene == self.device.start_state["snm"] | ||
assert self.state().delay_off_countdown == self.device.start_state["dv"] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. line too long (80 > 79 characters) |
||
assert self.state().smart_night_light is (self.device.start_state["bl"] == 1) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. line too long (85 > 79 characters) |
||
assert self.state().automatic_color_temperature is (self.device.start_state["ac"] == 1) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. line too long (95 > 79 characters) |
||
|
||
def test_set_brightness(self): | ||
def brightness(): | ||
return self.device.status().brightness | ||
|
||
self.device.set_brightness(10) | ||
assert brightness() == 10 | ||
self.device.set_brightness(20) | ||
assert brightness() == 20 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Test against incorrect values (brightness <0, >100), the bulbs should raise an exception if an incorrect value is thrown at them I think. |
||
|
||
def test_set_color_temperature(self): | ||
def color_temperature(): | ||
return self.device.status().color_temperature | ||
|
||
self.device.set_color_temperature(30) | ||
assert color_temperature() == 30 | ||
self.device.set_color_temperature(20) | ||
assert color_temperature() == 20 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same as above for incorrect values. |
||
|
||
def test_delay_off(self): | ||
def delay_off_countdown(): | ||
return self.device.status().delay_off_countdown | ||
|
||
self.device.delay_off(100) | ||
assert delay_off_countdown() == 100 | ||
self.device.delay_off(200) | ||
assert delay_off_countdown() == 200 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same as above. |
||
|
||
def test_set_scene(self): | ||
def scene(): | ||
return self.device.status().scene | ||
|
||
self.device.set_scene(1) | ||
assert scene() == 1 | ||
self.device.set_scene(2) | ||
assert scene() == 2 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same as above. |
||
|
||
def test_smart_night_light_on(self): | ||
def smart_night_light(): | ||
return self.device.status().smart_night_light | ||
|
||
self.device.smart_night_light_off() | ||
assert smart_night_light() is False | ||
self.device.smart_night_light_on() | ||
assert smart_night_light() is True | ||
|
||
def test_automatic_color_temperature_on(self): | ||
def automatic_color_temperature(): | ||
return self.device.status().automatic_color_temperature | ||
|
||
self.device.automatic_color_temperature_on() | ||
assert automatic_color_temperature() is True | ||
self.device.automatic_color_temperature_off() | ||
assert automatic_color_temperature() is False |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
line too long (81 > 79 characters)