Skip to content

Commit 20a6a66

Browse files
committed
Use a nullable DateTime model field to test OrderingFilter's handling of nulls
1 parent ee0e6ba commit 20a6a66

File tree

2 files changed

+85
-72
lines changed

2 files changed

+85
-72
lines changed

tests/models.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ def formfield(self, **kwargs):
4141

4242
class User(models.Model):
4343
username = models.CharField(_('username'), max_length=255)
44-
first_name = SubCharField(max_length=100, null=True, blank=True)
45-
last_name = SubSubCharField(max_length=100, null=True, blank=True)
44+
first_name = SubCharField(max_length=100)
45+
last_name = SubSubCharField(max_length=100)
4646

4747
status = models.IntegerField(choices=STATUS_CHOICES, default=0)
4848

@@ -51,6 +51,8 @@ class User(models.Model):
5151

5252
favorite_books = models.ManyToManyField('Book', related_name='lovers')
5353

54+
last_login = models.DateTimeField(null=True)
55+
5456
def __str__(self):
5557
return self.username
5658

tests/test_filtering.py

Lines changed: 81 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1872,12 +1872,15 @@ def test_filtering(self):
18721872
class OrderingFilterTests(TestCase):
18731873

18741874
def setUp(self):
1875-
User.objects.create(username='alex', first_name='Alex', last_name='Allan', status=1)
1876-
User.objects.create(username='jacob', first_name='Jacob', last_name='Johnson', status=2)
1877-
User.objects.create(username='aaron', first_name='Aaron', last_name='Barrett', status=2)
1878-
User.objects.create(username='carl', first_name=None, last_name='Jung', status=0)
1875+
tz = timezone.utc
1876+
User.objects.create(username='alex', status=1, last_login=datetime.datetime(2020, 1, 1, tzinfo=tz))
1877+
User.objects.create(username='jacob', status=2, last_login=datetime.datetime(2020, 2, 1, tzinfo=tz))
1878+
User.objects.create(username='aaron', status=2, last_login=datetime.datetime(2020, 3, 1, tzinfo=tz))
1879+
User.objects.create(username='carl', status=0)
18791880

