core/tests/components/weather/test_websocket_api.py

162 lines
4.6 KiB
Python

"""Test the weather websocket API."""
from homeassistant.components.weather import Forecast, WeatherEntityFeature
from homeassistant.components.weather.const import DOMAIN
from homeassistant.const import UnitOfTemperature
from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component
from . import MockWeatherTest, create_entity
from tests.typing import WebSocketGenerator
async def test_device_class_units(
hass: HomeAssistant, hass_ws_client: WebSocketGenerator
) -> None:
"""Test we can get supported units."""
assert await async_setup_component(hass, DOMAIN, {})
client = await hass_ws_client(hass)
await client.send_json(
{
"id": 1,
"type": "weather/convertible_units",
}
)
msg = await client.receive_json()
assert msg["success"]
assert msg["result"] == {
"units": {
"precipitation_unit": ["in", "mm"],
"pressure_unit": ["hPa", "inHg", "mbar", "mmHg"],
"temperature_unit": ["°C", "°F"],
"visibility_unit": ["km", "mi"],
"wind_speed_unit": ["ft/s", "km/h", "kn", "m/s", "mph"],
}
}
async def test_subscribe_forecast(
hass: HomeAssistant,
hass_ws_client: WebSocketGenerator,
config_flow_fixture: None,
) -> None:
"""Test multiple forecast."""
class MockWeatherMockForecast(MockWeatherTest):
"""Mock weather class."""
async def async_forecast_daily(self) -> list[Forecast] | None:
"""Return the forecast_daily."""
return self.forecast_list
kwargs = {
"native_temperature": 38,
"native_temperature_unit": UnitOfTemperature.CELSIUS,
"supported_features": WeatherEntityFeature.FORECAST_DAILY,
}
weather_entity = await create_entity(hass, MockWeatherMockForecast, None, **kwargs)
client = await hass_ws_client(hass)
await client.send_json_auto_id(
{
"type": "weather/subscribe_forecast",
"forecast_type": "daily",
"entity_id": weather_entity.entity_id,
}
)
msg = await client.receive_json()
assert msg["success"]
assert msg["result"] is None
subscription_id = msg["id"]
msg = await client.receive_json()
assert msg["id"] == subscription_id
assert msg["type"] == "event"
forecast = msg["event"]
assert forecast == {
"type": "daily",
"forecast": [
{
"cloud_coverage": None,
"temperature": 38.0,
"templow": 38.0,
"uv_index": None,
"wind_bearing": None,
}
],
}
await weather_entity.async_update_listeners(None)
msg = await client.receive_json()
assert msg["event"] == forecast
await weather_entity.async_update_listeners(["daily"])
msg = await client.receive_json()
assert msg["event"] == forecast
weather_entity.forecast_list = None
await weather_entity.async_update_listeners(None)
msg = await client.receive_json()
assert msg["event"] == {"type": "daily", "forecast": None}
async def test_subscribe_forecast_unknown_entity(
hass: HomeAssistant,
hass_ws_client: WebSocketGenerator,
) -> None:
"""Test multiple forecast."""
assert await async_setup_component(hass, DOMAIN, {})
client = await hass_ws_client(hass)
await client.send_json_auto_id(
{
"type": "weather/subscribe_forecast",
"forecast_type": "daily",
"entity_id": "weather.unknown",
}
)
msg = await client.receive_json()
assert not msg["success"]
assert msg["error"] == {
"code": "invalid_entity_id",
"message": "Weather entity not found: weather.unknown",
}
async def test_subscribe_forecast_unsupported(
hass: HomeAssistant,
hass_ws_client: WebSocketGenerator,
config_flow_fixture: None,
) -> None:
"""Test multiple forecast."""
class MockWeatherMock(MockWeatherTest):
"""Mock weather class."""
kwargs = {
"native_temperature": 38,
"native_temperature_unit": UnitOfTemperature.CELSIUS,
}
weather_entity = await create_entity(hass, MockWeatherMock, None, **kwargs)
client = await hass_ws_client(hass)
await client.send_json_auto_id(
{
"type": "weather/subscribe_forecast",
"forecast_type": "daily",
"entity_id": weather_entity.entity_id,
}
)
msg = await client.receive_json()
assert not msg["success"]
assert msg["error"] == {
"code": "forecast_not_supported",
"message": "The weather entity does not support forecast type: daily",
}