From e233dd7cbe0dd8114515a051e7f82dfe8987ee85 Mon Sep 17 00:00:00 2001 From: Phil Bruckner Date: Sat, 4 Jan 2020 16:01:58 -0600 Subject: [PATCH] Fix timer with empty config (#30463) --- homeassistant/components/timer/__init__.py | 23 ++++++++++++---------- tests/components/timer/test_init.py | 9 ++++++++- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/timer/__init__.py b/homeassistant/components/timer/__init__.py index 0cc707f5a45..f739cd2e996 100644 --- a/homeassistant/components/timer/__init__.py +++ b/homeassistant/components/timer/__init__.py @@ -17,7 +17,7 @@ _LOGGER = logging.getLogger(__name__) DOMAIN = "timer" ENTITY_ID_FORMAT = DOMAIN + ".{}" -DEFAULT_DURATION = 0 +DEFAULT_DURATION = timedelta(0) ATTR_DURATION = "duration" ATTR_REMAINING = "remaining" CONF_DURATION = "duration" @@ -37,18 +37,25 @@ SERVICE_PAUSE = "pause" SERVICE_CANCEL = "cancel" SERVICE_FINISH = "finish" + +def _none_to_empty_dict(value): + if value is None: + return {} + return value + + CONFIG_SCHEMA = vol.Schema( { DOMAIN: cv.schema_with_slug_keys( - vol.Any( + vol.All( + _none_to_empty_dict, { vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_ICON): cv.icon, vol.Optional( - CONF_DURATION, timedelta(DEFAULT_DURATION) + CONF_DURATION, default=DEFAULT_DURATION ): cv.time_period, }, - None, ) ) }, @@ -82,11 +89,7 @@ async def async_setup(hass, config): ) component.async_register_entity_service( SERVICE_START, - { - vol.Optional( - ATTR_DURATION, default=timedelta(DEFAULT_DURATION) - ): cv.time_period - }, + {vol.Optional(ATTR_DURATION, default=DEFAULT_DURATION): cv.time_period}, "async_start", ) component.async_register_entity_service(SERVICE_PAUSE, {}, "async_pause") @@ -108,7 +111,7 @@ async def _async_process_config(hass, config): name = cfg.get(CONF_NAME) icon = cfg.get(CONF_ICON) - duration = cfg.get(CONF_DURATION) + duration = cfg[CONF_DURATION] entities.append(Timer(hass, object_id, name, icon, duration)) diff --git a/tests/components/timer/test_init.py b/tests/components/timer/test_init.py index 93493fc3a55..f9206cb2bf7 100644 --- a/tests/components/timer/test_init.py +++ b/tests/components/timer/test_init.py @@ -11,6 +11,7 @@ from homeassistant.components.timer import ( CONF_DURATION, CONF_ICON, CONF_NAME, + DEFAULT_DURATION, DOMAIN, EVENT_TIMER_CANCELLED, EVENT_TIMER_FINISHED, @@ -63,20 +64,23 @@ async def test_config_options(hass): CONF_ICON: "mdi:work", CONF_DURATION: 10, }, + "test_3": None, } } assert await async_setup_component(hass, "timer", config) await hass.async_block_till_done() - assert count_start + 2 == len(hass.states.async_entity_ids()) + assert count_start + 3 == len(hass.states.async_entity_ids()) await hass.async_block_till_done() state_1 = hass.states.get("timer.test_1") state_2 = hass.states.get("timer.test_2") + state_3 = hass.states.get("timer.test_3") assert state_1 is not None assert state_2 is not None + assert state_3 is not None assert STATUS_IDLE == state_1.state assert ATTR_ICON not in state_1.attributes @@ -87,6 +91,9 @@ async def test_config_options(hass): assert "mdi:work" == state_2.attributes.get(ATTR_ICON) assert "0:00:10" == state_2.attributes.get(ATTR_DURATION) + assert STATUS_IDLE == state_3.state + assert str(DEFAULT_DURATION) == state_3.attributes.get(CONF_DURATION) + async def test_methods_and_events(hass): """Test methods and events."""