mirror of
https://github.com/python-kasa/python-kasa.git
synced 2024-12-23 03:33:35 +00:00
f9a987ca18
* Add doctests to SmartBulb * Add SmartDevice doctests, cleanup README.md * add doctests for smartplug and smartstrip * add discover doctests * Fix bulb mock * add smartdimmer doctests * add sphinx-generated docs, cleanup readme a bit * remove sphinx-click as it does not work with asyncclick * in preparation for rtd hooking, move doc deps to be separate from dev deps * pytestmark needs to be applied separately for each and every file, this fixes the tests * use pathlib for resolving relative paths * Skip discovery doctest on python3.7 The code is just fine, but some reason the mocking behaves differently between 3.7 and 3.8. The latter seems to accept a discrete object for asyncio.run where the former expects a coroutine..
118 lines
2.8 KiB
Python
118 lines
2.8 KiB
Python
import pytest
|
|
|
|
from kasa import SmartDeviceException
|
|
|
|
from .conftest import has_emeter, no_emeter, pytestmark
|
|
from .newfakes import CURRENT_CONSUMPTION_SCHEMA
|
|
|
|
|
|
@no_emeter
|
|
async def test_no_emeter(dev):
|
|
assert not dev.has_emeter
|
|
|
|
with pytest.raises(SmartDeviceException):
|
|
await dev.get_emeter_realtime()
|
|
with pytest.raises(SmartDeviceException):
|
|
await dev.get_emeter_daily()
|
|
with pytest.raises(SmartDeviceException):
|
|
await dev.get_emeter_monthly()
|
|
with pytest.raises(SmartDeviceException):
|
|
await dev.erase_emeter_stats()
|
|
|
|
|
|
@has_emeter
|
|
async def test_get_emeter_realtime(dev):
|
|
if dev.is_strip:
|
|
pytest.skip("Disabled for strips temporarily")
|
|
|
|
assert dev.has_emeter
|
|
|
|
current_emeter = await dev.get_emeter_realtime()
|
|
CURRENT_CONSUMPTION_SCHEMA(current_emeter)
|
|
|
|
|
|
@has_emeter
|
|
async def test_get_emeter_daily(dev):
|
|
if dev.is_strip:
|
|
pytest.skip("Disabled for strips temporarily")
|
|
|
|
assert dev.has_emeter
|
|
|
|
assert await dev.get_emeter_daily(year=1900, month=1) == {}
|
|
|
|
d = await dev.get_emeter_daily()
|
|
assert len(d) > 0
|
|
|
|
k, v = d.popitem()
|
|
assert isinstance(k, int)
|
|
assert isinstance(v, float)
|
|
|
|
# Test kwh (energy, energy_wh)
|
|
d = await dev.get_emeter_daily(kwh=False)
|
|
k2, v2 = d.popitem()
|
|
assert v * 1000 == v2
|
|
|
|
|
|
@has_emeter
|
|
async def test_get_emeter_monthly(dev):
|
|
if dev.is_strip:
|
|
pytest.skip("Disabled for strips temporarily")
|
|
|
|
assert dev.has_emeter
|
|
|
|
assert await dev.get_emeter_monthly(year=1900) == {}
|
|
|
|
d = await dev.get_emeter_monthly()
|
|
assert len(d) > 0
|
|
|
|
k, v = d.popitem()
|
|
assert isinstance(k, int)
|
|
assert isinstance(v, float)
|
|
|
|
# Test kwh (energy, energy_wh)
|
|
d = await dev.get_emeter_monthly(kwh=False)
|
|
k2, v2 = d.popitem()
|
|
assert v * 1000 == v2
|
|
|
|
|
|
@has_emeter
|
|
async def test_emeter_status(dev):
|
|
if dev.is_strip:
|
|
pytest.skip("Disabled for strips temporarily")
|
|
|
|
assert dev.has_emeter
|
|
|
|
d = await dev.get_emeter_realtime()
|
|
|
|
with pytest.raises(KeyError):
|
|
assert d["foo"]
|
|
|
|
assert d["power_mw"] == d["power"] * 1000
|
|
# bulbs have only power according to tplink simulator.
|
|
if not dev.is_bulb:
|
|
assert d["voltage_mv"] == d["voltage"] * 1000
|
|
|
|
assert d["current_ma"] == d["current"] * 1000
|
|
assert d["total_wh"] == d["total"] * 1000
|
|
|
|
|
|
@pytest.mark.skip("not clearing your stats..")
|
|
@has_emeter
|
|
async def test_erase_emeter_stats(dev):
|
|
assert dev.has_emeter
|
|
|
|
await dev.erase_emeter()
|
|
|
|
|
|
@has_emeter
|
|
async def test_current_consumption(dev):
|
|
if dev.is_strip:
|
|
pytest.skip("Disabled for strips temporarily")
|
|
|
|
if dev.has_emeter:
|
|
x = await dev.current_consumption()
|
|
assert isinstance(x, float)
|
|
assert x >= 0.0
|
|
else:
|
|
assert await dev.current_consumption() is None
|