|
| 1 | +"""Tests for the MqttChannel class.""" |
| 2 | + |
| 3 | +from collections.abc import Generator |
| 4 | +from unittest.mock import AsyncMock, Mock, patch |
| 5 | + |
| 6 | +import pytest |
| 7 | + |
| 8 | +from roborock.containers import HomeData, UserData |
| 9 | +from roborock.devices.mqtt_channel import MqttChannel |
| 10 | +from roborock.mqtt.session import MqttParams |
| 11 | + |
| 12 | +from .. import mock_data |
| 13 | + |
| 14 | +USER_DATA = UserData.from_dict(mock_data.USER_DATA) |
| 15 | +TEST_MQTT_PARAMS = MqttParams( |
| 16 | + host="localhost", |
| 17 | + port=1883, |
| 18 | + tls=False, |
| 19 | + username="username", |
| 20 | + password="password", |
| 21 | + timeout=10.0, |
| 22 | +) |
| 23 | + |
| 24 | + |
| 25 | +@pytest.fixture(autouse=True) |
| 26 | +def setup_mqtt_session() -> Generator[None, None, None]: |
| 27 | + """Fixture to set up the MQTT session for the tests.""" |
| 28 | + with patch("roborock.devices.device_manager.create_mqtt_session"): |
| 29 | + yield |
| 30 | + |
| 31 | + |
| 32 | +async def home_home_data_no_devices() -> HomeData: |
| 33 | + """Mock home data API that returns no devices.""" |
| 34 | + return HomeData( |
| 35 | + id=1, |
| 36 | + name="Test Home", |
| 37 | + devices=[], |
| 38 | + products=[], |
| 39 | + ) |
| 40 | + |
| 41 | + |
| 42 | +async def mock_home_data() -> HomeData: |
| 43 | + """Mock home data API that returns devices.""" |
| 44 | + return HomeData.from_dict(mock_data.HOME_DATA_RAW) |
| 45 | + |
| 46 | + |
| 47 | +async def test_mqtt_channel() -> None: |
| 48 | + """Test MQTT channel setup.""" |
| 49 | + |
| 50 | + mock_session = AsyncMock() |
| 51 | + |
| 52 | + channel = MqttChannel(mock_session, duid="abc123", rriot=USER_DATA.rriot, mqtt_params=TEST_MQTT_PARAMS) |
| 53 | + |
| 54 | + unsub = Mock() |
| 55 | + mock_session.subscribe.return_value = unsub |
| 56 | + |
| 57 | + callback = Mock() |
| 58 | + result = await channel.subscribe(callback) |
| 59 | + |
| 60 | + assert mock_session.subscribe.called |
| 61 | + assert mock_session.subscribe.call_args[0][0] == "rr/m/o/user123/username/abc123" |
| 62 | + assert mock_session.subscribe.call_args[0][1] == callback |
| 63 | + |
| 64 | + assert result == unsub |
0 commit comments