1. import datetime
    
  2. import unittest
    
  3. 
    
  4. from django.utils.dateparse import parse_duration
    
  5. from django.utils.duration import (
    
  6.     duration_iso_string,
    
  7.     duration_microseconds,
    
  8.     duration_string,
    
  9. )
    
  10. 
    
  11. 
    
  12. class TestDurationString(unittest.TestCase):
    
  13.     def test_simple(self):
    
  14.         duration = datetime.timedelta(hours=1, minutes=3, seconds=5)
    
  15.         self.assertEqual(duration_string(duration), "01:03:05")
    
  16. 
    
  17.     def test_days(self):
    
  18.         duration = datetime.timedelta(days=1, hours=1, minutes=3, seconds=5)
    
  19.         self.assertEqual(duration_string(duration), "1 01:03:05")
    
  20. 
    
  21.     def test_microseconds(self):
    
  22.         duration = datetime.timedelta(hours=1, minutes=3, seconds=5, microseconds=12345)
    
  23.         self.assertEqual(duration_string(duration), "01:03:05.012345")
    
  24. 
    
  25.     def test_negative(self):
    
  26.         duration = datetime.timedelta(days=-1, hours=1, minutes=3, seconds=5)
    
  27.         self.assertEqual(duration_string(duration), "-1 01:03:05")
    
  28. 
    
  29. 
    
  30. class TestParseDurationRoundtrip(unittest.TestCase):
    
  31.     def test_simple(self):
    
  32.         duration = datetime.timedelta(hours=1, minutes=3, seconds=5)
    
  33.         self.assertEqual(parse_duration(duration_string(duration)), duration)
    
  34. 
    
  35.     def test_days(self):
    
  36.         duration = datetime.timedelta(days=1, hours=1, minutes=3, seconds=5)
    
  37.         self.assertEqual(parse_duration(duration_string(duration)), duration)
    
  38. 
    
  39.     def test_microseconds(self):
    
  40.         duration = datetime.timedelta(hours=1, minutes=3, seconds=5, microseconds=12345)
    
  41.         self.assertEqual(parse_duration(duration_string(duration)), duration)
    
  42. 
    
  43.     def test_negative(self):
    
  44.         duration = datetime.timedelta(days=-1, hours=1, minutes=3, seconds=5)
    
  45.         self.assertEqual(parse_duration(duration_string(duration)), duration)
    
  46. 
    
  47. 
    
  48. class TestISODurationString(unittest.TestCase):
    
  49.     def test_simple(self):
    
  50.         duration = datetime.timedelta(hours=1, minutes=3, seconds=5)
    
  51.         self.assertEqual(duration_iso_string(duration), "P0DT01H03M05S")
    
  52. 
    
  53.     def test_days(self):
    
  54.         duration = datetime.timedelta(days=1, hours=1, minutes=3, seconds=5)
    
  55.         self.assertEqual(duration_iso_string(duration), "P1DT01H03M05S")
    
  56. 
    
  57.     def test_microseconds(self):
    
  58.         duration = datetime.timedelta(hours=1, minutes=3, seconds=5, microseconds=12345)
    
  59.         self.assertEqual(duration_iso_string(duration), "P0DT01H03M05.012345S")
    
  60. 
    
  61.     def test_negative(self):
    
  62.         duration = -1 * datetime.timedelta(days=1, hours=1, minutes=3, seconds=5)
    
  63.         self.assertEqual(duration_iso_string(duration), "-P1DT01H03M05S")
    
  64. 
    
  65. 
    
  66. class TestParseISODurationRoundtrip(unittest.TestCase):
    
  67.     def test_simple(self):
    
  68.         duration = datetime.timedelta(hours=1, minutes=3, seconds=5)
    
  69.         self.assertEqual(parse_duration(duration_iso_string(duration)), duration)
    
  70. 
    
  71.     def test_days(self):
    
  72.         duration = datetime.timedelta(days=1, hours=1, minutes=3, seconds=5)
    
  73.         self.assertEqual(parse_duration(duration_iso_string(duration)), duration)
    
  74. 
    
  75.     def test_microseconds(self):
    
  76.         duration = datetime.timedelta(hours=1, minutes=3, seconds=5, microseconds=12345)
    
  77.         self.assertEqual(parse_duration(duration_iso_string(duration)), duration)
    
  78. 
    
  79.     def test_negative(self):
    
  80.         duration = datetime.timedelta(days=-1, hours=1, minutes=3, seconds=5)
    
  81.         self.assertEqual(
    
  82.             parse_duration(duration_iso_string(duration)).total_seconds(),
    
  83.             duration.total_seconds(),
    
  84.         )
    
  85. 
    
  86. 
    
  87. class TestDurationMicroseconds(unittest.TestCase):
    
  88.     def test(self):
    
  89.         deltas = [
    
  90.             datetime.timedelta.max,
    
  91.             datetime.timedelta.min,
    
  92.             datetime.timedelta.resolution,
    
  93.             -datetime.timedelta.resolution,
    
  94.             datetime.timedelta(microseconds=8999999999999999),
    
  95.         ]
    
  96.         for delta in deltas:
    
  97.             with self.subTest(delta=delta):
    
  98.                 self.assertEqual(
    
  99.                     datetime.timedelta(microseconds=duration_microseconds(delta)), delta
    
  100.                 )