18801881
def test_ordering(self):
1882+
tz = timezone.utc
1883+
18811884
class F(FilterSet):
18821885
o = OrderingFilter(
18831886
fields=('username', )
@@ -1893,6 +1896,8 @@ class Meta:
18931896
self.assertEqual(list(names), ['aaron', 'alex', 'carl', 'jacob'])
18941897

18951898
def test_ordering_with_select_widget(self):
1899+
tz = timezone.utc
1900+
18961901
class F(FilterSet):
18971902
o = OrderingFilter(
18981903
widget=forms.Select,
@@ -1909,125 +1914,131 @@ class Meta:
19091914
self.assertEqual(list(names), ['aaron', 'alex', 'carl', 'jacob'])
19101915

19111916
def test_ordering_with_null(self):
1917+
tz = timezone.utc
1918+
19121919
class F(FilterSet):
19131920
o = OrderingFilter(
1914-
fields=('first_name', 'last_name')
1921+
fields=('last_login',)
19151922
)
19161923

19171924
class Meta:
19181925
model = User
1919-
fields = ['first_name', 'last_name']
1926+
fields = ['last_login']
19201927

19211928
qs = User.objects.all()
1922-
f = F({'o': 'first_name,last_name'}, queryset=qs)
1923-
names = f.qs.values_list('first_name', 'last_name')
1924-
self.assertEqual(list(names), [
1925-
(None, 'Jung'),
1926-
('Aaron', 'Barrett'),
1927-
('Alex', 'Allan'),
1928-
('Jacob', 'Johnson'),
1929+
f = F({'o': 'last_login'}, queryset=qs)
1930+
results = f.qs.values_list('username', 'last_login')
1931+
self.assertEqual(list(results), [
1932+
('carl', None),
1933+
('alex', datetime.datetime(2020, 1, 1, tzinfo=tz)),
1934+
('jacob', datetime.datetime(2020, 2, 1, tzinfo=tz)),
1935+
('aaron', datetime.datetime(2020, 3, 1, tzinfo=tz)),
19291936
])
19301937

1931-
f = F({'o': '-first_name,-last_name'}, queryset=qs)
1932-
names = f.qs.values_list('first_name', 'last_name')
1933-
self.assertEqual(list(names), [
1934-
('Jacob', 'Johnson'),
1935-
('Alex', 'Allan'),
1936-
('Aaron', 'Barrett'),
1937-
(None, 'Jung'),
1938+
f = F({'o': '-last_login'}, queryset=qs)
1939+
results = f.qs.values_list('username', 'last_login')
1940+
self.assertEqual(list(results), [
1941+
('aaron', datetime.datetime(2020, 3, 1, tzinfo=tz)),
1942+
('jacob', datetime.datetime(2020, 2, 1, tzinfo=tz)),
1943+
('alex', datetime.datetime(2020, 1, 1, tzinfo=tz)),
1944+
('carl', None),
19381945
])
19391946

19401947
def test_ordering_with_params_and_null(self):
1948+
tz = timezone.utc
1949+
19411950
class F(FilterSet):
19421951
o = OrderingFilter(
1943-
params=('first_name', 'last_name')
1952+
params=('last_login',)
19441953
)
19451954

19461955
class Meta:
19471956
model = User
1948-
fields = ['first_name', 'last_name']
1957+
fields = ['last_login']
19491958

19501959
qs = User.objects.all()
1951-
f = F({'o': 'first_name,last_name'}, queryset=qs)
1952-
names = f.qs.values_list('first_name', 'last_name')
1953-
self.assertEqual(list(names), [
1954-
(None, 'Jung'),
1955-
('Aaron', 'Barrett'),
1956-
('Alex', 'Allan'),
1957-
('Jacob', 'Johnson'),
1960+
f = F({'o': 'last_login'}, queryset=qs)
1961+
results = f.qs.values_list('username', 'last_login')
1962+
self.assertEqual(list(results), [
1963+
('carl', None),
1964+
('alex', datetime.datetime(2020, 1, 1, tzinfo=tz)),
1965+
('jacob', datetime.datetime(2020, 2, 1, tzinfo=tz)),
1966+
('aaron', datetime.datetime(2020, 3, 1, tzinfo=tz)),
19581967
])
19591968

1960-
f = F({'o': '-first_name,-last_name'}, queryset=qs)
1961-
names = f.qs.values_list('first_name', 'last_name')
1962-
self.assertEqual(list(names), [
1963-
('Jacob', 'Johnson'),
1964-
('Alex', 'Allan'),
1965-
('Aaron', 'Barrett'),
1966-
(None, 'Jung'),
1969+
f = F({'o': '-last_login'}, queryset=qs)
1970+
results = f.qs.values_list('username', 'last_login')
1971+
self.assertEqual(list(results), [
1972+
('aaron', datetime.datetime(2020, 3, 1, tzinfo=tz)),
1973+
('jacob', datetime.datetime(2020, 2, 1, tzinfo=tz)),
1974+
('alex', datetime.datetime(2020, 1, 1, tzinfo=tz)),
1975+
('carl', None),
19671976
])
19681977

19691978
def test_ordering_with_params_and_nulls_last(self):
1979+
tz = timezone.utc
1980+
19701981
class F(FilterSet):
19711982
o = OrderingFilter(
19721983
params={
1973-
'first_name': {'expr': expressions.F('first_name').asc(nulls_last=True)},
1974-
'last_name': {'expr': expressions.F('last_name').asc(nulls_last=True)}
1984+
'last_login': {'expr': expressions.F('last_login').asc(nulls_last=True)},
19751985
}
19761986
)
19771987

19781988
class Meta:
19791989
model = User
1980-
fields = ['first_name', 'last_name']
1990+
fields = ['last_login']
19811991

19821992
qs = User.objects.all()
1983-
f = F({'o': 'first_name,last_name'}, queryset=qs)
1984-
names = f.qs.values_list('first_name', 'last_name')
1985-
self.assertEqual(list(names), [
1986-
('Aaron', 'Barrett'),
1987-
('Alex', 'Allan'),
1988-
('Jacob', 'Johnson'),
1989-
(None, 'Jung'),
1993+
f = F({'o': 'last_login'}, queryset=qs)
1994+
results = f.qs.values_list('username', 'last_login')
1995+
self.assertEqual(list(results), [
1996+
('alex', datetime.datetime(2020, 1, 1, tzinfo=tz)),
1997+
('jacob', datetime.datetime(2020, 2, 1, tzinfo=tz)),
1998+
('aaron', datetime.datetime(2020, 3, 1, tzinfo=tz)),
1999+
('carl', None),
19902000
])
19912001

1992-
f = F({'o': '-first_name,-last_name'}, queryset=qs)
1993-
names = f.qs.values_list('first_name', 'last_name')
1994-
self.assertEqual(list(names), [
1995-
(None, 'Jung'),
1996-
('Jacob', 'Johnson'),
1997-
('Alex', 'Allan'),
1998-
('Aaron', 'Barrett'),
2002+
f = F({'o': '-last_login'}, queryset=qs)
2003+
results = f.qs.values_list('username', 'last_login')
2004+
self.assertEqual(list(results), [
2005+
('carl', None),
2006+
('aaron', datetime.datetime(2020, 3, 1, tzinfo=tz)),
2007+
('jacob', datetime.datetime(2020, 2, 1, tzinfo=tz)),
2008+
('alex', datetime.datetime(2020, 1, 1, tzinfo=tz)),
19992009
])
20002010

20012011
def test_ordering_with_params_and_desc_nulls_last(self):
2012+
tz = timezone.utc
2013+
20022014
class F(FilterSet):
20032015
o = OrderingFilter(
20042016
params={
2005-
'first_name': {'expr': expressions.F('first_name').desc(nulls_last=True)},
2006-
'last_name': {'expr': expressions.F('last_name').desc(nulls_last=True)}
2017+
'last_login': {'expr': expressions.F('last_login').desc(nulls_last=True)},
20072018
}
20082019
)
20092020

20102021
class Meta:
20112022
model = User
2012-
fields = ['first_name', 'last_name']
2023+
fields = ['last_login']
20132024

20142025
qs = User.objects.all()
2015-
f = F({'o': 'first_name,last_name'}, queryset=qs)
2016-
names = f.qs.values_list('first_name', 'last_name')
2017-
self.assertEqual(list(names), [
2018-
('Jacob', 'Johnson'),
2019-
('Alex', 'Allan'),
2020-
('Aaron', 'Barrett'),
2021-
(None, 'Jung'),
2026+
f = F({'o': 'last_login'}, queryset=qs)
2027+
results = f.qs.values_list('username', 'last_login')
2028+
self.assertEqual(list(results), [
2029+
('aaron', datetime.datetime(2020, 3, 1, tzinfo=tz)),
2030+
('jacob', datetime.datetime(2020, 2, 1, tzinfo=tz)),
2031+
('alex', datetime.datetime(2020, 1, 1, tzinfo=tz)),
2032+
('carl', None),
20222033
])
20232034

2024-
f = F({'o': '-first_name,-last_name'}, queryset=qs)
2025-
names = f.qs.values_list('first_name', 'last_name')
2026-
self.assertEqual(list(names), [
2027-
(None, 'Jung'),
2028-
('Aaron', 'Barrett'),
2029-
('Alex', 'Allan'),
2030-
('Jacob', 'Johnson'),
2035+
f = F({'o': '-last_login'}, queryset=qs)
2036+
results = f.qs.values_list('username', 'last_login')
2037+
self.assertEqual(list(results), [
2038+
('carl', None),
2039+
('alex', datetime.datetime(2020, 1, 1, tzinfo=tz)),
2040+
('jacob', datetime.datetime(2020, 2, 1, tzinfo=tz)),
2041+
('aaron', datetime.datetime(2020, 3, 1, tzinfo=tz)),
20312042
])
20322043

20332044

0 commit comments

Comments
 (0)