Browse Source

Add permission assignment to custom test methods

Jeremy Stretch 5 years ago
parent
commit
a8145fe4c2

+ 1 - 0
netbox/circuits/tests/test_api.py

@@ -58,6 +58,7 @@ class ProviderTest(APIViewTestCases.APIViewTestCase):
         )
         )
         Graph.objects.bulk_create(graphs)
         Graph.objects.bulk_create(graphs)
 
 
+        self.add_permissions('circuits.view_provider')
         url = reverse('circuits-api:provider-graphs', kwargs={'pk': provider.pk})
         url = reverse('circuits-api:provider-graphs', kwargs={'pk': provider.pk})
         response = self.client.get(url, **self.header)
         response = self.client.get(url, **self.header)
 
 

+ 20 - 0
netbox/dcim/tests/test_api.py

@@ -106,6 +106,7 @@ class SiteTest(APIViewTestCases.APIViewTestCase):
         )
         )
         Graph.objects.bulk_create(graphs)
         Graph.objects.bulk_create(graphs)
 
 
+        self.add_permissions('dcim.view_site')
         url = reverse('dcim-api:site-graphs', kwargs={'pk': Site.objects.first().pk})
         url = reverse('dcim-api:site-graphs', kwargs={'pk': Site.objects.first().pk})
         response = self.client.get(url, **self.header)
         response = self.client.get(url, **self.header)
 
 
@@ -245,6 +246,7 @@ class RackTest(APIViewTestCases.APIViewTestCase):
     def test_get_elevation_rack_units(self):
     def test_get_elevation_rack_units(self):
         rack = Rack.objects.first()
         rack = Rack.objects.first()
 
 
+        self.add_permissions('dcim.view_rack')
         url = '{}?q=3'.format(reverse('dcim-api:rack-elevation', kwargs={'pk': rack.pk}))
         url = '{}?q=3'.format(reverse('dcim-api:rack-elevation', kwargs={'pk': rack.pk}))
         response = self.client.get(url, **self.header)
         response = self.client.get(url, **self.header)
 
 
@@ -270,6 +272,7 @@ class RackTest(APIViewTestCases.APIViewTestCase):
         GET a single rack elevation.
         GET a single rack elevation.
         """
         """
         rack = Rack.objects.first()
         rack = Rack.objects.first()
+        self.add_permissions('dcim.view_rack')
         url = reverse('dcim-api:rack-elevation', kwargs={'pk': rack.pk})
         url = reverse('dcim-api:rack-elevation', kwargs={'pk': rack.pk})
         response = self.client.get(url, **self.header)
         response = self.client.get(url, **self.header)
 
 
@@ -280,6 +283,7 @@ class RackTest(APIViewTestCases.APIViewTestCase):
         GET a single rack elevation in SVG format.
         GET a single rack elevation in SVG format.
         """
         """
         rack = Rack.objects.first()
         rack = Rack.objects.first()
+        self.add_permissions('dcim.view_rack')
         url = '{}?render=svg'.format(reverse('dcim-api:rack-elevation', kwargs={'pk': rack.pk}))
         url = '{}?render=svg'.format(reverse('dcim-api:rack-elevation', kwargs={'pk': rack.pk}))
         response = self.client.get(url, **self.header)
         response = self.client.get(url, **self.header)
 
 
@@ -784,6 +788,7 @@ class DeviceTest(APIViewTestCases.APIViewTestCase):
         )
         )
         Graph.objects.bulk_create(graphs)
         Graph.objects.bulk_create(graphs)
 
 
+        self.add_permissions('dcim.view_device')
         url = reverse('dcim-api:device-graphs', kwargs={'pk': Device.objects.first().pk})
         url = reverse('dcim-api:device-graphs', kwargs={'pk': Device.objects.first().pk})
         response = self.client.get(url, **self.header)
         response = self.client.get(url, **self.header)
 
 
@@ -794,6 +799,7 @@ class DeviceTest(APIViewTestCases.APIViewTestCase):
         """
         """
         Check that config context data is included by default in the devices list.
         Check that config context data is included by default in the devices list.
         """
         """
+        self.add_permissions('dcim.view_device')
         url = reverse('dcim-api:device-list') + '?slug=device-with-context-data'
         url = reverse('dcim-api:device-list') + '?slug=device-with-context-data'
         response = self.client.get(url, **self.header)
         response = self.client.get(url, **self.header)
 
 
@@ -803,6 +809,7 @@ class DeviceTest(APIViewTestCases.APIViewTestCase):
         """
         """
         Check that config context data can be excluded by passing ?exclude=config_context.
         Check that config context data can be excluded by passing ?exclude=config_context.
         """
         """
+        self.add_permissions('dcim.view_device')
         url = reverse('dcim-api:device-list') + '?exclude=config_context'
         url = reverse('dcim-api:device-list') + '?exclude=config_context'
         response = self.client.get(url, **self.header)
         response = self.client.get(url, **self.header)
 
 
@@ -820,6 +827,7 @@ class DeviceTest(APIViewTestCases.APIViewTestCase):
             'name': device.name,
             'name': device.name,
         }
         }
 
 
+        self.add_permissions('dcim.add_device')
         url = reverse('dcim-api:device-list')
         url = reverse('dcim-api:device-list')
         response = self.client.post(url, data, format='json', **self.header)
         response = self.client.post(url, data, format='json', **self.header)
 
 
@@ -878,6 +886,7 @@ class ConsolePortTest(APIViewTestCases.APIViewTestCase):
         cable = Cable(termination_a=consoleport, termination_b=consoleserverport, label='Cable 1')
         cable = Cable(termination_a=consoleport, termination_b=consoleserverport, label='Cable 1')
         cable.save()
         cable.save()
 
 
+        self.add_permissions('dcim.view_consoleport')
         url = reverse('dcim-api:consoleport-trace', kwargs={'pk': consoleport.pk})
         url = reverse('dcim-api:consoleport-trace', kwargs={'pk': consoleport.pk})
         response = self.client.get(url, **self.header)
         response = self.client.get(url, **self.header)
 
 
@@ -941,6 +950,7 @@ class ConsoleServerPortTest(APIViewTestCases.APIViewTestCase):
         cable = Cable(termination_a=consoleserverport, termination_b=consoleport, label='Cable 1')
         cable = Cable(termination_a=consoleserverport, termination_b=consoleport, label='Cable 1')
         cable.save()
         cable.save()
 
 
+        self.add_permissions('dcim.view_consoleserverport')
         url = reverse('dcim-api:consoleserverport-trace', kwargs={'pk': consoleserverport.pk})
         url = reverse('dcim-api:consoleserverport-trace', kwargs={'pk': consoleserverport.pk})
         response = self.client.get(url, **self.header)
         response = self.client.get(url, **self.header)
 
 
@@ -1004,6 +1014,7 @@ class PowerPortTest(APIViewTestCases.APIViewTestCase):
         cable = Cable(termination_a=powerport, termination_b=poweroutlet, label='Cable 1')
         cable = Cable(termination_a=powerport, termination_b=poweroutlet, label='Cable 1')
         cable.save()
         cable.save()
 
 
