230 lines
7.9 KiB
Python
230 lines
7.9 KiB
Python
"""The tests for the Yahoo weather sensor component."""
|
|
import json
|
|
import unittest
|
|
from unittest.mock import patch
|
|
|
|
from homeassistant.setup import setup_component
|
|
|
|
from tests.common import MockDependency, get_test_home_assistant, load_fixture
|
|
|
|
VALID_CONFIG_MINIMAL = {
|
|
"sensor": {"platform": "yweather", "monitored_conditions": ["weather"]}
|
|
}
|
|
|
|
VALID_CONFIG_ALL = {
|
|
"sensor": {
|
|
"platform": "yweather",
|
|
"monitored_conditions": [
|
|
"weather",
|
|
"weather_current",
|
|
"temperature",
|
|
"temp_min",
|
|
"temp_max",
|
|
"wind_speed",
|
|
"pressure",
|
|
"visibility",
|
|
"humidity",
|
|
],
|
|
}
|
|
}
|
|
|
|
BAD_CONF_RAW = {
|
|
"sensor": {
|
|
"platform": "yweather",
|
|
"woeid": "12345",
|
|
"monitored_conditions": ["weather"],
|
|
}
|
|
}
|
|
|
|
BAD_CONF_DATA = {
|
|
"sensor": {
|
|
"platform": "yweather",
|
|
"woeid": "111",
|
|
"monitored_conditions": ["weather"],
|
|
}
|
|
}
|
|
|
|
|
|
def _yql_queryMock(yql): # pylint: disable=invalid-name
|
|
"""Mock yahoo query language query."""
|
|
return (
|
|
'{"query": {"count": 1, "created": "2017-11-17T13:40:47Z", '
|
|
'"lang": "en-US", "results": {"place": {"woeid": "23511632"}}}}'
|
|
)
|
|
|
|
|
|
def get_woeidMock(lat, lon): # pylint: disable=invalid-name
|
|
"""Mock get woeid Where On Earth Identifiers."""
|
|
return "23511632"
|
|
|
|
|
|
def get_woeidNoneMock(lat, lon): # pylint: disable=invalid-name
|
|
"""Mock get woeid Where On Earth Identifiers."""
|
|
return None
|
|
|
|
|
|
class YahooWeatherMock:
|
|
"""Mock class for the YahooWeather object."""
|
|
|
|
def __init__(self, woeid, temp_unit):
|
|
"""Initialize Telnet object."""
|
|
self.woeid = woeid
|
|
self.temp_unit = temp_unit
|
|
self._data = json.loads(load_fixture("yahooweather.json"))
|
|
|
|
# pylint: disable=no-self-use
|
|
def updateWeather(self): # pylint: disable=invalid-name
|
|
"""Return sample values."""
|
|
return True
|
|
|
|
@property
|
|
def RawData(self): # pylint: disable=invalid-name
|
|
"""Raw Data."""
|
|
if self.woeid == "12345":
|
|
return json.loads("[]")
|
|
return self._data
|
|
|
|
@property
|
|
def Units(self): # pylint: disable=invalid-name
|
|
"""Return dict with units."""
|
|
return self._data["query"]["results"]["channel"]["units"]
|
|
|
|
@property
|
|
def Now(self): # pylint: disable=invalid-name
|
|
"""Return current weather data."""
|
|
if self.woeid == "111":
|
|
raise ValueError
|
|
return self._data["query"]["results"]["channel"]["item"]["condition"]
|
|
|
|
@property
|
|
def Atmosphere(self): # pylint: disable=invalid-name
|
|
"""Atmosphere weather data."""
|
|
return self._data["query"]["results"]["channel"]["atmosphere"]
|
|
|
|
@property
|
|
def Wind(self): # pylint: disable=invalid-name
|
|
"""Wind weather data."""
|
|
return self._data["query"]["results"]["channel"]["wind"]
|
|
|
|
@property
|
|
def Forecast(self): # pylint: disable=invalid-name
|
|
"""Forecast data 0-5 Days."""
|
|
return self._data["query"]["results"]["channel"]["item"]["forecast"]
|
|
|
|
def getWeatherImage(self, code): # pylint: disable=invalid-name
|
|
"""Create a link to weather image from yahoo code."""
|
|
return f"https://l.yimg.com/a/i/us/we/52/{code}.gif"
|
|
|
|
|
|
class TestWeather(unittest.TestCase):
|
|
"""Test the Yahoo weather component."""
|
|
|
|
def setUp(self):
|
|
"""Set up things to be run when tests are started."""
|
|
self.hass = get_test_home_assistant()
|
|
|
|
def tearDown(self):
|
|
"""Stop down everything that was started."""
|
|
self.hass.stop()
|
|
|
|
@MockDependency("yahooweather")
|
|
@patch("yahooweather._yql_query", new=_yql_queryMock)
|
|
@patch("yahooweather.get_woeid", new=get_woeidMock)
|
|
@patch("yahooweather.YahooWeather", new=YahooWeatherMock)
|
|
def test_setup_minimal(self, mock_yahooweather):
|
|
"""Test for minimal weather sensor config."""
|
|
assert setup_component(self.hass, "sensor", VALID_CONFIG_MINIMAL)
|
|
|
|
state = self.hass.states.get("sensor.yweather_condition")
|
|
assert state is not None
|
|
|
|
assert state.state == "Mostly Cloudy"
|
|
assert state.attributes.get("friendly_name") == "Yweather Condition"
|
|
|
|
@MockDependency("yahooweather")
|
|
@patch("yahooweather._yql_query", new=_yql_queryMock)
|
|
@patch("yahooweather.get_woeid", new=get_woeidMock)
|
|
@patch("yahooweather.YahooWeather", new=YahooWeatherMock)
|
|
def test_setup_all(self, mock_yahooweather):
|
|
"""Test for all weather data attributes."""
|
|
assert setup_component(self.hass, "sensor", VALID_CONFIG_ALL)
|
|
|
|
state = self.hass.states.get("sensor.yweather_condition")
|
|
assert state is not None
|
|
assert state.state == "Mostly Cloudy"
|
|
assert state.attributes.get("condition_code") == "28"
|
|
assert state.attributes.get("friendly_name") == "Yweather Condition"
|
|
|
|
state = self.hass.states.get("sensor.yweather_current")
|
|
assert state is not None
|
|
assert state.state == "Cloudy"
|
|
assert state.attributes.get("friendly_name") == "Yweather Current"
|
|
|
|
state = self.hass.states.get("sensor.yweather_temperature")
|
|
assert state is not None
|
|
assert state.state == "18"
|
|
assert state.attributes.get("friendly_name") == "Yweather Temperature"
|
|
|
|
state = self.hass.states.get("sensor.yweather_temperature_max")
|
|
assert state is not None
|
|
assert state.state == "23"
|
|
assert state.attributes.get("friendly_name") == "Yweather Temperature max"
|
|
|
|
state = self.hass.states.get("sensor.yweather_temperature_min")
|
|
assert state is not None
|
|
assert state.state == "16"
|
|
assert state.attributes.get("friendly_name") == "Yweather Temperature min"
|
|
|
|
state = self.hass.states.get("sensor.yweather_wind_speed")
|
|
assert state is not None
|
|
assert state.state == "3.94"
|
|
assert state.attributes.get("friendly_name") == "Yweather Wind speed"
|
|
|
|
state = self.hass.states.get("sensor.yweather_pressure")
|
|
assert state is not None
|
|
assert state.state == "1000.0"
|
|
assert state.attributes.get("friendly_name") == "Yweather Pressure"
|
|
|
|
state = self.hass.states.get("sensor.yweather_visibility")
|
|
assert state is not None
|
|
assert state.state == "14.23"
|
|
assert state.attributes.get("friendly_name") == "Yweather Visibility"
|
|
|
|
state = self.hass.states.get("sensor.yweather_humidity")
|
|
assert state is not None
|
|
assert state.state == "71"
|
|
assert state.attributes.get("friendly_name") == "Yweather Humidity"
|
|
|
|
@MockDependency("yahooweather")
|
|
@patch("yahooweather._yql_query", new=_yql_queryMock)
|
|
@patch("yahooweather.get_woeid", new=get_woeidNoneMock)
|
|
@patch("yahooweather.YahooWeather", new=YahooWeatherMock)
|
|
def test_setup_bad_woied(self, mock_yahooweather):
|
|
"""Test for bad woeid."""
|
|
assert setup_component(self.hass, "sensor", VALID_CONFIG_MINIMAL)
|
|
|
|
state = self.hass.states.get("sensor.yweather_condition")
|
|
assert state is None
|
|
|
|
@MockDependency("yahooweather")
|
|
@patch("yahooweather._yql_query", new=_yql_queryMock)
|
|
@patch("yahooweather.get_woeid", new=get_woeidMock)
|
|
@patch("yahooweather.YahooWeather", new=YahooWeatherMock)
|
|
def test_setup_bad_raw(self, mock_yahooweather):
|
|
"""Test for bad RawData."""
|
|
assert setup_component(self.hass, "sensor", BAD_CONF_RAW)
|
|
|
|
state = self.hass.states.get("sensor.yweather_condition")
|
|
assert state is not None
|
|
|
|
@MockDependency("yahooweather")
|
|
@patch("yahooweather._yql_query", new=_yql_queryMock)
|
|
@patch("yahooweather.get_woeid", new=get_woeidMock)
|
|
@patch("yahooweather.YahooWeather", new=YahooWeatherMock)
|
|
def test_setup_bad_data(self, mock_yahooweather):
|
|
"""Test for bad data."""
|
|
assert setup_component(self.hass, "sensor", BAD_CONF_DATA)
|
|
|
|
state = self.hass.states.get("sensor.yweather_condition")
|
|
assert state is None
|