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
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:
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)
else:
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)
@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_datetime", "2017-09-07 19:46:00"),
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
initial = datetime.datetime(2017, 1, 1, 23, 42)
default = datetime.datetime(1970, 1, 1, 0, 0)
await async_setup_component(
hass,
@ -288,6 +291,8 @@ async def test_restore_state(hass):
"has_date": True,
"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")
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):
"""Test default value if none has been set via initial or restore state."""