+        self.add_permissions('dcim.view_powerport')
         url = reverse('dcim-api:powerport-trace', kwargs={'pk': powerport.pk})
         url = reverse('dcim-api:powerport-trace', kwargs={'pk': powerport.pk})
         response = self.client.get(url, **self.header)
         response = self.client.get(url, **self.header)
 
 
@@ -1067,6 +1078,7 @@ class PowerOutletTest(APIViewTestCases.APIViewTestCase):
         cable = Cable(termination_a=poweroutlet, termination_b=powerport, label='Cable 1')
         cable = Cable(termination_a=poweroutlet, termination_b=powerport, label='Cable 1')
         cable.save()
         cable.save()
 
 
+        self.add_permissions('dcim.view_poweroutlet')
         url = reverse('dcim-api:poweroutlet-trace', kwargs={'pk': poweroutlet.pk})
         url = reverse('dcim-api:poweroutlet-trace', kwargs={'pk': poweroutlet.pk})
         response = self.client.get(url, **self.header)
         response = self.client.get(url, **self.header)
 
 
@@ -1143,6 +1155,7 @@ class InterfaceTest(APIViewTestCases.APIViewTestCase):
         )
         )
         Graph.objects.bulk_create(graphs)
         Graph.objects.bulk_create(graphs)
 
 
+        self.add_permissions('dcim.view_interface')
         url = reverse('dcim-api:interface-graphs', kwargs={'pk': Interface.objects.first().pk})
         url = reverse('dcim-api:interface-graphs', kwargs={'pk': Interface.objects.first().pk})
         response = self.client.get(url, **self.header)
         response = self.client.get(url, **self.header)
 
 
@@ -1446,6 +1459,7 @@ class ConnectionTest(APITestCase):
             'termination_b_id': consoleserverport1.pk,
             'termination_b_id': consoleserverport1.pk,
         }
         }
 
 
+        self.add_permissions('dcim.add_cable')
         url = reverse('dcim-api:cable-list')
         url = reverse('dcim-api:cable-list')
         response = self.client.post(url, data, format='json', **self.header)
         response = self.client.post(url, data, format='json', **self.header)
 
 
@@ -1484,6 +1498,7 @@ class ConnectionTest(APITestCase):
             device=self.panel2, name='Test Front Port 2', type=PortTypeChoices.TYPE_8P8C, rear_port=rearport2
             device=self.panel2, name='Test Front Port 2', type=PortTypeChoices.TYPE_8P8C, rear_port=rearport2
         )
         )
 
 
+        self.add_permissions('dcim.add_cable')
         url = reverse('dcim-api:cable-list')
         url = reverse('dcim-api:cable-list')
         cables = [
         cables = [
             # Console port to panel1 front
             # Console port to panel1 front
@@ -1539,6 +1554,7 @@ class ConnectionTest(APITestCase):
             'termination_b_id': poweroutlet1.pk,
             'termination_b_id': poweroutlet1.pk,
         }
         }
 
 
+        self.add_permissions('dcim.add_cable')
         url = reverse('dcim-api:cable-list')
         url = reverse('dcim-api:cable-list')
         response = self.client.post(url, data, format='json', **self.header)
         response = self.client.post(url, data, format='json', **self.header)
 
 
@@ -1574,6 +1590,7 @@ class ConnectionTest(APITestCase):
             'termination_b_id': interface2.pk,
             'termination_b_id': interface2.pk,
         }
         }
 
 
+        self.add_permissions('dcim.add_cable')
         url = reverse('dcim-api:cable-list')
         url = reverse('dcim-api:cable-list')
         response = self.client.post(url, data, format='json', **self.header)
         response = self.client.post(url, data, format='json', **self.header)
 
 
@@ -1612,6 +1629,7 @@ class ConnectionTest(APITestCase):
             device=self.panel2, name='Test Front Port 2', type=PortTypeChoices.TYPE_8P8C, rear_port=rearport2
             device=self.panel2, name='Test Front Port 2', type=PortTypeChoices.TYPE_8P8C, rear_port=rearport2
         )
         )
 
 
+        self.add_permissions('dcim.add_cable')
         url = reverse('dcim-api:cable-list')
         url = reverse('dcim-api:cable-list')
         cables = [
         cables = [
             # Interface1 to panel1 front
             # Interface1 to panel1 front
@@ -1676,6 +1694,7 @@ class ConnectionTest(APITestCase):
             'termination_b_id': circuittermination1.pk,
             'termination_b_id': circuittermination1.pk,
         }
         }
 
 
+        self.add_permissions('dcim.add_cable')
         url = reverse('dcim-api:cable-list')
         url = reverse('dcim-api:cable-list')
         response = self.client.post(url, data, format='json', **self.header)
         response = self.client.post(url, data, format='json', **self.header)
 
 
@@ -1723,6 +1742,7 @@ class ConnectionTest(APITestCase):
             device=self.panel2, name='Test Front Port 2', type=PortTypeChoices.TYPE_8P8C, rear_port=rearport2
             device=self.panel2, name='Test Front Port 2', type=PortTypeChoices.TYPE_8P8C, rear_port=rearport2
         )
         )
 
 
+        self.add_permissions('dcim.add_cable')
         url = reverse('dcim-api:cable-list')
         url = reverse('dcim-api:cable-list')
         cables = [
         cables = [
             # Interface to panel1 front
             # Interface to panel1 front

+ 6 - 0
netbox/extras/tests/test_api.py

@@ -295,6 +295,7 @@ class CreatedUpdatedFilterTest(APITestCase):
         )
         )
 
 
     def test_get_rack_created(self):
     def test_get_rack_created(self):
+        self.add_permissions('dcim.view_rack')
         url = reverse('dcim-api:rack-list')
         url = reverse('dcim-api:rack-list')
         response = self.client.get('{}?created=2001-02-03'.format(url), **self.header)
         response = self.client.get('{}?created=2001-02-03'.format(url), **self.header)
 
 
@@ -302,6 +303,7 @@ class CreatedUpdatedFilterTest(APITestCase):
         self.assertEqual(response.data['results'][0]['id'], self.rack2.pk)
         self.assertEqual(response.data['results'][0]['id'], self.rack2.pk)
 
 
     def test_get_rack_created_gte(self):
     def test_get_rack_created_gte(self):
+        self.add_permissions('dcim.view_rack')
         url = reverse('dcim-api:rack-list')
         url = reverse('dcim-api:rack-list')
         response = self.client.get('{}?created__gte=2001-02-04'.format(url), **self.header)
         response = self.client.get('{}?created__gte=2001-02-04'.format(url), **self.header)
 
 
@@ -309,6 +311,7 @@ class CreatedUpdatedFilterTest(APITestCase):
         self.assertEqual(response.data['results'][0]['id'], self.rack1.pk)
         self.assertEqual(response.data['results'][0]['id'], self.rack1.pk)
 
 
     def test_get_rack_created_lte(self):
     def test_get_rack_created_lte(self):
