Skip to content

Commit

Permalink
Add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
syssi committed Dec 4, 2019
1 parent 1e2798d commit a986d8c
Show file tree
Hide file tree
Showing 3 changed files with 150 additions and 15 deletions.
7 changes: 6 additions & 1 deletion miio/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,12 @@
from miio.airconditioningcompanion import AirConditioningCompanion
from miio.airconditioningcompanion import AirConditioningCompanionV3
from miio.airfresh import AirFresh
from miio.airhumidifier import AirHumidifier
from miio.airhumidifier import (
AirHumidifier,
AirHumidifierCA1,
AirHumidifierCB1,
AirHumidifierMjjsq,
)
from miio.airdehumidifier import AirDehumidifier
from miio.airpurifier import AirPurifier
from miio.airqualitymonitor import AirQualityMonitor
Expand Down
28 changes: 14 additions & 14 deletions miio/airhumidifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -530,14 +530,14 @@ def target_humidity(self) -> int:
return self.data["HumiSet_Value"]

@property
def water(self) -> bool:
"""Water?."""
return self.data["waterstatus"]
def no_water(self) -> bool:
"""True if the water tank is empty."""
return self.data["waterstatus"] == 0

@property
def water_tank(self) -> bool:
"""Water tank?."""
return self.data["watertankstatus"]
def water_tank_detached(self) -> bool:
"""True if the water tank is detached."""
return self.data["watertankstatus"] == 0

def __repr__(self) -> str:
s = (
Expand All @@ -548,8 +548,8 @@ def __repr__(self) -> str:
"led_brightness=%s, "
"buzzer=%s, "
"target_humidity=%s%%, "
"water=%s, "
"water_tank=%s>"
"no_water=%s, "
"water_tank_detached=%s>"
% (
self.power,
self.mode,
Expand All @@ -558,8 +558,8 @@ def __repr__(self) -> str:
self.led,
self.buzzer,
self.target_humidity,
self.water,
self.water_tank,
self.no_water,
self.water_tank_detached,
)
)
return s
Expand Down Expand Up @@ -595,8 +595,8 @@ def __init__(
"LED: {result.led_brightness}\n"
"Buzzer: {result.buzzer}\n"
"Target humidity: {result.target_humidity} %\n"
"Water: {result.water}\n"
"Water tank: {result.water_tank}\n",
"No water: {result.no_water}\n"
"Water tank detached: {result.water_tank_detached}\n",
)
)
def status(self) -> AirHumidifierMjjsqStatus:
Expand Down Expand Up @@ -667,7 +667,7 @@ def set_buzzer(self, buzzer: bool):
)
def set_target_humidity(self, humidity: int):
"""Set the target humidity."""
if 0 < humidity < 100:
if humidity < 0 or humidity > 99:
raise AirHumidifierException("Invalid target humidity: %s" % humidity)

return self.send("HumiSet_Value", [humidity])
return self.send("Set_HumiValue", [humidity])
130 changes: 130 additions & 0 deletions miio/tests/test_airhumidifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,18 @@
import pytest

from miio import AirHumidifier
from miio import AirHumidifierMjjsq
from miio.airhumidifier import (
OperationMode,
OperationModeMjjsq,
LedBrightness,
AirHumidifierStatus,
AirHumidifierMjjsqStatus,
AirHumidifierException,
MODEL_HUMIDIFIER_V1,
MODEL_HUMIDIFIER_CA1,
MODEL_HUMIDIFIER_CB1,
MODEL_HUMIDIFIER_MJJSQ,
)
from .dummies import DummyDevice
from miio.device import DeviceInfo
Expand Down Expand Up @@ -689,3 +693,129 @@ def dry():

self.device.set_dry(False)
assert dry() is False


class DummyAirHumidifierMjjsq(DummyDevice, AirHumidifierMjjsq):
def __init__(self, *args, **kwargs):
self.model = MODEL_HUMIDIFIER_MJJSQ
self.state = {
"Humidifier_Gear": 1,
"Humidity_Value": 44,
"HumiSet_Value": 11,
"Led_State": 0,
"OnOff_State": 1,
"TemperatureValue": 21,
"TipSound_State": 0,
"waterstatus": 1,
"watertankstatus": 1,
}
self.return_values = {
"get_prop": self._get_state,
"Set_OnOff": lambda x: self._set_state("OnOff_State", x),
"Set_HumidifierGears": lambda x: self._set_state("Humidifier_Gear", x),
"SetLedState": lambda x: self._set_state("Led_State", x),
"SetTipSound_Status": lambda x: self._set_state("TipSound_State", x),
"Set_HumiValue": lambda x: self._set_state("HumiSet_Value", x),
}
super().__init__(args, kwargs)


@pytest.fixture(scope="class")
def airhumidifiermjjsq(request):
request.cls.device = DummyAirHumidifierMjjsq()
# TODO add ability to test on a real device


@pytest.mark.usefixtures("airhumidifiermjjsq")
class TestAirHumidifierMjjsq(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
assert self.is_on() 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 repr(self.state()) == repr(
AirHumidifierMjjsqStatus(self.device.start_state)
)
assert self.is_on() is True
assert self.state().temperature == self.device.start_state["TemperatureValue"]
assert self.state().humidity == self.device.start_state["Humidity_Value"]
assert self.state().mode == OperationModeMjjsq(self.device.start_state["Humidifier_Gear"])
assert self.state().led is (self.device.start_state["Led_State"] == 1)
assert self.state().buzzer is (self.device.start_state["TipSound_State"] == 1)
assert self.state().target_humidity == self.device.start_state["HumiSet_Value"]
assert self.state().no_water is (self.device.start_state["waterstatus"] == 0)
assert self.state().water_tank_detached is (self.device.start_state["watertankstatus"] == 0)

def test_set_mode(self):
def mode():
return self.device.status().mode

self.device.set_mode(OperationModeMjjsq.Low)
assert mode() == OperationModeMjjsq.Low

self.device.set_mode(OperationModeMjjsq.Medium)
assert mode() == OperationModeMjjsq.Medium

self.device.set_mode(OperationModeMjjsq.High)
assert mode() == OperationModeMjjsq.High

self.device.set_mode(OperationModeMjjsq.Humidity)
assert mode() == OperationModeMjjsq.Humidity

def test_set_led(self):
def led():
return self.device.status().led

self.device.set_led(True)
assert led() is True

self.device.set_led(False)
assert led() is False

def test_set_buzzer(self):
def buzzer():
return self.device.status().buzzer

self.device.set_buzzer(True)
assert buzzer() is True

self.device.set_buzzer(False)
assert buzzer() is False

def test_set_target_humidity(self):
def target_humidity():
return self.device.status().target_humidity

self.device.set_target_humidity(0)
assert target_humidity() == 0
self.device.set_target_humidity(50)
assert target_humidity() == 50
self.device.set_target_humidity(99)
assert target_humidity() == 99

with pytest.raises(AirHumidifierException):
self.device.set_target_humidity(-1)

with pytest.raises(AirHumidifierException):
self.device.set_target_humidity(100)

with pytest.raises(AirHumidifierException):
self.device.set_target_humidity(101)

0 comments on commit a986d8c

Please sign in to comment.