tests/utils_tests/test_dateparse.py ¶
See also
$ find . -name "*dateparse.py" -print
./tests/utils_tests/test_dateparse.py
./django/utils/dateparse.py
tests/utils_tests/test_dateparse.py ¶
1import unittest
2from datetime import date, datetime, time, timedelta
3
4from django.utils.dateparse import (
5 parse_date,
6 parse_datetime,
7 parse_duration,
8 parse_time,
9)
10from django.utils.timezone import get_fixed_timezone
11
12
13class DateParseTests(unittest.TestCase):
14 def test_parse_date(self):
15 # Valid inputs
16 self.assertEqual(parse_date("2012-04-23"), date(2012, 4, 23))
17 self.assertEqual(parse_date("2012-4-9"), date(2012, 4, 9))
18 # Invalid inputs
19 self.assertIsNone(parse_date("20120423"))
20 with self.assertRaises(ValueError):
21 parse_date("2012-04-56")
22
23 def test_parse_time(self):
24 # Valid inputs
25 self.assertEqual(parse_time("09:15:00"), time(9, 15))
26 self.assertEqual(parse_time("10:10"), time(10, 10))
27 self.assertEqual(parse_time("10:20:30.400"), time(10, 20, 30, 400000))
28 self.assertEqual(parse_time("10:20:30,400"), time(10, 20, 30, 400000))
29 self.assertEqual(parse_time("4:8:16"), time(4, 8, 16))
30 # Invalid inputs
31 self.assertIsNone(parse_time("091500"))
32 with self.assertRaises(ValueError):
33 parse_time("09:15:90")
34
35 def test_parse_datetime(self):
36 valid_inputs = (
37 ("2012-04-23T09:15:00", datetime(2012, 4, 23, 9, 15)),
38 ("2012-4-9 4:8:16", datetime(2012, 4, 9, 4, 8, 16)),
39 (
40 "2012-04-23T09:15:00Z",
41 datetime(2012, 4, 23, 9, 15, 0, 0, get_fixed_timezone(0)),
42 ),
43 (
44 "2012-4-9 4:8:16-0320",
45 datetime(2012, 4, 9, 4, 8, 16, 0, get_fixed_timezone(-200)),
46 ),
47 (
48 "2012-04-23T10:20:30.400+02:30",
49 datetime(2012, 4, 23, 10, 20, 30, 400000, get_fixed_timezone(150)),
50 ),
51 (
52 "2012-04-23T10:20:30.400+02",
53 datetime(2012, 4, 23, 10, 20, 30, 400000, get_fixed_timezone(120)),
54 ),
55 (
56 "2012-04-23T10:20:30.400-02",
57 datetime(2012, 4, 23, 10, 20, 30, 400000, get_fixed_timezone(-120)),
58 ),
59 (
60 "2012-04-23T10:20:30,400-02",
61 datetime(2012, 4, 23, 10, 20, 30, 400000, get_fixed_timezone(-120)),
62 ),
63 )
64 for source, expected in valid_inputs:
65 with self.subTest(source=source):
66 self.assertEqual(parse_datetime(source), expected)
67
68 # Invalid inputs
69 self.assertIsNone(parse_datetime("20120423091500"))
70 with self.assertRaises(ValueError):
71 parse_datetime("2012-04-56T09:15:90")
72
73
74class DurationParseTests(unittest.TestCase):
75 def test_parse_python_format(self):
76 timedeltas = [
77 timedelta(
78 days=4, minutes=15, seconds=30, milliseconds=100
79 ), # fractions of seconds
80 timedelta(hours=10, minutes=15, seconds=30), # hours, minutes, seconds
81 timedelta(days=4, minutes=15, seconds=30), # multiple days
82 timedelta(days=1, minutes=00, seconds=00), # single day
83 timedelta(days=-4, minutes=15, seconds=30), # negative durations
84 timedelta(minutes=15, seconds=30), # minute & seconds
85 timedelta(seconds=30), # seconds
86 ]
87 for delta in timedeltas:
88 with self.subTest(delta=delta):
89 self.assertEqual(parse_duration(format(delta)), delta)
90
91 def test_parse_postgresql_format(self):
92 test_values = (
93 ("1 day", timedelta(1)),
94 ("1 day 0:00:01", timedelta(days=1, seconds=1)),
95 ("1 day -0:00:01", timedelta(days=1, seconds=-1)),
96 ("-1 day -0:00:01", timedelta(days=-1, seconds=-1)),
97 ("-1 day +0:00:01", timedelta(days=-1, seconds=1)),
98 (
99 "4 days 0:15:30.1",
100 timedelta(days=4, minutes=15, seconds=30, milliseconds=100),
101 ),
102 (
103 "4 days 0:15:30.0001",
104 timedelta(days=4, minutes=15, seconds=30, microseconds=100),
105 ),
106 ("-4 days -15:00:30", timedelta(days=-4, hours=-15, seconds=-30)),
107 )
108 for source, expected in test_values:
109 with self.subTest(source=source):
110 self.assertEqual(parse_duration(source), expected)
111
112 def test_seconds(self):
113 self.assertEqual(parse_duration("30"), timedelta(seconds=30))
114
115 def test_minutes_seconds(self):
116 self.assertEqual(parse_duration("15:30"), timedelta(minutes=15, seconds=30))
117 self.assertEqual(parse_duration("5:30"), timedelta(minutes=5, seconds=30))
118
119 def test_hours_minutes_seconds(self):
120 self.assertEqual(
121 parse_duration("10:15:30"), timedelta(hours=10, minutes=15, seconds=30)
122 )
123 self.assertEqual(
124 parse_duration("1:15:30"), timedelta(hours=1, minutes=15, seconds=30)
125 )
126 self.assertEqual(
127 parse_duration("100:200:300"),
128 timedelta(hours=100, minutes=200, seconds=300),
129 )
130
131 def test_days(self):
132 self.assertEqual(
133 parse_duration("4 15:30"), timedelta(days=4, minutes=15, seconds=30)
134 )
135 self.assertEqual(
136 parse_duration("4 10:15:30"),
137 timedelta(days=4, hours=10, minutes=15, seconds=30),
138 )
139
140 def test_fractions_of_seconds(self):
141 test_values = (
142 ("15:30.1", timedelta(minutes=15, seconds=30, milliseconds=100)),
143 ("15:30.01", timedelta(minutes=15, seconds=30, milliseconds=10)),
144 ("15:30.001", timedelta(minutes=15, seconds=30, milliseconds=1)),
145 ("15:30.0001", timedelta(minutes=15, seconds=30, microseconds=100)),
146 ("15:30.00001", timedelta(minutes=15, seconds=30, microseconds=10)),
147 ("15:30.000001", timedelta(minutes=15, seconds=30, microseconds=1)),
148 ("15:30,000001", timedelta(minutes=15, seconds=30, microseconds=1)),
149 )
150 for source, expected in test_values:
151 with self.subTest(source=source):
152 self.assertEqual(parse_duration(source), expected)
153
154 def test_negative(self):
155 test_values = (
156 ("-4 15:30", timedelta(days=-4, minutes=15, seconds=30)),
157 ("-172800", timedelta(days=-2)),
158 ("-15:30", timedelta(minutes=-15, seconds=-30)),
159 ("-1:15:30", timedelta(hours=-1, minutes=-15, seconds=-30)),
160 ("-30.1", timedelta(seconds=-30, milliseconds=-100)),
161 ("-30,1", timedelta(seconds=-30, milliseconds=-100)),
162 ("-00:01:01", timedelta(minutes=-1, seconds=-1)),
163 ("-01:01", timedelta(seconds=-61)),
164 ("-01:-01", None),
165 )
166 for source, expected in test_values:
167 with self.subTest(source=source):
168 self.assertEqual(parse_duration(source), expected)
169
170 def test_iso_8601(self):
171 test_values = (
172 ("P4Y", None),
173 ("P4M", None),
174 ("P4W", None),
175 ("P4D", timedelta(days=4)),
176 ("P0.5D", timedelta(hours=12)),
177 ("P0,5D", timedelta(hours=12)),
178 ("PT5H", timedelta(hours=5)),
179 ("PT5M", timedelta(minutes=5)),
180 ("PT5S", timedelta(seconds=5)),
181 ("PT0.000005S", timedelta(microseconds=5)),
182 ("PT0,000005S", timedelta(microseconds=5)),
183 )
184 for source, expected in test_values:
185 with self.subTest(source=source):
186 self.assertEqual(parse_duration(source), expected)
class DurationParseTests(unittest.TestCase) ¶
1import unittest
2from datetime import date, datetime, time, timedelta
3
4from django.utils.dateparse import (
5 parse_date,
6 parse_datetime,
7 parse_duration,
8 parse_time,
9)
10from django.utils.timezone import get_fixed_timezone
11
12
13class DurationParseTests(unittest.TestCase):
14 def test_parse_python_format(self):
15 timedeltas = [
16 timedelta(
17 days=4, minutes=15, seconds=30, milliseconds=100
18 ), # fractions of seconds
19 timedelta(hours=10, minutes=15, seconds=30), # hours, minutes, seconds
20 timedelta(days=4, minutes=15, seconds=30), # multiple days
21 timedelta(days=1, minutes=00, seconds=00), # single day
22 timedelta(days=-4, minutes=15, seconds=30), # negative durations
23 timedelta(minutes=15, seconds=30), # minute & seconds
24 timedelta(seconds=30), # seconds
25 ]
26 for delta in timedeltas:
27 with self.subTest(delta=delta):
28 self.assertEqual(parse_duration(format(delta)), delta)
29
30 def test_parse_postgresql_format(self):
31 test_values = (
32 ("1 day", timedelta(1)),
33 ("1 day 0:00:01", timedelta(days=1, seconds=1)),
34 ("1 day -0:00:01", timedelta(days=1, seconds=-1)),
35 ("-1 day -0:00:01", timedelta(days=-1, seconds=-1)),
36 ("-1 day +0:00:01", timedelta(days=-1, seconds=1)),
37 (
38 "4 days 0:15:30.1",
39 timedelta(days=4, minutes=15, seconds=30, milliseconds=100),
40 ),
41 (
42 "4 days 0:15:30.0001",
43 timedelta(days=4, minutes=15, seconds=30, microseconds=100),
44 ),
45 ("-4 days -15:00:30", timedelta(days=-4, hours=-15, seconds=-30)),
46 )
47 for source, expected in test_values:
48 with self.subTest(source=source):
49 self.assertEqual(parse_duration(source), expected)
50
51 def test_seconds(self):
52 self.assertEqual(parse_duration("30"), timedelta(seconds=30))
53
54 def test_minutes_seconds(self):
55 self.assertEqual(parse_duration("15:30"), timedelta(minutes=15, seconds=30))
56 self.assertEqual(parse_duration("5:30"), timedelta(minutes=5, seconds=30))
57
58 def test_hours_minutes_seconds(self):
59 self.assertEqual(
60 parse_duration("10:15:30"), timedelta(hours=10, minutes=15, seconds=30)
61 )
62 self.assertEqual(
63 parse_duration("1:15:30"), timedelta(hours=1, minutes=15, seconds=30)
64 )
65 self.assertEqual(
66 parse_duration("100:200:300"),
67 timedelta(hours=100, minutes=200, seconds=300),
68 )
69
70 def test_days(self):
71 self.assertEqual(
72 parse_duration("4 15:30"), timedelta(days=4, minutes=15, seconds=30)
73 )
74 self.assertEqual(
75 parse_duration("4 10:15:30"),
76 timedelta(days=4, hours=10, minutes=15, seconds=30),
77 )
78
79 def test_fractions_of_seconds(self):
80 test_values = (
81 ("15:30.1", timedelta(minutes=15, seconds=30, milliseconds=100)),
82 ("15:30.01", timedelta(minutes=15, seconds=30, milliseconds=10)),
83 ("15:30.001", timedelta(minutes=15, seconds=30, milliseconds=1)),
84 ("15:30.0001", timedelta(minutes=15, seconds=30, microseconds=100)),
85 ("15:30.00001", timedelta(minutes=15, seconds=30, microseconds=10)),
86 ("15:30.000001", timedelta(minutes=15, seconds=30, microseconds=1)),
87 ("15:30,000001", timedelta(minutes=15, seconds=30, microseconds=1)),
88 )
89 for source, expected in test_values:
90 with self.subTest(source=source):
91 self.assertEqual(parse_duration(source), expected)
92
93 def test_negative(self):
94 test_values = (
95 ("-4 15:30", timedelta(days=-4, minutes=15, seconds=30)),
96 ("-172800", timedelta(days=-2)),
97 ("-15:30", timedelta(minutes=-15, seconds=-30)),
98 ("-1:15:30", timedelta(hours=-1, minutes=-15, seconds=-30)),
99 ("-30.1", timedelta(seconds=-30, milliseconds=-100)),
100 ("-30,1", timedelta(seconds=-30, milliseconds=-100)),
101 ("-00:01:01", timedelta(minutes=-1, seconds=-1)),
102 ("-01:01", timedelta(seconds=-61)),
103 ("-01:-01", None),
104 )
105 for source, expected in test_values:
106 with self.subTest(source=source):
107 self.assertEqual(parse_duration(source), expected)
108
109 def test_iso_8601(self):
110 test_values = (
111 ("P4Y", None),
112 ("P4M", None),
113 ("P4W", None),
114 ("P4D", timedelta(days=4)),
115 ("P0.5D", timedelta(hours=12)),
116 ("P0,5D", timedelta(hours=12)),
117 ("PT5H", timedelta(hours=5)),
118 ("PT5M", timedelta(minutes=5)),
119 ("PT5S", timedelta(seconds=5)),
120 ("PT0.000005S", timedelta(microseconds=5)),
121 ("PT0,000005S", timedelta(microseconds=5)),
122 )
123 for source, expected in test_values:
124 with self.subTest(source=source):
125 self.assertEqual(parse_duration(source), expected)