mirror of
https://github.com/home-assistant/core.git
synced 2025-12-24 12:59:34 +00:00
Add support for glob matching to entity filters (#36913)
* Added GLOB capability to entityfilter and every place that uses it. All existing tests are passing * added tests for components affected by glob change * fixed flake8 error * mocking the correct listener * mocking correct bus method in azure test * tests passing in 3.7 and 3.8 * fixed formatting issue from rebase/conflict * Checking against glob patterns in more performant way * perf improvments and reverted unnecessarily adjusted tests * added new benchmark test around filters * no longer using get with default in entityfilter * changed filter name and removed logbook from filter benchmark * simplified benchmark tests from feedback * fixed apache tests and returned include exclude schemas to normal * fixed azure event hub tests to properly go through component logic * fixed azure test and clean up for other tests * renaming test files to match standard * merged mqtt statestream test changes with base * removed dependency on recorder filter schema from history * fixed recorder tests after merge and a bunch of lint errors
This commit is contained in:
@@ -354,3 +354,189 @@ async def test_state_changed_event_include_domain_exclude_entity(hass, mqtt_mock
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert not mqtt_mock.async_publish.called
|
||||
|
||||
|
||||
async def test_state_changed_event_include_globs(hass, mqtt_mock):
|
||||
"""Test that filtering on included glob works as expected."""
|
||||
base_topic = "pub"
|
||||
|
||||
incl = {"entity_globs": ["*.included_*"]}
|
||||
excl = {}
|
||||
|
||||
# Add the statestream component for publishing state updates
|
||||
# Set the filter to allow *.included_* items
|
||||
assert await add_statestream(
|
||||
hass, base_topic=base_topic, publish_include=incl, publish_exclude=excl
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
# Reset the mock because it will have already gotten calls for the
|
||||
# mqtt_statestream state change on initialization, etc.
|
||||
mqtt_mock.async_publish.reset_mock()
|
||||
|
||||
# Set a state of an entity with included glob
|
||||
mock_state_change_event(hass, State("fake2.included_entity", "on"))
|
||||
await hass.async_block_till_done()
|
||||
await hass.async_block_till_done()
|
||||
|
||||
# Make sure 'on' was published to pub/fake2/included_entity/state
|
||||
mqtt_mock.async_publish.assert_called_with(
|
||||
"pub/fake2/included_entity/state", "on", 1, True
|
||||
)
|
||||
assert mqtt_mock.async_publish.called
|
||||
|
||||
mqtt_mock.async_publish.reset_mock()
|
||||
# Set a state of an entity that shouldn't be included
|
||||
mock_state_change_event(hass, State("fake2.entity", "on"))
|
||||
await hass.async_block_till_done()
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert not mqtt_mock.async_publish.called
|
||||
|
||||
|
||||
async def test_state_changed_event_exclude_globs(hass, mqtt_mock):
|
||||
"""Test that filtering on excluded globs works as expected."""
|
||||
base_topic = "pub"
|
||||
|
||||
incl = {}
|
||||
excl = {"entity_globs": ["*.excluded_*"]}
|
||||
|
||||
# Add the statestream component for publishing state updates
|
||||
# Set the filter to allow *.excluded_* items
|
||||
assert await add_statestream(
|
||||
hass, base_topic=base_topic, publish_include=incl, publish_exclude=excl
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
# Reset the mock because it will have already gotten calls for the
|
||||
# mqtt_statestream state change on initialization, etc.
|
||||
mqtt_mock.async_publish.reset_mock()
|
||||
|
||||
# Set a state of an entity
|
||||
mock_state_change_event(hass, State("fake.entity", "on"))
|
||||
await hass.async_block_till_done()
|
||||
await hass.async_block_till_done()
|
||||
|
||||
# Make sure 'on' was published to pub/fake/entity/state
|
||||
mqtt_mock.async_publish.assert_called_with("pub/fake/entity/state", "on", 1, True)
|
||||
assert mqtt_mock.async_publish.called
|
||||
|
||||
mqtt_mock.async_publish.reset_mock()
|
||||
# Set a state of an entity that shouldn't be included by glob
|
||||
mock_state_change_event(hass, State("fake.excluded_entity", "on"))
|
||||
await hass.async_block_till_done()
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert not mqtt_mock.async_publish.called
|
||||
|
||||
|
||||
async def test_state_changed_event_exclude_domain_globs_include_entity(hass, mqtt_mock):
|
||||
"""Test filtering with excluded domain and glob and included entity."""
|
||||
base_topic = "pub"
|
||||
|
||||
incl = {"entities": ["fake.entity"]}
|
||||
excl = {"domains": ["fake"], "entity_globs": ["*.excluded_*"]}
|
||||
|
||||
# Add the statestream component for publishing state updates
|
||||
# Set the filter to exclude with include filter
|
||||
assert await add_statestream(
|
||||
hass, base_topic=base_topic, publish_include=incl, publish_exclude=excl
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
# Reset the mock because it will have already gotten calls for the
|
||||
# mqtt_statestream state change on initialization, etc.
|
||||
mqtt_mock.async_publish.reset_mock()
|
||||
|
||||
# Set a state of an entity
|
||||
mock_state_change_event(hass, State("fake.entity", "on"))
|
||||
await hass.async_block_till_done()
|
||||
await hass.async_block_till_done()
|
||||
|
||||
# Make sure 'on' was published to pub/fake/entity/state
|
||||
mqtt_mock.async_publish.assert_called_with("pub/fake/entity/state", "on", 1, True)
|
||||
assert mqtt_mock.async_publish.called
|
||||
|
||||
mqtt_mock.async_publish.reset_mock()
|
||||
# Set a state of an entity that doesn't match any filters
|
||||
mock_state_change_event(hass, State("fake2.included_entity", "on"))
|
||||
await hass.async_block_till_done()
|
||||
await hass.async_block_till_done()
|
||||
|
||||
# Make sure 'on' was published to pub/fake/entity/state
|
||||
mqtt_mock.async_publish.assert_called_with(
|
||||
"pub/fake2/included_entity/state", "on", 1, True
|
||||
)
|
||||
assert mqtt_mock.async_publish.called
|
||||
|
||||
mqtt_mock.async_publish.reset_mock()
|
||||
# Set a state of an entity that shouldn't be included by domain
|
||||
mock_state_change_event(hass, State("fake.entity2", "on"))
|
||||
await hass.async_block_till_done()
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert not mqtt_mock.async_publish.called
|
||||
|
||||
mqtt_mock.async_publish.reset_mock()
|
||||
# Set a state of an entity that shouldn't be included by glob
|
||||
mock_state_change_event(hass, State("fake.excluded_entity", "on"))
|
||||
await hass.async_block_till_done()
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert not mqtt_mock.async_publish.called
|
||||
|
||||
|
||||
async def test_state_changed_event_include_domain_globs_exclude_entity(hass, mqtt_mock):
|
||||
"""Test filtering with included domain and glob and excluded entity."""
|
||||
base_topic = "pub"
|
||||
|
||||
incl = {"domains": ["fake"], "entity_globs": ["*.included_*"]}
|
||||
excl = {"entities": ["fake.entity2"]}
|
||||
|
||||
# Add the statestream component for publishing state updates
|
||||
# Set the filter to include with exclude filter
|
||||
assert await add_statestream(
|
||||
hass, base_topic=base_topic, publish_include=incl, publish_exclude=excl
|
||||
)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
# Reset the mock because it will have already gotten calls for the
|
||||
# mqtt_statestream state change on initialization, etc.
|
||||
mqtt_mock.async_publish.reset_mock()
|
||||
|
||||
# Set a state of an entity included by domain
|
||||
mock_state_change_event(hass, State("fake.entity", "on"))
|
||||
await hass.async_block_till_done()
|
||||
await hass.async_block_till_done()
|
||||
|
||||
# Make sure 'on' was published to pub/fake/entity/state
|
||||
mqtt_mock.async_publish.assert_called_with("pub/fake/entity/state", "on", 1, True)
|
||||
assert mqtt_mock.async_publish.called
|
||||
|
||||
mqtt_mock.async_publish.reset_mock()
|
||||
# Set a state of an entity included by glob
|
||||
mock_state_change_event(hass, State("fake.included_entity", "on"))
|
||||
await hass.async_block_till_done()
|
||||
await hass.async_block_till_done()
|
||||
|
||||
# Make sure 'on' was published to pub/fake/entity/state
|
||||
mqtt_mock.async_publish.assert_called_with(
|
||||
"pub/fake/included_entity/state", "on", 1, True
|
||||
)
|
||||
assert mqtt_mock.async_publish.called
|
||||
|
||||
mqtt_mock.async_publish.reset_mock()
|
||||
# Set a state of an entity that shouldn't be included
|
||||
mock_state_change_event(hass, State("fake.entity2", "on"))
|
||||
await hass.async_block_till_done()
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert not mqtt_mock.async_publish.called
|
||||
|
||||
mqtt_mock.async_publish.reset_mock()
|
||||
# Set a state of an entity that doesn't match any filters
|
||||
mock_state_change_event(hass, State("fake2.entity", "on"))
|
||||
await hass.async_block_till_done()
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert not mqtt_mock.async_publish.called
|
||||
|
||||
Reference in New Issue
Block a user