"""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