diff --git a/kasa/cli.py b/kasa/cli.py index f7ff1dd3..76dc0ac4 100755 --- a/kasa/cli.py +++ b/kasa/cli.py @@ -379,6 +379,7 @@ async def cli( 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 @@ async def cli( 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 @@ async def cli( # 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 e30685fe..1973c824 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, )