+        self.add_permissions('dcim.view_rack')
         url = reverse('dcim-api:rack-list')
         url = reverse('dcim-api:rack-list')
         response = self.client.get('{}?created__lte=2001-02-04'.format(url), **self.header)
         response = self.client.get('{}?created__lte=2001-02-04'.format(url), **self.header)
 
 
@@ -316,6 +319,7 @@ class CreatedUpdatedFilterTest(APITestCase):
         self.assertEqual(response.data['results'][0]['id'], self.rack2.pk)
         self.assertEqual(response.data['results'][0]['id'], self.rack2.pk)
 
 
     def test_get_rack_last_updated(self):
     def test_get_rack_last_updated(self):
+        self.add_permissions('dcim.view_rack')
         url = reverse('dcim-api:rack-list')
         url = reverse('dcim-api:rack-list')
         response = self.client.get('{}?last_updated=2001-02-03%2001:02:03.000004'.format(url), **self.header)
         response = self.client.get('{}?last_updated=2001-02-03%2001:02:03.000004'.format(url), **self.header)
 
 
@@ -323,6 +327,7 @@ class CreatedUpdatedFilterTest(APITestCase):
         self.assertEqual(response.data['results'][0]['id'], self.rack2.pk)
         self.assertEqual(response.data['results'][0]['id'], self.rack2.pk)
 
 
     def test_get_rack_last_updated_gte(self):
     def test_get_rack_last_updated_gte(self):
+        self.add_permissions('dcim.view_rack')
         url = reverse('dcim-api:rack-list')
         url = reverse('dcim-api:rack-list')
         response = self.client.get('{}?last_updated__gte=2001-02-04%2001:02:03.000004'.format(url), **self.header)
         response = self.client.get('{}?last_updated__gte=2001-02-04%2001:02:03.000004'.format(url), **self.header)
 
 
@@ -330,6 +335,7 @@ class CreatedUpdatedFilterTest(APITestCase):
         self.assertEqual(response.data['results'][0]['id'], self.rack1.pk)
         self.assertEqual(response.data['results'][0]['id'], self.rack1.pk)
 
 
     def test_get_rack_last_updated_lte(self):
     def test_get_rack_last_updated_lte(self):
+        self.add_permissions('dcim.view_rack')
         url = reverse('dcim-api:rack-list')
         url = reverse('dcim-api:rack-list')
         response = self.client.get('{}?last_updated__lte=2001-02-04%2001:02:03.000004'.format(url), **self.header)
         response = self.client.get('{}?last_updated__lte=2001-02-04%2001:02:03.000004'.format(url), **self.header)
 
 

+ 6 - 11
netbox/extras/tests/test_changelog.py

@@ -4,7 +4,6 @@ from rest_framework import status
 
 
 from dcim.models import Site
 from dcim.models import Site
 from extras.choices import *
 from extras.choices import *
-from extras.constants import *
 from extras.models import CustomField, CustomFieldValue, ObjectChange
 from extras.models import CustomField, CustomFieldValue, ObjectChange
 from utilities.testing import APITestCase
 from utilities.testing import APITestCase
 
 
@@ -26,7 +25,6 @@ class ChangeLogTest(APITestCase):
         cf.obj_type.set([ct])
         cf.obj_type.set([ct])
 
 
     def test_create_object(self):
     def test_create_object(self):
-
         data = {
         data = {
             'name': 'Test Site 1',
             'name': 'Test Site 1',
             'slug': 'test-site-1',
             'slug': 'test-site-1',
@@ -37,10 +35,10 @@ class ChangeLogTest(APITestCase):
                 'bar', 'foo'
                 'bar', 'foo'
             ],
             ],
         }
         }
-
         self.assertEqual(ObjectChange.objects.count(), 0)
         self.assertEqual(ObjectChange.objects.count(), 0)
-
         url = reverse('dcim-api:site-list')
         url = reverse('dcim-api:site-list')
+        self.add_permissions('dcim.add_site')
+
         response = self.client.post(url, data, format='json', **self.header)
         response = self.client.post(url, data, format='json', **self.header)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
 
 
@@ -55,7 +53,6 @@ class ChangeLogTest(APITestCase):
         self.assertListEqual(sorted(oc.object_data['tags']), data['tags'])
         self.assertListEqual(sorted(oc.object_data['tags']), data['tags'])
 
 
     def test_update_object(self):
     def test_update_object(self):
-
         site = Site(name='Test Site 1', slug='test-site-1')
         site = Site(name='Test Site 1', slug='test-site-1')
         site.save()
         site.save()
 
 
@@ -69,10 +66,10 @@ class ChangeLogTest(APITestCase):
                 'abc', 'xyz'
                 'abc', 'xyz'
             ],
             ],
         }
         }
-
         self.assertEqual(ObjectChange.objects.count(), 0)
         self.assertEqual(ObjectChange.objects.count(), 0)
-
+        self.add_permissions('dcim.change_site')
         url = reverse('dcim-api:site-detail', kwargs={'pk': site.pk})
         url = reverse('dcim-api:site-detail', kwargs={'pk': site.pk})
+
         response = self.client.put(url, data, format='json', **self.header)
         response = self.client.put(url, data, format='json', **self.header)
         self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertHttpStatus(response, status.HTTP_200_OK)
 
 
@@ -87,7 +84,6 @@ class ChangeLogTest(APITestCase):
         self.assertListEqual(sorted(oc.object_data['tags']), data['tags'])
         self.assertListEqual(sorted(oc.object_data['tags']), data['tags'])
 
 
     def test_delete_object(self):
     def test_delete_object(self):
-
         site = Site(
         site = Site(
             name='Test Site 1',
             name='Test Site 1',
             slug='test-site-1'
             slug='test-site-1'
@@ -99,12 +95,11 @@ class ChangeLogTest(APITestCase):
             obj=site,
             obj=site,
             value='ABC'
             value='ABC'
         )
         )
-
         self.assertEqual(ObjectChange.objects.count(), 0)
         self.assertEqual(ObjectChange.objects.count(), 0)
-
+        self.add_permissions('dcim.delete_site')
         url = reverse('dcim-api:site-detail', kwargs={'pk': site.pk})
         url = reverse('dcim-api:site-detail', kwargs={'pk': site.pk})
-        response = self.client.delete(url, **self.header)
 
 
+        response = self.client.delete(url, **self.header)
         self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(Site.objects.count(), 0)
         self.assertEqual(Site.objects.count(), 0)
 
 

+ 14 - 8
netbox/extras/tests/test_customfields.py

@@ -182,8 +182,9 @@ class CustomFieldAPITest(APITestCase):
         Validate that custom fields are present on an object even if it has no values defined.
         Validate that custom fields are present on an object even if it has no values defined.
         """
         """
         url = reverse('dcim-api:site-detail', kwargs={'pk': self.sites[0].pk})
         url = reverse('dcim-api:site-detail', kwargs={'pk': self.sites[0].pk})
