
* Add python 3.7 to travis and tox * Use pyyaml from github * Don't version constraints * Fix version tag * Change to new pyyaml release * Python 3.7 requires xenial * Fix namespace detection * Use correct RegEx type * Update pexpect to 4.6 * Use correct validation for dictionaries * Disable Py37 incompatible packages * Upgrade all pexpect to 4.6 * Add explicit None as default param
152 lines
6 KiB
Python
152 lines
6 KiB
Python
"""The test for the geo rss events sensor platform."""
|
|
import unittest
|
|
from unittest import mock
|
|
import sys
|
|
|
|
import feedparser
|
|
import pytest
|
|
|
|
from homeassistant.setup import setup_component
|
|
from tests.common import load_fixture, get_test_home_assistant
|
|
import homeassistant.components.sensor.geo_rss_events as geo_rss_events
|
|
|
|
URL = 'http://geo.rss.local/geo_rss_events.xml'
|
|
VALID_CONFIG_WITH_CATEGORIES = {
|
|
'platform': 'geo_rss_events',
|
|
geo_rss_events.CONF_URL: URL,
|
|
geo_rss_events.CONF_CATEGORIES: [
|
|
'Category 1',
|
|
'Category 2'
|
|
]
|
|
}
|
|
VALID_CONFIG_WITHOUT_CATEGORIES = {
|
|
'platform': 'geo_rss_events',
|
|
geo_rss_events.CONF_URL: URL
|
|
}
|
|
|
|
|
|
# Until https://github.com/kurtmckee/feedparser/pull/131 is released.
|
|
@pytest.mark.skipif(sys.version_info[:2] >= (3, 7),
|
|
reason='Package incompatible with Python 3.7')
|
|
class TestGeoRssServiceUpdater(unittest.TestCase):
|
|
"""Test the GeoRss service updater."""
|
|
|
|
def setUp(self):
|
|
"""Initialize values for this testcase class."""
|
|
self.hass = get_test_home_assistant()
|
|
self.config = VALID_CONFIG_WITHOUT_CATEGORIES
|
|
|
|
def tearDown(self):
|
|
"""Stop everything that was started."""
|
|
self.hass.stop()
|
|
|
|
@mock.patch('feedparser.parse', return_value=feedparser.parse(""))
|
|
def test_setup_with_categories(self, mock_parse):
|
|
"""Test the general setup of this sensor."""
|
|
self.config = VALID_CONFIG_WITH_CATEGORIES
|
|
self.assertTrue(
|
|
setup_component(self.hass, 'sensor', {'sensor': self.config}))
|
|
self.assertIsNotNone(
|
|
self.hass.states.get('sensor.event_service_category_1'))
|
|
self.assertIsNotNone(
|
|
self.hass.states.get('sensor.event_service_category_2'))
|
|
|
|
@mock.patch('feedparser.parse', return_value=feedparser.parse(""))
|
|
def test_setup_without_categories(self, mock_parse):
|
|
"""Test the general setup of this sensor."""
|
|
self.assertTrue(
|
|
setup_component(self.hass, 'sensor', {'sensor': self.config}))
|
|
self.assertIsNotNone(self.hass.states.get('sensor.event_service_any'))
|
|
|
|
def setup_data(self, url='url'):
|
|
"""Set up data object for use by sensors."""
|
|
home_latitude = -33.865
|
|
home_longitude = 151.209444
|
|
radius_in_km = 500
|
|
data = geo_rss_events.GeoRssServiceData(home_latitude,
|
|
home_longitude, url,
|
|
radius_in_km)
|
|
return data
|
|
|
|
def test_update_sensor_with_category(self):
|
|
"""Test updating sensor object."""
|
|
raw_data = load_fixture('geo_rss_events.xml')
|
|
# Loading raw data from fixture and plug in to data object as URL
|
|
# works since the third-party feedparser library accepts a URL
|
|
# as well as the actual data.
|
|
data = self.setup_data(raw_data)
|
|
category = "Category 1"
|
|
name = "Name 1"
|
|
unit_of_measurement = "Unit 1"
|
|
sensor = geo_rss_events.GeoRssServiceSensor(category,
|
|
data, name,
|
|
unit_of_measurement)
|
|
|
|
sensor.update()
|
|
assert sensor.name == "Name 1 Category 1"
|
|
assert sensor.unit_of_measurement == "Unit 1"
|
|
assert sensor.icon == "mdi:alert"
|
|
assert len(sensor._data.events) == 4
|
|
assert sensor.state == 1
|
|
assert sensor.device_state_attributes == {'Title 1': "117km"}
|
|
# Check entries of first hit
|
|
assert sensor._data.events[0][geo_rss_events.ATTR_TITLE] == "Title 1"
|
|
assert sensor._data.events[0][
|
|
geo_rss_events.ATTR_CATEGORY] == "Category 1"
|
|
self.assertAlmostEqual(sensor._data.events[0][
|
|
geo_rss_events.ATTR_DISTANCE], 116.586, 0)
|
|
|
|
def test_update_sensor_without_category(self):
|
|
"""Test updating sensor object."""
|
|
raw_data = load_fixture('geo_rss_events.xml')
|
|
data = self.setup_data(raw_data)
|
|
category = None
|
|
name = "Name 2"
|
|
unit_of_measurement = "Unit 2"
|
|
sensor = geo_rss_events.GeoRssServiceSensor(category,
|
|
data, name,
|
|
unit_of_measurement)
|
|
|
|
sensor.update()
|
|
assert sensor.name == "Name 2 Any"
|
|
assert sensor.unit_of_measurement == "Unit 2"
|
|
assert sensor.icon == "mdi:alert"
|
|
assert len(sensor._data.events) == 4
|
|
assert sensor.state == 4
|
|
assert sensor.device_state_attributes == {'Title 1': "117km",
|
|
'Title 2': "302km",
|
|
'Title 3': "204km",
|
|
'Title 6': "48km"}
|
|
|
|
def test_update_sensor_without_data(self):
|
|
"""Test updating sensor object."""
|
|
data = self.setup_data()
|
|
category = None
|
|
name = "Name 3"
|
|
unit_of_measurement = "Unit 3"
|
|
sensor = geo_rss_events.GeoRssServiceSensor(category,
|
|
data, name,
|
|
unit_of_measurement)
|
|
|
|
sensor.update()
|
|
assert sensor.name == "Name 3 Any"
|
|
assert sensor.unit_of_measurement == "Unit 3"
|
|
assert sensor.icon == "mdi:alert"
|
|
assert len(sensor._data.events) == 0
|
|
assert sensor.state == 0
|
|
|
|
@mock.patch('feedparser.parse', return_value=None)
|
|
def test_update_sensor_with_none_result(self, parse_function):
|
|
"""Test updating sensor object."""
|
|
data = self.setup_data("http://invalid.url/")
|
|
category = None
|
|
name = "Name 4"
|
|
unit_of_measurement = "Unit 4"
|
|
sensor = geo_rss_events.GeoRssServiceSensor(category,
|
|
data, name,
|
|
unit_of_measurement)
|
|
|
|
sensor.update()
|
|
assert sensor.name == "Name 4 Any"
|
|
assert sensor.unit_of_measurement == "Unit 4"
|
|
assert sensor.state == 0
|