From 2b4cb2e1c7a4ca273d7b31c8902a7200dc463183 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Wed, 2 Feb 2022 19:45:10 +0530 Subject: [PATCH 1/3] test: Add tests for get_time, get_timedelta --- frappe/tests/test_utils.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/frappe/tests/test_utils.py b/frappe/tests/test_utils.py index 507722f9e9..9a93a515c7 100644 --- a/frappe/tests/test_utils.py +++ b/frappe/tests/test_utils.py @@ -17,7 +17,7 @@ import frappe from frappe.utils import ceil, evaluate_filters, floor, format_timedelta from frappe.utils import get_url, money_in_words, parse_timedelta, scrub_urls from frappe.utils import validate_email_address, validate_url -from frappe.utils.data import cast, validate_python_code +from frappe.utils.data import cast, get_time, get_timedelta, nowtime, now_datetime, validate_python_code from frappe.utils.diff import _get_value_from_version, get_version_diff, version_query from frappe.utils.image import optimize_image, strip_exif_data from frappe.utils.response import json_handler @@ -334,6 +334,34 @@ class TestDateUtils(unittest.TestCase): self.assertEqual(frappe.utils.get_last_day_of_week("2020-12-28"), frappe.utils.getdate("2021-01-02")) + def test_get_time(self): + from dateutil.parser import ParserError + datetime_input = now_datetime() + timedelta_input = get_timedelta() + time_input = nowtime() + + self.assertIsInstance(get_time(datetime_input), time) + self.assertIsInstance(get_time(timedelta_input), time) + self.assertIsInstance(get_time(time_input), time) + self.assertIsInstance(get_time(str(datetime_input)), time) + self.assertIsInstance(get_time(str(timedelta_input)), time) + self.assertIsInstance(get_time(str(time_input)), time) + with self.assertRaises(ParserError): + get_time("100:0:0") + + def test_get_timedelta(self): + datetime_input = now_datetime() + timedelta_input = get_timedelta() + time_input = nowtime() + + self.assertIsInstance(get_timedelta(), timedelta) + self.assertIsInstance(get_timedelta("100:2:12"), timedelta) + self.assertIsInstance(get_timedelta("17:21:00"), timedelta) + self.assertIsInstance(get_timedelta("2012-01-19 17:21:00"), timedelta) + self.assertIsInstance(get_timedelta(str(datetime_input)), timedelta) + self.assertIsInstance(get_timedelta(str(timedelta_input)), timedelta) + self.assertIsInstance(get_timedelta(str(time_input)), timedelta) + class TestResponse(unittest.TestCase): def test_json_handler(self): class TEST(Enum): From ad1fedf4a8ff72aab6b2c4600ffc7e9d71c87b42 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Wed, 2 Feb 2022 19:46:09 +0530 Subject: [PATCH 2/3] fix: Return correct types for time utils --- frappe/utils/data.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/frappe/utils/data.py b/frappe/utils/data.py index 23a271c77c..34ddc23155 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -112,9 +112,9 @@ def get_timedelta(time: Optional[str] = None) -> Optional[datetime.timedelta]: try: t = parser.parse(time) except ParserError as e: - if "day" in e.args[1]: - from frappe.utils import parse_timedelta + if "day" in e.args[1] or "hour must be in" in e.args[0]: return parse_timedelta(time) + raise e return datetime.timedelta( hours=t.hour, minutes=t.minute, seconds=t.second, microseconds=t.microsecond ) @@ -329,17 +329,24 @@ def get_year_ending(date): # last day of this month return add_to_date(date, days=-1) -def get_time(time_str): +def get_time(time_str: str) -> datetime.time: from dateutil import parser + from dateutil.parser import ParserError if isinstance(time_str, datetime.datetime): return time_str.time() elif isinstance(time_str, datetime.time): return time_str - else: - if isinstance(time_str, datetime.timedelta): - return format_timedelta(time_str) + elif isinstance(time_str, datetime.timedelta): + return (datetime.datetime.min + time_str).time() + try: return parser.parse(time_str).time() + except ParserError as e: + if "day" in e.args[1] or "hour must be in" in e.args[0]: + return ( + datetime.datetime.min + parse_timedelta(time_str) + ).time() + raise e def get_datetime_str(datetime_obj): if isinstance(datetime_obj, str): From 1b7fa5e180ffd18693e9ef033b9dba8197d64baf Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Wed, 2 Feb 2022 20:22:43 +0530 Subject: [PATCH 3/3] fix(test): Update test according to API behaviour --- frappe/tests/test_utils.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/frappe/tests/test_utils.py b/frappe/tests/test_utils.py index 9a93a515c7..27d1f7651d 100644 --- a/frappe/tests/test_utils.py +++ b/frappe/tests/test_utils.py @@ -335,7 +335,6 @@ class TestDateUtils(unittest.TestCase): frappe.utils.getdate("2021-01-02")) def test_get_time(self): - from dateutil.parser import ParserError datetime_input = now_datetime() timedelta_input = get_timedelta() time_input = nowtime() @@ -343,11 +342,10 @@ class TestDateUtils(unittest.TestCase): self.assertIsInstance(get_time(datetime_input), time) self.assertIsInstance(get_time(timedelta_input), time) self.assertIsInstance(get_time(time_input), time) + self.assertIsInstance(get_time("100:2:12"), time) self.assertIsInstance(get_time(str(datetime_input)), time) self.assertIsInstance(get_time(str(timedelta_input)), time) self.assertIsInstance(get_time(str(time_input)), time) - with self.assertRaises(ParserError): - get_time("100:0:0") def test_get_timedelta(self): datetime_input = now_datetime()