Files
core/tests/components/weatherflow_cloud/conftest.py
Jeef ea70229426 Add Weatherflow Cloud wind support via websocket (#125611)
* rebase off of dev

* update tests

* update tests

* addressing PR finally

* API to back

* adding a return type

* need to test

* removed teh extra check on available

* some changes

* ready for re-review

* change assertions

* remove icon function

* update ambr

* ruff

* update snapshot and push

* Update homeassistant/components/weatherflow_cloud/coordinator.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* Update homeassistant/components/weatherflow_cloud/coordinator.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* enhnaced tests

* better coverage

* Update homeassistant/components/weatherflow_cloud/coordinator.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* Update homeassistant/components/weatherflow_cloud/coordinator.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* Update homeassistant/components/weatherflow_cloud/coordinator.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* Update homeassistant/components/weatherflow_cloud/coordinator.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* Update homeassistant/components/weatherflow_cloud/coordinator.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* remove comments

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2025-06-30 15:26:17 +02:00

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