17db96d56Sopenharmony_ciimport datetime
27db96d56Sopenharmony_cifrom email import utils
37db96d56Sopenharmony_ciimport test.support
47db96d56Sopenharmony_ciimport time
57db96d56Sopenharmony_ciimport unittest
67db96d56Sopenharmony_ciimport sys
77db96d56Sopenharmony_ciimport os.path
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ciclass DateTimeTests(unittest.TestCase):
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci    datestring = 'Sun, 23 Sep 2001 20:10:55'
127db96d56Sopenharmony_ci    dateargs = (2001, 9, 23, 20, 10, 55)
137db96d56Sopenharmony_ci    offsetstring = ' -0700'
147db96d56Sopenharmony_ci    utcoffset = datetime.timedelta(hours=-7)
157db96d56Sopenharmony_ci    tz = datetime.timezone(utcoffset)
167db96d56Sopenharmony_ci    naive_dt = datetime.datetime(*dateargs)
177db96d56Sopenharmony_ci    aware_dt = datetime.datetime(*dateargs, tzinfo=tz)
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ci    def test_naive_datetime(self):
207db96d56Sopenharmony_ci        self.assertEqual(utils.format_datetime(self.naive_dt),
217db96d56Sopenharmony_ci                         self.datestring + ' -0000')
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ci    def test_aware_datetime(self):
247db96d56Sopenharmony_ci        self.assertEqual(utils.format_datetime(self.aware_dt),
257db96d56Sopenharmony_ci                         self.datestring + self.offsetstring)
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ci    def test_usegmt(self):
287db96d56Sopenharmony_ci        utc_dt = datetime.datetime(*self.dateargs,
297db96d56Sopenharmony_ci                                   tzinfo=datetime.timezone.utc)
307db96d56Sopenharmony_ci        self.assertEqual(utils.format_datetime(utc_dt, usegmt=True),
317db96d56Sopenharmony_ci                         self.datestring + ' GMT')
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_ci    def test_usegmt_with_naive_datetime_raises(self):
347db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
357db96d56Sopenharmony_ci            utils.format_datetime(self.naive_dt, usegmt=True)
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci    def test_usegmt_with_non_utc_datetime_raises(self):
387db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
397db96d56Sopenharmony_ci            utils.format_datetime(self.aware_dt, usegmt=True)
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_ci    def test_parsedate_to_datetime(self):
427db96d56Sopenharmony_ci        self.assertEqual(
437db96d56Sopenharmony_ci            utils.parsedate_to_datetime(self.datestring + self.offsetstring),
447db96d56Sopenharmony_ci            self.aware_dt)
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ci    def test_parsedate_to_datetime_naive(self):
477db96d56Sopenharmony_ci        self.assertEqual(
487db96d56Sopenharmony_ci            utils.parsedate_to_datetime(self.datestring + ' -0000'),
497db96d56Sopenharmony_ci            self.naive_dt)
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ci    def test_parsedate_to_datetime_with_invalid_raises_valueerror(self):
527db96d56Sopenharmony_ci        # See also test_parsedate_returns_None_for_invalid_strings in test_email.
537db96d56Sopenharmony_ci        invalid_dates = [
547db96d56Sopenharmony_ci            '',
557db96d56Sopenharmony_ci            ' ',
567db96d56Sopenharmony_ci            '0',
577db96d56Sopenharmony_ci            'A Complete Waste of Time',
587db96d56Sopenharmony_ci            'Wed, 3 Apr 2002 12.34.56.78+0800'
597db96d56Sopenharmony_ci            'Tue, 06 Jun 2017 27:39:33 +0600',
607db96d56Sopenharmony_ci            'Tue, 06 Jun 2017 07:39:33 +2600',
617db96d56Sopenharmony_ci            'Tue, 06 Jun 2017 27:39:33',
627db96d56Sopenharmony_ci            '17 June , 2022',
637db96d56Sopenharmony_ci            'Friday, -Nov-82 16:14:55 EST',
647db96d56Sopenharmony_ci            'Friday, Nov--82 16:14:55 EST',
657db96d56Sopenharmony_ci            'Friday, 19-Nov- 16:14:55 EST',
667db96d56Sopenharmony_ci        ]
677db96d56Sopenharmony_ci        for dtstr in invalid_dates:
687db96d56Sopenharmony_ci            with self.subTest(dtstr=dtstr):
697db96d56Sopenharmony_ci                self.assertRaises(ValueError, utils.parsedate_to_datetime, dtstr)
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ciclass LocaltimeTests(unittest.TestCase):
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ci    def test_localtime_is_tz_aware_daylight_true(self):
747db96d56Sopenharmony_ci        test.support.patch(self, time, 'daylight', True)
757db96d56Sopenharmony_ci        t = utils.localtime()
767db96d56Sopenharmony_ci        self.assertIsNotNone(t.tzinfo)
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci    def test_localtime_is_tz_aware_daylight_false(self):
797db96d56Sopenharmony_ci        test.support.patch(self, time, 'daylight', False)
807db96d56Sopenharmony_ci        t = utils.localtime()
817db96d56Sopenharmony_ci        self.assertIsNotNone(t.tzinfo)
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ci    def test_localtime_daylight_true_dst_false(self):
847db96d56Sopenharmony_ci        test.support.patch(self, time, 'daylight', True)
857db96d56Sopenharmony_ci        t0 = datetime.datetime(2012, 3, 12, 1, 1)
867db96d56Sopenharmony_ci        t1 = utils.localtime(t0, isdst=-1)
877db96d56Sopenharmony_ci        t2 = utils.localtime(t1)
887db96d56Sopenharmony_ci        self.assertEqual(t1, t2)
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ci    def test_localtime_daylight_false_dst_false(self):
917db96d56Sopenharmony_ci        test.support.patch(self, time, 'daylight', False)
927db96d56Sopenharmony_ci        t0 = datetime.datetime(2012, 3, 12, 1, 1)
937db96d56Sopenharmony_ci        t1 = utils.localtime(t0, isdst=-1)
947db96d56Sopenharmony_ci        t2 = utils.localtime(t1)
957db96d56Sopenharmony_ci        self.assertEqual(t1, t2)
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci    @test.support.run_with_tz('Europe/Minsk')
987db96d56Sopenharmony_ci    def test_localtime_daylight_true_dst_true(self):
997db96d56Sopenharmony_ci        test.support.patch(self, time, 'daylight', True)
1007db96d56Sopenharmony_ci        t0 = datetime.datetime(2012, 3, 12, 1, 1)
1017db96d56Sopenharmony_ci        t1 = utils.localtime(t0, isdst=1)
1027db96d56Sopenharmony_ci        t2 = utils.localtime(t1)
1037db96d56Sopenharmony_ci        self.assertEqual(t1, t2)
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci    @test.support.run_with_tz('Europe/Minsk')
1067db96d56Sopenharmony_ci    def test_localtime_daylight_false_dst_true(self):
1077db96d56Sopenharmony_ci        test.support.patch(self, time, 'daylight', False)
1087db96d56Sopenharmony_ci        t0 = datetime.datetime(2012, 3, 12, 1, 1)
1097db96d56Sopenharmony_ci        t1 = utils.localtime(t0, isdst=1)
1107db96d56Sopenharmony_ci        t2 = utils.localtime(t1)
1117db96d56Sopenharmony_ci        self.assertEqual(t1, t2)
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci    @test.support.run_with_tz('EST+05EDT,M3.2.0,M11.1.0')
1147db96d56Sopenharmony_ci    def test_localtime_epoch_utc_daylight_true(self):
1157db96d56Sopenharmony_ci        test.support.patch(self, time, 'daylight', True)
1167db96d56Sopenharmony_ci        t0 = datetime.datetime(1990, 1, 1, tzinfo = datetime.timezone.utc)
1177db96d56Sopenharmony_ci        t1 = utils.localtime(t0)
1187db96d56Sopenharmony_ci        t2 = t0 - datetime.timedelta(hours=5)
1197db96d56Sopenharmony_ci        t2 = t2.replace(tzinfo = datetime.timezone(datetime.timedelta(hours=-5)))
1207db96d56Sopenharmony_ci        self.assertEqual(t1, t2)
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci    @test.support.run_with_tz('EST+05EDT,M3.2.0,M11.1.0')
1237db96d56Sopenharmony_ci    def test_localtime_epoch_utc_daylight_false(self):
1247db96d56Sopenharmony_ci        test.support.patch(self, time, 'daylight', False)
1257db96d56Sopenharmony_ci        t0 = datetime.datetime(1990, 1, 1, tzinfo = datetime.timezone.utc)
1267db96d56Sopenharmony_ci        t1 = utils.localtime(t0)
1277db96d56Sopenharmony_ci        t2 = t0 - datetime.timedelta(hours=5)
1287db96d56Sopenharmony_ci        t2 = t2.replace(tzinfo = datetime.timezone(datetime.timedelta(hours=-5)))
1297db96d56Sopenharmony_ci        self.assertEqual(t1, t2)
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci    def test_localtime_epoch_notz_daylight_true(self):
1327db96d56Sopenharmony_ci        test.support.patch(self, time, 'daylight', True)
1337db96d56Sopenharmony_ci        t0 = datetime.datetime(1990, 1, 1)
1347db96d56Sopenharmony_ci        t1 = utils.localtime(t0)
1357db96d56Sopenharmony_ci        t2 = utils.localtime(t0.replace(tzinfo=None))
1367db96d56Sopenharmony_ci        self.assertEqual(t1, t2)
1377db96d56Sopenharmony_ci
1387db96d56Sopenharmony_ci    def test_localtime_epoch_notz_daylight_false(self):
1397db96d56Sopenharmony_ci        test.support.patch(self, time, 'daylight', False)
1407db96d56Sopenharmony_ci        t0 = datetime.datetime(1990, 1, 1)
1417db96d56Sopenharmony_ci        t1 = utils.localtime(t0)
1427db96d56Sopenharmony_ci        t2 = utils.localtime(t0.replace(tzinfo=None))
1437db96d56Sopenharmony_ci        self.assertEqual(t1, t2)
1447db96d56Sopenharmony_ci
1457db96d56Sopenharmony_ci    # XXX: Need a more robust test for Olson's tzdata
1467db96d56Sopenharmony_ci    @unittest.skipIf(sys.platform.startswith('win'),
1477db96d56Sopenharmony_ci                     "Windows does not use Olson's TZ database")
1487db96d56Sopenharmony_ci    @unittest.skipUnless(os.path.exists('/usr/share/zoneinfo') or
1497db96d56Sopenharmony_ci                         os.path.exists('/usr/lib/zoneinfo'),
1507db96d56Sopenharmony_ci                         "Can't find the Olson's TZ database")
1517db96d56Sopenharmony_ci    @test.support.run_with_tz('Europe/Kiev')
1527db96d56Sopenharmony_ci    def test_variable_tzname(self):
1537db96d56Sopenharmony_ci        t0 = datetime.datetime(1984, 1, 1, tzinfo=datetime.timezone.utc)
1547db96d56Sopenharmony_ci        t1 = utils.localtime(t0)
1557db96d56Sopenharmony_ci        self.assertEqual(t1.tzname(), 'MSK')
1567db96d56Sopenharmony_ci        t0 = datetime.datetime(1994, 1, 1, tzinfo=datetime.timezone.utc)
1577db96d56Sopenharmony_ci        t1 = utils.localtime(t0)
1587db96d56Sopenharmony_ci        self.assertEqual(t1.tzname(), 'EET')
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ci# Issue #24836: The timezone files are out of date (pre 2011k)
1617db96d56Sopenharmony_ci# on Mac OS X Snow Leopard.
1627db96d56Sopenharmony_ci@test.support.requires_mac_ver(10, 7)
1637db96d56Sopenharmony_ciclass FormatDateTests(unittest.TestCase):
1647db96d56Sopenharmony_ci
1657db96d56Sopenharmony_ci    @test.support.run_with_tz('Europe/Minsk')
1667db96d56Sopenharmony_ci    def test_formatdate(self):
1677db96d56Sopenharmony_ci        timeval = time.mktime((2011, 12, 1, 18, 0, 0, 4, 335, 0))
1687db96d56Sopenharmony_ci        string = utils.formatdate(timeval, localtime=False, usegmt=False)
1697db96d56Sopenharmony_ci        self.assertEqual(string, 'Thu, 01 Dec 2011 15:00:00 -0000')
1707db96d56Sopenharmony_ci        string = utils.formatdate(timeval, localtime=False, usegmt=True)
1717db96d56Sopenharmony_ci        self.assertEqual(string, 'Thu, 01 Dec 2011 15:00:00 GMT')
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_ci    @test.support.run_with_tz('Europe/Minsk')
1747db96d56Sopenharmony_ci    def test_formatdate_with_localtime(self):
1757db96d56Sopenharmony_ci        timeval = time.mktime((2011, 1, 1, 18, 0, 0, 6, 1, 0))
1767db96d56Sopenharmony_ci        string = utils.formatdate(timeval, localtime=True)
1777db96d56Sopenharmony_ci        self.assertEqual(string, 'Sat, 01 Jan 2011 18:00:00 +0200')
1787db96d56Sopenharmony_ci        # Minsk moved from +0200 (with DST) to +0300 (without DST) in 2011
1797db96d56Sopenharmony_ci        timeval = time.mktime((2011, 12, 1, 18, 0, 0, 4, 335, 0))
1807db96d56Sopenharmony_ci        string = utils.formatdate(timeval, localtime=True)
1817db96d56Sopenharmony_ci        self.assertEqual(string, 'Thu, 01 Dec 2011 18:00:00 +0300')
1827db96d56Sopenharmony_ci
1837db96d56Sopenharmony_ciif __name__ == '__main__':
1847db96d56Sopenharmony_ci    unittest.main()
185