(root)/
Python-3.11.7/
Lib/
test/
test_email/
test_utils.py
       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()