Add GDACS feed integration (#31235)
* initial version of gdacs integration * updated translations * generated files * added abbreviation * bumped library version * small feed entry attribute fixes * add unit tests * need to use original mdi name * bumped library version * improved entity name for earthquakes * round vulnerability number * typo * support for categories * testing support for categories * tie longitude and latitude together * validating categories * simplifying setup * passing domain as parameter * simplified test setup * moved test code * simplified test code * removed superfluous code * changed approach to unique identifier * changed code structure * simplified unit system handling * made schema a constant * comment added * simplifying code * added message if location already configured * removed unnecessary code * simplified test code * avoid mocking __init__ * pylint * simplified code * fetch categories from integration library * setting PARALLEL_UPDATES * setting PARALLEL_UPDATES to zero/unlimited * added quality scale
This commit is contained in:
1 parent
05b3c1f17d
commit
8d429d7676
18 files changed
+1240
No files matched your search
@@ -0,0 +1,41 @@
|
||||
"""Tests for the GDACS component."""
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
|
||||
def _generate_mock_feed_entry(
|
||||
external_id,
|
||||
title,
|
||||
distance_to_home,
|
||||
coordinates,
|
||||
attribution=None,
|
||||
alert_level=None,
|
||||
country=None,
|
||||
duration_in_week=None,
|
||||
event_name=None,
|
||||
event_type_short=None,
|
||||
event_type=None,
|
||||
from_date=None,
|
||||
to_date=None,
|
||||
population=None,
|
||||
severity=None,
|
||||
vulnerability=None,
|
||||
):
|
||||
"""Construct a mock feed entry for testing purposes."""
|
||||
feed_entry = MagicMock()
|
||||
feed_entry.external_id = external_id
|
||||
feed_entry.title = title
|
||||
feed_entry.distance_to_home = distance_to_home
|
||||
feed_entry.coordinates = coordinates
|
||||
feed_entry.attribution = attribution
|
||||
feed_entry.alert_level = alert_level
|
||||
feed_entry.country = country
|
||||
feed_entry.duration_in_week = duration_in_week
|
||||
feed_entry.event_name = event_name
|
||||
feed_entry.event_type_short = event_type_short
|
||||
feed_entry.event_type = event_type
|
||||
feed_entry.from_date = from_date
|
||||
feed_entry.to_date = to_date
|
||||
feed_entry.population = population
|
||||
feed_entry.severity = severity
|
||||
feed_entry.vulnerability = vulnerability
|
||||
return feed_entry
|
||||
@@ -0,0 +1,31 @@
|
||||
"""Configuration for GDACS tests."""
|
||||
import pytest
|
||||
|
||||
from homeassistant.components.gdacs import CONF_CATEGORIES, DOMAIN
|
||||
from homeassistant.const import (
|
||||
CONF_LATITUDE,
|
||||
CONF_LONGITUDE,
|
||||
CONF_RADIUS,
|
||||
CONF_SCAN_INTERVAL,
|
||||
CONF_UNIT_SYSTEM,
|
||||
)
|
||||
|
||||
from tests.common import MockConfigEntry
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def config_entry():
|
||||
"""Create a mock GDACS config entry."""
|
||||
return MockConfigEntry(
|
||||
domain=DOMAIN,
|
||||
data={
|
||||
CONF_LATITUDE: -41.2,
|
||||
CONF_LONGITUDE: 174.7,
|
||||
CONF_RADIUS: 25,
|
||||
CONF_UNIT_SYSTEM: "metric",
|
||||
CONF_SCAN_INTERVAL: 300.0,
|
||||
CONF_CATEGORIES: [],
|
||||
},
|
||||
title="-41.2, 174.7",
|
||||
unique_id="-41.2, 174.7",
|
||||
)
|
||||
@@ -0,0 +1,76 @@
|
||||
"""Define tests for the GDACS config flow."""
|
||||
from datetime import timedelta
|
||||
|
||||
from homeassistant import data_entry_flow
|
||||
from homeassistant.components.gdacs import CONF_CATEGORIES, DOMAIN
|
||||
from homeassistant.const import (
|
||||
CONF_LATITUDE,
|
||||
CONF_LONGITUDE,
|
||||
CONF_RADIUS,
|
||||
CONF_SCAN_INTERVAL,
|
||||
)
|
||||
|
||||
|
||||
async def test_duplicate_error(hass, config_entry):
|
||||
"""Test that errors are shown when duplicates are added."""
|
||||
conf = {CONF_LATITUDE: -41.2, CONF_LONGITUDE: 174.7, CONF_RADIUS: 25}
|
||||
config_entry.add_to_hass(hass)
|
||||
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DOMAIN, context={"source": "user"}, data=conf
|
||||
)
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
||||
assert result["reason"] == "already_configured"
|
||||
|
||||
|
||||
async def test_show_form(hass):
|
||||
"""Test that the form is served with no input."""
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DOMAIN, context={"source": "user"}
|
||||
)
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
|
||||
assert result["step_id"] == "user"
|
||||
|
||||
|
||||
async def test_step_import(hass):
|
||||
"""Test that the import step works."""
|
||||
conf = {
|
||||
CONF_LATITUDE: -41.2,
|
||||
CONF_LONGITUDE: 174.7,
|
||||
CONF_RADIUS: 25,
|
||||
CONF_SCAN_INTERVAL: timedelta(minutes=4),
|
||||
CONF_CATEGORIES: ["Drought", "Earthquake"],
|
||||
}
|
||||
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DOMAIN, context={"source": "import"}, data=conf
|
||||
)
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
||||
assert result["title"] == "-41.2, 174.7"
|
||||
assert result["data"] == {
|
||||
CONF_LATITUDE: -41.2,
|
||||
CONF_LONGITUDE: 174.7,
|
||||
CONF_RADIUS: 25,
|
||||
CONF_SCAN_INTERVAL: 240.0,
|
||||
CONF_CATEGORIES: ["Drought", "Earthquake"],
|
||||
}
|
||||
|
||||
|
||||
async def test_step_user(hass):
|
||||
"""Test that the user step works."""
|
||||
hass.config.latitude = -41.2
|
||||
hass.config.longitude = 174.7
|
||||
conf = {CONF_RADIUS: 25}
|
||||
|
||||
result = await hass.config_entries.flow.async_init(
|
||||
DOMAIN, context={"source": "user"}, data=conf
|
||||
)
|
||||
assert result["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
|
||||
assert result["title"] == "-41.2, 174.7"
|
||||
assert result["data"] == {
|
||||
CONF_LATITUDE: -41.2,
|
||||
CONF_LONGITUDE: 174.7,
|
||||
CONF_RADIUS: 25,
|
||||
CONF_SCAN_INTERVAL: 300.0,
|
||||
CONF_CATEGORIES: [],
|
||||
}
|
||||
@@ -0,0 +1,242 @@
|
||||
"""The tests for the GDACS Feed integration."""
|
||||
import datetime
|
||||
|
||||
from asynctest import patch
|
||||
|
||||
from homeassistant.components import gdacs
|
||||
from homeassistant.components.gdacs import DEFAULT_SCAN_INTERVAL, DOMAIN, FEED
|
||||
from homeassistant.components.gdacs.geo_location import (
|
||||
ATTR_ALERT_LEVEL,
|
||||
ATTR_COUNTRY,
|
||||
ATTR_DESCRIPTION,
|
||||
ATTR_DURATION_IN_WEEK,
|
||||
ATTR_EVENT_TYPE,
|
||||
ATTR_EXTERNAL_ID,
|
||||
ATTR_FROM_DATE,
|
||||
ATTR_POPULATION,
|
||||
ATTR_SEVERITY,
|
||||
ATTR_TO_DATE,
|
||||
ATTR_VULNERABILITY,
|
||||
)
|
||||
from homeassistant.components.geo_location import ATTR_SOURCE
|
||||
from homeassistant.const import (
|
||||
ATTR_ATTRIBUTION,
|
||||
ATTR_FRIENDLY_NAME,
|
||||
ATTR_ICON,
|
||||
ATTR_LATITUDE,
|
||||
ATTR_LONGITUDE,
|
||||
ATTR_UNIT_OF_MEASUREMENT,
|
||||
CONF_RADIUS,
|
||||
EVENT_HOMEASSISTANT_START,
|
||||
)
|
||||
from homeassistant.setup import async_setup_component
|
||||
import homeassistant.util.dt as dt_util
|
||||
from homeassistant.util.unit_system import IMPERIAL_SYSTEM
|
||||
|
||||
from tests.common import async_fire_time_changed
|
||||
from tests.components.gdacs import _generate_mock_feed_entry
|
||||
|
||||
CONFIG = {gdacs.DOMAIN: {CONF_RADIUS: 200}}
|
||||
|
||||
|
||||
async def test_setup(hass):
|
||||
"""Test the general setup of the integration."""
|
||||
# Set up some mock feed entries for this test.
|
||||
mock_entry_1 = _generate_mock_feed_entry(
|
||||
"1234",
|
||||
"Description 1",
|
||||
15.5,
|
||||
(38.0, -3.0),
|
||||
event_name="Name 1",
|
||||
event_type_short="DR",
|
||||
event_type="Drought",
|
||||
alert_level="Alert Level 1",
|
||||
country="Country 1",
|
||||
attribution="Attribution 1",
|
||||
from_date=datetime.datetime(2020, 1, 10, 8, 0, tzinfo=datetime.timezone.utc),
|
||||
to_date=datetime.datetime(2020, 1, 20, 8, 0, tzinfo=datetime.timezone.utc),
|
||||
duration_in_week=1,
|
||||
population="Population 1",
|
||||
severity="Severity 1",
|
||||
vulnerability="Vulnerability 1",
|
||||
)
|
||||
mock_entry_2 = _generate_mock_feed_entry(
|
||||
"2345",
|
||||
"Description 2",
|
||||
20.5,
|
||||
(38.1, -3.1),
|
||||
event_name="Name 2",
|
||||
event_type_short="TC",
|
||||
event_type="Tropical Cyclone",
|
||||
)
|
||||
mock_entry_3 = _generate_mock_feed_entry(
|
||||
"3456",
|
||||
"Description 3",
|
||||
25.5,
|
||||
(38.2, -3.2),
|
||||
event_name="Name 3",
|
||||
event_type_short="TC",
|
||||
event_type="Tropical Cyclone",
|
||||
country="Country 2",
|
||||
)
|
||||
mock_entry_4 = _generate_mock_feed_entry(
|
||||
"4567", "Description 4", 12.5, (38.3, -3.3)
|
||||
)
|
||||
|
||||
# Patching 'utcnow' to gain more control over the timed update.
|
||||
utcnow = dt_util.utcnow()
|
||||
with patch("homeassistant.util.dt.utcnow", return_value=utcnow), patch(
|
||||
"aio_georss_client.feed.GeoRssFeed.update"
|
||||
) as mock_feed_update:
|
||||
mock_feed_update.return_value = "OK", [mock_entry_1, mock_entry_2, mock_entry_3]
|
||||
assert await async_setup_component(hass, gdacs.DOMAIN, CONFIG)
|
||||
# Artificially trigger update and collect events.
|
||||
hass.bus.async_fire(EVENT_HOMEASSISTANT_START)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
all_states = hass.states.async_all()
|
||||
# 3 geolocation and 1 sensor entities
|
||||
assert len(all_states) == 4
|
||||
|
||||
state = hass.states.get("geo_location.drought_name_1")
|
||||
assert state is not None
|
||||
assert state.name == "Drought: Name 1"
|
||||
assert state.attributes == {
|
||||
ATTR_EXTERNAL_ID: "1234",
|
||||
ATTR_LATITUDE: 38.0,
|
||||
ATTR_LONGITUDE: -3.0,
|
||||
ATTR_FRIENDLY_NAME: "Drought: Name 1",
|
||||
ATTR_DESCRIPTION: "Description 1",
|
||||
ATTR_COUNTRY: "Country 1",
|
||||
ATTR_ATTRIBUTION: "Attribution 1",
|
||||
ATTR_FROM_DATE: datetime.datetime(
|
||||
2020, 1, 10, 8, 0, tzinfo=datetime.timezone.utc
|
||||
),
|
||||
ATTR_TO_DATE: datetime.datetime(
|
||||
2020, 1, 20, 8, 0, tzinfo=datetime.timezone.utc
|
||||
),
|
||||
ATTR_DURATION_IN_WEEK: 1,
|
||||
ATTR_ALERT_LEVEL: "Alert Level 1",
|
||||
ATTR_POPULATION: "Population 1",
|
||||
ATTR_EVENT_TYPE: "Drought",
|
||||
ATTR_SEVERITY: "Severity 1",
|
||||
ATTR_VULNERABILITY: "Vulnerability 1",
|
||||
ATTR_UNIT_OF_MEASUREMENT: "km",
|
||||
ATTR_SOURCE: "gdacs",
|
||||
ATTR_ICON: "mdi:water-off",
|
||||
}
|
||||
assert float(state.state) == 15.5
|
||||
|
||||
state = hass.states.get("geo_location.tropical_cyclone_name_2")
|
||||
assert state is not None
|
||||
assert state.name == "Tropical Cyclone: Name 2"
|
||||
assert state.attributes == {
|
||||
ATTR_EXTERNAL_ID: "2345",
|
||||
ATTR_LATITUDE: 38.1,
|
||||
ATTR_LONGITUDE: -3.1,
|
||||
ATTR_FRIENDLY_NAME: "Tropical Cyclone: Name 2",
|
||||
ATTR_DESCRIPTION: "Description 2",
|
||||
ATTR_EVENT_TYPE: "Tropical Cyclone",
|
||||
ATTR_UNIT_OF_MEASUREMENT: "km",
|
||||
ATTR_SOURCE: "gdacs",
|
||||
ATTR_ICON: "mdi:weather-hurricane",
|
||||
}
|
||||
assert float(state.state) == 20.5
|
||||
|
||||
state = hass.states.get("geo_location.tropical_cyclone_name_3")
|
||||
assert state is not None
|
||||
assert state.name == "Tropical Cyclone: Name 3"
|
||||
assert state.attributes == {
|
||||
ATTR_EXTERNAL_ID: "3456",
|
||||
ATTR_LATITUDE: 38.2,
|
||||
ATTR_LONGITUDE: -3.2,
|
||||
ATTR_FRIENDLY_NAME: "Tropical Cyclone: Name 3",
|
||||
ATTR_DESCRIPTION: "Description 3",
|
||||
ATTR_EVENT_TYPE: "Tropical Cyclone",
|
||||
ATTR_COUNTRY: "Country 2",
|
||||
ATTR_UNIT_OF_MEASUREMENT: "km",
|
||||
ATTR_SOURCE: "gdacs",
|
||||
ATTR_ICON: "mdi:weather-hurricane",
|
||||
}
|
||||
assert float(state.state) == 25.5
|
||||
|
||||
# Simulate an update - two existing, one new entry, one outdated entry
|
||||
mock_feed_update.return_value = "OK", [mock_entry_1, mock_entry_4, mock_entry_3]
|
||||
async_fire_time_changed(hass, utcnow + DEFAULT_SCAN_INTERVAL)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
all_states = hass.states.async_all()
|
||||
assert len(all_states) == 4
|
||||
|
||||
# Simulate an update - empty data, but successful update,
|
||||
# so no changes to entities.
|
||||
mock_feed_update.return_value = "OK_NO_DATA", None
|
||||
async_fire_time_changed(hass, utcnow + 2 * DEFAULT_SCAN_INTERVAL)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
all_states = hass.states.async_all()
|
||||
assert len(all_states) == 4
|
||||
|
||||
# Simulate an update - empty data, removes all entities
|
||||
mock_feed_update.return_value = "ERROR", None
|
||||
async_fire_time_changed(hass, utcnow + 3 * DEFAULT_SCAN_INTERVAL)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
all_states = hass.states.async_all()
|
||||
assert len(all_states) == 1
|
||||
|
||||
|
||||
async def test_setup_imperial(hass):
|
||||
"""Test the setup of the integration using imperial unit system."""
|
||||
hass.config.units = IMPERIAL_SYSTEM
|
||||
# Set up some mock feed entries for this test.
|
||||
mock_entry_1 = _generate_mock_feed_entry(
|
||||
"1234",
|
||||
"Description 1",
|
||||
15.5,
|
||||
(38.0, -3.0),
|
||||
event_name="Name 1",
|
||||
event_type_short="DR",
|
||||
event_type="Drought",
|
||||
)
|
||||
|
||||
# Patching 'utcnow' to gain more control over the timed update.
|
||||
utcnow = dt_util.utcnow()
|
||||
with patch("homeassistant.util.dt.utcnow", return_value=utcnow), patch(
|
||||
"aio_georss_client.feed.GeoRssFeed.update"
|
||||
) as mock_feed_update, patch(
|
||||
"aio_georss_client.feed.GeoRssFeed.last_timestamp", create=True
|
||||
):
|
||||
mock_feed_update.return_value = "OK", [mock_entry_1]
|
||||
assert await async_setup_component(hass, gdacs.DOMAIN, CONFIG)
|
||||
# Artificially trigger update and collect events.
|
||||
hass.bus.async_fire(EVENT_HOMEASSISTANT_START)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
all_states = hass.states.async_all()
|
||||
assert len(all_states) == 2
|
||||
|
||||
# Test conversion of 200 miles to kilometers.
|
||||
feeds = hass.data[DOMAIN][FEED]
|
||||
assert feeds is not None
|
||||
assert len(feeds) == 1
|
||||
manager = list(feeds.values())[0]
|
||||
# Ensure that the filter value in km is correctly set.
|
||||
assert manager._feed_manager._feed._filter_radius == 321.8688
|
||||
|
||||
state = hass.states.get("geo_location.drought_name_1")
|
||||
assert state is not None
|
||||
assert state.name == "Drought: Name 1"
|
||||
assert state.attributes == {
|
||||
ATTR_EXTERNAL_ID: "1234",
|
||||
ATTR_LATITUDE: 38.0,
|
||||
ATTR_LONGITUDE: -3.0,
|
||||
ATTR_FRIENDLY_NAME: "Drought: Name 1",
|
||||
ATTR_DESCRIPTION: "Description 1",
|
||||
ATTR_EVENT_TYPE: "Drought",
|
||||
ATTR_UNIT_OF_MEASUREMENT: "mi",
|
||||
ATTR_SOURCE: "gdacs",
|
||||
ATTR_ICON: "mdi:water-off",
|
||||
}
|
||||
# 15.5km (as defined in mock entry) has been converted to 9.6mi.
|
||||
assert float(state.state) == 9.6
|
||||
@@ -0,0 +1,19 @@
|
||||
"""Define tests for the GDACS general setup."""
|
||||
from asynctest import patch
|
||||
|
||||
from homeassistant.components.gdacs import DOMAIN, FEED
|
||||
|
||||
|
||||
async def test_component_unload_config_entry(hass, config_entry):
|
||||
"""Test that loading and unloading of a config entry works."""
|
||||
config_entry.add_to_hass(hass)
|
||||
with patch("aio_georss_gdacs.GdacsFeedManager.update") as mock_feed_manager_update:
|
||||
# Load config entry.
|
||||
assert await hass.config_entries.async_setup(config_entry.entry_id)
|
||||
await hass.async_block_till_done()
|
||||
assert mock_feed_manager_update.call_count == 1
|
||||
assert hass.data[DOMAIN][FEED][config_entry.entry_id] is not None
|
||||
# Unload config entry.
|
||||
assert await hass.config_entries.async_unload(config_entry.entry_id)
|
||||
await hass.async_block_till_done()
|
||||
assert hass.data[DOMAIN][FEED].get(config_entry.entry_id) is None
|
||||
@@ -0,0 +1,100 @@
|
||||
"""The tests for the GDACS Feed integration."""
|
||||
from asynctest import patch
|
||||
|
||||
from homeassistant.components import gdacs
|
||||
from homeassistant.components.gdacs import DEFAULT_SCAN_INTERVAL
|
||||
from homeassistant.components.gdacs.sensor import (
|
||||
ATTR_CREATED,
|
||||
ATTR_LAST_UPDATE,
|
||||
ATTR_LAST_UPDATE_SUCCESSFUL,
|
||||
ATTR_REMOVED,
|
||||
ATTR_STATUS,
|
||||
ATTR_UPDATED,
|
||||
)
|
||||
from homeassistant.const import (
|
||||
ATTR_ICON,
|
||||
ATTR_UNIT_OF_MEASUREMENT,
|
||||
CONF_RADIUS,
|
||||
EVENT_HOMEASSISTANT_START,
|
||||
)
|
||||
from homeassistant.setup import async_setup_component
|
||||
import homeassistant.util.dt as dt_util
|
||||
|
||||
from tests.common import async_fire_time_changed
|
||||
from tests.components.gdacs import _generate_mock_feed_entry
|
||||
|
||||
CONFIG = {gdacs.DOMAIN: {CONF_RADIUS: 200}}
|
||||
|
||||
|
||||
async def test_setup(hass):
|
||||
"""Test the general setup of the integration."""
|
||||
# Set up some mock feed entries for this test.
|
||||
mock_entry_1 = _generate_mock_feed_entry(
|
||||
"1234", "Title 1", 15.5, (38.0, -3.0), attribution="Attribution 1",
|
||||
)
|
||||
mock_entry_2 = _generate_mock_feed_entry("2345", "Title 2", 20.5, (38.1, -3.1),)
|
||||
mock_entry_3 = _generate_mock_feed_entry("3456", "Title 3", 25.5, (38.2, -3.2),)
|
||||
mock_entry_4 = _generate_mock_feed_entry("4567", "Title 4", 12.5, (38.3, -3.3))
|
||||
|
||||
# Patching 'utcnow' to gain more control over the timed update.
|
||||
utcnow = dt_util.utcnow()
|
||||
with patch("homeassistant.util.dt.utcnow", return_value=utcnow), patch(
|
||||
"aio_georss_client.feed.GeoRssFeed.update"
|
||||
) as mock_feed_update:
|
||||
mock_feed_update.return_value = "OK", [mock_entry_1, mock_entry_2, mock_entry_3]
|
||||
assert await async_setup_component(hass, gdacs.DOMAIN, CONFIG)
|
||||
# Artificially trigger update and collect events.
|
||||
hass.bus.async_fire(EVENT_HOMEASSISTANT_START)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
all_states = hass.states.async_all()
|
||||
# 3 geolocation and 1 sensor entities
|
||||
assert len(all_states) == 4
|
||||
|
||||
state = hass.states.get("sensor.gdacs_32_87336_117_22743")
|
||||
assert state is not None
|
||||
assert int(state.state) == 3
|
||||
assert state.name == "GDACS (32.87336, -117.22743)"
|
||||
attributes = state.attributes
|
||||
assert attributes[ATTR_STATUS] == "OK"
|
||||
assert attributes[ATTR_CREATED] == 3
|
||||
assert attributes[ATTR_LAST_UPDATE].tzinfo == dt_util.UTC
|
||||
assert attributes[ATTR_LAST_UPDATE_SUCCESSFUL].tzinfo == dt_util.UTC
|
||||
assert attributes[ATTR_LAST_UPDATE] == attributes[ATTR_LAST_UPDATE_SUCCESSFUL]
|
||||
assert attributes[ATTR_UNIT_OF_MEASUREMENT] == "alerts"
|
||||
assert attributes[ATTR_ICON] == "mdi:alert"
|
||||
|
||||
# Simulate an update - two existing, one new entry, one outdated entry
|
||||
mock_feed_update.return_value = "OK", [mock_entry_1, mock_entry_4, mock_entry_3]
|
||||
async_fire_time_changed(hass, utcnow + DEFAULT_SCAN_INTERVAL)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
all_states = hass.states.async_all()
|
||||
assert len(all_states) == 4
|
||||
|
||||
state = hass.states.get("sensor.gdacs_32_87336_117_22743")
|
||||
attributes = state.attributes
|
||||
assert attributes[ATTR_CREATED] == 1
|
||||
assert attributes[ATTR_UPDATED] == 2
|
||||
assert attributes[ATTR_REMOVED] == 1
|
||||
|
||||
# Simulate an update - empty data, but successful update,
|
||||
# so no changes to entities.
|
||||
mock_feed_update.return_value = "OK_NO_DATA", None
|
||||
async_fire_time_changed(hass, utcnow + 2 * DEFAULT_SCAN_INTERVAL)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
all_states = hass.states.async_all()
|
||||
assert len(all_states) == 4
|
||||
|
||||
# Simulate an update - empty data, removes all entities
|
||||
mock_feed_update.return_value = "ERROR", None
|
||||
async_fire_time_changed(hass, utcnow + 3 * DEFAULT_SCAN_INTERVAL)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
all_states = hass.states.async_all()
|
||||
assert len(all_states) == 1
|
||||
|
||||
state = hass.states.get("sensor.gdacs_32_87336_117_22743")
|
||||
attributes = state.attributes
|
||||
assert attributes[ATTR_REMOVED] == 3
|
||||
Reference in new issue
Block a user