|
1 | 1 | """Common fixtures for the WeatherflowCloud tests."""
|
2 | 2 |
|
3 | 3 | from collections.abc import Generator
|
4 |
| -from unittest.mock import AsyncMock, Mock, patch |
| 4 | +from unittest.mock import AsyncMock, MagicMock, Mock, patch |
5 | 5 |
|
6 | 6 | from aiohttp import ClientResponseError
|
7 | 7 | import pytest
|
| 8 | +from weatherflow4py.api import WeatherFlowRestAPI |
8 | 9 | from weatherflow4py.models.rest.forecast import WeatherDataForecastREST
|
9 | 10 | from weatherflow4py.models.rest.observation import ObservationStationREST
|
10 | 11 | from weatherflow4py.models.rest.stations import StationsResponseREST
|
11 | 12 | from weatherflow4py.models.rest.unified import WeatherFlowDataREST
|
| 13 | +from weatherflow4py.ws import WeatherFlowWebsocketAPI |
12 | 14 |
|
13 | 15 | from homeassistant.components.weatherflow_cloud.const import DOMAIN
|
14 | 16 | from homeassistant.const import CONF_API_TOKEN
|
@@ -81,35 +83,83 @@ async def mock_config_entry() -> MockConfigEntry:
|
81 | 83 |
|
82 | 84 |
|
83 | 85 | @pytest.fixture
|
84 |
| -def mock_api(): |
85 |
| - """Fixture for Mock WeatherFlowRestAPI.""" |
86 |
| - get_stations_response_data = StationsResponseREST.from_json( |
87 |
| - load_fixture("stations.json", DOMAIN) |
88 |
| - ) |
89 |
| - get_forecast_response_data = WeatherDataForecastREST.from_json( |
90 |
| - load_fixture("forecast.json", DOMAIN) |
91 |
| - ) |
92 |
| - get_observation_response_data = ObservationStationREST.from_json( |
93 |
| - load_fixture("station_observation.json", DOMAIN) |
94 |
| - ) |
| 86 | +def mock_rest_api(): |
| 87 | + """Mock rest api.""" |
| 88 | + fixtures = { |
| 89 | + "stations": StationsResponseREST.from_json( |
| 90 | + load_fixture("stations.json", DOMAIN) |
| 91 | + ), |
| 92 | + "forecast": WeatherDataForecastREST.from_json( |
| 93 | + load_fixture("forecast.json", DOMAIN) |
| 94 | + ), |
| 95 | + "observation": ObservationStationREST.from_json( |
| 96 | + load_fixture("station_observation.json", DOMAIN) |
| 97 | + ), |
| 98 | + } |
| 99 | + |
| 100 | + # Create device_station_map |
| 101 | + device_station_map = { |
| 102 | + device.device_id: station.station_id |
| 103 | + for station in fixtures["stations"].stations |
| 104 | + for device in station.devices |
| 105 | + } |
95 | 106 |
|
| 107 | + # Prepare mock data |
96 | 108 | data = {
|
97 | 109 | 24432: WeatherFlowDataREST(
|
98 |
| - weather=get_forecast_response_data, |
99 |
| - observation=get_observation_response_data, |
100 |
| - station=get_stations_response_data.stations[0], |
| 110 | + weather=fixtures["forecast"], |
| 111 | + observation=fixtures["observation"], |
| 112 | + station=fixtures["stations"].stations[0], |
101 | 113 | device_observations=None,
|
102 | 114 | )
|
103 | 115 | }
|
104 | 116 |
|
105 |
| - with patch( |
106 |
| - "homeassistant.components.weatherflow_cloud.coordinator.WeatherFlowRestAPI", |
107 |
| - autospec=True, |
108 |
| - ) as mock_api_class: |
109 |
| - # Create an instance of AsyncMock for the API |
110 |
| - mock_api = AsyncMock() |
111 |
| - mock_api.get_all_data.return_value = data |
112 |
| - # Patch the class to return our mock_api instance |
113 |
| - mock_api_class.return_value = mock_api |
114 |
| - |
| 117 | + mock_api = AsyncMock(spec=WeatherFlowRestAPI) |
| 118 | + mock_api.get_all_data.return_value = data |
| 119 | + mock_api.async_get_stations.return_value = fixtures["stations"] |
| 120 | + mock_api.device_station_map = device_station_map |
| 121 | + mock_api.api_token = MOCK_API_TOKEN |
| 122 | + |
| 123 | + # Apply patches |
| 124 | + with ( |
| 125 | + patch( |
| 126 | + "homeassistant.components.weatherflow_cloud.WeatherFlowRestAPI", |
| 127 | + return_value=mock_api, |
| 128 | + ) as _, |
| 129 | + patch( |
| 130 | + "homeassistant.components.weatherflow_cloud.coordinator.WeatherFlowRestAPI", |
| 131 | + return_value=mock_api, |
| 132 | + ) as _, |
| 133 | + ): |
115 | 134 | yield mock_api
|
| 135 | + |
| 136 | + |
| 137 | +@pytest.fixture |
| 138 | +async def mock_websocket_api(): |
| 139 | + """Mock WeatherFlowWebsocketAPI.""" |
| 140 | + mock_websocket = AsyncMock() |
| 141 | + mock_websocket.send = AsyncMock() |
| 142 | + mock_websocket.recv = AsyncMock() |
| 143 | + |
| 144 | + mock_ws_instance = AsyncMock(spec=WeatherFlowWebsocketAPI) |
| 145 | + mock_ws_instance.connect = AsyncMock() |
| 146 | + mock_ws_instance.send_message = AsyncMock() |
| 147 | + mock_ws_instance.register_observation_callback = MagicMock() |
| 148 | + mock_ws_instance.register_wind_callback = MagicMock() |
| 149 | + mock_ws_instance.websocket = mock_websocket |
| 150 | + |
| 151 | + with ( |
| 152 | + patch( |
| 153 | + "homeassistant.components.weatherflow_cloud.coordinator.WeatherFlowWebsocketAPI", |
| 154 | + return_value=mock_ws_instance, |
| 155 | + ), |
| 156 | + patch( |
| 157 | + "homeassistant.components.weatherflow_cloud.WeatherFlowWebsocketAPI", |
| 158 | + return_value=mock_ws_instance, |
| 159 | + ), |
| 160 | + patch( |
| 161 | + "weatherflow4py.ws.WeatherFlowWebsocketAPI", return_value=mock_ws_instance |
| 162 | + ), |
| 163 | + ): |
| 164 | + # mock_connect.return_value = mock_websocket |
| 165 | + yield mock_ws_instance |
0 commit comments