1+ import django .template as django_template
2+ from django .template .engine import Engine
3+ from django .template .response import SimpleTemplateResponse
14from django .urls import reverse
2- from django .test import TestCase , Client
5+ from django .test import TestCase
36
47from . import models
58
69
710class IndexTest (TestCase ):
11+
812 def setUp (self ):
9- self .client = Client ()
1013 self .url = reverse ("secret_list" )
14+
1115 models .SecretFile .objects .create (filename = "foo.txt" , order = 1 , size = 1024 )
1216 models .SecretFile .objects .create (filename = "bar.txt" , order = 2 , size = 512 )
1317
@@ -34,3 +38,70 @@ def test_sorting_argument(self):
3438 # Nothing wrong happens with invalid sort argument
3539 response = self .client .get (self .url , {"sort" : "NOT EXISTING" })
3640 self .assertContains (response , "foo.txt" )
41+
42+
43+ class NullsTestCase (TestCase ):
44+ def setUp (self ):
45+ self .nulls_first_url = reverse ("nulls_first" )
46+ self .nulls_last_url = reverse ("nulls_last" )
47+
48+ models .SecretFile .objects .create (filename = "foo.txt" , order = 1 , size = 1024 )
49+ models .SecretFile .objects .create (filename = "bar.txt" , order = 2 , size = 512 )
50+
51+ def test_sorting_nulls_first (self ):
52+ """ Verify None sorted field_name is in firsts places when sorting in asc and desc order """
53+
54+ models .SecretFile .objects .create (filename = None , order = 3 , size = 512 )
55+ # asc order
56+ values = ["<SecretFile: #3 None>" , "<SecretFile: #2 bar.txt>" , "<SecretFile: #1 foo.txt>" ]
57+ response = self .client .get (
58+ self .nulls_first_url ,
59+ {"sort" : "filename" , "nulls_first" : True , "dir" : "asc" }
60+ )
61+ self .assertQuerysetEqual (list (response .context ["secret_files" ]), values )
62+
63+ # desc order
64+ values = ["<SecretFile: #3 None>" , "<SecretFile: #1 foo.txt>" , "<SecretFile: #2 bar.txt>" ]
65+ response = self .client .get (
66+ self .nulls_first_url ,
67+ {"sort" : "filename" , "nulls_first" : True , "dir" : "desc" }
68+ )
69+ self .assertQuerysetEqual (list (response .context ["secret_files" ]), values )
70+
71+ def test_sorting_nulls_last (self ):
72+ """ Verify None sorted field_name is in lasts places when sorting in asc and desc order """
73+
74+ models .SecretFile .objects .create (filename = None , order = 3 , size = 512 )
75+ # asc order
76+ values = ["<SecretFile: #2 bar.txt>" , "<SecretFile: #1 foo.txt>" , "<SecretFile: #3 None>" ]
77+ response = self .client .get (
78+ self .nulls_last_url ,
79+ {"sort" : "filename" , "nulls_last" : True , "dir" : "asc" }
80+ )
81+ self .assertQuerysetEqual (list (response .context ["secret_files" ]), values )
82+
83+ # desc order
84+ values = ["<SecretFile: #1 foo.txt>" , "<SecretFile: #2 bar.txt>" , "<SecretFile: #3 None>" ]
85+ response = self .client .get (
86+ self .nulls_last_url ,
87+ {"sort" : "filename" , "nulls_last" : True , "dir" : "desc" }
88+ )
89+ self .assertQuerysetEqual (list (response .context ["secret_files" ]), values )
90+
91+ def test_sorting_nulls_first_and_last (self ):
92+ """ Verify nulls_first and nulls_last autosort params can't be used at the same time """
93+
94+ engine = Engine (
95+ libraries = {'sorting_tags' : 'webstack_django_sorting.templatetags.sorting_tags' },
96+ context_processors = ['django.template.context_processors.request' ],
97+ )
98+ with self .assertRaises (django_template .TemplateSyntaxError ) as exc :
99+ template = engine .from_string ("""
100+ {% load sorting_tags %}
101+ {% autosort secret_files nulls_first=True nulls_last=True %}
102+ """ )
103+ response = SimpleTemplateResponse (
104+ template ,
105+ context = {'secret_files' : models .SecretFile .objects .all ()}
106+ )
107+ self .assertIn ("Can't set nulls_first and nulls_last simultaneously." , exc .exception .args )
0 commit comments