1111
1212from djqscsv_tests .context import SELECT , EXCLUDE , AS , CONSTANT
1313
14- from djqscsv_tests .models import Person
15-
1614from djqscsv_tests .util import create_people_and_get_queryset
1715
1816from django .utils import six
2321else :
2422 from StringIO import StringIO
2523
24+
2625class CSVTestCase (TestCase ):
2726
2827 def setUp (self ):
@@ -38,7 +37,8 @@ def csv_match(self, csv_file, expected_data, **csv_kwargs):
3837 for csv_row , expected_row in test_pairs :
3938 if is_first :
4039 # add the BOM to the data
41- expected_row = ['\xef \xbb \xbf ' + expected_row [0 ]] + expected_row [1 :]
40+ expected_row = (['\xef \xbb \xbf ' + expected_row [0 ]] +
41+ expected_row [1 :])
4242 is_first = False
4343 iteration_happened = True
4444 assertion_results .append (csv_row == expected_row )
@@ -55,7 +55,6 @@ def assertNotMatchesCsv(self, *args, **kwargs):
5555 assertion_results = self .csv_match (* args , ** kwargs )
5656 self .assertFalse (all (assertion_results ))
5757
58-
5958 def assertQuerySetBecomesCsv (self , qs , expected_data , ** kwargs ):
6059 obj = StringIO ()
6160 djqscsv .write_csv (qs , obj , ** kwargs )
@@ -68,27 +67,30 @@ def assertEmptyQuerySetMatches(self, expected_data, **kwargs):
6867 if DJANGO_VERSION [:2 ] == (1 , 5 ):
6968 with self .assertRaises (djqscsv .CSVException ):
7069 djqscsv .write_csv (qs , obj )
71- elif DJANGO_VERSION [: 2 ] == ( 1 , 6 ) :
70+ else :
7271 djqscsv .write_csv (qs , obj ,
7372 ** kwargs )
7473 self .assertEqual (obj .getvalue (), expected_data )
7574
76-
7775 # the csv data that is returned by the most inclusive query under test.
7876 # use this data structure to build smaller data sets
7977 BASE_CSV = [
8078 ['id' , 'name' , 'address' ,
81- 'info' , 'hobby_id' , 'hobby__name' , 'Most Powerful' ],
82- ['1' , 'vetch' , 'iffish' , 'wizard' , '1' , 'Doing Magic' , '0' ],
83- ['2' , 'nemmerle' , 'roke' , 'deceased arch mage' , '2' , 'Resting' , '1' ],
84- ['3' , 'ged' , 'gont' , 'former arch mage' , '2' , 'Resting' , '1' ]]
79+ 'info' , 'hobby_id' , 'born' , 'hobby__name' , 'Most Powerful' ],
80+ ['1' , 'vetch' , 'iffish' ,
81+ 'wizard' , '1' , '2001-01-01T01:01:00' , 'Doing Magic' , '0' ],
82+ ['2' , 'nemmerle' , 'roke' ,
83+ 'deceased arch mage' , '2' , '2001-01-01T01:01:00' , 'Resting' , '1' ],
84+ ['3' , 'ged' , 'gont' ,
85+ 'former arch mage' , '2' , '2001-01-01T01:01:00' , 'Resting' , '1' ]]
8586
8687 FULL_PERSON_CSV_WITH_RELATED = SELECT (BASE_CSV ,
8788 AS ('id' , 'ID' ),
8889 AS ('name' , 'Person\' s name' ),
8990 'address' ,
9091 AS ('info' , 'Info on Person' ),
9192 'hobby_id' ,
93+ 'born' ,
9294 'hobby__name' )
9395
9496 FULL_PERSON_CSV = EXCLUDE (FULL_PERSON_CSV_WITH_RELATED ,
@@ -115,11 +117,11 @@ def test_write_csv_full_no_verbose(self):
115117 def test_write_csv_limited_no_verbose (self ):
116118 qs = self .qs .values ('name' , 'address' , 'info' )
117119 self .assertQuerySetBecomesCsv (qs , self .LIMITED_PERSON_CSV_NO_VERBOSE ,
118- use_verbose_names = False )
120+ use_verbose_names = False )
119121
120122 def test_empty_queryset_no_verbose (self ):
121123 self .assertEmptyQuerySetMatches (
122- '\xef \xbb \xbf id,name,address,info,hobby_id\r \n ' ,
124+ '\xef \xbb \xbf id,name,address,info,hobby_id,born \r \n ' ,
123125 use_verbose_names = False )
124126
125127
@@ -135,13 +137,18 @@ def test_write_csv_limited(self):
135137 def test_empty_queryset (self ):
136138 self .assertEmptyQuerySetMatches (
137139 '\xef \xbb \xbf ID,Person\' s name,address,'
138- 'Info on Person,hobby_id\r \n ' )
140+ 'Info on Person,hobby_id,born\r \n ' )
141+
139142
140143class FieldHeaderMapTests (CSVTestCase ):
141144 def test_write_csv_full_custom_headers (self ):
142- overridden_info_csv = ([['ID' , "Person's name" , 'address' ,
143- 'INFORMATION' , 'hobby_id' ]] +
144- self .FULL_PERSON_CSV [1 :])
145+ overridden_info_csv = SELECT (self .FULL_PERSON_CSV ,
146+ 'ID' ,
147+ "Person's name" ,
148+ 'address' ,
149+ AS ('Info on Person' , 'INFORMATION' ),
150+ 'hobby_id' ,
151+ 'born' )
145152
146153 self .assertQuerySetBecomesCsv (
147154 self .qs , overridden_info_csv ,
@@ -155,8 +162,7 @@ def test_write_csv_limited_custom_headers(self):
155162
156163 self .assertQuerySetBecomesCsv (
157164 qs , overridden_info_csv ,
158- field_header_map = { 'info' : 'INFORMATION' })
159-
165+ field_header_map = {'info' : 'INFORMATION' })
160166
161167 def test_write_csv_with_related_custom_headers (self ):
162168 overridden_csv = SELECT (self .FULL_PERSON_CSV_WITH_RELATED ,
@@ -166,23 +172,25 @@ def test_write_csv_with_related_custom_headers(self):
166172
167173 self .assertQuerySetBecomesCsv (
168174 qs , overridden_csv ,
169- field_header_map = { 'hobby__name' : 'Name of Activity' })
175+ field_header_map = {'hobby__name' : 'Name of Activity' })
170176
171177 def test_empty_queryset_custom_headers (self ):
172178 self .assertEmptyQuerySetMatches (
173- '\xef \xbb \xbf ID,Person\' s name,address,INFORMATION,hobby_id\r \n ' ,
174- field_header_map = { 'info' : 'INFORMATION' })
179+ '\xef \xbb \xbf ID,Person\' s name,'
180+ 'address,INFORMATION,hobby_id,born\r \n ' ,
181+ field_header_map = {'info' : 'INFORMATION' })
175182
176183
177184class WalkRelationshipTests (CSVTestCase ):
178185
179186 def test_with_related (self ):
180187
181188 qs = self .qs .values ('id' , 'name' , 'address' , 'info' ,
182- 'hobby_id' , 'hobby__name' )
189+ 'hobby_id' , 'born' , ' hobby__name' )
183190
184191 self .assertQuerySetBecomesCsv (qs , self .FULL_PERSON_CSV_WITH_RELATED )
185192
193+
186194class ColumnOrderingTests (CSVTestCase ):
187195 def setUp (self ):
188196 self .qs = create_people_and_get_queryset ()
@@ -208,16 +216,17 @@ def test_no_values_matches_models_file(self):
208216 'name' ,
209217 'address' ,
210218 'info' ,
211- 'hobby_id' )
212-
219+ 'hobby_id' ,
220+ 'born' )
213221 self .assertQuerySetBecomesCsv (self .qs , csv ,
214222 use_verbose_names = False )
215223
216224
217225class AggregateTests (CSVTestCase ):
218226
219227 def setUp (self ):
220- self .qs = create_people_and_get_queryset ().annotate (num_hobbies = Count ('hobby' ))
228+ self .qs = (create_people_and_get_queryset ()
229+ .annotate (num_hobbies = Count ('hobby' )))
221230
222231 def test_aggregate (self ):
223232 csv_with_aggregate = SELECT (self .FULL_PERSON_CSV ,
@@ -226,6 +235,7 @@ def test_aggregate(self):
226235 'address' ,
227236 "Info on Person" ,
228237 'hobby_id' ,
238+ 'born' ,
229239 CONSTANT ('1' , 'num_hobbies' ))
230240 self .assertQuerySetBecomesCsv (self .qs , csv_with_aggregate )
231241
@@ -234,7 +244,7 @@ class ExtraOrderingTests(CSVTestCase):
234244
235245 def setUp (self ):
236246 self .qs = create_people_and_get_queryset ().extra (
237- select = {'Most Powerful' :"info LIKE '%arch mage%'" })
247+ select = {'Most Powerful' : "info LIKE '%arch mage%'" })
238248
239249 def test_extra_select (self ):
240250 csv_with_extra = SELECT (self .BASE_CSV ,
@@ -243,19 +253,20 @@ def test_extra_select(self):
243253 'address' ,
244254 AS ('info' , 'Info on Person' ),
245255 'hobby_id' ,
256+ 'born' ,
246257 'Most Powerful' )
247258
248259 self .assertQuerySetBecomesCsv (self .qs , csv_with_extra )
249260
250-
251261 def test_extra_select_ordering (self ):
252262 custom_order_csv = SELECT (self .BASE_CSV ,
253263 AS ('id' , 'ID' ),
254264 'Most Powerful' ,
255265 AS ('name' , "Person's name" ),
256266 'address' ,
257267 AS ('info' , 'Info on Person' ),
258- 'hobby_id' )
268+ 'hobby_id' ,
269+ 'born' )
259270
260271 self .assertQuerySetBecomesCsv (self .qs , custom_order_csv ,
261272 field_order = ['id' , 'Most Powerful' ])
@@ -283,7 +294,6 @@ def test_render_to_csv_response_no_filename(self):
283294 self .assertRegexpMatches (response ['Content-Disposition' ],
284295 r'attachment; filename=person_export.csv;' )
285296
286-
287297 def test_render_to_csv_response (self ):
288298 response = djqscsv .render_to_csv_response (self .qs ,
289299 filename = "test_csv" ,
@@ -292,7 +302,6 @@ def test_render_to_csv_response(self):
292302 self .assertMatchesCsv (response .content .split ('\n ' ),
293303 self .FULL_PERSON_CSV_NO_VERBOSE )
294304
295-
296305 def test_render_to_csv_response_other_delimiter (self ):
297306 response = djqscsv .render_to_csv_response (self .qs ,
298307 filename = "test_csv" ,
@@ -304,7 +313,6 @@ def test_render_to_csv_response_other_delimiter(self):
304313 self .FULL_PERSON_CSV_NO_VERBOSE ,
305314 delimiter = "|" )
306315
307-
308316 def test_render_to_csv_fails_on_delimiter_mismatch (self ):
309317 response = djqscsv .render_to_csv_response (self .qs ,
310318 filename = "test_csv" ,
0 commit comments