-        response = self.client.get(url, **self.header)
+        self.add_permissions('dcim.view_site')
 
 
+        response = self.client.get(url, **self.header)
         self.assertEqual(response.data['name'], self.sites[0].name)
         self.assertEqual(response.data['name'], self.sites[0].name)
         self.assertEqual(response.data['custom_fields'], {
         self.assertEqual(response.data['custom_fields'], {
             'text_field': None,
             'text_field': None,
@@ -201,10 +202,10 @@ class CustomFieldAPITest(APITestCase):
         site2_cfvs = {
         site2_cfvs = {
             cfv.field.name: cfv.value for cfv in self.sites[1].custom_field_values.all()
             cfv.field.name: cfv.value for cfv in self.sites[1].custom_field_values.all()
         }
         }
-
         url = reverse('dcim-api:site-detail', kwargs={'pk': self.sites[1].pk})
         url = reverse('dcim-api:site-detail', kwargs={'pk': self.sites[1].pk})
-        response = self.client.get(url, **self.header)
+        self.add_permissions('dcim.view_site')
 
 
+        response = self.client.get(url, **self.header)
         self.assertEqual(response.data['name'], self.sites[1].name)
         self.assertEqual(response.data['name'], self.sites[1].name)
         self.assertEqual(response.data['custom_fields']['text_field'], site2_cfvs['text_field'])
         self.assertEqual(response.data['custom_fields']['text_field'], site2_cfvs['text_field'])
         self.assertEqual(response.data['custom_fields']['number_field'], site2_cfvs['number_field'])
         self.assertEqual(response.data['custom_fields']['number_field'], site2_cfvs['number_field'])
@@ -221,8 +222,9 @@ class CustomFieldAPITest(APITestCase):
             'name': 'Site 3',
             'name': 'Site 3',
             'slug': 'site-3',
             'slug': 'site-3',
         }
         }
-
         url = reverse('dcim-api:site-list')
         url = reverse('dcim-api:site-list')
+        self.add_permissions('dcim.add_site')
+
         response = self.client.post(url, data, format='json', **self.header)
         response = self.client.post(url, data, format='json', **self.header)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
 
 
@@ -263,8 +265,9 @@ class CustomFieldAPITest(APITestCase):
                 'choice_field': self.cf_select_choice2.pk,
                 'choice_field': self.cf_select_choice2.pk,
             },
             },
         }
         }
-
         url = reverse('dcim-api:site-list')
         url = reverse('dcim-api:site-list')
+        self.add_permissions('dcim.add_site')
+
         response = self.client.post(url, data, format='json', **self.header)
         response = self.client.post(url, data, format='json', **self.header)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
 
 
@@ -309,8 +312,9 @@ class CustomFieldAPITest(APITestCase):
                 'slug': 'site-5',
                 'slug': 'site-5',
             },
             },
         )
         )
-
         url = reverse('dcim-api:site-list')
         url = reverse('dcim-api:site-list')
+        self.add_permissions('dcim.add_site')
+
         response = self.client.post(url, data, format='json', **self.header)
         response = self.client.post(url, data, format='json', **self.header)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(len(response.data), len(data))
         self.assertEqual(len(response.data), len(data))
@@ -367,8 +371,9 @@ class CustomFieldAPITest(APITestCase):
                 'custom_fields': custom_field_data,
                 'custom_fields': custom_field_data,
             },
             },
         )
         )
-
         url = reverse('dcim-api:site-list')
         url = reverse('dcim-api:site-list')
+        self.add_permissions('dcim.add_site')
+
         response = self.client.post(url, data, format='json', **self.header)
         response = self.client.post(url, data, format='json', **self.header)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(len(response.data), len(data))
         self.assertEqual(len(response.data), len(data))
@@ -410,8 +415,9 @@ class CustomFieldAPITest(APITestCase):
                 'number_field': 1234,
                 'number_field': 1234,
             },
             },
         }
         }
-
         url = reverse('dcim-api:site-detail', kwargs={'pk': self.sites[1].pk})
         url = reverse('dcim-api:site-detail', kwargs={'pk': self.sites[1].pk})
+        self.add_permissions('dcim.change_site')
+
         response = self.client.patch(url, data, format='json', **self.header)
         response = self.client.patch(url, data, format='json', **self.header)
         self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertHttpStatus(response, status.HTTP_200_OK)
 
 

+ 4 - 7
netbox/extras/tests/test_tags.py

@@ -15,16 +15,15 @@ class TaggedItemTest(APITestCase):
         super().setUp()
         super().setUp()
 
 
     def test_create_tagged_item(self):
     def test_create_tagged_item(self):
-
         data = {
         data = {
             'name': 'Test Site',
             'name': 'Test Site',
             'slug': 'test-site',
             'slug': 'test-site',
             'tags': ['Foo', 'Bar', 'Baz']
             'tags': ['Foo', 'Bar', 'Baz']
         }
         }
-
         url = reverse('dcim-api:site-list')
         url = reverse('dcim-api:site-list')
-        response = self.client.post(url, data, format='json', **self.header)
+        self.add_permissions('dcim.add_site')
 
 
+        response = self.client.post(url, data, format='json', **self.header)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(sorted(response.data['tags']), sorted(data['tags']))
         self.assertEqual(sorted(response.data['tags']), sorted(data['tags']))
         site = Site.objects.get(pk=response.data['id'])
         site = Site.objects.get(pk=response.data['id'])
@@ -32,20 +31,18 @@ class TaggedItemTest(APITestCase):
         self.assertEqual(sorted(tags), sorted(data['tags']))
         self.assertEqual(sorted(tags), sorted(data['tags']))
 
 
     def test_update_tagged_item(self):
     def test_update_tagged_item(self):
-
         site = Site.objects.create(
         site = Site.objects.create(
             name='Test Site',
             name='Test Site',
             slug='test-site'
             slug='test-site'
         )
         )
         site.tags.add('Foo', 'Bar', 'Baz')
         site.tags.add('Foo', 'Bar', 'Baz')
-
         data = {
         data = {
             'tags': ['Foo', 'Bar', 'New Tag']
             'tags': ['Foo', 'Bar', 'New Tag']
         }
         }
-
+        self.add_permissions('dcim.change_site')
         url = reverse('dcim-api:site-detail', kwargs={'pk': site.pk})
         url = reverse('dcim-api:site-detail', kwargs={'pk': site.pk})
-        response = self.client.patch(url, data, format='json', **self.header)
 
 
+        response = self.client.patch(url, data, format='json', **self.header)
         self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(sorted(response.data['tags']), sorted(data['tags']))
         self.assertEqual(sorted(response.data['tags']), sorted(data['tags']))
         site = Site.objects.get(pk=response.data['id'])
         site = Site.objects.get(pk=response.data['id'])

