Add permission assignment to custom test methods

This commit is contained in:
Jeremy Stretch 2020-06-08 12:22:29 -04:00
parent 3b44e7c1c4
commit a8145fe4c2
10 changed files with 104 additions and 80 deletions

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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'])

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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(reverse('virtualization-api:virtualmachine-list'), virtualmachine.pk)
url = '{}?id={}'.format(url, virtualmachine.pk) self.add_permissions('virtualization.view_virtualmachine')
response = self.client.get(url, **self.header)
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)