Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
mikf
GitHub Repository: mikf/gallery-dl
Path: blob/master/test/test_dt.py
8753 views
1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-
3
4
# Copyright 2025 Mike Fährmann
5
#
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License version 2 as
8
# published by the Free Software Foundation.
9
10
import os
11
import sys
12
import unittest
13
14
import datetime
15
16
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
17
from gallery_dl import dt # noqa E402
18
19
20
class TestDatetime(unittest.TestCase):
21
22
def test_convert(self, f=dt.convert):
23
24
def _assert(value, expected):
25
result = f(value)
26
self.assertIsInstance(result, datetime.datetime)
27
self.assertEqual(result, expected, msg=repr(value))
28
29
d = datetime.datetime(2010, 1, 1)
30
self.assertIs(f(d), d)
31
32
_assert(d , d)
33
_assert(1262304000 , d)
34
_assert(1262304000.0 , d)
35
_assert(1262304000.123, d)
36
_assert("1262304000" , d)
37
38
_assert("2010-01-01" , d)
39
_assert("2010-01-01 00:00:00" , d)
40
_assert("2010-01-01T00:00:00" , d)
41
_assert("2010-01-01T00:00:00.123456" , d)
42
_assert("2009-12-31T19:00:00-05:00" , d)
43
_assert("2009-12-31T19:00:00.123456-05:00", d)
44
_assert("2010-01-01T00:00:00Z" , d)
45
_assert("2010-01-01T00:00:00.123456Z" , d)
46
_assert("2009-12-31T19:00:00-0500" , d)
47
_assert("2009-12-31T19:00:00.123456-0500" , d)
48
49
_assert(0 , dt.NONE)
50
_assert("" , dt.NONE)
51
_assert("foo", dt.NONE)
52
_assert(None , dt.NONE)
53
_assert(() , dt.NONE)
54
_assert([] , dt.NONE)
55
_assert({} , dt.NONE)
56
_assert((1, 2, 3), dt.NONE)
57
58
@unittest.skipIf(sys.hexversion < 0x30b0000,
59
"extended fromisoformat timezones")
60
def test_convert_tz(self, f=dt.convert):
61
62
def _assert(value, expected):
63
result = f(value)
64
self.assertIsInstance(result, datetime.datetime)
65
self.assertEqual(result, expected, msg=repr(value))
66
67
d = datetime.datetime(2010, 1, 1)
68
_assert("2009-12-31T19:00:00-05" , d)
69
_assert("2009-12-31T19:00:00.123456-05" , d)
70
71
def test_to_timestamp(self, f=dt.to_ts):
72
self.assertEqual(f(dt.EPOCH), 0.0)
73
self.assertEqual(f(datetime.datetime(2010, 1, 1)), 1262304000.0)
74
self.assertEqual(f(datetime.datetime(2010, 1, 1, 0, 0, 0, 128000)),
75
1262304000.128000)
76
with self.assertRaises(TypeError):
77
f(None)
78
79
def test_to_timestamp_string(self, f=dt.to_ts_string):
80
self.assertEqual(f(dt.EPOCH), "0")
81
self.assertEqual(f(datetime.datetime(2010, 1, 1)), "1262304000")
82
self.assertEqual(f(None), "")
83
84
def test_from_timestamp(self, f=dt.from_ts):
85
self.assertEqual(f(0.0), dt.EPOCH)
86
self.assertEqual(f(1262304000.0), datetime.datetime(2010, 1, 1))
87
self.assertEqual(f(1262304000.128000).replace(microsecond=0),
88
datetime.datetime(2010, 1, 1, 0, 0, 0))
89
90
def test_now(self, f=dt.now):
91
self.assertIsInstance(f(), datetime.datetime)
92
93
def test_parse_timestamp(self, f=dt.parse_ts):
94
null = dt.from_ts(0)
95
value = dt.from_ts(1555816235)
96
97
self.assertEqual(f(0) , null)
98
self.assertEqual(f("0") , null)
99
self.assertEqual(f(1555816235) , value)
100
self.assertEqual(f("1555816235"), value)
101
102
for value in ((), [], {}, None, ""):
103
self.assertEqual(f(value), dt.NONE)
104
self.assertEqual(f(value, "foo"), "foo")
105
106
def test_parse(self, f=dt.parse):
107
self.assertEqual(
108
f("1970.01.01", "%Y.%m.%d"),
109
dt.EPOCH,
110
)
111
self.assertEqual(
112
f("May 7, 2019 9:33 am", "%B %d, %Y %I:%M %p"),
113
datetime.datetime(2019, 5, 7, 9, 33, 0),
114
)
115
self.assertEqual(
116
f("2019-05-07T21:25:02.753+0900", "%Y-%m-%dT%H:%M:%S.%f%z"),
117
datetime.datetime(2019, 5, 7, 12, 25, 2),
118
)
119
120
for value in ((), [], {}, None, 1, 2.3):
121
self.assertEqual(f(value, "%Y"), dt.NONE)
122
123
def test_parse_iso(self, f=dt.parse_iso):
124
self.assertEqual(
125
f("1970-01-01T00:00:00+00:00"),
126
dt.from_ts(0),
127
)
128
self.assertEqual(
129
f("2019-05-07T21:25:02+09:00"),
130
datetime.datetime(2019, 5, 7, 12, 25, 2),
131
)
132
self.assertEqual(
133
f("2019-05-07T12:25:02Z"),
134
datetime.datetime(2019, 5, 7, 12, 25, 2),
135
)
136
self.assertEqual(
137
f("2019-05-07 21:25:02"),
138
datetime.datetime(2019, 5, 7, 21, 25, 2),
139
)
140
self.assertEqual(
141
f("1970-01-01"),
142
dt.EPOCH,
143
)
144
self.assertEqual(
145
f("1970.01.01"),
146
dt.NONE,
147
)
148
self.assertEqual(
149
f("1970-01-01T00:00:00+0000"),
150
dt.EPOCH,
151
)
152
self.assertEqual(
153
f("2019-05-07T21:25:02.753+0900"),
154
datetime.datetime(2019, 5, 7, 12, 25, 2),
155
)
156
157
for value in ((), [], {}, None, 1, 2.3):
158
self.assertEqual(f(value), dt.NONE)
159
160
def test_none(self):
161
self.assertFalse(dt.NONE)
162
self.assertIsInstance(dt.NONE, dt.datetime)
163
self.assertEqual(str(dt.NONE), "[Invalid DateTime]")
164
165
166
if __name__ == "__main__":
167
unittest.main()
168
169