diff --git a/test/test_dt.py b/test/test_dt.py new file mode 100644 index 00000000..b9cc4d2c --- /dev/null +++ b/test/test_dt.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# Copyright 2025 Mike Fährmann +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. + +import os +import sys +import unittest + +import datetime + +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +from gallery_dl import dt # noqa E402 + + +class TestDatetime(unittest.TestCase): + + def test_convert(self, f=dt.convert): + + def _assert(value, expected): + result = f(value) + self.assertIsInstance(result, datetime.datetime) + self.assertEqual(result, expected, msg=repr(value)) + + d = datetime.datetime(2010, 1, 1) + self.assertIs(f(d), d) + + _assert(d , d) + _assert(1262304000 , d) + _assert(1262304000.0 , d) + _assert(1262304000.123, d) + _assert("1262304000" , d) + + _assert("2010-01-01" , d) + _assert("2010-01-01 00:00:00" , d) + _assert("2010-01-01T00:00:00" , d) + _assert("2010-01-01T00:00:00.123456" , d) + _assert("2009-12-31T19:00:00-05:00" , d) + _assert("2009-12-31T19:00:00.123456-05:00", d) + _assert("2010-01-01T00:00:00Z" , d) + _assert("2010-01-01T00:00:00.123456Z" , d) + + _assert(0 , dt.EPOCH) + _assert("" , dt.EPOCH) + _assert("foo", dt.EPOCH) + _assert(None , dt.EPOCH) + _assert(() , dt.EPOCH) + _assert([] , dt.EPOCH) + _assert({} , dt.EPOCH) + _assert((1, 2, 3), dt.EPOCH) + + @unittest.skipIf(sys.hexversion < 0x30b0000, + "extended fromisoformat timezones") + def test_convert_tz(self, f=dt.convert): + + def _assert(value, expected): + result = f(value) + self.assertIsInstance(result, datetime.datetime) + self.assertEqual(result, expected, msg=repr(value)) + + d = datetime.datetime(2010, 1, 1) + + _assert("2009-12-31T19:00:00-05" , d) + _assert("2009-12-31T19:00:00-0500" , d) + _assert("2009-12-31T19:00:00.123456-05" , d) + _assert("2009-12-31T19:00:00.123456-0500" , d) + + def test_to_timestamp(self, f=dt.to_ts): + self.assertEqual(f(dt.EPOCH), 0.0) + self.assertEqual(f(datetime.datetime(2010, 1, 1)), 1262304000.0) + self.assertEqual(f(datetime.datetime(2010, 1, 1, 0, 0, 0, 128000)), + 1262304000.128000) + with self.assertRaises(TypeError): + f(None) + + def test_to_timestamp_string(self, f=dt.to_ts_string): + self.assertEqual(f(dt.EPOCH), "0") + self.assertEqual(f(datetime.datetime(2010, 1, 1)), "1262304000") + self.assertEqual(f(None), "") + + def test_from_timestamp(self, f=dt.from_ts): + self.assertEqual(f(0.0), dt.EPOCH) + self.assertEqual(f(1262304000.0), datetime.datetime(2010, 1, 1)) + self.assertEqual(f(1262304000.128000).replace(microsecond=0), + datetime.datetime(2010, 1, 1, 0, 0, 0)) + + def test_now(self, f=dt.now): + self.assertIsInstance(f(), datetime.datetime) + + def test_parse_timestamp(self, f=dt.parse_ts): + null = dt.from_ts(0) + value = dt.from_ts(1555816235) + + self.assertEqual(f(0) , null) + self.assertEqual(f("0") , null) + self.assertEqual(f(1555816235) , value) + self.assertEqual(f("1555816235"), value) + + for value in ((), [], {}, None, ""): + self.assertEqual(f(value), dt.EPOCH) + self.assertEqual(f(value, "foo"), "foo") + + def test_parse(self, f=dt.parse): + self.assertEqual( + f("1970.01.01", "%Y.%m.%d"), + dt.EPOCH, + ) + self.assertEqual( + f("May 7, 2019 9:33 am", "%B %d, %Y %I:%M %p"), + datetime.datetime(2019, 5, 7, 9, 33, 0), + ) + self.assertEqual( + f("2019-05-07T21:25:02.753+0900", "%Y-%m-%dT%H:%M:%S.%f%z"), + datetime.datetime(2019, 5, 7, 12, 25, 2), + ) + + for value in ((), [], {}, None, 1, 2.3): + self.assertEqual(f(value, "%Y"), dt.EPOCH) + + def test_parse_iso(self, f=dt.parse_iso): + null = dt.from_ts(0) + + self.assertEqual(f("1970-01-01T00:00:00+00:00"), null) + self.assertEqual(f("1970-01-01T00:00:00+0000") , null) + + self.assertEqual( + f("2019-05-07T21:25:02+09:00"), + datetime.datetime(2019, 5, 7, 12, 25, 2), + ) + self.assertEqual( + f("2019-05-07T12:25:02Z"), + datetime.datetime(2019, 5, 7, 12, 25, 2), + ) + self.assertEqual( + f("2019-05-07 21:25:02"), + datetime.datetime(2019, 5, 7, 21, 25, 2), + ) + self.assertEqual( + f("1970.01.01"), + dt.EPOCH, + ) + + for value in ((), [], {}, None, 1, 2.3): + self.assertEqual(f(value), dt.EPOCH) + + def test_parse_compat(self, f=dt.parse_compat): + self.assertEqual( + f("2019-05-07T21:25:02.753+0900", "%Y-%m-%dT%H:%M:%S.%f%z"), + datetime.datetime(2019, 5, 7, 12, 25, 2), + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/test/test_text.py b/test/test_text.py index 0e187d75..4ff34a3b 100644 --- a/test/test_text.py +++ b/test/test_text.py @@ -11,8 +11,6 @@ import os import sys import unittest -import datetime - sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from gallery_dl import text, util # noqa E402 @@ -519,51 +517,6 @@ class TestText(unittest.TestCase): self.assertEqual(f({"ä&": "あと", "#": "?"}), "%C3%A4%26=%E3%81%82%E3%81%A8&%23=%3F") - def test_parse_timestamp(self, f=text.parse_timestamp): - null = util.datetime_utcfromtimestamp(0) - value = util.datetime_utcfromtimestamp(1555816235) - - self.assertEqual(f(0) , null) - self.assertEqual(f("0") , null) - self.assertEqual(f(1555816235) , value) - self.assertEqual(f("1555816235"), value) - - for value in INVALID_ALT: - self.assertEqual(f(value), None) - self.assertEqual(f(value, "foo"), "foo") - - def test_parse_datetime(self, f=text.parse_datetime): - null = util.datetime_utcfromtimestamp(0) - - self.assertEqual(f("1970-01-01T00:00:00+00:00"), null) - self.assertEqual(f("1970-01-01T00:00:00+0000") , null) - self.assertEqual(f("1970.01.01", "%Y.%m.%d") , null) - - self.assertEqual( - f("2019-05-07T21:25:02+09:00"), - datetime.datetime(2019, 5, 7, 12, 25, 2), - ) - self.assertEqual( - f("2019-05-07T21:25:02+0900"), - datetime.datetime(2019, 5, 7, 12, 25, 2), - ) - self.assertEqual( - f("2019-05-07T21:25:02.753+0900", "%Y-%m-%dT%H:%M:%S.%f%z"), - datetime.datetime(2019, 5, 7, 12, 25, 2), - ) - self.assertEqual( - f("2019-05-07T21:25:02", "%Y-%m-%dT%H:%M:%S", utcoffset=9), - datetime.datetime(2019, 5, 7, 12, 25, 2), - ) - self.assertEqual( - f("2019-05-07 21:25:02"), - "2019-05-07 21:25:02", - ) - - for value in INVALID: - self.assertEqual(f(value), None) - self.assertEqual(f("1970.01.01"), "1970.01.01") - if __name__ == "__main__": unittest.main() diff --git a/test/test_util.py b/test/test_util.py index bfaab01b..7f278a93 100644 --- a/test/test_util.py +++ b/test/test_util.py @@ -406,89 +406,6 @@ def hash(value): self.assertEqual(expr(value), result) -class TestDatetime(unittest.TestCase): - - def test_to_datetime(self, f=util.to_datetime): - - def _assert(value, expected): - result = f(value) - self.assertIsInstance(result, datetime.datetime) - self.assertEqual(result, expected, msg=repr(value)) - - dt = datetime.datetime(2010, 1, 1) - self.assertIs(f(dt), dt) - - _assert(dt , dt) - _assert(1262304000 , dt) - _assert(1262304000.0 , dt) - _assert(1262304000.123, dt) - _assert("1262304000" , dt) - - _assert("2010-01-01" , dt) - _assert("2010-01-01 00:00:00" , dt) - _assert("2010-01-01T00:00:00" , dt) - _assert("2010-01-01T00:00:00.123456" , dt) - _assert("2009-12-31T19:00:00-05:00" , dt) - _assert("2009-12-31T19:00:00.123456-05:00", dt) - _assert("2010-01-01T00:00:00Z" , dt) - _assert("2010-01-01T00:00:00.123456Z" , dt) - - _assert(0 , util.EPOCH) - _assert("" , util.EPOCH) - _assert("foo", util.EPOCH) - _assert(None , util.EPOCH) - _assert(() , util.EPOCH) - _assert([] , util.EPOCH) - _assert({} , util.EPOCH) - _assert((1, 2, 3), util.EPOCH) - - @unittest.skipIf(sys.hexversion < 0x30b0000, - "extended fromisoformat timezones") - def test_to_datetime_tz(self, f=util.to_datetime): - - def _assert(value, expected): - result = f(value) - self.assertIsInstance(result, datetime.datetime) - self.assertEqual(result, expected, msg=repr(value)) - - dt = datetime.datetime(2010, 1, 1) - - _assert("2009-12-31T19:00:00-05" , dt) - _assert("2009-12-31T19:00:00-0500" , dt) - _assert("2009-12-31T19:00:00.123456-05" , dt) - _assert("2009-12-31T19:00:00.123456-0500" , dt) - - def test_datetime_to_timestamp(self, f=util.datetime_to_timestamp): - self.assertEqual(f(util.EPOCH), 0.0) - self.assertEqual(f(datetime.datetime(2010, 1, 1)), 1262304000.0) - self.assertEqual(f(datetime.datetime(2010, 1, 1, 0, 0, 0, 128000)), - 1262304000.128000) - with self.assertRaises(TypeError): - f(None) - - def test_datetime_to_timestamp_string( - self, f=util.datetime_to_timestamp_string): - self.assertEqual(f(util.EPOCH), "0") - self.assertEqual(f(datetime.datetime(2010, 1, 1)), "1262304000") - self.assertEqual(f(None), "") - - def test_datetime_from_timestamp( - self, f=util.datetime_from_timestamp): - self.assertEqual(f(0.0), util.EPOCH) - self.assertEqual(f(1262304000.0), datetime.datetime(2010, 1, 1)) - self.assertEqual(f(1262304000.128000).replace(microsecond=0), - datetime.datetime(2010, 1, 1, 0, 0, 0)) - - def test_datetime_utcfromtimestamp( - self, f=util.datetime_utcfromtimestamp): - self.assertEqual(f(0.0), util.EPOCH) - self.assertEqual(f(1262304000.0), datetime.datetime(2010, 1, 1)) - - def test_datetime_utcnow( - self, f=util.datetime_utcnow): - self.assertIsInstance(f(), datetime.datetime) - - class TestOther(unittest.TestCase): def test_bencode(self):