+ 5 - 7
netbox/extras/tests/test_webhooks.py

@@ -42,13 +42,13 @@ class WebhookTest(APITestCase):
             webhook.obj_type.set([site_ct])
             webhook.obj_type.set([site_ct])
 
 
     def test_enqueue_webhook_create(self):
     def test_enqueue_webhook_create(self):
-
         # Create an object via the REST API
         # Create an object via the REST API
         data = {
         data = {
             'name': 'Test Site',
             'name': 'Test Site',
             'slug': 'test-site',
             'slug': 'test-site',
         }
         }
         url = reverse('dcim-api:site-list')
         url = reverse('dcim-api:site-list')
+        self.add_permissions('dcim.add_site')
         response = self.client.post(url, data, format='json', **self.header)
         response = self.client.post(url, data, format='json', **self.header)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(Site.objects.count(), 1)
         self.assertEqual(Site.objects.count(), 1)
@@ -62,14 +62,13 @@ class WebhookTest(APITestCase):
         self.assertEqual(job.args[3], ObjectChangeActionChoices.ACTION_CREATE)
         self.assertEqual(job.args[3], ObjectChangeActionChoices.ACTION_CREATE)
 
 
     def test_enqueue_webhook_update(self):
     def test_enqueue_webhook_update(self):
-
-        site = Site.objects.create(name='Site 1', slug='site-1')
-
         # Update an object via the REST API
         # Update an object via the REST API
+        site = Site.objects.create(name='Site 1', slug='site-1')
         data = {
         data = {
             'comments': 'Updated the site',
             'comments': 'Updated the site',
         }
         }
         url = reverse('dcim-api:site-detail', kwargs={'pk': site.pk})
         url = reverse('dcim-api:site-detail', kwargs={'pk': site.pk})
+        self.add_permissions('dcim.change_site')
         response = self.client.patch(url, data, format='json', **self.header)
         response = self.client.patch(url, data, format='json', **self.header)
         self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertHttpStatus(response, status.HTTP_200_OK)
 
 
@@ -82,11 +81,10 @@ class WebhookTest(APITestCase):
         self.assertEqual(job.args[3], ObjectChangeActionChoices.ACTION_UPDATE)
         self.assertEqual(job.args[3], ObjectChangeActionChoices.ACTION_UPDATE)
 
 
     def test_enqueue_webhook_delete(self):
     def test_enqueue_webhook_delete(self):
-
-        site = Site.objects.create(name='Site 1', slug='site-1')
-
         # Delete an object via the REST API
         # Delete an object via the REST API
+        site = Site.objects.create(name='Site 1', slug='site-1')
         url = reverse('dcim-api:site-detail', kwargs={'pk': site.pk})
         url = reverse('dcim-api:site-detail', kwargs={'pk': site.pk})
+        self.add_permissions('dcim.delete_site')
         response = self.client.delete(url, **self.header)
         response = self.client.delete(url, **self.header)
         self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
 
 

+ 11 - 0
netbox/ipam/tests/test_api.py

@@ -176,6 +176,7 @@ class PrefixTest(APIViewTestCases.APIViewTestCase):
         Prefix.objects.create(prefix=IPNetwork('192.0.2.64/26'))
         Prefix.objects.create(prefix=IPNetwork('192.0.2.64/26'))
         Prefix.objects.create(prefix=IPNetwork('192.0.2.192/27'))
         Prefix.objects.create(prefix=IPNetwork('192.0.2.192/27'))
         url = reverse('ipam-api:prefix-available-prefixes', kwargs={'pk': prefix.pk})
         url = reverse('ipam-api:prefix-available-prefixes', kwargs={'pk': prefix.pk})
+        self.add_permissions('ipam.view_prefix')
 
 
         # Retrieve all available IPs
         # Retrieve all available IPs
         response = self.client.get(url, **self.header)
         response = self.client.get(url, **self.header)
@@ -190,6 +191,7 @@ class PrefixTest(APIViewTestCases.APIViewTestCase):
         vrf = VRF.objects.create(name='Test VRF 1', rd='1234')
         vrf = VRF.objects.create(name='Test VRF 1', rd='1234')
         prefix = Prefix.objects.create(prefix=IPNetwork('192.0.2.0/28'), vrf=vrf, is_pool=True)
         prefix = Prefix.objects.create(prefix=IPNetwork('192.0.2.0/28'), vrf=vrf, is_pool=True)
         url = reverse('ipam-api:prefix-available-prefixes', kwargs={'pk': prefix.pk})
         url = reverse('ipam-api:prefix-available-prefixes', kwargs={'pk': prefix.pk})
