Add (some) tests to the cli tool (#22)

* Add tests to the cli tool

* add pytest-mock

* do not ignore cli.py for coverage

* read requirements_test.txt instead of redefining reqs in tox.ini

* Add upload to codecov, first try!

* fix name of the result file

* no need to manually publish to azure devops..
This commit is contained in:
Teemu R 2020-04-20 19:26:20 +02:00 committed by GitHub
parent 7f625cd1c2
commit 852ae494af
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 129 additions and 9 deletions

View File

@ -87,5 +87,9 @@ steps:
displayName: 'Order of imports (isort)'
- script: |
pytest --cov kasa --cov-report html
pytest --cov kasa --cov-report xml
displayName: 'Tests'
- script: |
codecov -t $(codecov.token)
displayName: Report Coverage to codecov

119
kasa/tests/test_cli.py Normal file
View File

@ -0,0 +1,119 @@
import asyncio
from click.testing import CliRunner
from kasa import SmartDevice
from kasa.cli import alias, brightness, emeter, raw_command, state, sysinfo
from .conftest import handle_turn_on, turn_on
def test_sysinfo(dev):
runner = CliRunner()
res = runner.invoke(sysinfo, obj=dev)
assert "System info" in res.output
assert dev.alias in res.output
@turn_on
def test_state(dev, turn_on):
asyncio.run(handle_turn_on(dev, turn_on))
runner = CliRunner()
res = runner.invoke(state, obj=dev)
print(res.output)
if dev.is_on:
assert "Device state: ON" in res.output
else:
assert "Device state: OFF" in res.output
if not dev.has_emeter:
assert "Device has no emeter" in res.output
def test_alias(dev):
runner = CliRunner()
res = runner.invoke(alias, obj=dev)
assert f"Alias: {dev.alias}" in res.output
new_alias = "new alias"
res = runner.invoke(alias, [new_alias], obj=dev)
assert f"Setting alias to {new_alias}" in res.output
res = runner.invoke(alias, obj=dev)
assert f"Alias: {new_alias}" in res.output
def test_raw_command(dev):
runner = CliRunner()
res = runner.invoke(raw_command, ["system", "get_sysinfo"], obj=dev)
assert res.exit_code == 0
assert dev.alias in res.output
res = runner.invoke(raw_command, obj=dev)
assert res.exit_code != 0
assert "Usage" in res.output
def test_emeter(dev: SmartDevice, mocker):
runner = CliRunner()
res = runner.invoke(emeter, obj=dev)
if not dev.has_emeter:
assert "Device has no emeter" in res.output
return
assert "Current State" in res.output
monthly = mocker.patch.object(dev, "get_emeter_monthly")
res = runner.invoke(emeter, ["--year", "1900"], obj=dev)
assert "For year" in res.output
monthly.assert_called()
daily = mocker.patch.object(dev, "get_emeter_daily")
res = runner.invoke(emeter, ["--month", "1900-12"], obj=dev)
assert "For month" in res.output
daily.assert_called()
def test_brightness(dev):
runner = CliRunner()
res = runner.invoke(brightness, obj=dev)
if not dev.is_dimmable:
assert "This device does not support brightness." in res.output
return
res = runner.invoke(brightness, obj=dev)
assert f"Brightness: {dev.brightness}" in res.output
res = runner.invoke(brightness, ["12"], obj=dev)
assert "Setting brightness" in res.output
res = runner.invoke(brightness, obj=dev)
assert f"Brightness: 12" in res.output
def test_temperature(dev):
pass
def test_hsv(dev):
pass
def test_led(dev):
pass
def test_on(dev):
pass
def test_off(dev):
pass
def test_reboot(dev):
pass

View File

@ -2,3 +2,7 @@ pytest
pytest-azurepipelines
pytest-cov
pytest-asyncio
pytest-mock
click # needed for test_cli
voluptuous
codecov

View File

@ -8,13 +8,7 @@ skip_missing_interpreters = True
[testenv]
passenv = TRAVIS TRAVIS_JOB_ID TRAVIS_BRANCH
deps=
pytest
pytest-cov
voluptuous
typing
flake8
pytest-asyncio
deps = -r{toxinidir}/requirements_test.txt
commands=
py.test --cov --cov-config=tox.ini kasa
@ -49,7 +43,6 @@ commands = pre-commit run --all-files
source = kasa
branch = True
omit =
kasa/cli.py
kasa/tests/*
[coverage:report]