From 453f7c729470d14eb5dc6694184ca0177c721c9f Mon Sep 17 00:00:00 2001 From: Markus Nigbur Date: Tue, 7 Jan 2020 00:00:23 +0100 Subject: [PATCH] Fire restarted event on restarting active timer (#30475) * Fire restarted event on restarting active timer * Added test for the restart event --- homeassistant/components/timer/__init__.py | 2 +- tests/components/timer/test_init.py | 69 ++++++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/timer/__init__.py b/homeassistant/components/timer/__init__.py index f739cd2e996..ccc04d7f72a 100644 --- a/homeassistant/components/timer/__init__.py +++ b/homeassistant/components/timer/__init__.py @@ -180,7 +180,7 @@ class Timer(RestoreEntity): newduration = duration event = EVENT_TIMER_STARTED - if self._state == STATUS_PAUSED: + if self._state == STATUS_ACTIVE or self._state == STATUS_PAUSED: event = EVENT_TIMER_RESTARTED self._state = STATUS_ACTIVE diff --git a/tests/components/timer/test_init.py b/tests/components/timer/test_init.py index f9206cb2bf7..56675c9d893 100644 --- a/tests/components/timer/test_init.py +++ b/tests/components/timer/test_init.py @@ -127,6 +127,8 @@ async def test_methods_and_events(hass): {"call": SERVICE_START, "state": STATUS_ACTIVE, "event": EVENT_TIMER_STARTED}, {"call": SERVICE_PAUSE, "state": STATUS_PAUSED, "event": EVENT_TIMER_PAUSED}, {"call": SERVICE_CANCEL, "state": STATUS_IDLE, "event": EVENT_TIMER_CANCELLED}, + {"call": SERVICE_START, "state": STATUS_ACTIVE, "event": EVENT_TIMER_STARTED}, + {"call": SERVICE_START, "state": STATUS_ACTIVE, "event": EVENT_TIMER_RESTARTED}, ] expectedEvents = 0 @@ -291,3 +293,70 @@ async def test_config_reload(hass, hass_admin_user, hass_read_only_user): assert STATUS_IDLE == state_3.state assert ATTR_ICON not in state_3.attributes assert ATTR_FRIENDLY_NAME not in state_3.attributes + + +async def test_timer_restarted_event(hass): + """Ensure restarted event is called after starting a paused or running timer.""" + hass.state = CoreState.starting + + await async_setup_component(hass, DOMAIN, {DOMAIN: {"test1": {CONF_DURATION: 10}}}) + + state = hass.states.get("timer.test1") + assert state + assert state.state == STATUS_IDLE + + results = [] + + def fake_event_listener(event): + """Fake event listener for trigger.""" + results.append(event) + + hass.bus.async_listen(EVENT_TIMER_STARTED, fake_event_listener) + hass.bus.async_listen(EVENT_TIMER_RESTARTED, fake_event_listener) + hass.bus.async_listen(EVENT_TIMER_PAUSED, fake_event_listener) + hass.bus.async_listen(EVENT_TIMER_FINISHED, fake_event_listener) + hass.bus.async_listen(EVENT_TIMER_CANCELLED, fake_event_listener) + + await hass.services.async_call( + DOMAIN, SERVICE_START, {CONF_ENTITY_ID: "timer.test1"} + ) + await hass.async_block_till_done() + state = hass.states.get("timer.test1") + assert state + assert state.state == STATUS_ACTIVE + + assert results[-1].event_type == EVENT_TIMER_STARTED + assert len(results) == 1 + + await hass.services.async_call( + DOMAIN, SERVICE_START, {CONF_ENTITY_ID: "timer.test1"} + ) + await hass.async_block_till_done() + state = hass.states.get("timer.test1") + assert state + assert state.state == STATUS_ACTIVE + + assert results[-1].event_type == EVENT_TIMER_RESTARTED + assert len(results) == 2 + + await hass.services.async_call( + DOMAIN, SERVICE_PAUSE, {CONF_ENTITY_ID: "timer.test1"} + ) + await hass.async_block_till_done() + state = hass.states.get("timer.test1") + assert state + assert state.state == STATUS_PAUSED + + assert results[-1].event_type == EVENT_TIMER_PAUSED + assert len(results) == 3 + + await hass.services.async_call( + DOMAIN, SERVICE_START, {CONF_ENTITY_ID: "timer.test1"} + ) + await hass.async_block_till_done() + state = hass.states.get("timer.test1") + assert state + assert state.state == STATUS_ACTIVE + + assert results[-1].event_type == EVENT_TIMER_RESTARTED + assert len(results) == 4