core/tests/components/weather/test_intent.py

109 lines
3.5 KiB
Python

"""Test weather intents."""
from unittest.mock import patch
import pytest
from homeassistant.components.weather import (
DOMAIN,
WeatherEntity,
intent as weather_intent,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers import intent
from homeassistant.setup import async_setup_component
async def test_get_weather(hass: HomeAssistant) -> None:
"""Test get weather for first entity and by name."""
assert await async_setup_component(hass, "weather", {"weather": {}})
entity1 = WeatherEntity()
entity1._attr_name = "Weather 1"
entity1.entity_id = "weather.test_1"
entity2 = WeatherEntity()
entity2._attr_name = "Weather 2"
entity2.entity_id = "weather.test_2"
await hass.data[DOMAIN].async_add_entities([entity1, entity2])
await weather_intent.async_setup_intents(hass)
# First entity will be chosen
response = await intent.async_handle(
hass, "test", weather_intent.INTENT_GET_WEATHER, {}
)
assert response.response_type == intent.IntentResponseType.QUERY_ANSWER
assert len(response.matched_states) == 1
state = response.matched_states[0]
assert state.entity_id == entity1.entity_id
# Named entity will be chosen
response = await intent.async_handle(
hass,
"test",
weather_intent.INTENT_GET_WEATHER,
{"name": {"value": "Weather 2"}},
)
assert response.response_type == intent.IntentResponseType.QUERY_ANSWER
assert len(response.matched_states) == 1
state = response.matched_states[0]
assert state.entity_id == entity2.entity_id
async def test_get_weather_wrong_name(hass: HomeAssistant) -> None:
"""Test get weather with the wrong name."""
assert await async_setup_component(hass, "weather", {"weather": {}})
entity1 = WeatherEntity()
entity1._attr_name = "Weather 1"
entity1.entity_id = "weather.test_1"
await hass.data[DOMAIN].async_add_entities([entity1])
await weather_intent.async_setup_intents(hass)
# Incorrect name
with pytest.raises(intent.IntentHandleError):
await intent.async_handle(
hass,
"test",
weather_intent.INTENT_GET_WEATHER,
{"name": {"value": "not the right name"}},
)
async def test_get_weather_no_entities(hass: HomeAssistant) -> None:
"""Test get weather with no weather entities."""
assert await async_setup_component(hass, "weather", {"weather": {}})
await weather_intent.async_setup_intents(hass)
# No weather entities
with pytest.raises(intent.IntentHandleError):
await intent.async_handle(hass, "test", weather_intent.INTENT_GET_WEATHER, {})
async def test_get_weather_no_state(hass: HomeAssistant) -> None:
"""Test get weather when state is not returned."""
assert await async_setup_component(hass, "weather", {"weather": {}})
entity1 = WeatherEntity()
entity1._attr_name = "Weather 1"
entity1.entity_id = "weather.test_1"
await hass.data[DOMAIN].async_add_entities([entity1])
await weather_intent.async_setup_intents(hass)
# Success with state
response = await intent.async_handle(
hass, "test", weather_intent.INTENT_GET_WEATHER, {}
)
assert response.response_type == intent.IntentResponseType.QUERY_ANSWER
# Failure without state
with patch("homeassistant.core.StateMachine.get", return_value=None), pytest.raises(
intent.IntentHandleError
):
await intent.async_handle(hass, "test", weather_intent.INTENT_GET_WEATHER, {})