python (3.12.0)
1 import datetime
2 from email import utils
3 import test.support
4 import time
5 import unittest
6 import sys
7 import os.path
8
9 class ESC[4;38;5;81mDateTimeTests(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
10
11 datestring = 'Sun, 23 Sep 2001 20:10:55'
12 dateargs = (2001, 9, 23, 20, 10, 55)
13 offsetstring = ' -0700'
14 utcoffset = datetime.timedelta(hours=-7)
15 tz = datetime.timezone(utcoffset)
16 naive_dt = datetime.datetime(*dateargs)
17 aware_dt = datetime.datetime(*dateargs, tzinfo=tz)
18
19 def test_naive_datetime(self):
20 self.assertEqual(utils.format_datetime(self.naive_dt),
21 self.datestring + ' -0000')
22
23 def test_aware_datetime(self):
24 self.assertEqual(utils.format_datetime(self.aware_dt),
25 self.datestring + self.offsetstring)
26
27 def test_usegmt(self):
28 utc_dt = datetime.datetime(*self.dateargs,
29 tzinfo=datetime.timezone.utc)
30 self.assertEqual(utils.format_datetime(utc_dt, usegmt=True),
31 self.datestring + ' GMT')
32
33 def test_usegmt_with_naive_datetime_raises(self):
34 with self.assertRaises(ValueError):
35 utils.format_datetime(self.naive_dt, usegmt=True)
36
37 def test_usegmt_with_non_utc_datetime_raises(self):
38 with self.assertRaises(ValueError):
39 utils.format_datetime(self.aware_dt, usegmt=True)
40
41 def test_parsedate_to_datetime(self):
42 self.assertEqual(
43 utils.parsedate_to_datetime(self.datestring + self.offsetstring),
44 self.aware_dt)
45
46 def test_parsedate_to_datetime_naive(self):
47 self.assertEqual(
48 utils.parsedate_to_datetime(self.datestring + ' -0000'),
49 self.naive_dt)
50
51 def test_parsedate_to_datetime_with_invalid_raises_valueerror(self):
52 # See also test_parsedate_returns_None_for_invalid_strings in test_email.
53 invalid_dates = [
54 '',
55 ' ',
56 '0',
57 'A Complete Waste of Time',
58 'Wed, 3 Apr 2002 12.34.56.78+0800'
59 'Tue, 06 Jun 2017 27:39:33 +0600',
60 'Tue, 06 Jun 2017 07:39:33 +2600',
61 'Tue, 06 Jun 2017 27:39:33',
62 '17 June , 2022',
63 'Friday, -Nov-82 16:14:55 EST',
64 'Friday, Nov--82 16:14:55 EST',
65 'Friday, 19-Nov- 16:14:55 EST',
66 ]
67 for dtstr in invalid_dates:
68 with self.subTest(dtstr=dtstr):
69 self.assertRaises(ValueError, utils.parsedate_to_datetime, dtstr)
70
71 class ESC[4;38;5;81mLocaltimeTests(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
72
73 def test_localtime_is_tz_aware_daylight_true(self):
74 test.support.patch(self, time, 'daylight', True)
75 t = utils.localtime()
76 self.assertIsNotNone(t.tzinfo)
77
78 def test_localtime_is_tz_aware_daylight_false(self):
79 test.support.patch(self, time, 'daylight', False)
80 t = utils.localtime()
81 self.assertIsNotNone(t.tzinfo)
82
83 def test_localtime_daylight_true_dst_false(self):
84 test.support.patch(self, time, 'daylight', True)
85 t0 = datetime.datetime(2012, 3, 12, 1, 1)
86 t1 = utils.localtime(t0)
87 t2 = utils.localtime(t1)
88 self.assertEqual(t1, t2)
89
90 def test_localtime_daylight_false_dst_false(self):
91 test.support.patch(self, time, 'daylight', False)
92 t0 = datetime.datetime(2012, 3, 12, 1, 1)
93 t1 = utils.localtime(t0)
94 t2 = utils.localtime(t1)
95 self.assertEqual(t1, t2)
96
97 @test.support.run_with_tz('Europe/Minsk')
98 def test_localtime_daylight_true_dst_true(self):
99 test.support.patch(self, time, 'daylight', True)
100 t0 = datetime.datetime(2012, 3, 12, 1, 1)
101 t1 = utils.localtime(t0)
102 t2 = utils.localtime(t1)
103 self.assertEqual(t1, t2)
104
105 @test.support.run_with_tz('Europe/Minsk')
106 def test_localtime_daylight_false_dst_true(self):
107 test.support.patch(self, time, 'daylight', False)
108 t0 = datetime.datetime(2012, 3, 12, 1, 1)
109 t1 = utils.localtime(t0)
110 t2 = utils.localtime(t1)
111 self.assertEqual(t1, t2)
112
113 @test.support.run_with_tz('EST+05EDT,M3.2.0,M11.1.0')
114 def test_localtime_epoch_utc_daylight_true(self):
115 test.support.patch(self, time, 'daylight', True)
116 t0 = datetime.datetime(1990, 1, 1, tzinfo = datetime.timezone.utc)
117 t1 = utils.localtime(t0)
118 t2 = t0 - datetime.timedelta(hours=5)
119 t2 = t2.replace(tzinfo = datetime.timezone(datetime.timedelta(hours=-5)))
120 self.assertEqual(t1, t2)
121
122 @test.support.run_with_tz('EST+05EDT,M3.2.0,M11.1.0')
123 def test_localtime_epoch_utc_daylight_false(self):
124 test.support.patch(self, time, 'daylight', False)
125 t0 = datetime.datetime(1990, 1, 1, tzinfo = datetime.timezone.utc)
126 t1 = utils.localtime(t0)
127 t2 = t0 - datetime.timedelta(hours=5)
128 t2 = t2.replace(tzinfo = datetime.timezone(datetime.timedelta(hours=-5)))
129 self.assertEqual(t1, t2)
130
131 def test_localtime_epoch_notz_daylight_true(self):
132 test.support.patch(self, time, 'daylight', True)
133 t0 = datetime.datetime(1990, 1, 1)
134 t1 = utils.localtime(t0)
135 t2 = utils.localtime(t0.replace(tzinfo=None))
136 self.assertEqual(t1, t2)
137
138 def test_localtime_epoch_notz_daylight_false(self):
139 test.support.patch(self, time, 'daylight', False)
140 t0 = datetime.datetime(1990, 1, 1)
141 t1 = utils.localtime(t0)
142 t2 = utils.localtime(t0.replace(tzinfo=None))
143 self.assertEqual(t1, t2)
144
145 # XXX: Need a more robust test for Olson's tzdata
146 @unittest.skipIf(sys.platform.startswith('win'),
147 "Windows does not use Olson's TZ database")
148 @unittest.skipUnless(os.path.exists('/usr/share/zoneinfo') or
149 os.path.exists('/usr/lib/zoneinfo'),
150 "Can't find the Olson's TZ database")
151 @test.support.run_with_tz('Europe/Kiev')
152 def test_variable_tzname(self):
153 t0 = datetime.datetime(1984, 1, 1, tzinfo=datetime.timezone.utc)
154 t1 = utils.localtime(t0)
155 self.assertEqual(t1.tzname(), 'MSK')
156 t0 = datetime.datetime(1994, 1, 1, tzinfo=datetime.timezone.utc)
157 t1 = utils.localtime(t0)
158 self.assertEqual(t1.tzname(), 'EET')
159
160 def test_isdst_deprecation(self):
161 with self.assertWarns(DeprecationWarning):
162 t0 = datetime.datetime(1990, 1, 1)
163 t1 = utils.localtime(t0, isdst=True)
164
165 # Issue #24836: The timezone files are out of date (pre 2011k)
166 # on Mac OS X Snow Leopard.
167 @test.support.requires_mac_ver(10, 7)
168 class ESC[4;38;5;81mFormatDateTests(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
169
170 @test.support.run_with_tz('Europe/Minsk')
171 def test_formatdate(self):
172 timeval = time.mktime((2011, 12, 1, 18, 0, 0, 4, 335, 0))
173 string = utils.formatdate(timeval, localtime=False, usegmt=False)
174 self.assertEqual(string, 'Thu, 01 Dec 2011 15:00:00 -0000')
175 string = utils.formatdate(timeval, localtime=False, usegmt=True)
176 self.assertEqual(string, 'Thu, 01 Dec 2011 15:00:00 GMT')
177
178 @test.support.run_with_tz('Europe/Minsk')
179 def test_formatdate_with_localtime(self):
180 timeval = time.mktime((2011, 1, 1, 18, 0, 0, 6, 1, 0))
181 string = utils.formatdate(timeval, localtime=True)
182 self.assertEqual(string, 'Sat, 01 Jan 2011 18:00:00 +0200')
183 # Minsk moved from +0200 (with DST) to +0300 (without DST) in 2011
184 timeval = time.mktime((2011, 12, 1, 18, 0, 0, 4, 335, 0))
185 string = utils.formatdate(timeval, localtime=True)
186 self.assertEqual(string, 'Thu, 01 Dec 2011 18:00:00 +0300')
187
188 if __name__ == '__main__':
189 unittest.main()