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