mirror of
https://github.com/python-kasa/python-kasa.git
synced 2024-12-22 19:23:34 +00:00
Do not error when accessing smart device_type before update (#1319)
This commit is contained in:
parent
123ea107b1
commit
4eed945e00
@ -765,10 +765,11 @@ class SmartDevice(Device):
|
|||||||
if self._device_type is not DeviceType.Unknown:
|
if self._device_type is not DeviceType.Unknown:
|
||||||
return self._device_type
|
return self._device_type
|
||||||
|
|
||||||
# Fallback to device_type (from disco info)
|
if (
|
||||||
type_str = self._info.get("type", self._info.get("device_type"))
|
not (type_str := self._info.get("type", self._info.get("device_type")))
|
||||||
|
or not self._components
|
||||||
if not type_str: # no update or discovery info
|
):
|
||||||
|
# no update or discovery info
|
||||||
return self._device_type
|
return self._device_type
|
||||||
|
|
||||||
self._device_type = self._get_device_type_from_components(
|
self._device_type = self._get_device_type_from_components(
|
||||||
|
@ -130,6 +130,8 @@ new_discovery = parametrize_discovery(
|
|||||||
"new discovery", data_root_filter="discovery_result"
|
"new discovery", data_root_filter="discovery_result"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
smart_discovery = parametrize_discovery("smart discovery", protocol_filter={"SMART"})
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(
|
@pytest.fixture(
|
||||||
params=filter_fixtures("discoverable", protocol_filter={"SMART", "IOT"}),
|
params=filter_fixtures("discoverable", protocol_filter={"SMART", "IOT"}),
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import copy
|
||||||
import logging
|
import logging
|
||||||
import time
|
import time
|
||||||
from typing import Any, cast
|
from typing import Any, cast
|
||||||
@ -11,16 +12,18 @@ import pytest
|
|||||||
from freezegun.api import FrozenDateTimeFactory
|
from freezegun.api import FrozenDateTimeFactory
|
||||||
from pytest_mock import MockerFixture
|
from pytest_mock import MockerFixture
|
||||||
|
|
||||||
from kasa import Device, KasaException, Module
|
from kasa import Device, DeviceType, KasaException, Module
|
||||||
from kasa.exceptions import DeviceError, SmartErrorCode
|
from kasa.exceptions import DeviceError, SmartErrorCode
|
||||||
from kasa.protocols.smartprotocol import _ChildProtocolWrapper
|
from kasa.protocols.smartprotocol import _ChildProtocolWrapper
|
||||||
from kasa.smart import SmartDevice
|
from kasa.smart import SmartDevice
|
||||||
from kasa.smart.modules.energy import Energy
|
from kasa.smart.modules.energy import Energy
|
||||||
from kasa.smart.smartmodule import SmartModule
|
from kasa.smart.smartmodule import SmartModule
|
||||||
from tests.conftest import (
|
from tests.conftest import (
|
||||||
|
DISCOVERY_MOCK_IP,
|
||||||
device_smart,
|
device_smart,
|
||||||
get_device_for_fixture_protocol,
|
get_device_for_fixture_protocol,
|
||||||
get_parent_and_child_modules,
|
get_parent_and_child_modules,
|
||||||
|
smart_discovery,
|
||||||
)
|
)
|
||||||
from tests.device_fixtures import variable_temp_smart
|
from tests.device_fixtures import variable_temp_smart
|
||||||
|
|
||||||
@ -51,6 +54,31 @@ async def test_update_no_device_info(dev: SmartDevice, mocker: MockerFixture):
|
|||||||
await dev.update()
|
await dev.update()
|
||||||
|
|
||||||
|
|
||||||
|
@smart_discovery
|
||||||
|
async def test_device_type_no_update(discovery_mock, caplog: pytest.LogCaptureFixture):
|
||||||
|
"""Test device type and repr when device not updated."""
|
||||||
|
dev = SmartDevice(DISCOVERY_MOCK_IP)
|
||||||
|
assert dev.device_type is DeviceType.Unknown
|
||||||
|
assert repr(dev) == f"<DeviceType.Unknown at {DISCOVERY_MOCK_IP} - update() needed>"
|
||||||
|
|
||||||
|
discovery_result = copy.deepcopy(discovery_mock.discovery_data["result"])
|
||||||
|
dev.update_from_discover_info(discovery_result)
|
||||||
|
assert dev.device_type is DeviceType.Unknown
|
||||||
|
assert (
|
||||||
|
repr(dev)
|
||||||
|
== f"<DeviceType.Unknown at {DISCOVERY_MOCK_IP} - None (None) - update() needed>"
|
||||||
|
)
|
||||||
|
discovery_result["device_type"] = "SMART.FOOBAR"
|
||||||
|
dev.update_from_discover_info(discovery_result)
|
||||||
|
dev._components = {"dummy": 1}
|
||||||
|
assert dev.device_type is DeviceType.Plug
|
||||||
|
assert (
|
||||||
|
repr(dev)
|
||||||
|
== f"<DeviceType.Plug at {DISCOVERY_MOCK_IP} - None (None) - update() needed>"
|
||||||
|
)
|
||||||
|
assert "Unknown device type, falling back to plug" in caplog.text
|
||||||
|
|
||||||
|
|
||||||
@device_smart
|
@device_smart
|
||||||
async def test_initial_update(dev: SmartDevice, mocker: MockerFixture):
|
async def test_initial_update(dev: SmartDevice, mocker: MockerFixture):
|
||||||
"""Test the initial update cycle."""
|
"""Test the initial update cycle."""
|
||||||
|
Loading…
Reference in New Issue
Block a user