import pytest from asyncclick.testing import CliRunner from kasa import SmartDevice from kasa.cli import ( TYPE_TO_CLASS, alias, brightness, cli, emeter, raw_command, state, sysinfo, ) from .conftest import handle_turn_on, pytestmark, turn_on async def test_sysinfo(dev): runner = CliRunner() res = await runner.invoke(sysinfo, obj=dev) assert "System info" in res.output assert dev.alias in res.output @turn_on async def test_state(dev, turn_on): await handle_turn_on(dev, turn_on) runner = CliRunner() res = await runner.invoke(state, obj=dev) await dev.update() if dev.is_on: assert "Device state: ON" in res.output else: assert "Device state: OFF" in res.output async def test_alias(dev): runner = CliRunner() res = await runner.invoke(alias, obj=dev) assert f"Alias: {dev.alias}" in res.output old_alias = dev.alias new_alias = "new alias" res = await runner.invoke(alias, [new_alias], obj=dev) assert f"Setting alias to {new_alias}" in res.output res = await runner.invoke(alias, obj=dev) assert f"Alias: {new_alias}" in res.output await dev.set_alias(old_alias) async def test_raw_command(dev): runner = CliRunner() res = await runner.invoke(raw_command, ["system", "get_sysinfo"], obj=dev) assert res.exit_code == 0 assert dev.alias in res.output res = await runner.invoke(raw_command, obj=dev) assert res.exit_code != 0 assert "Usage" in res.output async def test_emeter(dev: SmartDevice, mocker): runner = CliRunner() res = await runner.invoke(emeter, obj=dev) if not dev.has_emeter: assert "Device has no emeter" in res.output return assert "== Emeter ==" in res.output monthly = mocker.patch.object(dev, "get_emeter_monthly") monthly.return_value = [] res = await runner.invoke(emeter, ["--year", "1900"], obj=dev) assert "For year" in res.output monthly.assert_called() daily = mocker.patch.object(dev, "get_emeter_daily") daily.return_value = [] res = await runner.invoke(emeter, ["--month", "1900-12"], obj=dev) assert "For month" in res.output daily.assert_called() async def test_brightness(dev): runner = CliRunner() res = await runner.invoke(brightness, obj=dev) if not dev.is_dimmable: assert "This device does not support brightness." in res.output return res = await runner.invoke(brightness, obj=dev) assert f"Brightness: {dev.brightness}" in res.output res = await runner.invoke(brightness, ["12"], obj=dev) assert "Setting brightness" in res.output res = await runner.invoke(brightness, obj=dev) assert "Brightness: 12" in res.output def _generate_type_class_pairs(): yield from TYPE_TO_CLASS.items() @pytest.mark.parametrize("type_class", _generate_type_class_pairs()) async def test_deprecated_type(dev, type_class, mocker): """Make sure that using deprecated types yields a warning.""" type, cls = type_class if type == "dimmer": return runner = CliRunner() with mocker.patch("kasa.SmartDevice.update"): res = await runner.invoke(cli, ["--host", "127.0.0.2", f"--{type}"]) assert "Using --bulb, --plug, --strip, and --lightstrip is deprecated" in res.output async def test_temperature(dev): pass async def test_hsv(dev): pass async def test_led(dev): pass async def test_on(dev): pass async def test_off(dev): pass async def test_reboot(dev): pass