summaryrefslogtreecommitdiff
path: root/tests/db_functions
diff options
context:
space:
mode:
authorDaniel Hahler <git@thequod.de>2016-11-23 16:36:11 +0100
committerTim Graham <timograham@gmail.com>2017-06-28 10:10:09 -0400
commit43a4835edf32c57eb74c0eb207c276734a34abcf (patch)
treedf46a7430323734ae947295d0b636f1470186965 /tests/db_functions
parent63e9a71ec4917ddf7f4acbf69a7ccdafb76fb2ee (diff)
Fixed #27473 -- Added DurationField support to Extract.
Diffstat (limited to 'tests/db_functions')
-rw-r--r--tests/db_functions/test_datetime.py36
1 files changed, 34 insertions, 2 deletions
diff --git a/tests/db_functions/test_datetime.py b/tests/db_functions/test_datetime.py
index a64eac75c9..f168f73c86 100644
--- a/tests/db_functions/test_datetime.py
+++ b/tests/db_functions/test_datetime.py
@@ -11,7 +11,9 @@ from django.db.models.functions import (
Trunc, TruncDate, TruncDay, TruncHour, TruncMinute, TruncMonth,
TruncQuarter, TruncSecond, TruncTime, TruncYear,
)
-from django.test import TestCase, override_settings
+from django.test import (
+ TestCase, override_settings, skipIfDBFeature, skipUnlessDBFeature,
+)
from django.utils import timezone
from .models import DTModel
@@ -147,7 +149,7 @@ class DateFunctionTests(TestCase):
with self.assertRaisesMessage(ValueError, 'lookup_name must be provided'):
Extract('start_datetime')
- msg = 'Extract input expression must be DateField, DateTimeField, or TimeField.'
+ msg = 'Extract input expression must be DateField, DateTimeField, TimeField, or DurationField.'
with self.assertRaisesMessage(ValueError, msg):
list(DTModel.objects.annotate(extracted=Extract('name', 'hour')))
@@ -208,6 +210,36 @@ class DateFunctionTests(TestCase):
self.assertEqual(DTModel.objects.filter(start_date__month=Extract('start_date', 'month')).count(), 2)
self.assertEqual(DTModel.objects.filter(start_time__hour=Extract('start_time', 'hour')).count(), 2)
+ @skipUnlessDBFeature('has_native_duration_field')
+ def test_extract_duration(self):
+ start_datetime = microsecond_support(datetime(2015, 6, 15, 14, 30, 50, 321))
+ end_datetime = microsecond_support(datetime(2016, 6, 15, 14, 10, 50, 123))
+ if settings.USE_TZ:
+ start_datetime = timezone.make_aware(start_datetime, is_dst=False)
+ end_datetime = timezone.make_aware(end_datetime, is_dst=False)
+ self.create_model(start_datetime, end_datetime)
+ self.create_model(end_datetime, start_datetime)
+ self.assertQuerysetEqual(
+ DTModel.objects.annotate(extracted=Extract('duration', 'second')).order_by('start_datetime'),
+ [
+ (start_datetime, (end_datetime - start_datetime).seconds % 60),
+ (end_datetime, (start_datetime - end_datetime).seconds % 60)
+ ],
+ lambda m: (m.start_datetime, m.extracted)
+ )
+ self.assertEqual(
+ DTModel.objects.annotate(
+ duration_days=Extract('duration', 'day'),
+ ).filter(duration_days__gt=200).count(),
+ 1
+ )
+
+ @skipIfDBFeature('has_native_duration_field')
+ def test_extract_duration_without_native_duration_field(self):
+ msg = 'Extract requires native DurationField database support.'
+ with self.assertRaisesMessage(ValueError, msg):
+ list(DTModel.objects.annotate(extracted=Extract('duration', 'second')))
+
def test_extract_year_func(self):
start_datetime = microsecond_support(datetime(2015, 6, 15, 14, 30, 50, 321))
end_datetime = microsecond_support(datetime(2016, 6, 15, 14, 10, 50, 123))