Skip to content

Commit

Permalink
Improved test helpers in truncated date/time field tests.
Browse files Browse the repository at this point in the history
Co-authored-by: Lily Foote <code@lilyf.org>
  • Loading branch information
2 people authored and felixxm committed Feb 15, 2024
1 parent 3cadeea commit 2aa8388
Showing 1 changed file with 108 additions and 124 deletions.
232 changes: 108 additions & 124 deletions tests/db_functions/datetime/test_extract_trunc.py
Expand Up @@ -939,73 +939,74 @@ def test_trunc_func(self):
self.create_model(start_datetime, end_datetime)
self.create_model(end_datetime, start_datetime)

def test_datetime_kind(kind):
self.assertQuerySetEqual(
DTModel.objects.annotate(
truncated=Trunc(
"start_datetime", kind, output_field=DateTimeField()
)
).order_by("start_datetime"),
def assertDatetimeKind(kind):
truncated_start = truncate_to(start_datetime, kind)
truncated_end = truncate_to(end_datetime, kind)
queryset = DTModel.objects.annotate(
truncated=Trunc("start_datetime", kind, output_field=DateTimeField())
).order_by("start_datetime")
self.assertSequenceEqual(
queryset.values_list("start_datetime", "truncated"),
[
(start_datetime, truncate_to(start_datetime, kind)),
(end_datetime, truncate_to(end_datetime, kind)),
(start_datetime, truncated_start),
(end_datetime, truncated_end),
],
lambda m: (m.start_datetime, m.truncated),
)

def test_date_kind(kind):
self.assertQuerySetEqual(
DTModel.objects.annotate(
truncated=Trunc("start_date", kind, output_field=DateField())
).order_by("start_datetime"),
def assertDateKind(kind):
truncated_start = truncate_to(start_datetime.date(), kind)
truncated_end = truncate_to(end_datetime.date(), kind)
queryset = DTModel.objects.annotate(
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)),
(end_datetime, truncate_to(end_datetime.date(), kind)),
(start_datetime, truncated_start),
(end_datetime, truncated_end),
],
lambda m: (m.start_datetime, m.truncated),
)

def test_time_kind(kind):
self.assertQuerySetEqual(
DTModel.objects.annotate(
truncated=Trunc("start_time", kind, output_field=TimeField())
).order_by("start_datetime"),
def assertTimeKind(kind):
truncated_start = truncate_to(start_datetime.time(), kind)
truncated_end = truncate_to(end_datetime.time(), kind)
queryset = DTModel.objects.annotate(
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)),
(end_datetime, truncate_to(end_datetime.time(), kind)),
(start_datetime, truncated_start),
(end_datetime, truncated_end),
],
lambda m: (m.start_datetime, m.truncated),
)

def test_datetime_to_time_kind(kind):
self.assertQuerySetEqual(
DTModel.objects.annotate(
truncated=Trunc("start_datetime", kind, output_field=TimeField()),
).order_by("start_datetime"),
def assertDatetimeToTimeKind(kind):
truncated_start = truncate_to(start_datetime.time(), kind)
truncated_end = truncate_to(end_datetime.time(), kind)
queryset = DTModel.objects.annotate(
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)),
(end_datetime, truncate_to(end_datetime.time(), kind)),
(start_datetime, truncated_start),
(end_datetime, truncated_end),
],
lambda m: (m.start_datetime, m.truncated),
)

test_date_kind("year")
test_date_kind("quarter")
test_date_kind("month")
test_date_kind("day")
test_time_kind("hour")
test_time_kind("minute")
test_time_kind("second")
test_datetime_kind("year")
test_datetime_kind("quarter")
test_datetime_kind("month")
test_datetime_kind("day")
test_datetime_kind("hour")
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")
date_truncations = ["year", "quarter", "month", "day"]
time_truncations = ["hour", "minute", "second"]
tests = [
(assertDateKind, date_truncations),
(assertTimeKind, time_truncations),
(assertDatetimeKind, [*date_truncations, *time_truncations]),
(assertDatetimeToTimeKind, time_truncations),
]
for assertion, truncations in tests:
for truncation in truncations:
with self.subTest(assertion=assertion.__name__, truncation=truncation):
assertion(truncation)

