From cb4fa1def6a2ed55a08e7e3cdb14b29bbfa5ea72 Mon Sep 17 00:00:00 2001 From: sdb9696 Date: Tue, 18 Jun 2024 16:45:02 +0100 Subject: [PATCH] Fix to call update when only --device-family passed to cli --- kasa/cli.py | 19 ++++++++++++++----- kasa/tests/test_cli.py | 14 +++++++++++++- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/kasa/cli.py b/kasa/cli.py index f7ff1dd34..76dc0ac47 100755 --- a/kasa/cli.py +++ b/kasa/cli.py @@ -379,6 +379,7 @@ def _nop_echo(*args, **kwargs): echo("No host name given, trying discovery..") return await ctx.invoke(discover) + device_updated = False if type is not None: dev = TYPE_TO_CLASS[type](host) elif device_family and encrypt_type: @@ -396,11 +397,19 @@ def _nop_echo(*args, **kwargs): connection_type=ctype, ) dev = await Device.connect(config=config) + device_updated = True else: - echo( - "No --type or --device-family and --encrypt-type defined, " - + f"discovering for {discovery_timeout} seconds.." - ) + if device_family or encrypt_type: + echo( + "--device-family and --encrypt-type options must both be " + "provided or they are ignored\n" + f"discovering for {discovery_timeout} seconds.." + ) + else: + echo( + "No --type or --device-family and --encrypt-type defined, " + + f"discovering for {discovery_timeout} seconds.." + ) dev = await Discover.discover_single( host, port=port, @@ -411,7 +420,7 @@ def _nop_echo(*args, **kwargs): # Skip update on specific commands, or if device factory, # that performs an update was used for the device. - if ctx.invoked_subcommand not in SKIP_UPDATE_COMMANDS and not device_family: + if ctx.invoked_subcommand not in SKIP_UPDATE_COMMANDS and not device_updated: await dev.update() @asynccontextmanager diff --git a/kasa/tests/test_cli.py b/kasa/tests/test_cli.py index e30685fe4..1973c8248 100644 --- a/kasa/tests/test_cli.py +++ b/kasa/tests/test_cli.py @@ -57,7 +57,15 @@ def runner(): return runner -async def test_update_called_by_cli(dev, mocker, runner): +@pytest.mark.parametrize( + ("device_family", "encrypt_type"), + [ + pytest.param(None, None, id="No connect params"), + pytest.param("SMART.TAPOPLUG", None, id="Only device_family"), + pytest.param(None, "KLAP", id="Only encrypt_type"), + ], +) +async def test_update_called_by_cli(dev, mocker, runner, device_family, encrypt_type): """Test that device update is called on main.""" update = mocker.patch.object(dev, "update") @@ -76,6 +84,10 @@ async def test_update_called_by_cli(dev, mocker, runner): "foo", "--password", "bar", + "--device-family", + device_family, + "--encrypt-type", + encrypt_type, ], catch_exceptions=False, )