Skip to content

Commit 1f410cf

Browse files
arthansonjeremystretch
authored andcommitted
11617 add tests for invalid headers to csv,yaml,json
1 parent 5346583 commit 1f410cf

File tree

2 files changed

+223
-4
lines changed

2 files changed

+223
-4
lines changed

netbox/netbox/tests/test_import.py

Lines changed: 222 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
import csv
2+
import io
3+
import json
4+
import yaml
5+
16
from django.contrib.contenttypes.models import ContentType
27
from 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)

netbox/netbox/views/generic/bulk_views.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@
2323
from utilities.forms import BulkRenameForm, ConfirmationForm, restrict_form_fields
2424
from utilities.forms.bulk_import import BulkImportForm
2525
from utilities.forms.utils import headers_to_dict, validate_import_headers
26-
from utilities.htmx import is_embedded
27-
from utilities.htmx import is_htmx
26+
from utilities.htmx import is_embedded, is_htmx
2827
from utilities.permissions import get_permission_for_model
2928
from utilities.utils import get_viewname
3029
from utilities.views import GetReturnURLMixin

0 commit comments

Comments
 (0)