11"""Tests for the RoomMapping related functionality."""
22
3+ from copy import deepcopy
34from typing import Any
45from unittest .mock import AsyncMock
56
67import pytest
78
8- from roborock .data .containers import HomeDataRoom , NamedRoomMapping
9+ from roborock .data .containers import HomeData , HomeDataRoom , NamedRoomMapping
910from roborock .devices .device import RoborockDevice
1011from roborock .devices .traits .v1 .rooms import RoomsTrait
1112from roborock .devices .traits .v1 .status import StatusTrait
1213from roborock .roborock_typing import RoborockCommand
14+ from tests .devices .traits .v1 .fixtures import HOME_DATA
1315
1416
1517@pytest .fixture
@@ -79,29 +81,25 @@ async def test_refresh_unknown_room_names_overwrites_home_data(
7981 mock_rpc_channel : AsyncMock ,
8082) -> None :
8183 """Test web rooms are used to refresh home data for missing iot ids."""
82- original_rooms = list (rooms_trait ._home_data .rooms or ())
83- try :
84- web_api_client .get_rooms .return_value = [
85- HomeDataRoom (id = 2362048 , name = "Living Room" ),
86- HomeDataRoom (id = 2362044 , name = "Example room 2" ),
87- HomeDataRoom (id = 2362041 , name = "Example room 3" ),
88- HomeDataRoom (id = 9999999 , name = "Office" ),
89- ]
90-
91- room_mapping_data = [[16 , "2362048" ], [17 , "9999999" ]]
92- mock_rpc_channel .send_command .side_effect = [room_mapping_data ]
84+ web_api_client .get_rooms .return_value = [
85+ HomeDataRoom (id = 2362048 , name = "Living Room" ),
86+ HomeDataRoom (id = 2362044 , name = "Example room 2" ),
87+ HomeDataRoom (id = 2362041 , name = "Example room 3" ),
88+ HomeDataRoom (id = 9999999 , name = "Office" ),
89+ ]
90+
91+ room_mapping_data = [[16 , "2362048" ], [17 , "9999999" ]]
92+ mock_rpc_channel .send_command .side_effect = [room_mapping_data ]
9393
94- await rooms_trait .refresh ()
94+ await rooms_trait .refresh ()
9595
96- assert rooms_trait .rooms
97- assert rooms_trait .rooms [0 ] == NamedRoomMapping (segment_id = 16 , iot_id = "2362048" , raw_name = "Living Room" )
98- assert rooms_trait .rooms [1 ] == NamedRoomMapping (segment_id = 17 , iot_id = "9999999" , raw_name = "Office" )
96+ assert rooms_trait .rooms
97+ assert rooms_trait .rooms [0 ] == NamedRoomMapping (segment_id = 16 , iot_id = "2362048" , raw_name = "Living Room" )
98+ assert rooms_trait .rooms [1 ] == NamedRoomMapping (segment_id = 17 , iot_id = "9999999" , raw_name = "Office" )
9999
100- home_data_rooms = {str (room .id ): room .name for room in rooms_trait ._home_data .rooms or ()}
101- assert home_data_rooms ["2362048" ] == "Living Room"
102- assert home_data_rooms ["9999999" ] == "Office"
103- finally :
104- rooms_trait ._home_data .rooms = original_rooms
100+ home_data_rooms = {str (room .id ): room .name for room in rooms_trait ._home_data .rooms or ()}
101+ assert home_data_rooms ["2362048" ] == "Living Room"
102+ assert home_data_rooms ["9999999" ] == "Office"
105103
106104
107105async def test_refresh_unknown_room_names_web_api_called_once (
@@ -110,25 +108,21 @@ async def test_refresh_unknown_room_names_web_api_called_once(
110108 mock_rpc_channel : AsyncMock ,
111109) -> None :
112110 """Test unknown room IDs trigger one web lookup per iot_id."""
113- original_rooms = list (rooms_trait ._home_data .rooms or ())
114- try :
115- web_api_client .get_rooms .return_value = [
116- HomeDataRoom (id = 9999911 , name = "Living Room" ),
117- ]
111+ web_api_client .get_rooms .return_value = [
112+ HomeDataRoom (id = 9999911 , name = "Living Room" ),
113+ ]
118114
119- room_mapping_data = [[16 , "9999911" ]]
120- mock_rpc_channel .send_command .side_effect = [room_mapping_data , room_mapping_data ]
115+ room_mapping_data = [[16 , "9999911" ]]
116+ mock_rpc_channel .send_command .side_effect = [room_mapping_data , room_mapping_data ]
121117
122- await rooms_trait .refresh ()
123- assert rooms_trait .rooms
124- assert rooms_trait .rooms [0 ].name == "Living Room"
118+ await rooms_trait .refresh ()
119+ assert rooms_trait .rooms
120+ assert rooms_trait .rooms [0 ].name == "Living Room"
125121
126- await rooms_trait .refresh ()
127- assert rooms_trait .rooms
128- assert rooms_trait .rooms [0 ].name == "Living Room"
129- web_api_client .get_rooms .assert_called_once ()
130- finally :
131- rooms_trait ._home_data .rooms = original_rooms
122+ await rooms_trait .refresh ()
123+ assert rooms_trait .rooms
124+ assert rooms_trait .rooms [0 ].name == "Living Room"
125+ web_api_client .get_rooms .assert_called_once ()
132126
133127
134128async def test_refresh_unknown_room_names_unresolved_uses_room_fallback (
@@ -209,32 +203,34 @@ async def test_refresh_unknown_room_names_failure_falls_back_to_room_segment_id(
209203 web_api_client .get_rooms .assert_called_once ()
210204
211205
212- async def test_refresh_shared_room_names_use_shared_device_rooms_without_mutating_home_data (
206+ def _build_shared_home_data () -> HomeData :
207+ home_data = deepcopy (HOME_DATA )
208+ home_data .received_devices = [home_data .devices .pop (0 )]
209+ return home_data
210+
211+
212+ @pytest .mark .parametrize ("home_data" , [_build_shared_home_data ()], indirect = True )
213+ async def test_refresh_shared_room_names_use_shared_device_rooms (
213214 rooms_trait : RoomsTrait ,
215+ home_data : HomeData ,
214216 web_api_client : AsyncMock ,
215217 mock_rpc_channel : AsyncMock ,
216218) -> None :
217219 """Test shared devices resolve room names via the shared-device room list."""
218- original_rooms = list (rooms_trait ._home_data .rooms or ())
219- try :
220- # Mark the device as shared by adding it to received_devices
221- device = next (d for d in rooms_trait ._home_data .devices if d .duid == rooms_trait ._device_uid )
222- rooms_trait ._home_data .received_devices = [device ]
223- rooms_trait ._home_data .devices = []
224-
225- web_api_client .get_shared_device_rooms .return_value = [
226- HomeDataRoom (id = 9999999 , name = "Office" ),
227- ]
228- room_mapping_data = [[16 , "2362048" ], [17 , "9999999" ]]
229- mock_rpc_channel .send_command .side_effect = [room_mapping_data ]
230-
231- await rooms_trait .refresh ()
232-
233- assert rooms_trait .rooms
234- assert rooms_trait .rooms [0 ] == NamedRoomMapping (segment_id = 16 , iot_id = "2362048" , raw_name = "Example room 1" )
235- assert rooms_trait .rooms [1 ] == NamedRoomMapping (segment_id = 17 , iot_id = "9999999" , raw_name = "Office" )
236- assert rooms_trait ._home_data .rooms == original_rooms
237- web_api_client .get_shared_device_rooms .assert_called_once_with (rooms_trait ._device_uid )
238- web_api_client .get_rooms .assert_not_called ()
239- finally :
240- rooms_trait ._home_data .rooms = original_rooms
220+ assert home_data .received_devices
221+ assert not rooms_trait .rooms
222+
223+ web_api_client .get_shared_device_rooms .return_value = [
224+ HomeDataRoom (id = 9999999 , name = "Office" ),
225+ ]
226+ room_mapping_data = [[16 , "2362048" ], [17 , "9999999" ]]
227+ mock_rpc_channel .send_command .side_effect = [room_mapping_data ]
228+
229+ await rooms_trait .refresh ()
230+
231+ assert rooms_trait .rooms == [
232+ NamedRoomMapping (segment_id = 16 , iot_id = "2362048" , raw_name = "Example room 1" ),
233+ NamedRoomMapping (segment_id = 17 , iot_id = "9999999" , raw_name = "Office" ),
234+ ]
235+ web_api_client .get_shared_device_rooms .assert_called_once_with (rooms_trait ._device_uid )
236+ web_api_client .get_rooms .assert_not_called ()
0 commit comments