Improved test helpers in truncated date/time field tests.

Co-authored-by: Lily Foote <code@lilyf.org>
This commit is contained in:
Shafiya Adzhani 2024-02-15 09:24:34 +01:00 committed by Mariusz Felisiak
parent 3cadeea077
commit 2aa8388110
1 changed files with 108 additions and 124 deletions

View File

@ -939,73 +939,74 @@ class DateFunctionTests(TestCase):
self.create_model(start_datetime, end_datetime) self.create_model(start_datetime, end_datetime)
self.create_model(end_datetime, start_datetime) self.create_model(end_datetime, start_datetime)
def test_datetime_kind(kind): def assertDatetimeKind(kind):
self.assertQuerySetEqual( truncated_start = truncate_to(start_datetime, kind)
DTModel.objects.annotate( truncated_end = truncate_to(end_datetime, kind)
truncated=Trunc( queryset = DTModel.objects.annotate(
"start_datetime", kind, output_field=DateTimeField() truncated=Trunc("start_datetime", kind, output_field=DateTimeField())
) ).order_by("start_datetime")
).order_by("start_datetime"), self.assertSequenceEqual(
queryset.values_list("start_datetime", "truncated"),
[ [
(start_datetime, truncate_to(start_datetime, kind)), (start_datetime, truncated_start),
(end_datetime, truncate_to(end_datetime, kind)), (end_datetime, truncated_end),
], ],
lambda m: (m.start_datetime, m.truncated),
) )
def test_date_kind(kind): def assertDateKind(kind):
self.assertQuerySetEqual( truncated_start = truncate_to(start_datetime.date(), kind)
DTModel.objects.annotate( truncated_end = truncate_to(end_datetime.date(), kind)
truncated=Trunc("start_date", kind, output_field=DateField()) queryset = DTModel.objects.annotate(
).order_by("start_datetime"), truncated=Trunc("start_date", kind, output_field=DateField())
).order_by("start_datetime")
self.assertSequenceEqual(
queryset.values_list("start_datetime", "truncated"),
[ [
(start_datetime, truncate_to(start_datetime.date(), kind)), (start_datetime, truncated_start),
(end_datetime, truncate_to(end_datetime.date(), kind)), (end_datetime, truncated_end),
], ],
lambda m: (m.start_datetime, m.truncated),
) )
def test_time_kind(kind): def assertTimeKind(kind):
self.assertQuerySetEqual( truncated_start = truncate_to(start_datetime.time(), kind)
DTModel.objects.annotate( truncated_end = truncate_to(end_datetime.time(), kind)
truncated=Trunc("start_time", kind, output_field=TimeField()) queryset = DTModel.objects.annotate(
).order_by("start_datetime"), truncated=Trunc("start_time", kind, output_field=TimeField())
).order_by("start_datetime")
self.assertSequenceEqual(
queryset.values_list("start_datetime", "truncated"),
[ [
(start_datetime, truncate_to(start_datetime.time(), kind)), (start_datetime, truncated_start),
(end_datetime, truncate_to(end_datetime.time(), kind)), (end_datetime, truncated_end),
], ],
lambda m: (m.start_datetime, m.truncated),
) )
def test_datetime_to_time_kind(kind): def assertDatetimeToTimeKind(kind):
self.assertQuerySetEqual( truncated_start = truncate_to(start_datetime.time(), kind)
DTModel.objects.annotate( truncated_end = truncate_to(end_datetime.time(), kind)
truncated=Trunc("start_datetime", kind, output_field=TimeField()), queryset = DTModel.objects.annotate(
).order_by("start_datetime"), truncated=Trunc("start_datetime", kind, output_field=TimeField()),
).order_by("start_datetime")
self.assertSequenceEqual(
queryset.values_list("start_datetime", "truncated"),
[ [
(start_datetime, truncate_to(start_datetime.time(), kind)), (start_datetime, truncated_start),
(end_datetime, truncate_to(end_datetime.time(), kind)), (end_datetime, truncated_end),
], ],
lambda m: (m.start_datetime, m.truncated),
) )
test_date_kind("year") date_truncations = ["year", "quarter", "month", "day"]
test_date_kind("quarter") time_truncations = ["hour", "minute", "second"]
test_date_kind("month") tests = [
test_date_kind("day") (assertDateKind, date_truncations),
test_time_kind("hour") (assertTimeKind, time_truncations),
test_time_kind("minute") (assertDatetimeKind, [*date_truncations, *time_truncations]),
test_time_kind("second") (assertDatetimeToTimeKind, time_truncations),
test_datetime_kind("year") ]
test_datetime_kind("quarter") for assertion, truncations in tests:
test_datetime_kind("month") for truncation in truncations:
test_datetime_kind("day") with self.subTest(assertion=assertion.__name__, truncation=truncation):
test_datetime_kind("hour") assertion(truncation)
test_datetime_kind("minute")
test_datetime_kind("second")
test_datetime_to_time_kind("hour")
test_datetime_to_time_kind("minute")
test_datetime_to_time_kind("second")
qs = DTModel.objects.filter( qs = DTModel.objects.filter(
start_datetime__date=Trunc( start_datetime__date=Trunc(
@ -1833,91 +1834,74 @@ class DateFunctionWithTimeZoneTests(DateFunctionTests):
self.create_model(end_datetime, start_datetime) self.create_model(end_datetime, start_datetime)
melb = zoneinfo.ZoneInfo("Australia/Melbourne") melb = zoneinfo.ZoneInfo("Australia/Melbourne")
def test_datetime_kind(kind): def assertDatetimeKind(kind):
self.assertQuerySetEqual( truncated_start = truncate_to(start_datetime.astimezone(melb), kind, melb)
DTModel.objects.annotate( truncated_end = truncate_to(end_datetime.astimezone(melb), kind, melb)
truncated=Trunc( queryset = DTModel.objects.annotate(
"start_datetime", truncated=Trunc(
kind, "start_datetime",
output_field=DateTimeField(), kind,
tzinfo=melb, output_field=DateTimeField(),
) tzinfo=melb,
).order_by("start_datetime"), )
).order_by("start_datetime")
self.assertSequenceEqual(
queryset.values_list("start_datetime", "truncated"),
[ [
( (start_datetime, truncated_start),
start_datetime, (end_datetime, truncated_end),
truncate_to(start_datetime.astimezone(melb), kind, melb),
),
(
end_datetime,
truncate_to(end_datetime.astimezone(melb), kind, melb),
),
], ],
lambda m: (m.start_datetime, m.truncated),
) )
def test_datetime_to_date_kind(kind): def assertDatetimeToDateKind(kind):
self.assertQuerySetEqual( truncated_start = truncate_to(start_datetime.astimezone(melb).date(), kind)
DTModel.objects.annotate( truncated_end = truncate_to(end_datetime.astimezone(melb).date(), kind)
truncated=Trunc( queryset = DTModel.objects.annotate(
"start_datetime", truncated=Trunc(
kind, "start_datetime",
output_field=DateField(), kind,
tzinfo=melb, output_field=DateField(),
), tzinfo=melb,
).order_by("start_datetime"), ),
).order_by("start_datetime")
self.assertSequenceEqual(
queryset.values_list("start_datetime", "truncated"),
[ [
( (start_datetime, truncated_start),
start_datetime, (end_datetime, truncated_end),
truncate_to(start_datetime.astimezone(melb).date(), kind),
),
(
end_datetime,
truncate_to(end_datetime.astimezone(melb).date(), kind),
),
], ],
lambda m: (m.start_datetime, m.truncated),
) )
def test_datetime_to_time_kind(kind): def assertDatetimeToTimeKind(kind):
self.assertQuerySetEqual( truncated_start = truncate_to(start_datetime.astimezone(melb).time(), kind)
DTModel.objects.annotate( truncated_end = truncate_to(end_datetime.astimezone(melb).time(), kind)
truncated=Trunc( queryset = DTModel.objects.annotate(
"start_datetime", truncated=Trunc(
kind, "start_datetime",
output_field=TimeField(), kind,
tzinfo=melb, output_field=TimeField(),
) tzinfo=melb,
).order_by("start_datetime"), )
).order_by("start_datetime")
self.assertSequenceEqual(
queryset.values_list("start_datetime", "truncated"),
[ [
( (start_datetime, truncated_start),
start_datetime, (end_datetime, truncated_end),
truncate_to(start_datetime.astimezone(melb).time(), kind),
),
(
end_datetime,
truncate_to(end_datetime.astimezone(melb).time(), kind),
),
], ],
lambda m: (m.start_datetime, m.truncated),
) )
test_datetime_to_date_kind("year") date_truncations = ["year", "quarter", "month", "week", "day"]
test_datetime_to_date_kind("quarter") time_truncations = ["hour", "minute", "second"]
test_datetime_to_date_kind("month") tests = [
test_datetime_to_date_kind("week") (assertDatetimeToDateKind, date_truncations),
test_datetime_to_date_kind("day") (assertDatetimeToTimeKind, time_truncations),
test_datetime_to_time_kind("hour") (assertDatetimeKind, [*date_truncations, *time_truncations]),
test_datetime_to_time_kind("minute") ]
test_datetime_to_time_kind("second") for assertion, truncations in tests:
test_datetime_kind("year") for truncation in truncations:
test_datetime_kind("quarter") with self.subTest(assertion=assertion.__name__, truncation=truncation):
test_datetime_kind("month") assertion(truncation)
test_datetime_kind("week")
test_datetime_kind("day")
test_datetime_kind("hour")
test_datetime_kind("minute")
test_datetime_kind("second")
qs = DTModel.objects.filter( qs = DTModel.objects.filter(
start_datetime__date=Trunc( start_datetime__date=Trunc(