11"""Tests for the Device class."""
22
3+ import pathlib
4+ from collections .abc import Awaitable , Callable
35from unittest .mock import AsyncMock , Mock
46
57import pytest
8+ from syrupy import SnapshotAssertion
69
710from roborock .containers import HomeData , S7MaxVStatus , UserData
811from roborock .devices .device import RoborockDevice
12+ from roborock .devices .traits .clean_summary import CleanSummaryTrait
13+ from roborock .devices .traits .dnd import DoNotDisturbTrait
14+ from roborock .devices .traits .sound_volume import SoundVolumeTrait
915from roborock .devices .traits .status import StatusTrait
1016from roborock .devices .traits .trait import Trait
17+ from roborock .devices .v1_rpc_channel import decode_rpc_response
18+ from roborock .roborock_message import RoborockMessage , RoborockMessageProtocol
1119
1220from .. import mock_data
1321
1422USER_DATA = UserData .from_dict (mock_data .USER_DATA )
1523HOME_DATA = HomeData .from_dict (mock_data .HOME_DATA_RAW )
1624STATUS = S7MaxVStatus .from_dict (mock_data .STATUS )
1725
26+ TESTDATA = pathlib .Path ("tests/protocols/testdata/v1_protocol/" )
27+
1828
1929@pytest .fixture (autouse = True , name = "channel" )
2030def device_channel_fixture () -> AsyncMock :
@@ -45,7 +55,10 @@ def traits_fixture(rpc_channel: AsyncMock) -> list[Trait]:
4555 StatusTrait (
4656 product_info = HOME_DATA .products [0 ],
4757 rpc_channel = rpc_channel ,
48- )
58+ ),
59+ CleanSummaryTrait (rpc_channel = rpc_channel ),
60+ DoNotDisturbTrait (rpc_channel = rpc_channel ),
61+ SoundVolumeTrait (rpc_channel = rpc_channel ),
4962 ]
5063
5164
@@ -70,19 +83,45 @@ async def test_device_connection(device: RoborockDevice, channel: AsyncMock) ->
7083 assert unsub .called
7184
7285
73- async def test_device_get_status_command (device : RoborockDevice , rpc_channel : AsyncMock ) -> None :
74- """Test the device get_status command."""
75- # Mock response for get_status command
76- rpc_channel .send_command .return_value = [STATUS .as_dict ()]
77-
78- # Test get_status and verify the command was sent
79- status_api = device .traits ["status" ]
80- assert isinstance (status_api , StatusTrait )
81- assert status_api is not None
82- status = await status_api .get_status ()
83- assert rpc_channel .send_command .called
84-
85- # Verify the result
86- assert status is not None
87- assert status .battery == 100
88- assert status .state == 8
86+ @pytest .fixture (name = "setup_rpc_channel" )
87+ def setup_rpc_channel_fixture (rpc_channel : AsyncMock , payload : pathlib .Path ) -> AsyncMock :
88+ """Fixture to set up the RPC channel for the tests."""
89+ # The values other than the payload are arbitrary
90+ message = RoborockMessage (
91+ protocol = RoborockMessageProtocol .GENERAL_RESPONSE ,
92+ payload = payload .read_bytes (),
93+ seq = 12750 ,
94+ version = b"1.0" ,
95+ random = 97431 ,
96+ timestamp = 1652547161 ,
97+ )
98+ response_message = decode_rpc_response (message )
99+ rpc_channel .send_command .return_value = response_message .data
100+ return rpc_channel
101+
102+
103+ @pytest .mark .parametrize (
104+ ("payload" , "trait_name" , "trait_type" , "trait_method" ),
105+ [
106+ (TESTDATA / "get_status.json" , "status" , StatusTrait , StatusTrait .get_status ),
107+ (TESTDATA / "get_dnd.json" , "do_not_disturb" , DoNotDisturbTrait , DoNotDisturbTrait .get_dnd_timer ),
108+ (TESTDATA / "get_clean_summary.json" , "clean_summary" , CleanSummaryTrait , CleanSummaryTrait .get_clean_summary ),
109+ (TESTDATA / "get_volume.json" , "sound_volume" , SoundVolumeTrait , SoundVolumeTrait .get_volume ),
110+ ],
111+ )
112+ async def test_device_trait_command_parsing (
113+ device : RoborockDevice ,
114+ setup_rpc_channel : AsyncMock ,
115+ snapshot : SnapshotAssertion ,
116+ trait_name : str ,
117+ trait_type : type [Trait ],
118+ trait_method : Callable [..., Awaitable [object ]],
119+ ) -> None :
120+ """Test the device trait command."""
121+ trait = device .traits [trait_name ]
122+ assert trait
123+ assert isinstance (trait , trait_type )
124+ result = await trait_method (trait )
125+ assert setup_rpc_channel .send_command .called
126+
127+ assert result == snapshot
0 commit comments