core/tests/components/wunderground/test_sensor.py

181 lines
6.0 KiB
Python

"""The tests for the WUnderground platform."""
import aiohttp
from pytest import raises
import homeassistant.components.wunderground.sensor as wunderground
from homeassistant.const import LENGTH_INCHES, STATE_UNKNOWN, TEMP_CELSIUS
from homeassistant.exceptions import PlatformNotReady
from homeassistant.setup import async_setup_component
from tests.common import assert_setup_component, load_fixture
VALID_CONFIG_PWS = {
"platform": "wunderground",
"api_key": "foo",
"pws_id": "bar",
"monitored_conditions": [
"weather",
"feelslike_c",
"alerts",
"elevation",
"location",
],
}
VALID_CONFIG = {
"platform": "wunderground",
"api_key": "foo",
"lang": "EN",
"monitored_conditions": [
"weather",
"feelslike_c",
"alerts",
"elevation",
"location",
"weather_1d_metric",
"precip_1d_in",
],
}
INVALID_CONFIG = {
"platform": "wunderground",
"api_key": "BOB",
"pws_id": "bar",
"lang": "foo",
"monitored_conditions": ["weather", "feelslike_c", "alerts"],
}
URL = (
"http://api.wunderground.com/api/foo/alerts/conditions/forecast/lang"
":EN/q/32.87336,-117.22743.json"
)
PWS_URL = "http://api.wunderground.com/api/foo/alerts/conditions/lang:EN/q/pws:bar.json"
INVALID_URL = (
"http://api.wunderground.com/api/BOB/alerts/conditions/lang:foo/q/pws:bar.json"
)
async def test_setup(hass, aioclient_mock):
"""Test that the component is loaded."""
aioclient_mock.get(URL, text=load_fixture("wunderground-valid.json"))
with assert_setup_component(1, "sensor"):
await async_setup_component(hass, "sensor", {"sensor": VALID_CONFIG})
async def test_setup_pws(hass, aioclient_mock):
"""Test that the component is loaded with PWS id."""
aioclient_mock.get(PWS_URL, text=load_fixture("wunderground-valid.json"))
with assert_setup_component(1, "sensor"):
await async_setup_component(hass, "sensor", {"sensor": VALID_CONFIG_PWS})
async def test_setup_invalid(hass, aioclient_mock):
"""Test that the component is not loaded with invalid config."""
aioclient_mock.get(INVALID_URL, text=load_fixture("wunderground-error.json"))
with assert_setup_component(0, "sensor"):
await async_setup_component(hass, "sensor", {"sensor": INVALID_CONFIG})
async def test_sensor(hass, aioclient_mock):
"""Test the WUnderground sensor class and methods."""
aioclient_mock.get(URL, text=load_fixture("wunderground-valid.json"))
await async_setup_component(hass, "sensor", {"sensor": VALID_CONFIG})
state = hass.states.get("sensor.pws_weather")
assert state.state == "Clear"
assert state.name == "Weather Summary"
assert "unit_of_measurement" not in state.attributes
assert (
state.attributes["entity_picture"] == "https://icons.wxug.com/i/c/k/clear.gif"
)
state = hass.states.get("sensor.pws_alerts")
assert state.state == "1"
assert state.name == "Alerts"
assert state.attributes["Message"] == "This is a test alert message"
assert state.attributes["icon"] == "mdi:alert-circle-outline"
assert "entity_picture" not in state.attributes
state = hass.states.get("sensor.pws_location")
assert state.state == "Holly Springs, NC"
assert state.name == "Location"
state = hass.states.get("sensor.pws_elevation")
assert state.state == "413"
assert state.name == "Elevation"
state = hass.states.get("sensor.pws_feelslike_c")
assert state.state == "40"
assert state.name == "Feels Like"
assert "entity_picture" not in state.attributes
assert state.attributes["unit_of_measurement"] == TEMP_CELSIUS
state = hass.states.get("sensor.pws_weather_1d_metric")
assert state.state == "Mostly Cloudy. Fog overnight."
assert state.name == "Tuesday"
state = hass.states.get("sensor.pws_precip_1d_in")
assert state.state == "0.03"
assert state.name == "Precipitation Intensity Today"
assert state.attributes["unit_of_measurement"] == LENGTH_INCHES
async def test_connect_failed(hass, aioclient_mock):
"""Test the WUnderground connection error."""
aioclient_mock.get(URL, exc=aiohttp.ClientError())
with raises(PlatformNotReady):
await wunderground.async_setup_platform(hass, VALID_CONFIG, lambda _: None)
async def test_invalid_data(hass, aioclient_mock):
"""Test the WUnderground invalid data."""
aioclient_mock.get(URL, text=load_fixture("wunderground-invalid.json"))
await async_setup_component(hass, "sensor", {"sensor": VALID_CONFIG})
for condition in VALID_CONFIG["monitored_conditions"]:
state = hass.states.get("sensor.pws_" + condition)
assert state.state == STATE_UNKNOWN
async def test_entity_id_with_multiple_stations(hass, aioclient_mock):
"""Test not generating duplicate entity ids with multiple stations."""
aioclient_mock.get(URL, text=load_fixture("wunderground-valid.json"))
aioclient_mock.get(PWS_URL, text=load_fixture("wunderground-valid.json"))
config = [VALID_CONFIG, {**VALID_CONFIG_PWS, "entity_namespace": "hi"}]
await async_setup_component(hass, "sensor", {"sensor": config})
await hass.async_block_till_done()
state = hass.states.get("sensor.pws_weather")
assert state is not None
assert state.state == "Clear"
state = hass.states.get("sensor.hi_pws_weather")
assert state is not None
assert state.state == "Clear"
async def test_fails_because_of_unique_id(hass, aioclient_mock):
"""Test same config twice fails because of unique_id."""
aioclient_mock.get(URL, text=load_fixture("wunderground-valid.json"))
aioclient_mock.get(PWS_URL, text=load_fixture("wunderground-valid.json"))
config = [
VALID_CONFIG,
{**VALID_CONFIG, "entity_namespace": "hi"},
VALID_CONFIG_PWS,
]
await async_setup_component(hass, "sensor", {"sensor": config})
await hass.async_block_till_done()
states = hass.states.async_all()
expected = len(VALID_CONFIG["monitored_conditions"]) + len(
VALID_CONFIG_PWS["monitored_conditions"]
)
assert len(states) == expected