Skip to content

Commit 60b66ad

Browse files
committed
fix: handle cache data as a dict
1 parent b48121f commit 60b66ad

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

roborock/devices/cache.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,24 @@ class CacheData:
4040
trait_data: dict[str, Any] | None = None
4141
"""Trait-specific cached data used internally for caching device features."""
4242

43+
@staticmethod
44+
def from_dict(data: dict) -> "CacheData":
45+
"""Load CacheData from deserialized dict."""
46+
return CacheData(
47+
home_data=HomeData.from_dict(data.get("home_data", {})),
48+
network_info={
49+
duid: NetworkInfo.from_dict(duid_data) for duid, duid_data in data.get("network_info", {}).items()
50+
},
51+
home_map_info={
52+
map_id: CombinedMapInfo.from_dict(map_data)
53+
for map_id, map_data in data.get("home_map_info", {}).items()
54+
},
55+
home_map_content=data.get("home_map_content", {}),
56+
home_map_content_base64=data.get("home_map_content_base64", {}),
57+
device_features=DeviceFeatures(**data.get("device_features", {})) if data.get("device_features") else None,
58+
trait_data=data.get("trait_data"),
59+
)
60+
4361

4462
class Cache(Protocol):
4563
"""Protocol for a cache that can store and retrieve values."""

tests/devices/test_file_cache.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
"""Tests for the FileCache class."""
22

3+
import dataclasses
34
import pathlib
45
import pickle
56
from unittest.mock import AsyncMock, patch
67

78
import pytest
89

10+
from roborock.data import HomeData, NetworkInfo, RoborockProductNickname
11+
from roborock.device_features import DeviceFeatures
912
from roborock.devices.cache import CacheData
1013
from roborock.devices.file_cache import FileCache
14+
from tests.mock_data import HOME_DATA_RAW, NETWORK_INFO
1115

1216

1317
@pytest.fixture(name="cache_file")
@@ -66,3 +70,36 @@ async def test_flush_no_data(cache_file: pathlib.Path) -> None:
6670
cache = FileCache(cache_file)
6771
await cache.flush()
6872
assert not cache_file.exists()
73+
74+
75+
def test_serialize_dictionary_cache() -> None:
76+
data = {
77+
"home_data": HOME_DATA_RAW,
78+
"network_info": {"fake_duid": NETWORK_INFO},
79+
"home_map_info": {
80+
"0": {
81+
"map_flag": 0,
82+
"name": "",
83+
"rooms": [
84+
{"segment_id": 16, "iot_id": "2537178", "name": "Living room"},
85+
{"segment_id": 17, "iot_id": "2537175", "name": "Kitchen"},
86+
],
87+
}
88+
},
89+
"home_map_content": {},
90+
"home_map_content_base64": {"0": "fake_bytes"},
91+
"device_features": dataclasses.asdict(
92+
DeviceFeatures.from_feature_flags(
93+
new_feature_info=4499197267967999,
94+
new_feature_info_str="508A977F7EFEFFFF",
95+
feature_info=[111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125],
96+
product_nickname=RoborockProductNickname.TANOS,
97+
)
98+
),
99+
"trait_data": {"dock_type": 9},
100+
}
101+
cache_data = CacheData.from_dict(data)
102+
assert isinstance(cache_data, CacheData)
103+
assert isinstance(cache_data.device_features, DeviceFeatures)
104+
assert isinstance(cache_data.network_info["fake_duid"], NetworkInfo)
105+
assert isinstance(cache_data.home_data, HomeData)

0 commit comments

Comments
 (0)