1+ import csv
2+ import io
3+ import json
4+ import yaml
5+
16from django .contrib .contenttypes .models import ContentType
27from django .test import override_settings
38
@@ -17,8 +22,16 @@ def setUpTestData(cls):
1722 def _get_csv_data (self , csv_data ):
1823 return '\n ' .join (csv_data )
1924
25+ def _get_yaml_data (self , csv_data ):
26+ data = [* csv .DictReader (io .StringIO (self ._get_csv_data (csv_data )))]
27+ return yaml .dump (data )
28+
29+ def _get_json_data (self , csv_data ):
30+ data = [* csv .DictReader (io .StringIO (self ._get_csv_data (csv_data )))]
31+ return json .dumps (data )
32+
2033 @override_settings (EXEMPT_VIEW_PERMISSIONS = ['*' ])
21- def test_valid_tags (self ):
34+ def test_valid_tags_csv (self ):
2235 csv_data = (
2336 'name,slug,tags' ,
2437 'Region 1,region-1,"alpha,bravo"' ,
@@ -61,7 +74,93 @@ def test_valid_tags(self):
6174 self .assertEqual (regions [3 ].tags .count (), 0 )
6275
6376 @override_settings (EXEMPT_VIEW_PERMISSIONS = ['*' ])
64- def test_invalid_tags (self ):
77+ def test_valid_tags_yaml (self ):
78+ csv_data = (
79+ 'name,slug,tags' ,
80+ 'Region 1,region-1,"alpha,bravo"' ,
81+ 'Region 2,region-2,"charlie,delta"' ,
82+ 'Region 3,region-3,echo' ,
83+ 'Region 4,region-4,' ,
84+ )
85+
86+ data = {
87+ 'format' : ImportFormatChoices .YAML ,
88+ 'data' : self ._get_yaml_data (csv_data ),
89+ }
90+
91+ # Assign model-level permission
92+ obj_perm = ObjectPermission (name = 'Test permission' , actions = ['add' ])
93+ obj_perm .save ()
94+ obj_perm .users .add (self .user )
95+ obj_perm .object_types .add (ContentType .objects .get_for_model (self .model ))
96+
97+ # Try GET with model-level permission
98+ self .assertHttpStatus (self .client .get (self ._get_url ('import' )), 200 )
99+
100+ # Test POST with permission
101+ self .assertHttpStatus (self .client .post (self ._get_url ('import' ), data ), 200 )
102+ regions = Region .objects .all ()
103+ self .assertEqual (regions .count (), 4 )
104+ region = Region .objects .get (slug = "region-4" )
105+ self .assertEqual (
106+ list (regions [0 ].tags .values_list ('name' , flat = True )),
107+ ['Alpha' , 'Bravo' ]
108+ )
109+ self .assertEqual (
110+ list (regions [1 ].tags .values_list ('name' , flat = True )),
111+ ['Charlie' , 'Delta' ]
112+ )
113+ self .assertEqual (
114+ list (regions [2 ].tags .values_list ('name' , flat = True )),
115+ ['Echo' ]
116+ )
117+ self .assertEqual (regions [3 ].tags .count (), 0 )
118+
119+ @override_settings (EXEMPT_VIEW_PERMISSIONS = ['*' ])
120+ def test_valid_tags_json (self ):
121+ csv_data = (
122+ 'name,slug,tags' ,
123+ 'Region 1,region-1,"alpha,bravo"' ,
124+ 'Region 2,region-2,"charlie,delta"' ,
125+ 'Region 3,region-3,echo' ,
126+ 'Region 4,region-4,' ,
127+ )
128+
129+ data = {
130+ 'format' : ImportFormatChoices .JSON ,
131+ 'data' : self ._get_json_data (csv_data ),
132+ }
133+
134+ # Assign model-level permission
135+ obj_perm = ObjectPermission (name = 'Test permission' , actions = ['add' ])
136+ obj_perm .save ()
137+ obj_perm .users .add (self .user )
138+ obj_perm .object_types .add (ContentType .objects .get_for_model (self .model ))
139+
140+ # Try GET with model-level permission
141+ self .assertHttpStatus (self .client .get (self ._get_url ('import' )), 200 )
142+
143+ # Test POST with permission
144+ self .assertHttpStatus (self .client .post (self ._get_url ('import' ), data ), 200 )
145+ regions = Region .objects .all ()
146+ self .assertEqual (regions .count (), 4 )
147+ region = Region .objects .get (slug = "region-4" )
148+ self .assertEqual (
149+ list (regions [0 ].tags .values_list ('name' , flat = True )),
150+ ['Alpha' , 'Bravo' ]
151+ )
152+ self .assertEqual (
153+ list (regions [1 ].tags .values_list ('name' , flat = True )),
154+ ['Charlie' , 'Delta' ]
155+ )
156+ self .assertEqual (
157+ list (regions [2 ].tags .values_list ('name' , flat = True )),
158+ ['Echo' ]
159+ )
160+ self .assertEqual (regions [3 ].tags .count (), 0 )
161+
162+ @override_settings (EXEMPT_VIEW_PERMISSIONS = ['*' ])
163+ def test_invalid_tags_csv (self ):
65164 csv_data = (
66165 'name,slug,tags' ,
67166 'Region 1,region-1,"Alpha,Bravo"' , # Valid
@@ -85,3 +184,124 @@ def test_invalid_tags(self):
85184 # Test POST with permission
86185 self .assertHttpStatus (self .client .post (self ._get_url ('import' ), data ), 200 )
87186 self .assertEqual (Region .objects .count (), 0 )
187+
188+ @override_settings (EXEMPT_VIEW_PERMISSIONS = ['*' ])
189+ def test_invalid_tags_yaml (self ):
190+ csv_data = (
191+ 'name,slug,tags' ,
192+ 'Region 1,region-1,"Alpha,Bravo"' , # Valid
193+ 'Region 2,region-2,"Alpha,Tango"' , # Invalid
194+ )
195+
196+ data = {
197+ 'format' : ImportFormatChoices .YAML ,
198+ 'data' : self ._get_yaml_data (csv_data ),
199+ }
200+
201+ # Assign model-level permission
202+ obj_perm = ObjectPermission (name = 'Test permission' , actions = ['add' ])
203+ obj_perm .save ()
204+ obj_perm .users .add (self .user )
205+ obj_perm .object_types .add (ContentType .objects .get_for_model (self .model ))
206+
207+ # Try GET with model-level permission
208+ self .assertHttpStatus (self .client .get (self ._get_url ('import' )), 200 )
209+
210+ # Test POST with permission
211+ self .assertHttpStatus (self .client .post (self ._get_url ('import' ), data ), 200 )
212+ self .assertEqual (Region .objects .count (), 0 )
213+
214+ @override_settings (EXEMPT_VIEW_PERMISSIONS = ['*' ])
215+ def test_invalid_tags_json (self ):
216+ csv_data = (
217+ 'name,slug,tags' ,
218+ 'Region 1,region-1,"Alpha,Bravo"' , # Valid
219+ 'Region 2,region-2,"Alpha,Tango"' , # Invalid
220+ )
221+
222+ data = {
223+ 'format' : ImportFormatChoices .JSON ,
224+ 'data' : self ._get_json_data (csv_data ),
225+ }
226+
227+ # Assign model-level permission
228+ obj_perm = ObjectPermission (name = 'Test permission' , actions = ['add' ])
229+ obj_perm .save ()
230+ obj_perm .users .add (self .user )
231+ obj_perm .object_types .add (ContentType .objects .get_for_model (self .model ))
232+
233+ # Try GET with model-level permission
234+ self .assertHttpStatus (self .client .get (self ._get_url ('import' )), 200 )
235+
236+ # Test POST with permission
237+ self .assertHttpStatus (self .client .post (self ._get_url ('import' ), data ), 200 )
238+ self .assertEqual (Region .objects .count (), 0 )
239+
240+ @override_settings (EXEMPT_VIEW_PERMISSIONS = ['*' ])
241+ def test_invalid_header_csv (self ):
242+ csv_data = (
243+ 'name,slug,tags,xxx' ,
244+ 'Region 1,region-1,"alpha,bravo",yyy' ,
245+ )
246+
247+ data = {
248+ 'format' : ImportFormatChoices .CSV ,
249+ 'data' : self ._get_csv_data (csv_data ),
250+ }
251+
252+ # Assign model-level permission
253+ obj_perm = ObjectPermission (name = 'Test permission' , actions = ['add' ])
254+ obj_perm .save ()
255+ obj_perm .users .add (self .user )
256+ obj_perm .object_types .add (ContentType .objects .get_for_model (self .model ))
257+
258+ # Test POST with permission
259+ ret = self .client .post (self ._get_url ('import' ), data )
260+ self .assertHttpStatus (self .client .post (self ._get_url ('import' ), data ), 200 )
261+ self .assertEqual (Region .objects .count (), 0 )
262+
263+ @override_settings (EXEMPT_VIEW_PERMISSIONS = ['*' ])
264+ def test_invalid_header_yaml (self ):
265+ csv_data = (
266+ 'name,slug,tags,xxx' ,
267+ 'Region 1,region-1,"alpha,bravo",yyy' ,
268+ )
269+
270+ data = {
271+ 'format' : ImportFormatChoices .YAML ,
272+ 'data' : self ._get_yaml_data (csv_data ),
273+ }
274+
275+ # Assign model-level permission
276+ obj_perm = ObjectPermission (name = 'Test permission' , actions = ['add' ])
277+ obj_perm .save ()
278+ obj_perm .users .add (self .user )
279+ obj_perm .object_types .add (ContentType .objects .get_for_model (self .model ))
280+
281+ # Test POST with permission
282+ ret = self .client .post (self ._get_url ('import' ), data )
283+ self .assertHttpStatus (self .client .post (self ._get_url ('import' ), data ), 200 )
284+ self .assertEqual (Region .objects .count (), 0 )
285+
286+ @override_settings (EXEMPT_VIEW_PERMISSIONS = ['*' ])
287+ def test_invalid_header_json (self ):
288+ csv_data = (
289+ 'name,slug,tags,xxx' ,
290+ 'Region 1,region-1,"alpha,bravo",yyy' ,
291+ )
292+
293+ data = {
294+ 'format' : ImportFormatChoices .JSON ,
295+ 'data' : self ._get_json_data (csv_data ),
296+ }
297+
298+ # Assign model-level permission
299+ obj_perm = ObjectPermission (name = 'Test permission' , actions = ['add' ])
300+ obj_perm .save ()
301+ obj_perm .users .add (self .user )
302+ obj_perm .object_types .add (ContentType .objects .get_for_model (self .model ))
303+
304+ # Test POST with permission
305+ ret = self .client .post (self ._get_url ('import' ), data )
306+ self .assertHttpStatus (self .client .post (self ._get_url ('import' ), data ), 200 )
307+ self .assertEqual (Region .objects .count (), 0 )
0 commit comments