mirror of
https://github.com/home-assistant/core.git
synced 2025-12-24 21:06:19 +00:00
Ensure a state change tracker setup from inside a state change listener does not fire immediately (#37924)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
This commit is contained in:
@@ -1011,3 +1011,104 @@ async def test_async_call_later(hass):
|
||||
assert p_action is action
|
||||
assert p_point == now + timedelta(seconds=3)
|
||||
assert remove is mock()
|
||||
|
||||
|
||||
async def test_track_state_change_event_chain_multple_entity(hass):
|
||||
"""Test that adding a new state tracker inside a tracker does not fire right away."""
|
||||
tracker_called = []
|
||||
chained_tracker_called = []
|
||||
|
||||
chained_tracker_unsub = []
|
||||
tracker_unsub = []
|
||||
|
||||
@ha.callback
|
||||
def chained_single_run_callback(event):
|
||||
old_state = event.data.get("old_state")
|
||||
new_state = event.data.get("new_state")
|
||||
|
||||
chained_tracker_called.append((old_state, new_state))
|
||||
|
||||
@ha.callback
|
||||
def single_run_callback(event):
|
||||
old_state = event.data.get("old_state")
|
||||
new_state = event.data.get("new_state")
|
||||
|
||||
tracker_called.append((old_state, new_state))
|
||||
|
||||
chained_tracker_unsub.append(
|
||||
async_track_state_change_event(
|
||||
hass, ["light.bowl", "light.top"], chained_single_run_callback
|
||||
)
|
||||
)
|
||||
|
||||
tracker_unsub.append(
|
||||
async_track_state_change_event(
|
||||
hass, ["light.bowl", "light.top"], single_run_callback
|
||||
)
|
||||
)
|
||||
|
||||
hass.states.async_set("light.bowl", "on")
|
||||
hass.states.async_set("light.top", "on")
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert len(tracker_called) == 2
|
||||
assert len(chained_tracker_called) == 1
|
||||
assert len(tracker_unsub) == 1
|
||||
assert len(chained_tracker_unsub) == 2
|
||||
|
||||
hass.states.async_set("light.bowl", "off")
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert len(tracker_called) == 3
|
||||
assert len(chained_tracker_called) == 3
|
||||
assert len(tracker_unsub) == 1
|
||||
assert len(chained_tracker_unsub) == 3
|
||||
|
||||
|
||||
async def test_track_state_change_event_chain_single_entity(hass):
|
||||
"""Test that adding a new state tracker inside a tracker does not fire right away."""
|
||||
tracker_called = []
|
||||
chained_tracker_called = []
|
||||
|
||||
chained_tracker_unsub = []
|
||||
tracker_unsub = []
|
||||
|
||||
@ha.callback
|
||||
def chained_single_run_callback(event):
|
||||
old_state = event.data.get("old_state")
|
||||
new_state = event.data.get("new_state")
|
||||
|
||||
chained_tracker_called.append((old_state, new_state))
|
||||
|
||||
@ha.callback
|
||||
def single_run_callback(event):
|
||||
old_state = event.data.get("old_state")
|
||||
new_state = event.data.get("new_state")
|
||||
|
||||
tracker_called.append((old_state, new_state))
|
||||
|
||||
chained_tracker_unsub.append(
|
||||
async_track_state_change_event(
|
||||
hass, "light.bowl", chained_single_run_callback
|
||||
)
|
||||
)
|
||||
|
||||
tracker_unsub.append(
|
||||
async_track_state_change_event(hass, "light.bowl", single_run_callback)
|
||||
)
|
||||
|
||||
hass.states.async_set("light.bowl", "on")
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert len(tracker_called) == 1
|
||||
assert len(chained_tracker_called) == 0
|
||||
assert len(tracker_unsub) == 1
|
||||
assert len(chained_tracker_unsub) == 1
|
||||
|
||||
hass.states.async_set("light.bowl", "off")
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert len(tracker_called) == 2
|
||||
assert len(chained_tracker_called) == 1
|
||||
assert len(tracker_unsub) == 1
|
||||
assert len(chained_tracker_unsub) == 2
|
||||
|
||||
Reference in New Issue
Block a user