summaryrefslogtreecommitdiff
path: root/tests/utils_tests
diff options
context:
space:
mode:
authorMarc Tamlyn <marc.tamlyn@gmail.com>2014-07-24 13:57:24 +0100
committerMarc Tamlyn <marc.tamlyn@gmail.com>2014-12-20 18:28:29 +0000
commit57554442fe3e209c135e15dda4ea45123e579e58 (patch)
tree0ef2cb0e3048d13b82e4c7e81192df6124556a44 /tests/utils_tests
parenta3d96bee36040975ded8e3bf02e33e48d06f1f16 (diff)
Fixed #2443 -- Added DurationField.
A field for storing periods of time - modeled in Python by timedelta. It is stored in the native interval data type on PostgreSQL and as a bigint of microseconds on other backends. Also includes significant changes to the internals of time related maths in expressions, including the removal of DateModifierNode. Thanks to Tim and Josh in particular for reviews.
Diffstat (limited to 'tests/utils_tests')
-rw-r--r--tests/utils_tests/test_dateparse.py44
-rw-r--r--tests/utils_tests/test_duration.py43
2 files changed, 85 insertions, 2 deletions
diff --git a/tests/utils_tests/test_dateparse.py b/tests/utils_tests/test_dateparse.py
index cdf91c039e..a224e3b174 100644
--- a/tests/utils_tests/test_dateparse.py
+++ b/tests/utils_tests/test_dateparse.py
@@ -1,9 +1,9 @@
from __future__ import unicode_literals
-from datetime import date, time, datetime
+from datetime import date, time, datetime, timedelta
import unittest
-from django.utils.dateparse import parse_date, parse_time, parse_datetime
+from django.utils.dateparse import parse_date, parse_time, parse_datetime, parse_duration
from django.utils.timezone import get_fixed_timezone
@@ -46,3 +46,43 @@ class DateParseTests(unittest.TestCase):
# Invalid inputs
self.assertEqual(parse_datetime('20120423091500'), None)
self.assertRaises(ValueError, parse_datetime, '2012-04-56T09:15:90')
+
+
+class DurationParseTests(unittest.TestCase):
+ def test_seconds(self):
+ self.assertEqual(parse_duration('30'), timedelta(seconds=30))
+
+ def test_minutes_seconds(self):
+ self.assertEqual(parse_duration('15:30'), timedelta(minutes=15, seconds=30))
+ self.assertEqual(parse_duration('5:30'), timedelta(minutes=5, seconds=30))
+
+ def test_hours_minutes_seconds(self):
+ self.assertEqual(parse_duration('10:15:30'), timedelta(hours=10, minutes=15, seconds=30))
+ self.assertEqual(parse_duration('1:15:30'), timedelta(hours=1, minutes=15, seconds=30))
+ self.assertEqual(parse_duration('100:200:300'), timedelta(hours=100, minutes=200, seconds=300))
+
+ def test_days(self):
+ self.assertEqual(parse_duration('4 15:30'), timedelta(days=4, minutes=15, seconds=30))
+ self.assertEqual(parse_duration('4 10:15:30'), timedelta(days=4, hours=10, minutes=15, seconds=30))
+
+ def test_fractions_of_seconds(self):
+ self.assertEqual(parse_duration('15:30.1'), timedelta(minutes=15, seconds=30, milliseconds=100))
+ self.assertEqual(parse_duration('15:30.01'), timedelta(minutes=15, seconds=30, milliseconds=10))
+ self.assertEqual(parse_duration('15:30.001'), timedelta(minutes=15, seconds=30, milliseconds=1))
+ self.assertEqual(parse_duration('15:30.0001'), timedelta(minutes=15, seconds=30, microseconds=100))
+ self.assertEqual(parse_duration('15:30.00001'), timedelta(minutes=15, seconds=30, microseconds=10))
+ self.assertEqual(parse_duration('15:30.000001'), timedelta(minutes=15, seconds=30, microseconds=1))
+
+ def test_negative(self):
+ self.assertEqual(parse_duration('-4 15:30'), timedelta(days=-4, minutes=15, seconds=30))
+
+ def test_iso_8601(self):
+ self.assertEqual(parse_duration('P4Y'), None)
+ self.assertEqual(parse_duration('P4M'), None)
+ self.assertEqual(parse_duration('P4W'), None)
+ self.assertEqual(parse_duration('P4D'), timedelta(days=4))
+ self.assertEqual(parse_duration('P0.5D'), timedelta(hours=12))
+ self.assertEqual(parse_duration('PT5H'), timedelta(hours=5))
+ self.assertEqual(parse_duration('PT5M'), timedelta(minutes=5))
+ self.assertEqual(parse_duration('PT5S'), timedelta(seconds=5))
+ self.assertEqual(parse_duration('PT0.000005S'), timedelta(microseconds=5))
diff --git a/tests/utils_tests/test_duration.py b/tests/utils_tests/test_duration.py
new file mode 100644
index 0000000000..559d2ef16f
--- /dev/null
+++ b/tests/utils_tests/test_duration.py
@@ -0,0 +1,43 @@
+import datetime
+import unittest
+
+from django.utils.dateparse import parse_duration
+from django.utils.duration import duration_string
+
+
+class TestDurationString(unittest.TestCase):
+
+ def test_simple(self):
+ duration = datetime.timedelta(hours=1, minutes=3, seconds=5)
+ self.assertEqual(duration_string(duration), '01:03:05')
+
+ def test_days(self):
+ duration = datetime.timedelta(days=1, hours=1, minutes=3, seconds=5)
+ self.assertEqual(duration_string(duration), '1 01:03:05')
+
+ def test_microseconds(self):
+ duration = datetime.timedelta(hours=1, minutes=3, seconds=5, microseconds=12345)
+ self.assertEqual(duration_string(duration), '01:03:05.012345')
+
+ def test_negative(self):
+ duration = datetime.timedelta(days=-1, hours=1, minutes=3, seconds=5)
+ self.assertEqual(duration_string(duration), '-1 01:03:05')
+
+
+class TestParseDurationRoundtrip(unittest.TestCase):
+
+ def test_simple(self):
+ duration = datetime.timedelta(hours=1, minutes=3, seconds=5)
+ self.assertEqual(parse_duration(duration_string(duration)), duration)
+
+ def test_days(self):
+ duration = datetime.timedelta(days=1, hours=1, minutes=3, seconds=5)
+ self.assertEqual(parse_duration(duration_string(duration)), duration)
+
+ def test_microseconds(self):
+ duration = datetime.timedelta(hours=1, minutes=3, seconds=5, microseconds=12345)
+ self.assertEqual(parse_duration(duration_string(duration)), duration)
+
+ def test_negative(self):
+ duration = datetime.timedelta(days=-1, hours=1, minutes=3, seconds=5)
+ self.assertEqual(parse_duration(duration_string(duration)), duration)