2024-12-05 16:49:35 +00:00
|
|
|
"""Tests for smart camera devices."""
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
from datetime import UTC, datetime
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
from freezegun.api import FrozenDateTimeFactory
|
|
|
|
|
|
|
|
from kasa import Device, DeviceType, Module
|
|
|
|
|
|
|
|
from ..conftest import device_smartcam, hub_smartcam
|
|
|
|
|
|
|
|
|
|
|
|
@device_smartcam
|
|
|
|
async def test_state(dev: Device):
|
|
|
|
if dev.device_type is DeviceType.Hub:
|
|
|
|
pytest.skip("Hubs cannot be switched on and off")
|
|
|
|
|
2024-12-17 20:15:42 +00:00
|
|
|
if Module.LensMask in dev.modules:
|
|
|
|
state = dev.is_on
|
|
|
|
await dev.set_state(not state)
|
|
|
|
await dev.update()
|
|
|
|
assert dev.is_on is not state
|
|
|
|
|
|
|
|
dev.modules.pop(Module.LensMask) # type: ignore[attr-defined]
|
|
|
|
|
|
|
|
# Test with no lens mask module. Device is always on.
|
|
|
|
assert dev.is_on is True
|
|
|
|
res = await dev.set_state(False)
|
|
|
|
assert res == {}
|
2024-12-05 16:49:35 +00:00
|
|
|
await dev.update()
|
2024-12-17 20:15:42 +00:00
|
|
|
assert dev.is_on is True
|
2024-12-05 16:49:35 +00:00
|
|
|
|
|
|
|
|
|
|
|
@device_smartcam
|
|
|
|
async def test_alias(dev):
|
|
|
|
test_alias = "TEST1234"
|
|
|
|
original = dev.alias
|
|
|
|
|
|
|
|
assert isinstance(original, str)
|
|
|
|
await dev.set_alias(test_alias)
|
|
|
|
await dev.update()
|
|
|
|
assert dev.alias == test_alias
|
|
|
|
|
|
|
|
await dev.set_alias(original)
|
|
|
|
await dev.update()
|
|
|
|
assert dev.alias == original
|
|
|
|
|
|
|
|
|
|
|
|
@hub_smartcam
|
|
|
|
async def test_hub(dev):
|
|
|
|
assert dev.children
|
|
|
|
for child in dev.children:
|
|
|
|
assert "Cloud" in child.modules
|
|
|
|
assert child.modules["Cloud"].data
|
|
|
|
assert child.alias
|
|
|
|
await child.update()
|
|
|
|
assert "Time" not in child.modules
|
|
|
|
assert child.time
|
|
|
|
|
|
|
|
|
|
|
|
@device_smartcam
|
|
|
|
async def test_device_time(dev: Device, freezer: FrozenDateTimeFactory):
|
|
|
|
"""Test a child device gets the time from it's parent module."""
|
|
|
|
fallback_time = datetime.now(UTC).astimezone().replace(microsecond=0)
|
|
|
|
assert dev.time != fallback_time
|
|
|
|
module = dev.modules[Module.Time]
|
|
|
|
await module.set_time(fallback_time)
|
|
|
|
await dev.update()
|
|
|
|
assert dev.time == fallback_time
|