From 0e6b3d658323909d05493cf36b1e0f0d80f3d41a Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 28 Aug 2023 15:30:20 -0500 Subject: [PATCH] Switch async_track_same_state to use async_call_later (#99219) * Switch async_track_same_state to use async_call_later There was no need to use async_track_point_in_utc_time here since we only need a delay * update trigger tests * remove some more utcnow patching * remove some more utcnow patching * remove some more utcnow patching --- homeassistant/helpers/event.py | 4 +- .../triggers/test_numeric_state.py | 231 +++++++------- .../homeassistant/triggers/test_state.py | 294 ++++++++---------- 3 files changed, 249 insertions(+), 280 deletions(-) diff --git a/homeassistant/helpers/event.py b/homeassistant/helpers/event.py index 14ba4953694..235c1c80534 100644 --- a/homeassistant/helpers/event.py +++ b/homeassistant/helpers/event.py @@ -1327,9 +1327,7 @@ def async_track_same_state( if not async_check_same_func(entity, from_state, to_state): clear_listener() - async_remove_state_for_listener = async_track_point_in_utc_time( - hass, state_for_listener, dt_util.utcnow() + period - ) + async_remove_state_for_listener = async_call_later(hass, period, state_for_listener) if entity_ids == MATCH_ALL: async_remove_state_for_cancel = hass.bus.async_listen( diff --git a/tests/components/homeassistant/triggers/test_numeric_state.py b/tests/components/homeassistant/triggers/test_numeric_state.py index 2098d266f0d..b5bd748a5dc 100644 --- a/tests/components/homeassistant/triggers/test_numeric_state.py +++ b/tests/components/homeassistant/triggers/test_numeric_state.py @@ -3,6 +3,7 @@ from datetime import timedelta import logging from unittest.mock import patch +from freezegun.api import FrozenDateTimeFactory import pytest import voluptuous as vol @@ -1147,7 +1148,7 @@ async def test_if_fails_setup_for_without_above_below( ), ) async def test_if_not_fires_on_entity_change_with_for( - hass: HomeAssistant, calls, above, below + hass: HomeAssistant, freezer: FrozenDateTimeFactory, calls, above, below ) -> None: """Test for not firing on entity change with for.""" assert await async_setup_component( @@ -1171,7 +1172,8 @@ async def test_if_not_fires_on_entity_change_with_for( await hass.async_block_till_done() hass.states.async_set("test.entity", 15) await hass.async_block_till_done() - async_fire_time_changed(hass, dt_util.utcnow() + timedelta(seconds=10)) + freezer.tick(timedelta(seconds=10)) + async_fire_time_changed(hass) await hass.async_block_till_done() assert len(calls) == 0 @@ -1244,7 +1246,7 @@ async def test_if_not_fires_on_entities_change_with_for_after_stop( ), ) async def test_if_fires_on_entity_change_with_for_attribute_change( - hass: HomeAssistant, calls, above, below + hass: HomeAssistant, freezer: FrozenDateTimeFactory, calls, above, below ) -> None: """Test for firing on entity change with for and attribute change.""" hass.states.async_set("test.entity", 0) @@ -1267,20 +1269,17 @@ async def test_if_fires_on_entity_change_with_for_attribute_change( }, ) - utcnow = dt_util.utcnow() - with patch("homeassistant.core.dt_util.utcnow") as mock_utcnow: - mock_utcnow.return_value = utcnow - hass.states.async_set("test.entity", 9) - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=4) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.entity", 9, attributes={"mock_attr": "attr_change"}) - await hass.async_block_till_done() - assert len(calls) == 0 - mock_utcnow.return_value += timedelta(seconds=4) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 1 + hass.states.async_set("test.entity", 9) + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=4)) + async_fire_time_changed(hass) + hass.states.async_set("test.entity", 9, attributes={"mock_attr": "attr_change"}) + await hass.async_block_till_done() + assert len(calls) == 0 + freezer.tick(timedelta(seconds=4)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 1 @pytest.mark.parametrize( @@ -1374,7 +1373,7 @@ async def test_wait_template_with_trigger(hass: HomeAssistant, calls, above) -> ), ) async def test_if_fires_on_entities_change_no_overlap( - hass: HomeAssistant, calls, above, below + hass: HomeAssistant, freezer: FrozenDateTimeFactory, calls, above, below ) -> None: """Test for firing on entities change with no overlap.""" hass.states.async_set("test.entity_1", 0) @@ -1402,24 +1401,21 @@ async def test_if_fires_on_entities_change_no_overlap( ) await hass.async_block_till_done() - utcnow = dt_util.utcnow() - with patch("homeassistant.core.dt_util.utcnow") as mock_utcnow: - mock_utcnow.return_value = utcnow - hass.states.async_set("test.entity_1", 9) - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=10) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 1 - assert calls[0].data["some"] == "test.entity_1" + hass.states.async_set("test.entity_1", 9) + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=10)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 1 + assert calls[0].data["some"] == "test.entity_1" - hass.states.async_set("test.entity_2", 9) - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=10) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 2 - assert calls[1].data["some"] == "test.entity_2" + hass.states.async_set("test.entity_2", 9) + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=10)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 2 + assert calls[1].data["some"] == "test.entity_2" @pytest.mark.parametrize( @@ -1432,7 +1428,7 @@ async def test_if_fires_on_entities_change_no_overlap( ), ) async def test_if_fires_on_entities_change_overlap( - hass: HomeAssistant, calls, above, below + hass: HomeAssistant, freezer: FrozenDateTimeFactory, calls, above, below ) -> None: """Test for firing on entities change with overlap.""" hass.states.async_set("test.entity_1", 0) @@ -1460,35 +1456,32 @@ async def test_if_fires_on_entities_change_overlap( ) await hass.async_block_till_done() - utcnow = dt_util.utcnow() - with patch("homeassistant.core.dt_util.utcnow") as mock_utcnow: - mock_utcnow.return_value = utcnow - hass.states.async_set("test.entity_1", 9) - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.entity_2", 9) - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.entity_2", 15) - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.entity_2", 9) - await hass.async_block_till_done() - assert len(calls) == 0 - mock_utcnow.return_value += timedelta(seconds=3) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 1 - assert calls[0].data["some"] == "test.entity_1" + hass.states.async_set("test.entity_1", 9) + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) + hass.states.async_set("test.entity_2", 9) + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) + hass.states.async_set("test.entity_2", 15) + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) + hass.states.async_set("test.entity_2", 9) + await hass.async_block_till_done() + assert len(calls) == 0 + freezer.tick(timedelta(seconds=3)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 1 + assert calls[0].data["some"] == "test.entity_1" - mock_utcnow.return_value += timedelta(seconds=3) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 2 - assert calls[1].data["some"] == "test.entity_2" + freezer.tick(timedelta(seconds=3)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 2 + assert calls[1].data["some"] == "test.entity_2" @pytest.mark.parametrize( @@ -1699,7 +1692,7 @@ async def test_invalid_for_template(hass: HomeAssistant, calls, above, below) -> ), ) async def test_if_fires_on_entities_change_overlap_for_template( - hass: HomeAssistant, calls, above, below + hass: HomeAssistant, freezer: FrozenDateTimeFactory, calls, above, below ) -> None: """Test for firing on entities change with overlap and for template.""" hass.states.async_set("test.entity_1", 0) @@ -1730,39 +1723,36 @@ async def test_if_fires_on_entities_change_overlap_for_template( ) await hass.async_block_till_done() - utcnow = dt_util.utcnow() - with patch("homeassistant.util.dt.utcnow") as mock_utcnow: - mock_utcnow.return_value = utcnow - hass.states.async_set("test.entity_1", 9) - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.entity_2", 9) - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.entity_2", 15) - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.entity_2", 9) - await hass.async_block_till_done() - assert len(calls) == 0 - mock_utcnow.return_value += timedelta(seconds=3) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 1 - assert calls[0].data["some"] == "test.entity_1 - 0:00:05" + hass.states.async_set("test.entity_1", 9) + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) + hass.states.async_set("test.entity_2", 9) + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) + hass.states.async_set("test.entity_2", 15) + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) + hass.states.async_set("test.entity_2", 9) + await hass.async_block_till_done() + assert len(calls) == 0 + freezer.tick(timedelta(seconds=3)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 1 + assert calls[0].data["some"] == "test.entity_1 - 0:00:05" - mock_utcnow.return_value += timedelta(seconds=3) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 1 - mock_utcnow.return_value += timedelta(seconds=5) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 2 - assert calls[1].data["some"] == "test.entity_2 - 0:00:10" + freezer.tick(timedelta(seconds=3)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 1 + freezer.tick(timedelta(seconds=5)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 2 + assert calls[1].data["some"] == "test.entity_2 - 0:00:10" async def test_below_above(hass: HomeAssistant) -> None: @@ -1861,7 +1851,9 @@ async def test_attribute_if_not_fires_on_entities_change_with_for_after_stop( ("above", "below"), ((8, 12),), ) -async def test_variables_priority(hass: HomeAssistant, calls, above, below) -> None: +async def test_variables_priority( + hass: HomeAssistant, freezer: FrozenDateTimeFactory, calls, above, below +) -> None: """Test an externally defined trigger variable is overridden.""" hass.states.async_set("test.entity_1", 0) hass.states.async_set("test.entity_2", 0) @@ -1892,29 +1884,26 @@ async def test_variables_priority(hass: HomeAssistant, calls, above, below) -> N ) await hass.async_block_till_done() - utcnow = dt_util.utcnow() - with patch("homeassistant.util.dt.utcnow") as mock_utcnow: - mock_utcnow.return_value = utcnow - hass.states.async_set("test.entity_1", 9) - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.entity_2", 9) - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.entity_2", 15) - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.entity_2", 9) - await hass.async_block_till_done() - assert len(calls) == 0 - mock_utcnow.return_value += timedelta(seconds=3) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 1 - assert calls[0].data["some"] == "test.entity_1 - 0:00:05" + hass.states.async_set("test.entity_1", 9) + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) + hass.states.async_set("test.entity_2", 9) + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) + hass.states.async_set("test.entity_2", 15) + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) + hass.states.async_set("test.entity_2", 9) + await hass.async_block_till_done() + assert len(calls) == 0 + freezer.tick(timedelta(seconds=3)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 1 + assert calls[0].data["some"] == "test.entity_1 - 0:00:05" @pytest.mark.parametrize("multiplier", (1, 5)) diff --git a/tests/components/homeassistant/triggers/test_state.py b/tests/components/homeassistant/triggers/test_state.py index d58e3dd7c6e..9870beedafc 100644 --- a/tests/components/homeassistant/triggers/test_state.py +++ b/tests/components/homeassistant/triggers/test_state.py @@ -2,6 +2,7 @@ from datetime import timedelta from unittest.mock import patch +from freezegun.api import FrozenDateTimeFactory import pytest import homeassistant.components.automation as automation @@ -695,7 +696,7 @@ async def test_if_not_fires_on_entities_change_with_for_after_stop( async def test_if_fires_on_entity_change_with_for_attribute_change( - hass: HomeAssistant, calls + hass: HomeAssistant, freezer: FrozenDateTimeFactory, calls ) -> None: """Test for firing on entity change with for and attribute change.""" assert await async_setup_component( @@ -715,26 +716,23 @@ async def test_if_fires_on_entity_change_with_for_attribute_change( ) await hass.async_block_till_done() - utcnow = dt_util.utcnow() - with patch("homeassistant.core.dt_util.utcnow") as mock_utcnow: - mock_utcnow.return_value = utcnow - hass.states.async_set("test.entity", "world") - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=4) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set( - "test.entity", "world", attributes={"mock_attr": "attr_change"} - ) - await hass.async_block_till_done() - assert len(calls) == 0 - mock_utcnow.return_value += timedelta(seconds=4) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 1 + hass.states.async_set("test.entity", "world") + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=4)) + async_fire_time_changed(hass) + hass.states.async_set( + "test.entity", "world", attributes={"mock_attr": "attr_change"} + ) + await hass.async_block_till_done() + assert len(calls) == 0 + freezer.tick(timedelta(seconds=4)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 1 async def test_if_fires_on_entity_change_with_for_multiple_force_update( - hass: HomeAssistant, calls + hass: HomeAssistant, freezer: FrozenDateTimeFactory, calls ) -> None: """Test for firing on entity change with for and force update.""" assert await async_setup_component( @@ -754,21 +752,18 @@ async def test_if_fires_on_entity_change_with_for_multiple_force_update( ) await hass.async_block_till_done() - utcnow = dt_util.utcnow() - with patch("homeassistant.core.dt_util.utcnow") as mock_utcnow: - mock_utcnow.return_value = utcnow + hass.states.async_set("test.force_entity", "world", None, True) + await hass.async_block_till_done() + for _ in range(4): + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) hass.states.async_set("test.force_entity", "world", None, True) await hass.async_block_till_done() - for _ in range(4): - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.force_entity", "world", None, True) - await hass.async_block_till_done() - assert len(calls) == 0 - mock_utcnow.return_value += timedelta(seconds=4) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 1 + assert len(calls) == 0 + freezer.tick(timedelta(seconds=4)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 1 async def test_if_fires_on_entity_change_with_for(hass: HomeAssistant, calls) -> None: @@ -837,7 +832,7 @@ async def test_if_fires_on_entity_change_with_for_without_to( async def test_if_does_not_fires_on_entity_change_with_for_without_to_2( - hass: HomeAssistant, calls + hass: HomeAssistant, freezer: FrozenDateTimeFactory, calls ) -> None: """Test for firing on entity change with for.""" assert await async_setup_component( @@ -856,17 +851,12 @@ async def test_if_does_not_fires_on_entity_change_with_for_without_to_2( ) await hass.async_block_till_done() - utcnow = dt_util.utcnow() - with patch("homeassistant.core.dt_util.utcnow") as mock_utcnow: - mock_utcnow.return_value = utcnow - - for i in range(10): - hass.states.async_set("test.entity", str(i)) - await hass.async_block_till_done() - - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() + for i in range(10): + hass.states.async_set("test.entity", str(i)) + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) + await hass.async_block_till_done() assert len(calls) == 0 @@ -1110,7 +1100,7 @@ async def test_wait_template_with_trigger(hass: HomeAssistant, calls) -> None: async def test_if_fires_on_entities_change_no_overlap( - hass: HomeAssistant, calls + hass: HomeAssistant, freezer: FrozenDateTimeFactory, calls ) -> None: """Test for firing on entities change with no overlap.""" assert await async_setup_component( @@ -1133,27 +1123,26 @@ async def test_if_fires_on_entities_change_no_overlap( ) await hass.async_block_till_done() - utcnow = dt_util.utcnow() - with patch("homeassistant.core.dt_util.utcnow") as mock_utcnow: - mock_utcnow.return_value = utcnow - hass.states.async_set("test.entity_1", "world") - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=10) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 1 - assert calls[0].data["some"] == "test.entity_1" + hass.states.async_set("test.entity_1", "world") + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=10)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 1 + assert calls[0].data["some"] == "test.entity_1" - hass.states.async_set("test.entity_2", "world") - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=10) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 2 - assert calls[1].data["some"] == "test.entity_2" + hass.states.async_set("test.entity_2", "world") + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=10)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 2 + assert calls[1].data["some"] == "test.entity_2" -async def test_if_fires_on_entities_change_overlap(hass: HomeAssistant, calls) -> None: +async def test_if_fires_on_entities_change_overlap( + hass: HomeAssistant, freezer: FrozenDateTimeFactory, calls +) -> None: """Test for firing on entities change with overlap.""" assert await async_setup_component( hass, @@ -1175,35 +1164,32 @@ async def test_if_fires_on_entities_change_overlap(hass: HomeAssistant, calls) - ) await hass.async_block_till_done() - utcnow = dt_util.utcnow() - with patch("homeassistant.core.dt_util.utcnow") as mock_utcnow: - mock_utcnow.return_value = utcnow - hass.states.async_set("test.entity_1", "world") - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.entity_2", "world") - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.entity_2", "hello") - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.entity_2", "world") - await hass.async_block_till_done() - assert len(calls) == 0 - mock_utcnow.return_value += timedelta(seconds=3) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 1 - assert calls[0].data["some"] == "test.entity_1" + hass.states.async_set("test.entity_1", "world") + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) + hass.states.async_set("test.entity_2", "world") + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) + hass.states.async_set("test.entity_2", "hello") + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) + hass.states.async_set("test.entity_2", "world") + await hass.async_block_till_done() + assert len(calls) == 0 + freezer.tick(timedelta(seconds=3)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 1 + assert calls[0].data["some"] == "test.entity_1" - mock_utcnow.return_value += timedelta(seconds=3) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 2 - assert calls[1].data["some"] == "test.entity_2" + freezer.tick(timedelta(seconds=3)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 2 + assert calls[1].data["some"] == "test.entity_2" async def test_if_fires_on_change_with_for_template_1( @@ -1402,7 +1388,7 @@ async def test_invalid_for_template_1(hass: HomeAssistant, calls) -> None: async def test_if_fires_on_entities_change_overlap_for_template( - hass: HomeAssistant, calls + hass: HomeAssistant, freezer: FrozenDateTimeFactory, calls ) -> None: """Test for firing on entities change with overlap and for template.""" assert await async_setup_component( @@ -1428,39 +1414,36 @@ async def test_if_fires_on_entities_change_overlap_for_template( ) await hass.async_block_till_done() - utcnow = dt_util.utcnow() - with patch("homeassistant.core.dt_util.utcnow") as mock_utcnow: - mock_utcnow.return_value = utcnow - hass.states.async_set("test.entity_1", "world") - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.entity_2", "world") - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.entity_2", "hello") - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.entity_2", "world") - await hass.async_block_till_done() - assert len(calls) == 0 - mock_utcnow.return_value += timedelta(seconds=3) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 1 - assert calls[0].data["some"] == "test.entity_1 - 0:00:05" + hass.states.async_set("test.entity_1", "world") + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) + hass.states.async_set("test.entity_2", "world") + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) + hass.states.async_set("test.entity_2", "hello") + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) + hass.states.async_set("test.entity_2", "world") + await hass.async_block_till_done() + assert len(calls) == 0 + freezer.tick(timedelta(seconds=3)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 1 + assert calls[0].data["some"] == "test.entity_1 - 0:00:05" - mock_utcnow.return_value += timedelta(seconds=3) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 1 - mock_utcnow.return_value += timedelta(seconds=5) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 2 - assert calls[1].data["some"] == "test.entity_2 - 0:00:10" + freezer.tick(timedelta(seconds=3)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 1 + freezer.tick(timedelta(seconds=5)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 2 + assert calls[1].data["some"] == "test.entity_2 - 0:00:10" async def test_attribute_if_fires_on_entity_change_with_both_filters( @@ -1702,7 +1685,9 @@ async def test_attribute_if_fires_on_entity_change_with_both_filters_boolean( assert len(calls) == 1 -async def test_variables_priority(hass: HomeAssistant, calls) -> None: +async def test_variables_priority( + hass: HomeAssistant, freezer: FrozenDateTimeFactory, calls +) -> None: """Test an externally defined trigger variable is overridden.""" assert await async_setup_component( hass, @@ -1728,36 +1713,33 @@ async def test_variables_priority(hass: HomeAssistant, calls) -> None: ) await hass.async_block_till_done() - utcnow = dt_util.utcnow() - with patch("homeassistant.core.dt_util.utcnow") as mock_utcnow: - mock_utcnow.return_value = utcnow - hass.states.async_set("test.entity_1", "world") - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.entity_2", "world") - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.entity_2", "hello") - await hass.async_block_till_done() - mock_utcnow.return_value += timedelta(seconds=1) - async_fire_time_changed(hass, mock_utcnow.return_value) - hass.states.async_set("test.entity_2", "world") - await hass.async_block_till_done() - assert len(calls) == 0 - mock_utcnow.return_value += timedelta(seconds=3) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 1 - assert calls[0].data["some"] == "test.entity_1 - 0:00:05" + hass.states.async_set("test.entity_1", "world") + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) + hass.states.async_set("test.entity_2", "world") + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) + hass.states.async_set("test.entity_2", "hello") + await hass.async_block_till_done() + freezer.tick(timedelta(seconds=1)) + async_fire_time_changed(hass) + hass.states.async_set("test.entity_2", "world") + await hass.async_block_till_done() + assert len(calls) == 0 + freezer.tick(timedelta(seconds=3)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 1 + assert calls[0].data["some"] == "test.entity_1 - 0:00:05" - mock_utcnow.return_value += timedelta(seconds=3) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 1 - mock_utcnow.return_value += timedelta(seconds=5) - async_fire_time_changed(hass, mock_utcnow.return_value) - await hass.async_block_till_done() - assert len(calls) == 2 - assert calls[1].data["some"] == "test.entity_2 - 0:00:10" + freezer.tick(timedelta(seconds=3)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 1 + freezer.tick(timedelta(seconds=5)) + async_fire_time_changed(hass) + await hass.async_block_till_done() + assert len(calls) == 2 + assert calls[1].data["some"] == "test.entity_2 - 0:00:10"