summaryrefslogtreecommitdiffstats
path: root/test/test_dt.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_dt.py')
-rw-r--r--test/test_dt.py167
1 files changed, 167 insertions, 0 deletions
diff --git a/test/test_dt.py b/test/test_dt.py
new file mode 100644
index 0000000..02e3ac2
--- /dev/null
+++ b/test/test_dt.py
@@ -0,0 +1,167 @@
+#!/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("2009-12-31T19:00:00-0500" , d)
+ _assert("2009-12-31T19:00:00.123456-0500" , d)
+
+ _assert(0 , dt.NONE)
+ _assert("" , dt.NONE)
+ _assert("foo", dt.NONE)
+ _assert(None , dt.NONE)
+ _assert(() , dt.NONE)
+ _assert([] , dt.NONE)
+ _assert({} , dt.NONE)
+ _assert((1, 2, 3), dt.NONE)
+
+ @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.123456-05" , 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.NONE)
+ 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.NONE)
+
+ def test_parse_iso(self, f=dt.parse_iso):
+ self.assertEqual(
+ f("1970-01-01T00:00:00+00:00"),
+ dt.from_ts(0),
+ )
+ 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,
+ )
+ self.assertEqual(
+ f("1970.01.01"),
+ dt.NONE,
+ )
+ self.assertEqual(
+ f("1970-01-01T00:00:00+0000"),
+ dt.EPOCH,
+ )
+ self.assertEqual(
+ f("2019-05-07T21:25:02.753+0900"),
+ datetime.datetime(2019, 5, 7, 12, 25, 2),
+ )
+
+ for value in ((), [], {}, None, 1, 2.3):
+ self.assertEqual(f(value), dt.NONE)
+
+ def test_none(self):
+ self.assertFalse(dt.NONE)
+ self.assertIsInstance(dt.NONE, dt.datetime)
+ self.assertEqual(str(dt.NONE), "[Invalid DateTime]")
+
+
+if __name__ == "__main__":
+ unittest.main()