core/tests/components/weatherflow_cloud/conftest.py

171 lines
5.0 KiB
Python

"""Common fixtures for the WeatherflowCloud tests."""
from collections.abc import Generator
from unittest.mock import AsyncMock, MagicMock, Mock, patch
from aiohttp import ClientResponseError
import pytest
from weatherflow4py.api import WeatherFlowRestAPI
from weatherflow4py.models.rest.forecast import WeatherDataForecastREST
from weatherflow4py.models.rest.observation import ObservationStationREST
from weatherflow4py.models.rest.stations import StationsResponseREST
from weatherflow4py.models.rest.unified import WeatherFlowDataREST
from weatherflow4py.ws import WeatherFlowWebsocketAPI
from homeassistant.components.weatherflow_cloud.const import DOMAIN
from homeassistant.const import CONF_API_TOKEN
from tests.common import MockConfigEntry, load_fixture
@pytest.fixture
def mock_setup_entry() -> Generator[AsyncMock]:
"""Override async_setup_entry."""
with patch(
"homeassistant.components.weatherflow_cloud.async_setup_entry",
return_value=True,
) as mock_setup_entry:
yield mock_setup_entry
@pytest.fixture
def mock_get_stations() -> Generator[AsyncMock]:
"""Mock get_stations with a sequence of responses."""
side_effects = [
True,
]
with patch(
"weatherflow4py.api.WeatherFlowRestAPI.async_get_stations",
side_effect=side_effects,
) as mock_get_stations:
yield mock_get_stations
@pytest.fixture
def mock_get_stations_500_error() -> Generator[AsyncMock]:
"""Mock get_stations with a sequence of responses."""
side_effects = [
ClientResponseError(Mock(), (), status=500),
True,
]
with patch(
"weatherflow4py.api.WeatherFlowRestAPI.async_get_stations",
side_effect=side_effects,
) as mock_get_stations:
yield mock_get_stations
@pytest.fixture
def mock_get_stations_401_error() -> Generator[AsyncMock]:
"""Mock get_stations with a sequence of responses."""
side_effects = [ClientResponseError(Mock(), (), status=401), True, True, True]
with patch(
"weatherflow4py.api.WeatherFlowRestAPI.async_get_stations",
side_effect=side_effects,
) as mock_get_stations:
yield mock_get_stations
MOCK_API_TOKEN = "1234567890"
@pytest.fixture
async def mock_config_entry() -> MockConfigEntry:
"""Fixture for MockConfigEntry."""
return MockConfigEntry(
domain=DOMAIN,
data={CONF_API_TOKEN: MOCK_API_TOKEN},
version=1,
)
@pytest.fixture
def mock_rest_api():
"""Mock rest api."""
fixtures = {
"stations": StationsResponseREST.from_json(
load_fixture("stations.json", DOMAIN)
),
"forecast": WeatherDataForecastREST.from_json(
load_fixture("forecast.json", DOMAIN)
),
"observation": ObservationStationREST.from_json(
load_fixture("station_observation.json", DOMAIN)
),
}
# Create device_station_map
device_station_map = {
device.device_id: station.station_id
for station in fixtures["stations"].stations
for device in station.devices
}
# Prepare mock data
data = {
24432: WeatherFlowDataREST(
weather=fixtures["forecast"],
observation=fixtures["observation"],
station=fixtures["stations"].stations[0],
device_observations=None,
)
}
mock_api = AsyncMock(spec=WeatherFlowRestAPI)
mock_api.get_all_data.return_value = data
mock_api.async_get_stations.return_value = fixtures["stations"]
mock_api.device_station_map = device_station_map
mock_api.api_token = MOCK_API_TOKEN
# Apply patches
with (
patch(
"homeassistant.components.weatherflow_cloud.WeatherFlowRestAPI",
return_value=mock_api,
) as _,
patch(
"homeassistant.components.weatherflow_cloud.coordinator.WeatherFlowRestAPI",
return_value=mock_api,
) as _,
):
yield mock_api
@pytest.fixture
def mock_stations_data(mock_rest_api):
"""Mock stations data for coordinator tests."""
return mock_rest_api.async_get_stations.return_value
@pytest.fixture
async def mock_websocket_api():
"""Mock WeatherFlowWebsocketAPI."""
mock_websocket = AsyncMock()
mock_websocket.send = AsyncMock()
mock_websocket.recv = AsyncMock()
mock_ws_instance = AsyncMock(spec=WeatherFlowWebsocketAPI)
mock_ws_instance.connect = AsyncMock()
mock_ws_instance.send_message = AsyncMock()
mock_ws_instance.register_callback = MagicMock()
mock_ws_instance.websocket = mock_websocket
with (
patch(
"homeassistant.components.weatherflow_cloud.coordinator.WeatherFlowWebsocketAPI",
return_value=mock_ws_instance,
),
patch(
"homeassistant.components.weatherflow_cloud.WeatherFlowWebsocketAPI",
return_value=mock_ws_instance,
),
patch(
"weatherflow4py.ws.WeatherFlowWebsocketAPI", return_value=mock_ws_instance
),
):
# mock_connect.return_value = mock_websocket
yield mock_ws_instance