implement methods that depend on sys_info as properties and add update

In the case of smartbulb.update, light_state is also updated.
This commit is contained in:
Bas Nijholt
2019-11-15 17:48:36 +01:00
parent 8c25590186
commit 72d5443f1a
6 changed files with 413 additions and 221 deletions

View File

@@ -32,10 +32,11 @@ from .newfakes import (
@plug
def test_plug_sysinfo(dev):
assert dev.sync.get_sys_info() is not None
PLUG_SCHEMA(dev.sync.get_sys_info())
dev.sync.update()
assert dev.sys_info is not None
PLUG_SCHEMA(dev.sys_info)
assert dev.sync.get_model() is not None
assert dev.model is not None
assert dev.device_type == DeviceType.Plug or dev.device_type == DeviceType.Strip
assert dev.is_plug or dev.is_strip
@@ -43,23 +44,26 @@ def test_plug_sysinfo(dev):
@bulb
def test_bulb_sysinfo(dev):
assert dev.sync.get_sys_info() is not None
BULB_SCHEMA(dev.sync.get_sys_info())
dev.sync.update()
assert dev.sys_info is not None
BULB_SCHEMA(dev.sys_info)
assert dev.sync.get_model() is not None
assert dev.model is not None
assert dev.device_type == DeviceType.Bulb
assert dev.is_bulb
def test_state_info(dev):
assert isinstance(dev.sync.get_state_information(), dict)
dev.sync.update()
assert isinstance(dev.sync.state_information, dict)
def test_invalid_connection(dev):
with patch.object(FakeTransportProtocol, "query", side_effect=SmartDeviceException):
with pytest.raises(SmartDeviceException):
dev.sync.is_on()
dev.sync.update()
dev.is_on
def test_query_helper(dev):
@@ -71,26 +75,28 @@ def test_query_helper(dev):
@turn_on
def test_state(dev, turn_on):
handle_turn_on(dev, turn_on)
orig_state = dev.sync.is_on()
dev.sync.update()
orig_state = dev.is_on
if orig_state:
dev.sync.turn_off()
assert not dev.sync.is_on()
assert dev.sync.is_off()
assert not dev.is_on
assert dev.is_off
dev.sync.turn_on()
assert dev.sync.is_on()
assert not dev.sync.is_off()
assert dev.is_on
assert not dev.is_off
else:
dev.sync.turn_on()
assert dev.sync.is_on()
assert not dev.sync.is_off()
assert dev.is_on
assert not dev.is_off
dev.sync.turn_off()
assert not dev.sync.is_on()
assert dev.sync.is_off()
assert not dev.is_on
assert dev.is_off
@no_emeter
def test_no_emeter(dev):
assert not dev.sync.get_has_emeter()
dev.sync.update()
assert not dev.has_emeter
with pytest.raises(SmartDeviceException):
dev.sync.get_emeter_realtime()
@@ -104,10 +110,11 @@ def test_no_emeter(dev):
@has_emeter
def test_get_emeter_realtime(dev):
dev.sync.update()
if dev.is_strip:
pytest.skip("Disabled for HS300 temporarily")
assert dev.sync.get_has_emeter()
assert dev.has_emeter
current_emeter = dev.sync.get_emeter_realtime()
CURRENT_CONSUMPTION_SCHEMA(current_emeter)
@@ -115,10 +122,11 @@ def test_get_emeter_realtime(dev):
@has_emeter
def test_get_emeter_daily(dev):
dev.sync.update()
if dev.is_strip:
pytest.skip("Disabled for HS300 temporarily")
assert dev.sync.get_has_emeter()
assert dev.has_emeter
assert dev.sync.get_emeter_daily(year=1900, month=1) == {}
@@ -137,10 +145,11 @@ def test_get_emeter_daily(dev):
@has_emeter
def test_get_emeter_monthly(dev):
dev.sync.update()
if dev.is_strip:
pytest.skip("Disabled for HS300 temporarily")
assert dev.sync.get_has_emeter()
assert dev.has_emeter
assert dev.sync.get_emeter_monthly(year=1900) == {}
@@ -159,10 +168,11 @@ def test_get_emeter_monthly(dev):
@has_emeter
def test_emeter_status(dev):
dev.sync.update()
if dev.is_strip:
pytest.skip("Disabled for HS300 temporarily")
assert dev.sync.get_has_emeter()
assert dev.has_emeter
d = dev.sync.get_emeter_realtime()
@@ -181,17 +191,19 @@ def test_emeter_status(dev):
@pytest.mark.skip("not clearing your stats..")
@has_emeter
def test_erase_emeter_stats(dev):
assert dev.sync.get_has_emeter()
dev.sync.update()
assert dev.has_emeter
dev.sync.erase_emeter()
@has_emeter
def test_current_consumption(dev):
dev.sync.update()
if dev.is_strip:
pytest.skip("Disabled for HS300 temporarily")
if dev.sync.get_has_emeter():
if dev.has_emeter:
x = dev.sync.current_consumption()
assert isinstance(x, float)
assert x >= 0.0
@@ -200,34 +212,36 @@ def test_current_consumption(dev):
def test_alias(dev):
dev.sync.update()
test_alias = "TEST1234"
original = dev.sync.get_alias()
original = dev.sync.alias
assert isinstance(original, str)
dev.sync.set_alias(test_alias)
assert dev.sync.get_alias() == test_alias
assert dev.sync.alias == test_alias
dev.sync.set_alias(original)
assert dev.sync.get_alias() == original
assert dev.sync.alias == original
@plug
def test_led(dev):
original = dev.sync.get_led()
dev.sync.update()
original = dev.led
dev.sync.set_led(False)
assert not dev.sync.get_led()
dev.sync.set_led(True)
assert not dev.led
assert dev.sync.get_led()
dev.sync.set_led(True)
assert dev.led
dev.sync.set_led(original)
@plug
def test_on_since(dev):
assert isinstance(dev.sync.get_on_since(), datetime.datetime)
dev.sync.update()
assert isinstance(dev.on_since, datetime.datetime)
def test_icon(dev):
@@ -244,35 +258,41 @@ def test_timezone(dev):
def test_hw_info(dev):
PLUG_SCHEMA(dev.sync.get_hw_info())
dev.sync.update()
PLUG_SCHEMA(dev.hw_info)
def test_location(dev):
PLUG_SCHEMA(dev.sync.get_location())
dev.sync.update()
PLUG_SCHEMA(dev.location)
def test_rssi(dev):
PLUG_SCHEMA({"rssi": dev.sync.get_rssi()}) # wrapping for vol
dev.sync.update()
PLUG_SCHEMA({"rssi": dev.rssi}) # wrapping for vol
def test_mac(dev):
PLUG_SCHEMA({"mac": dev.sync.get_mac()}) # wrapping for val
dev.sync.update()
PLUG_SCHEMA({"mac": dev.mac}) # wrapping for val
# TODO check setting?
@non_variable_temp
def test_temperature_on_nonsupporting(dev):
assert dev.sync.get_valid_temperature_range() == (0, 0)
dev.sync.update()
assert dev.valid_temperature_range == (0, 0)
# TODO test when device does not support temperature range
with pytest.raises(SmartDeviceException):
dev.sync.set_color_temp(2700)
with pytest.raises(SmartDeviceException):
print(dev.sync.get_color_temp())
print(dev.sync.color_temp)
@variable_temp
def test_out_of_range_temperature(dev):
dev.sync.update()
with pytest.raises(ValueError):
dev.sync.set_color_temp(1000)
with pytest.raises(ValueError):
@@ -281,10 +301,11 @@ def test_out_of_range_temperature(dev):
@non_dimmable
def test_non_dimmable(dev):
assert not dev.sync.is_dimmable()
dev.sync.update()
assert not dev.is_dimmable
with pytest.raises(SmartDeviceException):
assert dev.sync.get_brightness() == 0
assert dev.brightness == 0
with pytest.raises(SmartDeviceException):
dev.sync.set_brightness(100)
@@ -293,13 +314,14 @@ def test_non_dimmable(dev):
@turn_on
def test_dimmable_brightness(dev, turn_on):
handle_turn_on(dev, turn_on)
assert dev.sync.is_dimmable()
dev.sync.update()
assert dev.is_dimmable
dev.sync.set_brightness(50)
assert dev.sync.get_brightness() == 50
assert dev.brightness == 50
dev.sync.set_brightness(10)
assert dev.sync.get_brightness() == 10
assert dev.brightness == 10
with pytest.raises(ValueError):
dev.sync.set_brightness("foo")
@@ -307,7 +329,8 @@ def test_dimmable_brightness(dev, turn_on):
@dimmable
def test_invalid_brightness(dev):
assert dev.sync.is_dimmable()
dev.sync.update()
assert dev.is_dimmable
with pytest.raises(ValueError):
dev.sync.set_brightness(110)
@@ -320,16 +343,17 @@ def test_invalid_brightness(dev):
@turn_on
def test_hsv(dev, turn_on):
handle_turn_on(dev, turn_on)
assert dev.sync.is_color()
dev.sync.update()
assert dev.is_color
hue, saturation, brightness = dev.sync.get_hsv()
hue, saturation, brightness = dev.hsv
assert 0 <= hue <= 255
assert 0 <= saturation <= 100
assert 0 <= brightness <= 100
dev.sync.set_hsv(hue=1, saturation=1, value=1)
hue, saturation, brightness = dev.sync.get_hsv()
hue, saturation, brightness = dev.hsv
assert hue == 1
assert saturation == 1
assert brightness == 1
@@ -339,8 +363,8 @@ def test_hsv(dev, turn_on):
@turn_on
def test_invalid_hsv(dev, turn_on):
handle_turn_on(dev, turn_on)
assert dev.sync.is_color()
dev.sync.update()
assert dev.is_color
for invalid_hue in [-1, 361, 0.5]:
with pytest.raises(ValueError):
@@ -357,67 +381,79 @@ def test_invalid_hsv(dev, turn_on):
@non_color_bulb
def test_hsv_on_non_color(dev):
assert not dev.sync.is_color()
dev.sync.update()
assert not dev.is_color
with pytest.raises(SmartDeviceException):
dev.sync.set_hsv(0, 0, 0)
with pytest.raises(SmartDeviceException):
print(dev.sync.get_hsv())
print(dev.hsv)
@variable_temp
@turn_on
def test_try_set_colortemp(dev, turn_on):
dev.sync.update()
handle_turn_on(dev, turn_on)
dev.sync.set_color_temp(2700)
assert dev.sync.get_color_temp() == 2700
assert dev.sync.color_temp == 2700
@non_variable_temp
def test_non_variable_temp(dev):
with pytest.raises(SmartDeviceException):
dev.sync.update()
dev.sync.set_color_temp(2700)
@strip
@turn_on
def test_children_change_state(dev, turn_on):
dev.sync.update()
handle_turn_on(dev, turn_on)
for plug in dev.plugs:
orig_state = plug.sync.is_on()
plug.sync.update()
orig_state = plug.is_on
if orig_state:
plug.turn_off()
assert not plug.sync.is_on()
assert plug.sync.is_off()
plug.sync.update()
assert not plug.is_on
assert plug.is_off
plug.sync.turn_on()
assert plug.sync.is_on()
assert not plug.sync.is_off()
plug.sync.update()
assert plug.is_on
assert not plug.is_off
else:
plug.sync.turn_on()
assert plug.sync.is_on()
assert not plug.sync.is_off()
plug.sync.update()
assert plug.is_on
assert not plug.is_off
plug.sync.turn_off()
assert not plug.sync.is_on()
assert plug.sync.is_off()
plug.sync.update()
assert not plug.is_on
assert plug.is_off
@strip
def test_children_alias(dev):
test_alias = "TEST1234"
for plug in dev.plugs:
original = plug.sync.get_alias()
plug.sync.update()
original = plug.alias
plug.sync.set_alias(alias=test_alias)
assert plug.sync.get_alias() == test_alias
plug.sync.update()
assert plug.alias == test_alias
plug.sync.set_alias(alias=original)
assert plug.sync.get_alias() == original
plug.sync.update()
assert plug.alias == original
@strip
def test_children_on_since(dev):
for plug in dev.plugs:
assert plug.sync.get_on_since()
plug.sync.update()
assert plug.on_since
@pytest.mark.skip("this test will wear out your relays")
@@ -435,7 +471,7 @@ def test_all_binary_states(dev):
dev.sync.turn_off(index=plug_index)
# check state map applied
for index, state in dev.sync.get_is_on().items():
for index, state in dev.is_on.items():
assert state_map[index] == state
# toggle each outlet with state map applied
@@ -448,7 +484,7 @@ def test_all_binary_states(dev):
dev.sync.turn_on(index=plug_index)
# only target outlet should have state changed
for index, state in dev.sync.get_is_on().items():
for index, state in dev.is_on.items():
if index == plug_index:
assert state != state_map[index]
else:
@@ -461,15 +497,17 @@ def test_all_binary_states(dev):
dev.sync.turn_off(index=plug_index)
# original state map should be restored
for index, state in dev.sync.get_is_on().items():
for index, state in dev.is_on.items():
assert state == state_map[index]
@strip
def test_children_get_emeter_realtime(dev):
assert dev.sync.get_has_emeter()
dev.sync.update()
assert dev.has_emeter
# test with index
for plug in dev.plugs:
plug.sync.update()
emeter = plug.sync.get_emeter_realtime()
CURRENT_CONSUMPTION_SCHEMA(emeter)
@@ -482,9 +520,11 @@ def test_children_get_emeter_realtime(dev):
@strip
def test_children_get_emeter_daily(dev):
assert dev.sync.get_has_emeter()
dev.sync.update()
assert dev.has_emeter
# test individual emeters
for plug in dev.plugs:
plug.sync.update()
emeter = plug.sync.get_emeter_daily(year=1900, month=1)
assert emeter == {}
@@ -505,9 +545,11 @@ def test_children_get_emeter_daily(dev):
@strip
def test_children_get_emeter_monthly(dev):
assert dev.sync.get_has_emeter()
dev.sync.update()
assert dev.has_emeter
# test individual emeters
for plug in dev.plugs:
plug.sync.update()
emeter = plug.sync.get_emeter_monthly(year=1900)
assert emeter == {}
@@ -539,9 +581,9 @@ def test_children_get_emeter_monthly(dev):
# if dev.is_strip:
# CHECK_COUNT = 0
# dev.sync.get_sys_info()
# dev.sys_info
# assert query_mock.call_count == CHECK_COUNT
# dev.sync.get_sys_info()
# dev.sys_info
# assert query_mock.call_count == CHECK_COUNT
@@ -553,15 +595,14 @@ def test_children_get_emeter_monthly(dev):
# with patch.object(
# FakeTransportProtocol, "query", wraps=dev.protocol.query
# ) as query_mock:
# dev.sync.get_sys_info()
# dev.sys_info
# assert query_mock.call_count == 1
# dev.sync.get_sys_info()
# dev.sys_info
# assert query_mock.call_count == 2
# # assert query_mock.called_once()
def test_representation(dev):
import re
pattern = re.compile("<.* model .* at .* (.*), is_on: .* - dev specific: .*>")
assert pattern.match(str(dev))