diff options
| author | Daniel Hahler <git@thequod.de> | 2016-11-23 16:36:11 +0100 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2017-06-28 10:10:09 -0400 |
| commit | 43a4835edf32c57eb74c0eb207c276734a34abcf (patch) | |
| tree | df46a7430323734ae947295d0b636f1470186965 /tests/db_functions | |
| parent | 63e9a71ec4917ddf7f4acbf69a7ccdafb76fb2ee (diff) | |
Fixed #27473 -- Added DurationField support to Extract.
Diffstat (limited to 'tests/db_functions')
| -rw-r--r-- | tests/db_functions/test_datetime.py | 36 |
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)) |
