diff --git a/homeassistant/helpers/template.py b/homeassistant/helpers/template.py index 917581fac07..a0512178fdc 100644 --- a/homeassistant/helpers/template.py +++ b/homeassistant/helpers/template.py @@ -1,7 +1,7 @@ """Template helper methods for rendering strings with Home Assistant data.""" import base64 import collections.abc -from datetime import datetime +from datetime import datetime, timedelta from functools import wraps import json import logging @@ -1102,6 +1102,7 @@ class TemplateEnvironment(ImmutableSandboxedEnvironment): self.globals["utcnow"] = dt_util.utcnow self.globals["as_timestamp"] = forgiving_as_timestamp self.globals["relative_time"] = relative_time + self.globals["timedelta"] = timedelta self.globals["strptime"] = strptime self.globals["urlencode"] = urlencode if hass is None: diff --git a/tests/helpers/test_template.py b/tests/helpers/test_template.py index 5d84eb0f4e6..81deb46f928 100644 --- a/tests/helpers/test_template.py +++ b/tests/helpers/test_template.py @@ -892,6 +892,65 @@ def test_relative_time(mock_is_safe, hass): ) +@patch( + "homeassistant.helpers.template.TemplateEnvironment.is_safe_callable", + return_value=True, +) +def test_timedelta(mock_is_safe, hass): + """Test relative_time method.""" + now = datetime.strptime("2000-01-01 10:00:00 +00:00", "%Y-%m-%d %H:%M:%S %z") + with patch("homeassistant.util.dt.now", return_value=now): + assert ( + "0:02:00" + == template.Template( + "{{timedelta(seconds=120)}}", + hass, + ).async_render() + ) + assert ( + "1 day, 0:00:00" + == template.Template( + "{{timedelta(seconds=86400)}}", + hass, + ).async_render() + ) + assert ( + "1 day, 4:00:00" + == template.Template( + "{{timedelta(days=1, hours=4)}}", + hass, + ).async_render() + ) + assert ( + "1 hour" + == template.Template( + "{{relative_time(now() - timedelta(seconds=3600))}}", + hass, + ).async_render() + ) + assert ( + "1 day" + == template.Template( + "{{relative_time(now() - timedelta(seconds=86400))}}", + hass, + ).async_render() + ) + assert ( + "1 day" + == template.Template( + "{{relative_time(now() - timedelta(seconds=86401))}}", + hass, + ).async_render() + ) + assert ( + "15 days" + == template.Template( + "{{relative_time(now() - timedelta(weeks=2, days=1))}}", + hass, + ).async_render() + ) + + @patch( "homeassistant.helpers.template.TemplateEnvironment.is_safe_callable", return_value=True,