Fix timer with empty config (#30463)

This commit is contained in:
Phil Bruckner 2020-01-04 16:01:58 -06:00 committed by Paulus Schoutsen
parent 6c89b6c5a2
commit e233dd7cbe
2 changed files with 21 additions and 11 deletions

View File

@ -17,7 +17,7 @@ _LOGGER = logging.getLogger(__name__)
DOMAIN = "timer" DOMAIN = "timer"
ENTITY_ID_FORMAT = DOMAIN + ".{}" ENTITY_ID_FORMAT = DOMAIN + ".{}"
DEFAULT_DURATION = 0 DEFAULT_DURATION = timedelta(0)
ATTR_DURATION = "duration" ATTR_DURATION = "duration"
ATTR_REMAINING = "remaining" ATTR_REMAINING = "remaining"
CONF_DURATION = "duration" CONF_DURATION = "duration"
@ -37,18 +37,25 @@ SERVICE_PAUSE = "pause"
SERVICE_CANCEL = "cancel" SERVICE_CANCEL = "cancel"
SERVICE_FINISH = "finish" SERVICE_FINISH = "finish"
def _none_to_empty_dict(value):
if value is None:
return {}
return value
CONFIG_SCHEMA = vol.Schema( CONFIG_SCHEMA = vol.Schema(
{ {
DOMAIN: cv.schema_with_slug_keys( DOMAIN: cv.schema_with_slug_keys(
vol.Any( vol.All(
_none_to_empty_dict,
{ {
vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_NAME): cv.string,
vol.Optional(CONF_ICON): cv.icon, vol.Optional(CONF_ICON): cv.icon,
vol.Optional( vol.Optional(
CONF_DURATION, timedelta(DEFAULT_DURATION) CONF_DURATION, default=DEFAULT_DURATION
): cv.time_period, ): cv.time_period,
}, },
None,
) )
) )
}, },
@ -82,11 +89,7 @@ async def async_setup(hass, config):
) )
component.async_register_entity_service( component.async_register_entity_service(
SERVICE_START, SERVICE_START,
{ {vol.Optional(ATTR_DURATION, default=DEFAULT_DURATION): cv.time_period},
vol.Optional(
ATTR_DURATION, default=timedelta(DEFAULT_DURATION)
): cv.time_period
},
"async_start", "async_start",
) )
component.async_register_entity_service(SERVICE_PAUSE, {}, "async_pause") 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) name = cfg.get(CONF_NAME)
icon = cfg.get(CONF_ICON) icon = cfg.get(CONF_ICON)
duration = cfg.get(CONF_DURATION) duration = cfg[CONF_DURATION]
entities.append(Timer(hass, object_id, name, icon, duration)) entities.append(Timer(hass, object_id, name, icon, duration))

View File

@ -11,6 +11,7 @@ from homeassistant.components.timer import (
CONF_DURATION, CONF_DURATION,
CONF_ICON, CONF_ICON,
CONF_NAME, CONF_NAME,
DEFAULT_DURATION,
DOMAIN, DOMAIN,
EVENT_TIMER_CANCELLED, EVENT_TIMER_CANCELLED,
EVENT_TIMER_FINISHED, EVENT_TIMER_FINISHED,
@ -63,20 +64,23 @@ async def test_config_options(hass):
CONF_ICON: "mdi:work", CONF_ICON: "mdi:work",
CONF_DURATION: 10, CONF_DURATION: 10,
}, },
"test_3": None,
} }
} }
assert await async_setup_component(hass, "timer", config) assert await async_setup_component(hass, "timer", config)
await hass.async_block_till_done() 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() await hass.async_block_till_done()
state_1 = hass.states.get("timer.test_1") state_1 = hass.states.get("timer.test_1")
state_2 = hass.states.get("timer.test_2") state_2 = hass.states.get("timer.test_2")
state_3 = hass.states.get("timer.test_3")
assert state_1 is not None assert state_1 is not None
assert state_2 is not None assert state_2 is not None
assert state_3 is not None
assert STATUS_IDLE == state_1.state assert STATUS_IDLE == state_1.state
assert ATTR_ICON not in state_1.attributes 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 "mdi:work" == state_2.attributes.get(ATTR_ICON)
assert "0:00:10" == state_2.attributes.get(ATTR_DURATION) 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): async def test_methods_and_events(hass):
"""Test methods and events.""" """Test methods and events."""