From bbe0f7533675032660f5b68fbaf9499b6bdc5dc4 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 10 Mar 2020 23:15:11 +0100 Subject: [PATCH] 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 --- homeassistant/components/input_datetime/__init__.py | 12 +++++++++++- tests/components/input_datetime/test_init.py | 11 +++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/input_datetime/__init__.py b/homeassistant/components/input_datetime/__init__.py index 575f607dadd..d000f606c58 100644 --- a/homeassistant/components/input_datetime/__init__.py +++ b/homeassistant/components/input_datetime/__init__.py @@ -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 diff --git a/tests/components/input_datetime/test_init.py b/tests/components/input_datetime/test_init.py index fa67bb2f8bf..afee32702c4 100644 --- a/tests/components/input_datetime/test_init.py +++ b/tests/components/input_datetime/test_init.py @@ -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."""