summaryrefslogtreecommitdiff
path: root/tests/db_functions
diff options
context:
space:
mode:
authorMads Jensen <mje@inducks.org>2016-11-11 14:01:40 +0100
committerTim Graham <timograham@gmail.com>2016-11-11 08:01:40 -0500
commit1446902be48ebf19bfe484371897a2815dd21fca (patch)
tree25945ce54301b3b33d4e975bfed5421ea5224d91 /tests/db_functions
parent2dc07da497f5ae95ad34a4714e330fae1fa8413c (diff)
Fixed #25240 -- Added ExtractWeek and exposed it through the __week lookup.
Thanks to Mariusz Felisiak and Tim Graham for review.
Diffstat (limited to 'tests/db_functions')
-rw-r--r--tests/db_functions/test_datetime.py60
1 files changed, 58 insertions, 2 deletions
diff --git a/tests/db_functions/test_datetime.py b/tests/db_functions/test_datetime.py
index f9a9a54c1c..a6c18438a6 100644
--- a/tests/db_functions/test_datetime.py
+++ b/tests/db_functions/test_datetime.py
@@ -9,8 +9,9 @@ from django.db import connection
from django.db.models import DateField, DateTimeField, IntegerField, TimeField
from django.db.models.functions import (
Extract, ExtractDay, ExtractHour, ExtractMinute, ExtractMonth,
- ExtractSecond, ExtractWeekDay, ExtractYear, Trunc, TruncDate, TruncDay,
- TruncHour, TruncMinute, TruncMonth, TruncSecond, TruncTime, TruncYear,
+ ExtractSecond, ExtractWeek, ExtractWeekDay, ExtractYear, Trunc, TruncDate,
+ TruncDay, TruncHour, TruncMinute, TruncMonth, TruncSecond, TruncTime,
+ TruncYear,
)
from django.test import TestCase, override_settings
from django.utils import timezone
@@ -167,6 +168,11 @@ class DateFunctionTests(TestCase):
lambda m: (m.start_datetime, m.extracted)
)
self.assertQuerysetEqual(
+ DTModel.objects.annotate(extracted=Extract('start_datetime', 'week')).order_by('start_datetime'),
+ [(start_datetime, 25), (end_datetime, 24)],
+ lambda m: (m.start_datetime, m.extracted)
+ )
+ self.assertQuerysetEqual(
DTModel.objects.annotate(extracted=Extract('start_datetime', 'week_day')).order_by('start_datetime'),
[
(start_datetime, (start_datetime.isoweekday() % 7) + 1),
@@ -254,6 +260,53 @@ class DateFunctionTests(TestCase):
)
self.assertEqual(DTModel.objects.filter(start_datetime__day=ExtractDay('start_datetime')).count(), 2)
+ def test_extract_week_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))
+ 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=ExtractWeek('start_datetime')).order_by('start_datetime'),
+ [(start_datetime, 25), (end_datetime, 24)],
+ lambda m: (m.start_datetime, m.extracted)
+ )
+ self.assertQuerysetEqual(
+ DTModel.objects.annotate(extracted=ExtractWeek('start_date')).order_by('start_datetime'),
+ [(start_datetime, 25), (end_datetime, 24)],
+ lambda m: (m.start_datetime, m.extracted)
+ )
+ # both dates are from the same week.
+ self.assertEqual(DTModel.objects.filter(start_datetime__week=ExtractWeek('start_datetime')).count(), 2)
+
+ def test_extract_week_func_boundaries(self):
+ end_datetime = microsecond_support(datetime(2016, 6, 15, 14, 10, 50, 123))
+ if settings.USE_TZ:
+ end_datetime = timezone.make_aware(end_datetime, is_dst=False)
+
+ week_52_day_2014 = microsecond_support(datetime(2014, 12, 27, 13, 0)) # Sunday
+ week_1_day_2014_2015 = microsecond_support(datetime(2014, 12, 31, 13, 0)) # Wednesday
+ week_53_day_2015 = microsecond_support(datetime(2015, 12, 31, 13, 0)) # Thursday
+ if settings.USE_TZ:
+ week_1_day_2014_2015 = timezone.make_aware(week_1_day_2014_2015, is_dst=False)
+ week_52_day_2014 = timezone.make_aware(week_52_day_2014, is_dst=False)
+ week_53_day_2015 = timezone.make_aware(week_53_day_2015, is_dst=False)
+
+ days = [week_52_day_2014, week_1_day_2014_2015, week_53_day_2015]
+ self.create_model(week_53_day_2015, end_datetime)
+ self.create_model(week_52_day_2014, end_datetime)
+ self.create_model(week_1_day_2014_2015, end_datetime)
+ qs = DTModel.objects.filter(start_datetime__in=days).annotate(
+ extracted=ExtractWeek('start_datetime'),
+ ).order_by('start_datetime')
+ self.assertQuerysetEqual(qs, [
+ (week_52_day_2014, 52),
+ (week_1_day_2014_2015, 1),
+ (week_53_day_2015, 53),
+ ], lambda m: (m.start_datetime, m.extracted))
+
def test_extract_weekday_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))
@@ -669,6 +722,7 @@ class DateFunctionWithTimeZoneTests(DateFunctionTests):
qs = DTModel.objects.annotate(
day=Extract('start_datetime', 'day'),
day_melb=Extract('start_datetime', 'day', tzinfo=melb),
+ week=Extract('start_datetime', 'week', tzinfo=melb),
weekday=ExtractWeekDay('start_datetime'),
weekday_melb=ExtractWeekDay('start_datetime', tzinfo=melb),
hour=ExtractHour('start_datetime'),
@@ -678,6 +732,7 @@ class DateFunctionWithTimeZoneTests(DateFunctionTests):
utc_model = qs.get()
self.assertEqual(utc_model.day, 15)
self.assertEqual(utc_model.day_melb, 16)
+ self.assertEqual(utc_model.week, 25)
self.assertEqual(utc_model.weekday, 2)
self.assertEqual(utc_model.weekday_melb, 3)
self.assertEqual(utc_model.hour, 23)
@@ -688,6 +743,7 @@ class DateFunctionWithTimeZoneTests(DateFunctionTests):
self.assertEqual(melb_model.day, 16)
self.assertEqual(melb_model.day_melb, 16)
+ self.assertEqual(melb_model.week, 25)
self.assertEqual(melb_model.weekday, 3)
self.assertEqual(melb_model.weekday_melb, 3)
self.assertEqual(melb_model.hour, 9)