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