diff options
| author | Sigurd Ljødal <sigurd@ljodal.no> | 2017-09-28 22:39:03 +0200 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2018-01-27 09:59:13 -0500 |
| commit | a455e732a0011dfbd15eddaa4fe60cb9439326e0 (patch) | |
| tree | 1df72fb36c377ae630e1bbc8a588662f8f3cb46f /tests | |
| parent | f229049d6cd186025f4033dc47608b0c9731e882 (diff) | |
Fixed #28650 -- Added TruncWeek database function.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/dates/tests.py | 9 | ||||
| -rw-r--r-- | tests/datetimes/tests.py | 9 | ||||
| -rw-r--r-- | tests/db_functions/test_datetime.py | 36 |
3 files changed, 51 insertions, 3 deletions
diff --git a/tests/dates/tests.py b/tests/dates/tests.py index 9cb77fe9e2..ebdf05812e 100644 --- a/tests/dates/tests.py +++ b/tests/dates/tests.py @@ -56,6 +56,12 @@ class DatesTests(TestCase): ], ) self.assertSequenceEqual( + Comment.objects.dates("article__pub_date", "week"), [ + datetime.date(2005, 7, 25), + datetime.date(2010, 7, 26), + ], + ) + self.assertSequenceEqual( Comment.objects.dates("article__pub_date", "day"), [ datetime.date(2005, 7, 28), datetime.date(2010, 7, 28), @@ -93,7 +99,8 @@ class DatesTests(TestCase): ) def test_dates_fails_when_given_invalid_kind_argument(self): - with self.assertRaisesMessage(AssertionError, "'kind' must be one of 'year', 'month' or 'day'."): + msg = "'kind' must be one of 'year', 'month', 'week', or 'day'." + with self.assertRaisesMessage(AssertionError, msg): Article.objects.dates("pub_date", "bad_kind") def test_dates_fails_when_given_invalid_order_argument(self): diff --git a/tests/datetimes/tests.py b/tests/datetimes/tests.py index 50a83f0371..a9f1199f06 100644 --- a/tests/datetimes/tests.py +++ b/tests/datetimes/tests.py @@ -54,6 +54,12 @@ class DateTimesTests(TestCase): ], ) self.assertSequenceEqual( + Comment.objects.datetimes("article__pub_date", "week"), [ + datetime.datetime(2005, 7, 25), + datetime.datetime(2010, 7, 26), + ], + ) + self.assertSequenceEqual( Comment.objects.datetimes("article__pub_date", "day"), [ datetime.datetime(2005, 7, 28), datetime.datetime(2010, 7, 28), @@ -99,6 +105,9 @@ class DateTimesTests(TestCase): Article.objects.datetimes('pub_date', 'month'), ["datetime.datetime(2005, 7, 1, 0, 0)"]) self.assertQuerysetEqual( + Article.objects.datetimes('pub_date', 'week'), + ["datetime.datetime(2005, 7, 25, 0, 0)"]) + self.assertQuerysetEqual( Article.objects.datetimes('pub_date', 'day'), ["datetime.datetime(2005, 7, 28, 0, 0)", "datetime.datetime(2005, 7, 29, 0, 0)", diff --git a/tests/db_functions/test_datetime.py b/tests/db_functions/test_datetime.py index e2f786bf6b..dc4c911ab9 100644 --- a/tests/db_functions/test_datetime.py +++ b/tests/db_functions/test_datetime.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import datetime, timedelta import pytz @@ -8,7 +8,7 @@ from django.db.models.functions import ( Extract, ExtractDay, ExtractHour, ExtractMinute, ExtractMonth, ExtractQuarter, ExtractSecond, ExtractWeek, ExtractWeekDay, ExtractYear, Trunc, TruncDate, TruncDay, TruncHour, TruncMinute, TruncMonth, - TruncQuarter, TruncSecond, TruncTime, TruncYear, + TruncQuarter, TruncSecond, TruncTime, TruncWeek, TruncYear, ) from django.test import ( TestCase, override_settings, skipIfDBFeature, skipUnlessDBFeature, @@ -34,6 +34,10 @@ def truncate_to(value, kind, tzinfo=None): if isinstance(value, datetime): return value.replace(hour=0, minute=0, second=0, microsecond=0) return value + if kind == 'week': + if isinstance(value, datetime): + return (value - timedelta(days=value.weekday())).replace(hour=0, minute=0, second=0, microsecond=0) + return value - timedelta(days=value.weekday()) if kind == 'month': if isinstance(value, datetime): return value.replace(day=1, hour=0, minute=0, second=0, microsecond=0) @@ -536,6 +540,7 @@ class DateFunctionTests(TestCase): test_date_kind('year') test_date_kind('quarter') test_date_kind('month') + test_date_kind('week') test_date_kind('day') test_time_kind('hour') test_time_kind('minute') @@ -543,6 +548,7 @@ class DateFunctionTests(TestCase): test_datetime_kind('year') test_datetime_kind('quarter') test_datetime_kind('month') + test_datetime_kind('week') test_datetime_kind('day') test_datetime_kind('hour') test_datetime_kind('minute') @@ -656,6 +662,30 @@ class DateFunctionTests(TestCase): with self.assertRaisesMessage(ValueError, "Cannot truncate TimeField 'start_time' to DateTimeField"): list(DTModel.objects.annotate(truncated=TruncMonth('start_time', output_field=TimeField()))) + def test_trunc_week_func(self): + start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) + end_datetime = truncate_to(datetime(2016, 6, 15, 14, 10, 50, 123), 'week') + 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=TruncWeek('start_datetime')).order_by('start_datetime'), + [ + (start_datetime, truncate_to(start_datetime, 'week')), + (end_datetime, truncate_to(end_datetime, 'week')), + ], + lambda m: (m.start_datetime, m.extracted) + ) + self.assertEqual(DTModel.objects.filter(start_datetime=TruncWeek('start_datetime')).count(), 1) + + with self.assertRaisesMessage(ValueError, "Cannot truncate TimeField 'start_time' to DateTimeField"): + list(DTModel.objects.annotate(truncated=TruncWeek('start_time'))) + + with self.assertRaisesMessage(ValueError, "Cannot truncate TimeField 'start_time' to DateTimeField"): + list(DTModel.objects.annotate(truncated=TruncWeek('start_time', output_field=TimeField()))) + def test_trunc_date_func(self): start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321) end_datetime = datetime(2016, 6, 15, 14, 10, 50, 123) @@ -960,6 +990,7 @@ class DateFunctionWithTimeZoneTests(DateFunctionTests): test_date_kind('year') test_date_kind('quarter') test_date_kind('month') + test_date_kind('week') test_date_kind('day') test_time_kind('hour') test_time_kind('minute') @@ -967,6 +998,7 @@ class DateFunctionWithTimeZoneTests(DateFunctionTests): test_datetime_kind('year') test_datetime_kind('quarter') test_datetime_kind('month') + test_datetime_kind('week') test_datetime_kind('day') test_datetime_kind('hour') test_datetime_kind('minute') |
