181 lines
6.0 KiB
Python
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
|