163 lines
5.4 KiB
Python
163 lines
5.4 KiB
Python
"""The tests for the Yahoo weather component."""
|
|
import json
|
|
import unittest
|
|
from unittest.mock import patch
|
|
|
|
from homeassistant.components.weather import (
|
|
ATTR_WEATHER_HUMIDITY,
|
|
ATTR_WEATHER_PRESSURE,
|
|
ATTR_WEATHER_TEMPERATURE,
|
|
ATTR_WEATHER_WIND_BEARING,
|
|
ATTR_WEATHER_WIND_SPEED,
|
|
)
|
|
from homeassistant.setup import setup_component
|
|
from homeassistant.util.unit_system import METRIC_SYSTEM
|
|
|
|
from tests.common import MockDependency, get_test_home_assistant, load_fixture
|
|
|
|
|
|
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"
|
|
|
|
|
|
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
|
|
"""Return raw Data."""
|
|
if self.woeid == "12345":
|
|
return json.loads("[]")
|
|
return self._data
|
|
|
|
@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
|
|
"""Return atmosphere weather data."""
|
|
return self._data["query"]["results"]["channel"]["atmosphere"]
|
|
|
|
@property
|
|
def Wind(self): # pylint: disable=invalid-name
|
|
"""Return wind weather data."""
|
|
return self._data["query"]["results"]["channel"]["wind"]
|
|
|
|
@property
|
|
def Forecast(self): # pylint: disable=invalid-name
|
|
"""Return forecast data 0-5 Days."""
|
|
if self.woeid == "123123":
|
|
raise ValueError
|
|
return self._data["query"]["results"]["channel"]["item"]["forecast"]
|
|
|
|
|
|
class TestWeather(unittest.TestCase):
|
|
"""Test the Yahoo weather component."""
|
|
|
|
DEVICES = []
|
|
|
|
def add_entities(self, devices):
|
|
"""Mock add devices."""
|
|
for device in devices:
|
|
device.update()
|
|
self.DEVICES.append(device)
|
|
|
|
def setUp(self):
|
|
"""Set up things to be run when tests are started."""
|
|
self.hass = get_test_home_assistant()
|
|
self.hass.config.units = METRIC_SYSTEM
|
|
|
|
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(self, mock_yahooweather):
|
|
"""Test for typical weather data attributes."""
|
|
assert setup_component(
|
|
self.hass, "weather", {"weather": {"platform": "yweather"}}
|
|
)
|
|
|
|
state = self.hass.states.get("weather.yweather")
|
|
assert state is not None
|
|
|
|
assert state.state == "cloudy"
|
|
|
|
data = state.attributes
|
|
assert data.get(ATTR_WEATHER_TEMPERATURE) == 18.0
|
|
assert data.get(ATTR_WEATHER_HUMIDITY) == 71
|
|
assert data.get(ATTR_WEATHER_PRESSURE) == 1000.0
|
|
assert data.get(ATTR_WEATHER_WIND_SPEED) == 3.94
|
|
assert data.get(ATTR_WEATHER_WIND_BEARING) == 0
|
|
assert state.attributes.get("friendly_name") == "Yweather"
|
|
|
|
@MockDependency("yahooweather")
|
|
@patch("yahooweather._yql_query", new=_yql_queryMock)
|
|
@patch("yahooweather.get_woeid", new=get_woeidMock)
|
|
@patch("yahooweather.YahooWeather", new=YahooWeatherMock)
|
|
def test_setup_no_data(self, mock_yahooweather):
|
|
"""Test for note receiving data."""
|
|
assert setup_component(
|
|
self.hass,
|
|
"weather",
|
|
{"weather": {"platform": "yweather", "woeid": "12345"}},
|
|
)
|
|
|
|
state = self.hass.states.get("weather.yweather")
|
|
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 forecast data."""
|
|
assert setup_component(
|
|
self.hass,
|
|
"weather",
|
|
{"weather": {"platform": "yweather", "woeid": "123123"}},
|
|
)
|
|
|
|
state = self.hass.states.get("weather.yweather")
|
|
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_condition_error(self, mock_yahooweather):
|
|
"""Test for bad forecast data."""
|
|
assert setup_component(
|
|
self.hass, "weather", {"weather": {"platform": "yweather", "woeid": "111"}}
|
|
)
|
|
|
|
state = self.hass.states.get("weather.yweather")
|
|
assert state is None
|