+        self.add_permissions('ipam.add_prefix')
 
 
         # Create four available prefixes with individual requests
         # Create four available prefixes with individual requests
         prefixes_to_be_created = [
         prefixes_to_be_created = [
@@ -225,6 +227,7 @@ class PrefixTest(APIViewTestCases.APIViewTestCase):
         """
         """
         prefix = Prefix.objects.create(prefix=IPNetwork('192.0.2.0/28'), is_pool=True)
         prefix = Prefix.objects.create(prefix=IPNetwork('192.0.2.0/28'), is_pool=True)
         url = reverse('ipam-api:prefix-available-prefixes', kwargs={'pk': prefix.pk})
         url = reverse('ipam-api:prefix-available-prefixes', kwargs={'pk': prefix.pk})
+        self.add_permissions('ipam.view_prefix', 'ipam.add_prefix')
 
 
         # Try to create five /30s (only four are available)
         # Try to create five /30s (only four are available)
         data = [
         data = [
@@ -240,6 +243,7 @@ class PrefixTest(APIViewTestCases.APIViewTestCase):
 
 
         # Verify that no prefixes were created (the entire /28 is still available)
         # Verify that no prefixes were created (the entire /28 is still available)
         response = self.client.get(url, **self.header)
         response = self.client.get(url, **self.header)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(response.data[0]['prefix'], '192.0.2.0/28')
         self.assertEqual(response.data[0]['prefix'], '192.0.2.0/28')
 
 
         # Create four /30s in a single request
         # Create four /30s in a single request
@@ -253,6 +257,7 @@ class PrefixTest(APIViewTestCases.APIViewTestCase):
         """
         """
         prefix = Prefix.objects.create(prefix=IPNetwork('192.0.2.0/29'), is_pool=True)
         prefix = Prefix.objects.create(prefix=IPNetwork('192.0.2.0/29'), is_pool=True)
         url = reverse('ipam-api:prefix-available-ips', kwargs={'pk': prefix.pk})
         url = reverse('ipam-api:prefix-available-ips', kwargs={'pk': prefix.pk})
+        self.add_permissions('ipam.view_prefix', 'ipam.view_ipaddress')
 
 
         # Retrieve all available IPs
         # Retrieve all available IPs
         response = self.client.get(url, **self.header)
         response = self.client.get(url, **self.header)
@@ -271,6 +276,8 @@ class PrefixTest(APIViewTestCases.APIViewTestCase):
         vrf = VRF.objects.create(name='Test VRF 1', rd='1234')
         vrf = VRF.objects.create(name='Test VRF 1', rd='1234')
         prefix = Prefix.objects.create(prefix=IPNetwork('192.0.2.0/30'), vrf=vrf, is_pool=True)
         prefix = Prefix.objects.create(prefix=IPNetwork('192.0.2.0/30'), vrf=vrf, is_pool=True)
         url = reverse('ipam-api:prefix-available-ips', kwargs={'pk': prefix.pk})
         url = reverse('ipam-api:prefix-available-ips', kwargs={'pk': prefix.pk})
+        # TODO: ipam.add_prefix should not be required
+        self.add_permissions('ipam.add_prefix', 'ipam.add_ipaddress')
 
 
         # Create all four available IPs with individual requests
         # Create all four available IPs with individual requests
         for i in range(1, 5):
         for i in range(1, 5):
@@ -293,6 +300,8 @@ class PrefixTest(APIViewTestCases.APIViewTestCase):
         """
         """
         prefix = Prefix.objects.create(prefix=IPNetwork('192.0.2.0/29'), is_pool=True)
         prefix = Prefix.objects.create(prefix=IPNetwork('192.0.2.0/29'), is_pool=True)
         url = reverse('ipam-api:prefix-available-ips', kwargs={'pk': prefix.pk})
         url = reverse('ipam-api:prefix-available-ips', kwargs={'pk': prefix.pk})
+        # TODO: ipam.add_prefix, ipam.view_prefix should not be required
+        self.add_permissions('ipam.add_prefix', 'ipam.view_prefix', 'ipam.view_ipaddress', 'ipam.add_ipaddress')
 
 
         # Try to create nine IPs (only eight are available)
         # Try to create nine IPs (only eight are available)
         data = [{'description': 'Test IP {}'.format(i)} for i in range(1, 10)]  # 9 IPs
         data = [{'description': 'Test IP {}'.format(i)} for i in range(1, 10)]  # 9 IPs
@@ -302,6 +311,7 @@ class PrefixTest(APIViewTestCases.APIViewTestCase):
 
 
         # Verify that no IPs were created (eight are still available)
         # Verify that no IPs were created (eight are still available)
         response = self.client.get(url, **self.header)
         response = self.client.get(url, **self.header)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(len(response.data), 8)
         self.assertEqual(len(response.data), 8)
 
 
         # Create all eight available IPs in a single request
         # Create all eight available IPs in a single request
@@ -411,6 +421,7 @@ class VLANTest(APIViewTestCases.APIViewTestCase):
         vlan = VLAN.objects.first()
         vlan = VLAN.objects.first()
         Prefix.objects.create(prefix=IPNetwork('192.0.2.0/24'), vlan=vlan)
         Prefix.objects.create(prefix=IPNetwork('192.0.2.0/24'), vlan=vlan)
 
 
+        self.add_permissions('ipam.delete_vlan')
         url = reverse('ipam-api:vlan-detail', kwargs={'pk': vlan.pk})
         url = reverse('ipam-api:vlan-detail', kwargs={'pk': vlan.pk})
         with disable_warnings('django.request'):
         with disable_warnings('django.request'):
             response = self.client.delete(url, **self.header)
             response = self.client.delete(url, **self.header)

+ 12 - 19
netbox/utilities/tests/test_api.py

@@ -18,7 +18,6 @@ class WritableNestedSerializerTest(APITestCase):
     """
     """
 
 
     def setUp(self):
     def setUp(self):
-
         super().setUp()
         super().setUp()
 
 
         self.region_a = Region.objects.create(name='Region A', slug='region-a')
         self.region_a = Region.objects.create(name='Region A', slug='region-a')
@@ -26,39 +25,36 @@ class WritableNestedSerializerTest(APITestCase):
         self.site2 = Site.objects.create(region=self.region_a, name='Site 2', slug='site-2')
         self.site2 = Site.objects.create(region=self.region_a, name='Site 2', slug='site-2')
 
 
     def test_related_by_pk(self):
     def test_related_by_pk(self):
-
         data = {
         data = {
             'vid': 100,
             'vid': 100,
             'name': 'Test VLAN 100',
             'name': 'Test VLAN 100',
             'site': self.site1.pk,
             'site': self.site1.pk,
         }
         }
-
         url = reverse('ipam-api:vlan-list')
         url = reverse('ipam-api:vlan-list')
-        response = self.client.post(url, data, format='json', **self.header)
+        self.add_permissions('ipam.add_vlan')
 
 
+        response = self.client.post(url, data, format='json', **self.header)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(response.data['site']['id'], self.site1.pk)
         self.assertEqual(response.data['site']['id'], self.site1.pk)
         vlan = VLAN.objects.get(pk=response.data['id'])
         vlan = VLAN.objects.get(pk=response.data['id'])
         self.assertEqual(vlan.site, self.site1)
         self.assertEqual(vlan.site, self.site1)
 
 
     def test_related_by_pk_no_match(self):
     def test_related_by_pk_no_match(self):
-
         data = {
         data = {
             'vid': 100,
             'vid': 100,
             'name': 'Test VLAN 100',
             'name': 'Test VLAN 100',
             'site': 999,
             'site': 999,
         }
         }
-
         url = reverse('ipam-api:vlan-list')
         url = reverse('ipam-api:vlan-list')
+        self.add_permissions('ipam.add_vlan')
+
         with disable_warnings('django.request'):
         with disable_warnings('django.request'):
             response = self.client.post(url, data, format='json', **self.header)
             response = self.client.post(url, data, format='json', **self.header)
-
         self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST)
         self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST)
         self.assertEqual(VLAN.objects.count(), 0)
         self.assertEqual(VLAN.objects.count(), 0)
         self.assertTrue(response.data['site'][0].startswith("Related object not found"))
         self.assertTrue(response.data['site'][0].startswith("Related object not found"))
 
 
     def test_related_by_attributes(self):
     def test_related_by_attributes(self):
-
         data = {
         data = {
             'vid': 100,
             'vid': 100,
             'name': 'Test VLAN 100',
             'name': 'Test VLAN 100',
@@ -66,17 +62,16 @@ class WritableNestedSerializerTest(APITestCase):
                 'name': 'Site 1'
                 'name': 'Site 1'
             },
             },
         }
         }
-
         url = reverse('ipam-api:vlan-list')
         url = reverse('ipam-api:vlan-list')
-        response = self.client.post(url, data, format='json', **self.header)
+        self.add_permissions('ipam.add_vlan')
 
 
+        response = self.client.post(url, data, format='json', **self.header)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(response.data['site']['id'], self.site1.pk)
         self.assertEqual(response.data['site']['id'], self.site1.pk)
         vlan = VLAN.objects.get(pk=response.data['id'])
         vlan = VLAN.objects.get(pk=response.data['id'])
         self.assertEqual(vlan.site, self.site1)
         self.assertEqual(vlan.site, self.site1)
 
 
     def test_related_by_attributes_no_match(self):
     def test_related_by_attributes_no_match(self):