qs = DTModel.objects.filter(
start_datetime__date=Trunc(
Expand Down Expand Up @@ -1833,91 +1834,74 @@ def test_trunc_func_with_timezone(self):
self.create_model(end_datetime, start_datetime)
melb = zoneinfo.ZoneInfo("Australia/Melbourne")

def test_datetime_kind(kind):
self.assertQuerySetEqual(
DTModel.objects.annotate(
truncated=Trunc(
"start_datetime",
kind,
output_field=DateTimeField(),
tzinfo=melb,
)
).order_by("start_datetime"),
def assertDatetimeKind(kind):
truncated_start = truncate_to(start_datetime.astimezone(melb), kind, melb)
truncated_end = truncate_to(end_datetime.astimezone(melb), kind, melb)
queryset = DTModel.objects.annotate(
truncated=Trunc(
"start_datetime",
kind,
output_field=DateTimeField(),
tzinfo=melb,
)
).order_by("start_datetime")
self.assertSequenceEqual(
queryset.values_list("start_datetime", "truncated"),
[
(
start_datetime,
truncate_to(start_datetime.astimezone(melb), kind, melb),
),
(
end_datetime,
truncate_to(end_datetime.astimezone(melb), kind, melb),
),
(start_datetime, truncated_start),
(end_datetime, truncated_end),
],
lambda m: (m.start_datetime, m.truncated),
)

def test_datetime_to_date_kind(kind):
self.assertQuerySetEqual(
DTModel.objects.annotate(
truncated=Trunc(
"start_datetime",
kind,
output_field=DateField(),
tzinfo=melb,
),
).order_by("start_datetime"),
def assertDatetimeToDateKind(kind):
truncated_start = truncate_to(start_datetime.astimezone(melb).date(), kind)
truncated_end = truncate_to(end_datetime.astimezone(melb).date(), kind)
queryset = DTModel.objects.annotate(
truncated=Trunc(
"start_datetime",
kind,
output_field=DateField(),
tzinfo=melb,
),
).order_by("start_datetime")
self.assertSequenceEqual(
queryset.values_list("start_datetime", "truncated"),
[
(
start_datetime,
truncate_to(start_datetime.astimezone(melb).date(), kind),
),
(
end_datetime,
truncate_to(end_datetime.astimezone(melb).date(), kind),
),
(start_datetime, truncated_start),
(end_datetime, truncated_end),
],
lambda m: (m.start_datetime, m.truncated),
)

def test_datetime_to_time_kind(kind):
self.assertQuerySetEqual(
DTModel.objects.annotate(
truncated=Trunc(
"start_datetime",
kind,
output_field=TimeField(),
tzinfo=melb,
)
).order_by("start_datetime"),
def assertDatetimeToTimeKind(kind):
truncated_start = truncate_to(start_datetime.astimezone(melb).time(), kind)
truncated_end = truncate_to(end_datetime.astimezone(melb).time(), kind)
queryset = DTModel.objects.annotate(
truncated=Trunc(
"start_datetime",
kind,
output_field=TimeField(),
tzinfo=melb,
)
).order_by("start_datetime")
self.assertSequenceEqual(
queryset.values_list("start_datetime", "truncated"),
[
(
start_datetime,
truncate_to(start_datetime.astimezone(melb).time(), kind),
),
(
end_datetime,
truncate_to(end_datetime.astimezone(melb).time(), kind),
),
(start_datetime, truncated_start),
(end_datetime, truncated_end),
],
lambda m: (m.start_datetime, m.truncated),
)

test_datetime_to_date_kind("year")
test_datetime_to_date_kind("quarter")
test_datetime_to_date_kind("month")
test_datetime_to_date_kind("week")
test_datetime_to_date_kind("day")
test_datetime_to_time_kind("hour")
test_datetime_to_time_kind("minute")
test_datetime_to_time_kind("second")
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")
test_datetime_kind("second")
date_truncations = ["year", "quarter", "month", "week", "day"]
time_truncations = ["hour", "minute", "second"]
tests = [
(assertDatetimeToDateKind, date_truncations),
(assertDatetimeToTimeKind, time_truncations),
(assertDatetimeKind, [*date_truncations, *time_truncations]),
]
for assertion, truncations in tests:
for truncation in truncations:
with self.subTest(assertion=assertion.__name__, truncation=truncation):
assertion(truncation)

qs = DTModel.objects.filter(
start_datetime__date=Trunc(
Expand Down

0 comments on commit 2aa8388

Please sign in to comment.