|
6 | 6 |
|
7 | 7 | import pytest |
8 | 8 |
|
9 | | -from roborock.data.containers import CombinedMapInfo |
| 9 | +from roborock.data.containers import CombinedMapInfo, NamedRoomMapping |
10 | 10 | from roborock.data.v1.v1_code_mappings import RoborockStateCode |
| 11 | +from roborock.data.v1.v1_containers import MultiMapsListMapInfo, MultiMapsListRoom |
11 | 12 | from roborock.devices.cache import DeviceCache, DeviceCacheData, InMemoryCache |
12 | 13 | from roborock.devices.device import RoborockDevice |
13 | 14 | from roborock.devices.traits.v1.home import HomeTrait |
@@ -570,3 +571,78 @@ async def test_single_map_no_switching( |
570 | 571 | if call[1].get("command") == RoborockCommand.LOAD_MULTI_MAP |
571 | 572 | ] |
572 | 573 | assert len(load_map_calls) == 0 |
| 574 | + |
| 575 | + |
| 576 | +async def test_refresh_map_info_room_override_and_addition_logic( |
| 577 | + home_trait: HomeTrait, |
| 578 | + rooms_trait: RoomsTrait, |
| 579 | +) -> None: |
| 580 | + """Test the room override and addition logic in _refresh_map_info. |
| 581 | +
|
| 582 | + This test verifies: |
| 583 | + 1. Room with "Unknown" does not override existing room from map_info |
| 584 | + 2. Room with valid name overrides existing room from map_info |
| 585 | + 3. Room with "Unknown" is added if not already in rooms |
| 586 | + 4. Room with valid name is added if not already in rooms |
| 587 | + """ |
| 588 | + map_info = MultiMapsListMapInfo( |
| 589 | + map_flag=0, |
| 590 | + name="Test Map", |
| 591 | + rooms=[ |
| 592 | + MultiMapsListRoom( |
| 593 | + id=16, |
| 594 | + iot_name_id="2362048", |
| 595 | + iot_name="Kitchen from map_info", |
| 596 | + ), |
| 597 | + MultiMapsListRoom( |
| 598 | + id=19, |
| 599 | + iot_name_id="2362042", |
| 600 | + iot_name="Bedroom from map_info", |
| 601 | + ), |
| 602 | + ], |
| 603 | + ) |
| 604 | + |
| 605 | + # Mock rooms_trait to return multiple rooms covering all scenarios: |
| 606 | + # - segment_id 16 with "Unknown": exists in map_info, should NOT override |
| 607 | + # - segment_id 19 with valid name: exists in map_info, should override |
| 608 | + # - segment_id 17 with "Unknown": not in map_info, should be added |
| 609 | + # - segment_id 18 with valid name: not in map_info, should be added |
| 610 | + rooms_trait.rooms = [ |
| 611 | + NamedRoomMapping(segment_id=16, iot_id="2362048", name="Unknown"), # Exists in map_info, should not override |
| 612 | + NamedRoomMapping( |
| 613 | + segment_id=19, iot_id="2362042", name="Updated Bedroom Name" |
| 614 | + ), # Exists in map_info, should override |
| 615 | + NamedRoomMapping(segment_id=17, iot_id="2362044", name="Unknown"), # Not in map_info, should be added |
| 616 | + NamedRoomMapping(segment_id=18, iot_id="2362041", name="Example room 3"), # Not in map_info, should be added |
| 617 | + ] |
| 618 | + |
| 619 | + # Mock rooms_trait.refresh to prevent actual device calls |
| 620 | + with patch.object(rooms_trait, "refresh", new_callable=AsyncMock): |
| 621 | + result = await home_trait._refresh_map_info(map_info) |
| 622 | + |
| 623 | + assert result.map_flag == 0 |
| 624 | + assert result.name == "Test Map" |
| 625 | + assert len(result.rooms) == 4 |
| 626 | + |
| 627 | + # Sort rooms by segment_id for consistent assertions |
| 628 | + sorted_rooms = sorted(result.rooms, key=lambda r: r.segment_id) |
| 629 | + |
| 630 | + # Room 16: from map_info, kept (not overridden by Unknown) |
| 631 | + assert sorted_rooms[0].segment_id == 16 |
| 632 | + assert sorted_rooms[0].name == "Kitchen from map_info" |
| 633 | + assert sorted_rooms[0].iot_id == "2362048" |
| 634 | + |
| 635 | + # Room 17: from rooms_trait with "Unknown", added because not in map_info |
| 636 | + assert sorted_rooms[1].segment_id == 17 |
| 637 | + assert sorted_rooms[1].name == "Unknown" |
| 638 | + assert sorted_rooms[1].iot_id == "2362044" |
| 639 | + |
| 640 | + # Room 18: from rooms_trait with valid name, added because not in map_info |
| 641 | + assert sorted_rooms[2].segment_id == 18 |
| 642 | + assert sorted_rooms[2].name == "Example room 3" |
| 643 | + assert sorted_rooms[2].iot_id == "2362041" |
| 644 | + |
| 645 | + # Room 19: from map_info, overridden by rooms_trait with valid name |
| 646 | + assert sorted_rooms[3].segment_id == 19 |
| 647 | + assert sorted_rooms[3].name == "Updated Bedroom Name" |
| 648 | + assert sorted_rooms[3].iot_id == "2362042" |
0 commit comments