-
         data = {
         data = {
             'vid': 100,
             'vid': 100,
             'name': 'Test VLAN 100',
             'name': 'Test VLAN 100',
@@ -84,17 +79,16 @@ class WritableNestedSerializerTest(APITestCase):
                 'name': 'Site X'
                 'name': 'Site X'
             },
             },
         }
         }
-
         url = reverse('ipam-api:vlan-list')
         url = reverse('ipam-api:vlan-list')
+        self.add_permissions('ipam.add_vlan')
+
         with disable_warnings('django.request'):
         with disable_warnings('django.request'):
             response = self.client.post(url, data, format='json', **self.header)
             response = self.client.post(url, data, format='json', **self.header)
-
         self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST)
         self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST)
         self.assertEqual(VLAN.objects.count(), 0)
         self.assertEqual(VLAN.objects.count(), 0)
         self.assertTrue(response.data['site'][0].startswith("Related object not found"))
         self.assertTrue(response.data['site'][0].startswith("Related object not found"))
 
 
     def test_related_by_attributes_multiple_matches(self):
     def test_related_by_attributes_multiple_matches(self):
-
         data = {
         data = {
             'vid': 100,
             'vid': 100,
             'name': 'Test VLAN 100',
             'name': 'Test VLAN 100',
@@ -104,27 +98,26 @@ class WritableNestedSerializerTest(APITestCase):
                 },
                 },
             },
             },
         }
         }
-
         url = reverse('ipam-api:vlan-list')
         url = reverse('ipam-api:vlan-list')
+        self.add_permissions('ipam.add_vlan')
+
         with disable_warnings('django.request'):
         with disable_warnings('django.request'):
             response = self.client.post(url, data, format='json', **self.header)
             response = self.client.post(url, data, format='json', **self.header)
-
         self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST)
         self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST)
         self.assertEqual(VLAN.objects.count(), 0)
         self.assertEqual(VLAN.objects.count(), 0)
         self.assertTrue(response.data['site'][0].startswith("Multiple objects match"))
         self.assertTrue(response.data['site'][0].startswith("Multiple objects match"))
 
 
     def test_related_by_invalid(self):
     def test_related_by_invalid(self):
-
         data = {
         data = {
             'vid': 100,
             'vid': 100,
             'name': 'Test VLAN 100',
             'name': 'Test VLAN 100',
             'site': 'XXX',
             'site': 'XXX',
         }
         }
-
         url = reverse('ipam-api:vlan-list')
         url = reverse('ipam-api:vlan-list')
+        self.add_permissions('ipam.add_vlan')
+
         with disable_warnings('django.request'):
         with disable_warnings('django.request'):
             response = self.client.post(url, data, format='json', **self.header)
             response = self.client.post(url, data, format='json', **self.header)
-
         self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST)
         self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST)
         self.assertEqual(VLAN.objects.count(), 0)
         self.assertEqual(VLAN.objects.count(), 0)
 
 

+ 25 - 28
netbox/virtualization/tests/test_api.py

@@ -164,10 +164,10 @@ class VirtualMachineTest(APIViewTestCases.APIViewTestCase):
         Check that config context data is included by default in the virtual machines list.
         Check that config context data is included by default in the virtual machines list.
         """
         """
         virtualmachine = VirtualMachine.objects.first()
         virtualmachine = VirtualMachine.objects.first()
-        url = reverse('virtualization-api:virtualmachine-list')
-        url = '{}?id={}'.format(url, virtualmachine.pk)
-        response = self.client.get(url, **self.header)
+        url = '{}?id={}'.format(reverse('virtualization-api:virtualmachine-list'), virtualmachine.pk)
+        self.add_permissions('virtualization.view_virtualmachine')
 
 
+        response = self.client.get(url, **self.header)
         self.assertEqual(response.data['results'][0].get('config_context', {}).get('A'), 1)
         self.assertEqual(response.data['results'][0].get('config_context', {}).get('A'), 1)
 
 
     def test_config_context_excluded(self):
     def test_config_context_excluded(self):
@@ -175,8 +175,9 @@ class VirtualMachineTest(APIViewTestCases.APIViewTestCase):
         Check that config context data can be excluded by passing ?exclude=config_context.
         Check that config context data can be excluded by passing ?exclude=config_context.
         """
         """
         url = reverse('virtualization-api:virtualmachine-list') + '?exclude=config_context'
         url = reverse('virtualization-api:virtualmachine-list') + '?exclude=config_context'
-        response = self.client.get(url, **self.header)
+        self.add_permissions('virtualization.view_virtualmachine')
 
 
+        response = self.client.get(url, **self.header)
         self.assertFalse('config_context' in response.data['results'][0])
         self.assertFalse('config_context' in response.data['results'][0])
 
 
     def test_unique_name_per_cluster_constraint(self):
     def test_unique_name_per_cluster_constraint(self):
@@ -188,8 +189,9 @@ class VirtualMachineTest(APIViewTestCases.APIViewTestCase):
             'cluster': Cluster.objects.first().pk,
             'cluster': Cluster.objects.first().pk,
         }
         }
         url = reverse('virtualization-api:virtualmachine-list')
         url = reverse('virtualization-api:virtualmachine-list')
-        response = self.client.post(url, data, format='json', **self.header)
+        self.add_permissions('virtualization.add_virtualmachine')
 
 
+        response = self.client.post(url, data, format='json', **self.header)
         self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST)
         self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST)
 
 
 
 
@@ -224,39 +226,38 @@ class InterfaceTest(APITestCase):
         self.vlan3 = VLAN.objects.create(name="Test VLAN 3", vid=3)
         self.vlan3 = VLAN.objects.create(name="Test VLAN 3", vid=3)
 
 
     def test_get_interface(self):
     def test_get_interface(self):
-
         url = reverse('virtualization-api:interface-detail', kwargs={'pk': self.interface1.pk})
         url = reverse('virtualization-api:interface-detail', kwargs={'pk': self.interface1.pk})
-        response = self.client.get(url, **self.header)
+        self.add_permissions('dcim.view_interface')
 
 
+        response = self.client.get(url, **self.header)
         self.assertEqual(response.data['name'], self.interface1.name)
         self.assertEqual(response.data['name'], self.interface1.name)
 
 
     def test_list_interfaces(self):
     def test_list_interfaces(self):
-
         url = reverse('virtualization-api:interface-list')
         url = reverse('virtualization-api:interface-list')
-        response = self.client.get(url, **self.header)
+        self.add_permissions('dcim.view_interface')
 
 
+        response = self.client.get(url, **self.header)
         self.assertEqual(response.data['count'], 3)
         self.assertEqual(response.data['count'], 3)
 
 
     def test_list_interfaces_brief(self):
     def test_list_interfaces_brief(self):
-
         url = reverse('virtualization-api:interface-list')
         url = reverse('virtualization-api:interface-list')
