mirror of https://github.com/home-assistant/core
162 lines
4.6 KiB
Python
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",
|
|
}
|