11
11
12
12
from djqscsv_tests .context import SELECT , EXCLUDE , AS , CONSTANT
13
13
14
- from djqscsv_tests .models import Person
15
-
16
14
from djqscsv_tests .util import create_people_and_get_queryset
17
15
18
16
from django .utils import six
23
21
else :
24
22
from StringIO import StringIO
25
23
24
+
26
25
class CSVTestCase (TestCase ):
27
26
28
27
def setUp (self ):
@@ -38,7 +37,8 @@ def csv_match(self, csv_file, expected_data, **csv_kwargs):
38
37
for csv_row , expected_row in test_pairs :
39
38
if is_first :
40
39
# 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 :])
42
42
is_first = False
43
43
iteration_happened = True
44
44
assertion_results .append (csv_row == expected_row )
@@ -55,7 +55,6 @@ def assertNotMatchesCsv(self, *args, **kwargs):
55
55
assertion_results = self .csv_match (* args , ** kwargs )
56
56
self .assertFalse (all (assertion_results ))
57
57
58
-
59
58
def assertQuerySetBecomesCsv (self , qs , expected_data , ** kwargs ):
60
59
obj = StringIO ()
61
60
djqscsv .write_csv (qs , obj , ** kwargs )
@@ -68,27 +67,30 @@ def assertEmptyQuerySetMatches(self, expected_data, **kwargs):
68
67
if DJANGO_VERSION [:2 ] == (1 , 5 ):
69
68
with self .assertRaises (djqscsv .CSVException ):
70
69
djqscsv .write_csv (qs , obj )
71
- elif DJANGO_VERSION [: 2 ] == ( 1 , 6 ) :
70
+ else :
72
71
djqscsv .write_csv (qs , obj ,
73
72
** kwargs )
74
73
self .assertEqual (obj .getvalue (), expected_data )
75
74
76
-
77
75
# the csv data that is returned by the most inclusive query under test.
78
76
# use this data structure to build smaller data sets
79
77
BASE_CSV = [
80
78
['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' ]]
85
86
86
87
FULL_PERSON_CSV_WITH_RELATED = SELECT (BASE_CSV ,
87
88
AS ('id' , 'ID' ),
88
89
AS ('name' , 'Person\' s name' ),
89
90
'address' ,
90
91
AS ('info' , 'Info on Person' ),
91
92
'hobby_id' ,
93
+ 'born' ,
92
94
'hobby__name' )
93
95
94
96
FULL_PERSON_CSV = EXCLUDE (FULL_PERSON_CSV_WITH_RELATED ,
@@ -115,11 +117,11 @@ def test_write_csv_full_no_verbose(self):
115
117
def test_write_csv_limited_no_verbose (self ):
116
118
qs = self .qs .values ('name' , 'address' , 'info' )
117
119
self .assertQuerySetBecomesCsv (qs , self .LIMITED_PERSON_CSV_NO_VERBOSE ,
118
- use_verbose_names = False )
120
+ use_verbose_names = False )
119
121
120
122
def test_empty_queryset_no_verbose (self ):
121
123
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 ' ,
123
125
use_verbose_names = False )
124
126
125
127
@@ -135,13 +137,18 @@ def test_write_csv_limited(self):
135
137
def test_empty_queryset (self ):
136
138
self .assertEmptyQuerySetMatches (
137
139
'\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
+
139
142
140
143
class FieldHeaderMapTests (CSVTestCase ):
141
144
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' )
145
152
146
153
self .assertQuerySetBecomesCsv (
147
154
self .qs , overridden_info_csv ,
@@ -155,8 +162,7 @@ def test_write_csv_limited_custom_headers(self):
155
162
156
163
self .assertQuerySetBecomesCsv (
157
164
qs , overridden_info_csv ,
158
- field_header_map = { 'info' : 'INFORMATION' })
159
-
165
+ field_header_map = {'info' : 'INFORMATION' })
160
166
161
167
def test_write_csv_with_related_custom_headers (self ):
162
168
overridden_csv = SELECT (self .FULL_PERSON_CSV_WITH_RELATED ,
@@ -166,23 +172,25 @@ def test_write_csv_with_related_custom_headers(self):
166
172
167
173
self .assertQuerySetBecomesCsv (
168
174
qs , overridden_csv ,
169
- field_header_map = { 'hobby__name' : 'Name of Activity' })
175
+ field_header_map = {'hobby__name' : 'Name of Activity' })
170
176
171
177
def test_empty_queryset_custom_headers (self ):
172
178
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' })
175
182
176
183
177
184
class WalkRelationshipTests (CSVTestCase ):
178
185
179
186
def test_with_related (self ):
180
187
181
188
qs = self .qs .values ('id' , 'name' , 'address' , 'info' ,
182
- 'hobby_id' , 'hobby__name' )
189
+ 'hobby_id' , 'born' , ' hobby__name' )
183
190
184
191
self .assertQuerySetBecomesCsv (qs , self .FULL_PERSON_CSV_WITH_RELATED )
185
192
193
+
186
194
class ColumnOrderingTests (CSVTestCase ):
187
195
def setUp (self ):
188
196
self .qs = create_people_and_get_queryset ()
@@ -208,16 +216,17 @@ def test_no_values_matches_models_file(self):
208
216
'name' ,
209
217
'address' ,
210
218
'info' ,
211
- 'hobby_id' )
212
-
219
+ 'hobby_id' ,
220
+ 'born' )
213
221
self .assertQuerySetBecomesCsv (self .qs , csv ,
214
222
use_verbose_names = False )
215
223
216
224
217
225
class AggregateTests (CSVTestCase ):
218
226
219
227
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' )))
221
230
222
231
def test_aggregate (self ):
223
232
csv_with_aggregate = SELECT (self .FULL_PERSON_CSV ,
@@ -226,6 +235,7 @@ def test_aggregate(self):
226
235
'address' ,
227
236
"Info on Person" ,
228
237
'hobby_id' ,
238
+ 'born' ,
229
239
CONSTANT ('1' , 'num_hobbies' ))
230
240
self .assertQuerySetBecomesCsv (self .qs , csv_with_aggregate )
231
241
@@ -234,7 +244,7 @@ class ExtraOrderingTests(CSVTestCase):
234
244
235
245
def setUp (self ):
236
246
self .qs = create_people_and_get_queryset ().extra (
237
- select = {'Most Powerful' :"info LIKE '%arch mage%'" })
247
+ select = {'Most Powerful' : "info LIKE '%arch mage%'" })
238
248
239
249
def test_extra_select (self ):
240
250
csv_with_extra = SELECT (self .BASE_CSV ,
@@ -243,19 +253,20 @@ def test_extra_select(self):
243
253
'address' ,
244
254
AS ('info' , 'Info on Person' ),
245
255
'hobby_id' ,
256
+ 'born' ,
246
257
'Most Powerful' )
247
258
248
259
self .assertQuerySetBecomesCsv (self .qs , csv_with_extra )
249
260
250
-
251
261
def test_extra_select_ordering (self ):
252
262
custom_order_csv = SELECT (self .BASE_CSV ,
253
263
AS ('id' , 'ID' ),
254
264
'Most Powerful' ,
255
265
AS ('name' , "Person's name" ),
256
266
'address' ,
257
267
AS ('info' , 'Info on Person' ),
258
- 'hobby_id' )
268
+ 'hobby_id' ,
269
+ 'born' )
259
270
260
271
self .assertQuerySetBecomesCsv (self .qs , custom_order_csv ,
261
272
field_order = ['id' , 'Most Powerful' ])
@@ -283,7 +294,6 @@ def test_render_to_csv_response_no_filename(self):
283
294
self .assertRegexpMatches (response ['Content-Disposition' ],
284
295
r'attachment; filename=person_export.csv;' )
285
296
286
-
287
297
def test_render_to_csv_response (self ):
288
298
response = djqscsv .render_to_csv_response (self .qs ,
289
299
filename = "test_csv" ,
@@ -292,7 +302,6 @@ def test_render_to_csv_response(self):
292
302
self .assertMatchesCsv (response .content .split ('\n ' ),
293
303
self .FULL_PERSON_CSV_NO_VERBOSE )
294
304
295
-
296
305
def test_render_to_csv_response_other_delimiter (self ):
297
306
response = djqscsv .render_to_csv_response (self .qs ,
298
307
filename = "test_csv" ,
@@ -304,7 +313,6 @@ def test_render_to_csv_response_other_delimiter(self):
304
313
self .FULL_PERSON_CSV_NO_VERBOSE ,
305
314
delimiter = "|" )
306
315
307
-
308
316
def test_render_to_csv_fails_on_delimiter_mismatch (self ):
309
317
response = djqscsv .render_to_csv_response (self .qs ,
310
318
filename = "test_csv" ,
0 commit comments