-        response = self.client.get('{}?brief=1'.format(url), **self.header)
+        self.add_permissions('dcim.view_interface')
 
 
+        response = self.client.get('{}?brief=1'.format(url), **self.header)
         self.assertEqual(
         self.assertEqual(
             sorted(response.data['results'][0]),
             sorted(response.data['results'][0]),
             ['id', 'name', 'url', 'virtual_machine']
             ['id', 'name', 'url', 'virtual_machine']
         )
         )
 
 
     def test_create_interface(self):
     def test_create_interface(self):
-
         data = {
         data = {
             'virtual_machine': self.virtualmachine.pk,
             'virtual_machine': self.virtualmachine.pk,
             'name': 'Test Interface 4',
             'name': 'Test Interface 4',
         }
         }
-
         url = reverse('virtualization-api:interface-list')
         url = reverse('virtualization-api:interface-list')
-        response = self.client.post(url, data, format='json', **self.header)
+        self.add_permissions('dcim.add_interface')
 
 
+        response = self.client.post(url, data, format='json', **self.header)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(Interface.objects.count(), 4)
         self.assertEqual(Interface.objects.count(), 4)
         interface4 = Interface.objects.get(pk=response.data['id'])
         interface4 = Interface.objects.get(pk=response.data['id'])
@@ -264,7 +265,6 @@ class InterfaceTest(APITestCase):
         self.assertEqual(interface4.name, data['name'])
         self.assertEqual(interface4.name, data['name'])
 
 
     def test_create_interface_with_802_1q(self):
     def test_create_interface_with_802_1q(self):
-
         data = {
         data = {
             'virtual_machine': self.virtualmachine.pk,
             'virtual_machine': self.virtualmachine.pk,
             'name': 'Test Interface 4',
             'name': 'Test Interface 4',
@@ -272,10 +272,10 @@ class InterfaceTest(APITestCase):
             'untagged_vlan': self.vlan3.id,
             'untagged_vlan': self.vlan3.id,
             'tagged_vlans': [self.vlan1.id, self.vlan2.id],
             'tagged_vlans': [self.vlan1.id, self.vlan2.id],
         }
         }
-
         url = reverse('virtualization-api:interface-list')
         url = reverse('virtualization-api:interface-list')
-        response = self.client.post(url, data, format='json', **self.header)
+        self.add_permissions('dcim.add_interface')
 
 
+        response = self.client.post(url, data, format='json', **self.header)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(Interface.objects.count(), 4)
         self.assertEqual(Interface.objects.count(), 4)
         self.assertEqual(response.data['virtual_machine']['id'], data['virtual_machine'])
         self.assertEqual(response.data['virtual_machine']['id'], data['virtual_machine'])
@@ -284,7 +284,6 @@ class InterfaceTest(APITestCase):
         self.assertEqual([v['id'] for v in response.data['tagged_vlans']], data['tagged_vlans'])
         self.assertEqual([v['id'] for v in response.data['tagged_vlans']], data['tagged_vlans'])
 
 
     def test_create_interface_bulk(self):
     def test_create_interface_bulk(self):
-
         data = [
         data = [
             {
             {
                 'virtual_machine': self.virtualmachine.pk,
                 'virtual_machine': self.virtualmachine.pk,
@@ -299,10 +298,10 @@ class InterfaceTest(APITestCase):
                 'name': 'Test Interface 6',
                 'name': 'Test Interface 6',
             },
             },
         ]
         ]
-
         url = reverse('virtualization-api:interface-list')
         url = reverse('virtualization-api:interface-list')
-        response = self.client.post(url, data, format='json', **self.header)
+        self.add_permissions('dcim.add_interface')
 
 
+        response = self.client.post(url, data, format='json', **self.header)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(Interface.objects.count(), 6)
         self.assertEqual(Interface.objects.count(), 6)
         self.assertEqual(response.data[0]['name'], data[0]['name'])
         self.assertEqual(response.data[0]['name'], data[0]['name'])
@@ -310,7 +309,6 @@ class InterfaceTest(APITestCase):
         self.assertEqual(response.data[2]['name'], data[2]['name'])
         self.assertEqual(response.data[2]['name'], data[2]['name'])
 
 
     def test_create_interface_802_1q_bulk(self):
     def test_create_interface_802_1q_bulk(self):
-
         data = [
         data = [
             {
             {
                 'virtual_machine': self.virtualmachine.pk,
                 'virtual_machine': self.virtualmachine.pk,
@@ -334,10 +332,10 @@ class InterfaceTest(APITestCase):
                 'tagged_vlans': [self.vlan1.id],
                 'tagged_vlans': [self.vlan1.id],
             },
             },
         ]
         ]
-
         url = reverse('virtualization-api:interface-list')
         url = reverse('virtualization-api:interface-list')
-        response = self.client.post(url, data, format='json', **self.header)
+        self.add_permissions('dcim.add_interface')
 
 
+        response = self.client.post(url, data, format='json', **self.header)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(Interface.objects.count(), 6)
         self.assertEqual(Interface.objects.count(), 6)
         for i in range(0, 3):
         for i in range(0, 3):
@@ -346,24 +344,23 @@ class InterfaceTest(APITestCase):
             self.assertEqual(response.data[i]['untagged_vlan']['id'], data[i]['untagged_vlan'])
             self.assertEqual(response.data[i]['untagged_vlan']['id'], data[i]['untagged_vlan'])
 
 
     def test_update_interface(self):
     def test_update_interface(self):
-
         data = {
         data = {
             'virtual_machine': self.virtualmachine.pk,
             'virtual_machine': self.virtualmachine.pk,
             'name': 'Test Interface X',
             'name': 'Test Interface X',
         }
         }
-
         url = reverse('virtualization-api:interface-detail', kwargs={'pk': self.interface1.pk})
         url = reverse('virtualization-api:interface-detail', kwargs={'pk': self.interface1.pk})
-        response = self.client.put(url, data, format='json', **self.header)
+        self.add_permissions('dcim.change_interface')
 
 
+        response = self.client.put(url, data, format='json', **self.header)
         self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(Interface.objects.count(), 3)
         self.assertEqual(Interface.objects.count(), 3)
         interface1 = Interface.objects.get(pk=response.data['id'])
         interface1 = Interface.objects.get(pk=response.data['id'])
         self.assertEqual(interface1.name, data['name'])
         self.assertEqual(interface1.name, data['name'])
 
 
     def test_delete_interface(self):
     def test_delete_interface(self):
-
         url = reverse('virtualization-api:interface-detail', kwargs={'pk': self.interface1.pk})
         url = reverse('virtualization-api:interface-detail', kwargs={'pk': self.interface1.pk})
-        response = self.client.delete(url, **self.header)
+        self.add_permissions('dcim.delete_interface')
 
 
+        response = self.client.delete(url, **self.header)
         self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(Interface.objects.count(), 2)
         self.assertEqual(Interface.objects.count(), 2)