Fix flapping event template test (#42614)

This commit is contained in:
J. Nick Koston 2020-10-29 18:05:55 -05:00 committed by GitHub
parent a396f8f76f
commit 8eb89cdb46
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -2123,68 +2123,73 @@ async def test_track_template_with_time_default(hass):
async def test_track_template_with_time_that_leaves_scope(hass): async def test_track_template_with_time_that_leaves_scope(hass):
"""Test tracking template with time.""" """Test tracking template with time."""
now = dt_util.utcnow()
test_time = datetime(now.year + 1, 5, 24, 11, 59, 1, 500000, tzinfo=dt_util.UTC)
hass.states.async_set("binary_sensor.washing_machine", "on") with patch("homeassistant.util.dt.utcnow", return_value=test_time):
specific_runs = [] hass.states.async_set("binary_sensor.washing_machine", "on")
template_complex = Template( specific_runs = []
""" template_complex = Template(
{% if states.binary_sensor.washing_machine.state == "on" %} """
{{ now() }} {% if states.binary_sensor.washing_machine.state == "on" %}
{% else %} {{ now() }}
{{ states.binary_sensor.washing_machine.last_updated }} {% else %}
{% endif %} {{ states.binary_sensor.washing_machine.last_updated }}
""", {% endif %}
hass, """,
) hass,
)
def specific_run_callback(event, updates): def specific_run_callback(event, updates):
specific_runs.append(updates.pop().result) specific_runs.append(updates.pop().result)
info = async_track_template_result( info = async_track_template_result(
hass, [TrackTemplate(template_complex, None)], specific_run_callback hass, [TrackTemplate(template_complex, None)], specific_run_callback
) )
await hass.async_block_till_done() await hass.async_block_till_done()
assert info.listeners == { assert info.listeners == {
"all": False, "all": False,
"domains": set(), "domains": set(),
"entities": {"binary_sensor.washing_machine"}, "entities": {"binary_sensor.washing_machine"},
"time": True, "time": True,
} }
hass.states.async_set("binary_sensor.washing_machine", "off") hass.states.async_set("binary_sensor.washing_machine", "off")
await hass.async_block_till_done() await hass.async_block_till_done()
assert info.listeners == { assert info.listeners == {
"all": False, "all": False,
"domains": set(), "domains": set(),
"entities": {"binary_sensor.washing_machine"}, "entities": {"binary_sensor.washing_machine"},
"time": False, "time": False,
} }
hass.states.async_set("binary_sensor.washing_machine", "on") hass.states.async_set("binary_sensor.washing_machine", "on")
await hass.async_block_till_done() await hass.async_block_till_done()
assert info.listeners == { assert info.listeners == {
"all": False, "all": False,
"domains": set(), "domains": set(),
"entities": {"binary_sensor.washing_machine"}, "entities": {"binary_sensor.washing_machine"},
"time": True, "time": True,
} }
# Verify we do not update before the minute rolls over # Verify we do not update before the minute rolls over
callback_count_before_time_change = len(specific_runs) callback_count_before_time_change = len(specific_runs)
test_time = dt_util.utcnow().replace(second=1) async_fire_time_changed(hass, test_time)
async_fire_time_changed(hass, test_time) await hass.async_block_till_done()
await hass.async_block_till_done() assert len(specific_runs) == callback_count_before_time_change
async_fire_time_changed(hass, test_time + timedelta(seconds=58))
await hass.async_block_till_done()
assert len(specific_runs) == callback_count_before_time_change
# Verify we do update on the next change of minute async_fire_time_changed(hass, test_time + timedelta(seconds=58))
async_fire_time_changed(hass, test_time + timedelta(seconds=59)) await hass.async_block_till_done()
await hass.async_block_till_done() assert len(specific_runs) == callback_count_before_time_change
assert len(specific_runs) == callback_count_before_time_change + 1
# Verify we do update on the next change of minute
async_fire_time_changed(hass, test_time + timedelta(seconds=59))
await hass.async_block_till_done()
assert len(specific_runs) == callback_count_before_time_change + 1
info.async_remove() info.async_remove()