input_datetime guard for unexpected state on restore (#32652)

* input_datetime guard for unexpected state

If state is a time and has_date = true, or the other way around, restore state would error

* Update __init__.py

* Add test
This commit is contained in:
Bram Kragten 2020-03-10 23:15:11 +01:00 committed by GitHub
parent 765882fc4d
commit bbe0f75336
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 1 deletions

View File

@ -237,12 +237,22 @@ class InputDatetime(RestoreEntity):
return return
if self.has_date and self.has_time: if self.has_date and self.has_time:
self._current_datetime = dt_util.parse_datetime(old_state.state) date_time = dt_util.parse_datetime(old_state.state)
if date_time is None:
self._current_datetime = dt_util.parse_datetime(DEFAULT_VALUE)
return
self._current_datetime = date_time
elif self.has_date: elif self.has_date:
date = dt_util.parse_date(old_state.state) date = dt_util.parse_date(old_state.state)
if date is None:
self._current_datetime = dt_util.parse_datetime(DEFAULT_VALUE)
return
self._current_datetime = datetime.datetime.combine(date, DEFAULT_TIME) self._current_datetime = datetime.datetime.combine(date, DEFAULT_TIME)
else: else:
time = dt_util.parse_time(old_state.state) time = dt_util.parse_time(old_state.state)
if time is None:
self._current_datetime = dt_util.parse_datetime(DEFAULT_VALUE)
return
self._current_datetime = datetime.datetime.combine(DEFAULT_DATE, time) self._current_datetime = datetime.datetime.combine(DEFAULT_DATE, time)
@property @property

View File

@ -268,12 +268,15 @@ async def test_restore_state(hass):
State("input_datetime.test_date", "2017-09-07"), State("input_datetime.test_date", "2017-09-07"),
State("input_datetime.test_datetime", "2017-09-07 19:46:00"), State("input_datetime.test_datetime", "2017-09-07 19:46:00"),
State("input_datetime.test_bogus_data", "this is not a date"), State("input_datetime.test_bogus_data", "this is not a date"),
State("input_datetime.test_was_time", "19:46:00"),
State("input_datetime.test_was_date", "2017-09-07"),
), ),
) )
hass.state = CoreState.starting hass.state = CoreState.starting
initial = datetime.datetime(2017, 1, 1, 23, 42) initial = datetime.datetime(2017, 1, 1, 23, 42)
default = datetime.datetime(1970, 1, 1, 0, 0)
await async_setup_component( await async_setup_component(
hass, hass,
@ -288,6 +291,8 @@ async def test_restore_state(hass):
"has_date": True, "has_date": True,
"initial": str(initial), "initial": str(initial),
}, },
"test_was_time": {"has_time": False, "has_date": True},
"test_was_date": {"has_time": True, "has_date": False},
} }
}, },
) )
@ -305,6 +310,12 @@ async def test_restore_state(hass):
state_bogus = hass.states.get("input_datetime.test_bogus_data") state_bogus = hass.states.get("input_datetime.test_bogus_data")
assert state_bogus.state == str(initial) assert state_bogus.state == str(initial)
state_was_time = hass.states.get("input_datetime.test_was_time")
assert state_was_time.state == str(default.date())
state_was_date = hass.states.get("input_datetime.test_was_date")
assert state_was_date.state == str(default.time())
async def test_default_value(hass): async def test_default_value(hass):
"""Test default value if none has been set via initial or restore state.""" """Test default value if none has been set via initial or restore state."""