diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index d45d972f8..1733deecc 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -1,6 +1,6 @@ +from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType from django.urls import reverse -from netaddr import IPNetwork from rest_framework import status from circuits.models import Circuit, CircuitTermination, CircuitType, Provider @@ -12,9 +12,9 @@ from dcim.models import ( InventoryItem, Platform, PowerFeed, PowerPort, PowerPortTemplate, PowerOutlet, PowerOutletTemplate, PowerPanel, Rack, RackGroup, RackReservation, RackRole, RearPort, Region, Site, VirtualChassis, ) -from ipam.models import IPAddress, VLAN +from ipam.models import VLAN from extras.models import Graph -from utilities.testing import APITestCase +from utilities.testing import APITestCase, APIViewTestCases from virtualization.models import Cluster, ClusterType @@ -28,2007 +28,795 @@ class AppTest(APITestCase): self.assertEqual(response.status_code, 200) -class RegionTest(APITestCase): +class RegionTest(APIViewTestCases.APIViewTestCase): + model = Region + brief_fields = ['id', 'name', 'site_count', 'slug', 'url'] + create_data = [ + { + 'name': 'Region 4', + 'slug': 'region-4', + }, + { + 'name': 'Region 5', + 'slug': 'region-5', + }, + { + 'name': 'Region 6', + 'slug': 'region-6', + }, + ] - def setUp(self): + @classmethod + def setUpTestData(cls): - super().setUp() + Region.objects.create(name='Region 1', slug='region-1') + Region.objects.create(name='Region 2', slug='region-2') + Region.objects.create(name='Region 3', slug='region-3') - self.region1 = Region.objects.create(name='Test Region 1', slug='test-region-1') - self.region2 = Region.objects.create(name='Test Region 2', slug='test-region-2') - self.region3 = Region.objects.create(name='Test Region 3', slug='test-region-3') - def test_get_region(self): +class SiteTest(APIViewTestCases.APIViewTestCase): + model = Site + brief_fields = ['id', 'name', 'slug', 'url'] - url = reverse('dcim-api:region-detail', kwargs={'pk': self.region1.pk}) - response = self.client.get(url, **self.header) + @classmethod + def setUpTestData(cls): - self.assertEqual(response.data['name'], self.region1.name) - - def test_list_regions(self): - - url = reverse('dcim-api:region-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_list_regions_brief(self): - - url = reverse('dcim-api:region-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['id', 'name', 'site_count', 'slug', 'url'] + regions = ( + Region.objects.create(name='Test Region 1', slug='test-region-1'), + Region.objects.create(name='Test Region 2', slug='test-region-2'), ) - def test_create_region(self): + sites = ( + Site(region=regions[0], name='Site 1', slug='site-1'), + Site(region=regions[0], name='Site 2', slug='site-2'), + Site(region=regions[0], name='Site 3', slug='site-3'), + ) + Site.objects.bulk_create(sites) - data = { - 'name': 'Test Region 4', - 'slug': 'test-region-4', - } - - url = reverse('dcim-api:region-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Region.objects.count(), 4) - region4 = Region.objects.get(pk=response.data['id']) - self.assertEqual(region4.name, data['name']) - self.assertEqual(region4.slug, data['slug']) - - def test_create_region_bulk(self): - - data = [ + cls.create_data = [ { - 'name': 'Test Region 4', - 'slug': 'test-region-4', + 'name': 'Site 4', + 'slug': 'site-4', + 'region': regions[1].pk, + 'status': SiteStatusChoices.STATUS_ACTIVE, }, { - 'name': 'Test Region 5', - 'slug': 'test-region-5', + 'name': 'Site 5', + 'slug': 'site-5', + 'region': regions[1].pk, + 'status': SiteStatusChoices.STATUS_ACTIVE, }, { - 'name': 'Test Region 6', - 'slug': 'test-region-6', + 'name': 'Site 6', + 'slug': 'site-6', + 'region': regions[1].pk, + 'status': SiteStatusChoices.STATUS_ACTIVE, }, ] - url = reverse('dcim-api:region-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Region.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) - - def test_update_region(self): - - data = { - 'name': 'Test Region X', - 'slug': 'test-region-x', - } - - url = reverse('dcim-api:region-detail', kwargs={'pk': self.region1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(Region.objects.count(), 3) - region1 = Region.objects.get(pk=response.data['id']) - self.assertEqual(region1.name, data['name']) - self.assertEqual(region1.slug, data['slug']) - - def test_delete_region(self): - - url = reverse('dcim-api:region-detail', kwargs={'pk': self.region1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(Region.objects.count(), 2) - - -class SiteTest(APITestCase): - - def setUp(self): - - super().setUp() - - self.region1 = Region.objects.create(name='Test Region 1', slug='test-region-1') - self.region2 = Region.objects.create(name='Test Region 2', slug='test-region-2') - self.site1 = Site.objects.create(region=self.region1, name='Test Site 1', slug='test-site-1') - self.site2 = Site.objects.create(region=self.region1, name='Test Site 2', slug='test-site-2') - self.site3 = Site.objects.create(region=self.region1, name='Test Site 3', slug='test-site-3') - - def test_get_site(self): - - url = reverse('dcim-api:site-detail', kwargs={'pk': self.site1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.site1.name) - def test_get_site_graphs(self): + """ + Test retrieval of Graphs assigned to Sites. + """ + ct = ContentType.objects.get_for_model(Site) + graphs = ( + Graph(type=ct, name='Graph 1', source='http://example.com/graphs.py?site={{ obj.slug }}&foo=1'), + Graph(type=ct, name='Graph 2', source='http://example.com/graphs.py?site={{ obj.slug }}&foo=2'), + Graph(type=ct, name='Graph 3', source='http://example.com/graphs.py?site={{ obj.slug }}&foo=3'), + ) + Graph.objects.bulk_create(graphs) - site_ct = ContentType.objects.get_for_model(Site) - self.graph1 = Graph.objects.create( - type=site_ct, - name='Test Graph 1', - source='http://example.com/graphs.py?site={{ obj.slug }}&foo=1' - ) - self.graph2 = Graph.objects.create( - type=site_ct, - name='Test Graph 2', - source='http://example.com/graphs.py?site={{ obj.slug }}&foo=2' - ) - self.graph3 = Graph.objects.create( - type=site_ct, - name='Test Graph 3', - source='http://example.com/graphs.py?site={{ obj.slug }}&foo=3' - ) - - url = reverse('dcim-api:site-graphs', kwargs={'pk': self.site1.pk}) + url = reverse('dcim-api:site-graphs', kwargs={'pk': Site.objects.first().pk}) response = self.client.get(url, **self.header) self.assertEqual(len(response.data), 3) - self.assertEqual(response.data[0]['embed_url'], 'http://example.com/graphs.py?site=test-site-1&foo=1') + self.assertEqual(response.data[0]['embed_url'], 'http://example.com/graphs.py?site=site-1&foo=1') - def test_list_sites(self): - url = reverse('dcim-api:site-list') - response = self.client.get(url, **self.header) +class RackGroupTest(APIViewTestCases.APIViewTestCase): + model = RackGroup + brief_fields = ['id', 'name', 'rack_count', 'slug', 'url'] - self.assertEqual(response.data['count'], 3) + @classmethod + def setUpTestData(cls): - def test_list_sites_brief(self): + sites = ( + Site(name='Site 1', slug='site-1'), + Site(name='Site 2', slug='site-2'), + ) + Site.objects.bulk_create(sites) - url = reverse('dcim-api:site-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['id', 'name', 'slug', 'url'] + parent_rack_groups = ( + RackGroup.objects.create(site=sites[0], name='Parent Rack Group 1', slug='parent-rack-group-1'), + RackGroup.objects.create(site=sites[1], name='Parent Rack Group 2', slug='parent-rack-group-2'), ) - def test_create_site(self): + RackGroup.objects.create(site=sites[0], name='Rack Group 1', slug='rack-group-1', parent=parent_rack_groups[0]) + RackGroup.objects.create(site=sites[0], name='Rack Group 2', slug='rack-group-2', parent=parent_rack_groups[0]) + RackGroup.objects.create(site=sites[0], name='Rack Group 3', slug='rack-group-3', parent=parent_rack_groups[0]) - data = { - 'name': 'Test Site 4', - 'slug': 'test-site-4', - 'region': self.region1.pk, - 'status': SiteStatusChoices.STATUS_ACTIVE, - } - - url = reverse('dcim-api:site-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Site.objects.count(), 4) - site4 = Site.objects.get(pk=response.data['id']) - self.assertEqual(site4.name, data['name']) - self.assertEqual(site4.slug, data['slug']) - self.assertEqual(site4.region_id, data['region']) - - def test_create_site_bulk(self): - - data = [ - { - 'name': 'Test Site 4', - 'slug': 'test-site-4', - 'region': self.region1.pk, - 'status': SiteStatusChoices.STATUS_ACTIVE, - }, - { - 'name': 'Test Site 5', - 'slug': 'test-site-5', - 'region': self.region1.pk, - 'status': SiteStatusChoices.STATUS_ACTIVE, - }, - { - 'name': 'Test Site 6', - 'slug': 'test-site-6', - 'region': self.region1.pk, - 'status': SiteStatusChoices.STATUS_ACTIVE, - }, - ] - - url = reverse('dcim-api:site-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Site.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) - - def test_update_site(self): - - data = { - 'name': 'Test Site X', - 'slug': 'test-site-x', - 'region': self.region2.pk, - } - - url = reverse('dcim-api:site-detail', kwargs={'pk': self.site1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(Site.objects.count(), 3) - site1 = Site.objects.get(pk=response.data['id']) - self.assertEqual(site1.name, data['name']) - self.assertEqual(site1.slug, data['slug']) - self.assertEqual(site1.region_id, data['region']) - - def test_delete_site(self): - - url = reverse('dcim-api:site-detail', kwargs={'pk': self.site1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(Site.objects.count(), 2) - - -class RackGroupTest(APITestCase): - - def setUp(self): - - super().setUp() - - self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1') - self.site2 = Site.objects.create(name='Test Site 2', slug='test-site-2') - self.parent_rackgroup1 = RackGroup.objects.create(site=self.site1, name='Parent Rack Group 1', slug='parent-rack-group-1') - self.parent_rackgroup2 = RackGroup.objects.create(site=self.site2, name='Parent Rack Group 2', slug='parent-rack-group-2') - self.rackgroup1 = RackGroup.objects.create(site=self.site1, name='Rack Group 1', slug='rack-group-1', parent=self.parent_rackgroup1) - self.rackgroup2 = RackGroup.objects.create(site=self.site1, name='Rack Group 2', slug='rack-group-2', parent=self.parent_rackgroup1) - self.rackgroup3 = RackGroup.objects.create(site=self.site1, name='Rack Group 3', slug='rack-group-3', parent=self.parent_rackgroup1) - - def test_get_rackgroup(self): - - url = reverse('dcim-api:rackgroup-detail', kwargs={'pk': self.rackgroup1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.rackgroup1.name) - - def test_list_rackgroups(self): - - url = reverse('dcim-api:rackgroup-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 5) - - def test_list_rackgroups_brief(self): - - url = reverse('dcim-api:rackgroup-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['id', 'name', 'rack_count', 'slug', 'url'] - ) - - def test_create_rackgroup(self): - - data = { - 'name': 'Rack Group 4', - 'slug': 'rack-group-4', - 'site': self.site1.pk, - 'parent': self.parent_rackgroup1.pk, - } - - url = reverse('dcim-api:rackgroup-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(RackGroup.objects.count(), 6) - rackgroup4 = RackGroup.objects.get(pk=response.data['id']) - self.assertEqual(rackgroup4.name, data['name']) - self.assertEqual(rackgroup4.slug, data['slug']) - self.assertEqual(rackgroup4.site_id, data['site']) - self.assertEqual(rackgroup4.parent_id, data['parent']) - - def test_create_rackgroup_bulk(self): - - data = [ + cls.create_data = [ { 'name': 'Test Rack Group 4', 'slug': 'test-rack-group-4', - 'site': self.site1.pk, - 'parent': self.parent_rackgroup1.pk, + 'site': sites[1].pk, + 'parent': parent_rack_groups[1].pk, }, { 'name': 'Test Rack Group 5', 'slug': 'test-rack-group-5', - 'site': self.site1.pk, - 'parent': self.parent_rackgroup1.pk, + 'site': sites[1].pk, + 'parent': parent_rack_groups[1].pk, }, { 'name': 'Test Rack Group 6', 'slug': 'test-rack-group-6', - 'site': self.site1.pk, - 'parent': self.parent_rackgroup1.pk, + 'site': sites[1].pk, + 'parent': parent_rack_groups[1].pk, }, ] - url = reverse('dcim-api:rackgroup-list') - response = self.client.post(url, data, format='json', **self.header) - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(RackGroup.objects.count(), 8) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) +class RackRoleTest(APIViewTestCases.APIViewTestCase): + model = RackRole + brief_fields = ['id', 'name', 'rack_count', 'slug', 'url'] + create_data = [ + { + 'name': 'Rack Role 4', + 'slug': 'rack-role-4', + 'color': 'ffff00', + }, + { + 'name': 'Rack Role 5', + 'slug': 'rack-role-5', + 'color': 'ffff00', + }, + { + 'name': 'Rack Role 6', + 'slug': 'rack-role-6', + 'color': 'ffff00', + }, + ] - def test_update_rackgroup(self): + @classmethod + def setUpTestData(cls): - data = { - 'name': 'Test Rack Group X', - 'slug': 'test-rack-group-x', - 'site': self.site2.pk, - 'parent': self.parent_rackgroup2.pk, - } - - url = reverse('dcim-api:rackgroup-detail', kwargs={'pk': self.rackgroup1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(RackGroup.objects.count(), 5) - rackgroup1 = RackGroup.objects.get(pk=response.data['id']) - self.assertEqual(rackgroup1.name, data['name']) - self.assertEqual(rackgroup1.slug, data['slug']) - self.assertEqual(rackgroup1.site_id, data['site']) - self.assertEqual(rackgroup1.parent_id, data['parent']) - - def test_delete_rackgroup(self): - - url = reverse('dcim-api:rackgroup-detail', kwargs={'pk': self.rackgroup1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(RackGroup.objects.count(), 4) + rack_roles = ( + RackRole(name='Rack Role 1', slug='rack-role-1', color='ff0000'), + RackRole(name='Rack Role 2', slug='rack-role-2', color='00ff00'), + RackRole(name='Rack Role 3', slug='rack-role-3', color='0000ff'), + ) + RackRole.objects.bulk_create(rack_roles) -class RackRoleTest(APITestCase): +class RackTest(APIViewTestCases.APIViewTestCase): + model = Rack + brief_fields = ['device_count', 'display_name', 'id', 'name', 'url'] - def setUp(self): + @classmethod + def setUpTestData(cls): - super().setUp() + sites = ( + Site(name='Site 1', slug='site-1'), + Site(name='Site 2', slug='site-2'), + ) + Site.objects.bulk_create(sites) - self.rackrole1 = RackRole.objects.create(name='Test Rack Role 1', slug='test-rack-role-1', color='ff0000') - self.rackrole2 = RackRole.objects.create(name='Test Rack Role 2', slug='test-rack-role-2', color='00ff00') - self.rackrole3 = RackRole.objects.create(name='Test Rack Role 3', slug='test-rack-role-3', color='0000ff') - - def test_get_rackrole(self): - - url = reverse('dcim-api:rackrole-detail', kwargs={'pk': self.rackrole1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.rackrole1.name) - - def test_list_rackroles(self): - - url = reverse('dcim-api:rackrole-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_list_rackroles_brief(self): - - url = reverse('dcim-api:rackrole-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['id', 'name', 'rack_count', 'slug', 'url'] + rack_groups = ( + RackGroup.objects.create(site=sites[0], name='Rack Group 1', slug='rack-group-1'), + RackGroup.objects.create(site=sites[1], name='Rack Group 2', slug='rack-group-2'), ) - def test_create_rackrole(self): + rack_roles = ( + RackRole(name='Rack Role 1', slug='rack-role-1', color='ff0000'), + RackRole(name='Rack Role 2', slug='rack-role-2', color='00ff00'), + ) + RackRole.objects.bulk_create(rack_roles) - data = { - 'name': 'Test Rack Role 4', - 'slug': 'test-rack-role-4', - 'color': 'ffff00', - } + racks = ( + Rack(site=sites[0], group=rack_groups[0], role=rack_roles[0], name='Rack 1'), + Rack(site=sites[0], group=rack_groups[0], role=rack_roles[0], name='Rack 2'), + Rack(site=sites[0], group=rack_groups[0], role=rack_roles[0], name='Rack 3'), + ) + Rack.objects.bulk_create(racks) - url = reverse('dcim-api:rackrole-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(RackRole.objects.count(), 4) - rackrole1 = RackRole.objects.get(pk=response.data['id']) - self.assertEqual(rackrole1.name, data['name']) - self.assertEqual(rackrole1.slug, data['slug']) - self.assertEqual(rackrole1.color, data['color']) - - def test_create_rackrole_bulk(self): - - data = [ + cls.create_data = [ { - 'name': 'Test Rack Role 4', - 'slug': 'test-rack-role-4', - 'color': 'ffff00', + 'name': 'Test Rack 4', + 'site': sites[1].pk, + 'group': rack_groups[1].pk, + 'role': rack_roles[1].pk, }, { - 'name': 'Test Rack Role 5', - 'slug': 'test-rack-role-5', - 'color': 'ffff00', + 'name': 'Test Rack 5', + 'site': sites[1].pk, + 'group': rack_groups[1].pk, + 'role': rack_roles[1].pk, }, { - 'name': 'Test Rack Role 6', - 'slug': 'test-rack-role-6', - 'color': 'ffff00', + 'name': 'Test Rack 6', + 'site': sites[1].pk, + 'group': rack_groups[1].pk, + 'role': rack_roles[1].pk, }, ] - url = reverse('dcim-api:rackrole-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(RackRole.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) - - def test_update_rackrole(self): - - data = { - 'name': 'Test Rack Role X', - 'slug': 'test-rack-role-x', - 'color': 'ffff00', - } - - url = reverse('dcim-api:rackrole-detail', kwargs={'pk': self.rackrole1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(RackRole.objects.count(), 3) - rackrole1 = RackRole.objects.get(pk=response.data['id']) - self.assertEqual(rackrole1.name, data['name']) - self.assertEqual(rackrole1.slug, data['slug']) - self.assertEqual(rackrole1.color, data['color']) - - def test_delete_rackrole(self): - - url = reverse('dcim-api:rackrole-detail', kwargs={'pk': self.rackrole1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(RackRole.objects.count(), 2) - - -class RackTest(APITestCase): - - def setUp(self): - - super().setUp() - - self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1') - self.site2 = Site.objects.create(name='Test Site 2', slug='test-site-2') - self.rackgroup1 = RackGroup.objects.create(site=self.site1, name='Test Rack Group 1', slug='test-rack-group-1') - self.rackgroup2 = RackGroup.objects.create(site=self.site2, name='Test Rack Group 2', slug='test-rack-group-2') - self.rackrole1 = RackRole.objects.create(name='Test Rack Role 1', slug='test-rack-role-1', color='ff0000') - self.rackrole2 = RackRole.objects.create(name='Test Rack Role 2', slug='test-rack-role-2', color='00ff00') - self.rack1 = Rack.objects.create( - site=self.site1, group=self.rackgroup1, role=self.rackrole1, name='Test Rack 1', u_height=42, - ) - self.rack2 = Rack.objects.create( - site=self.site1, group=self.rackgroup1, role=self.rackrole1, name='Test Rack 2', u_height=42, - ) - self.rack3 = Rack.objects.create( - site=self.site1, group=self.rackgroup1, role=self.rackrole1, name='Test Rack 3', u_height=42, - ) - - def test_get_rack(self): - - url = reverse('dcim-api:rack-detail', kwargs={'pk': self.rack1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.rack1.name) - + # TODO: Document this test def test_get_elevation_rack_units(self): + rack = Rack.objects.first() - url = '{}?q=3'.format(reverse('dcim-api:rack-elevation', kwargs={'pk': self.rack1.pk})) + url = '{}?q=3'.format(reverse('dcim-api:rack-elevation', kwargs={'pk': rack.pk})) response = self.client.get(url, **self.header) self.assertEqual(response.data['count'], 13) - url = '{}?q=U3'.format(reverse('dcim-api:rack-elevation', kwargs={'pk': self.rack1.pk})) + url = '{}?q=U3'.format(reverse('dcim-api:rack-elevation', kwargs={'pk': rack.pk})) response = self.client.get(url, **self.header) self.assertEqual(response.data['count'], 11) - url = '{}?q=10'.format(reverse('dcim-api:rack-elevation', kwargs={'pk': self.rack1.pk})) + url = '{}?q=10'.format(reverse('dcim-api:rack-elevation', kwargs={'pk': rack.pk})) response = self.client.get(url, **self.header) self.assertEqual(response.data['count'], 1) - url = '{}?q=U20'.format(reverse('dcim-api:rack-elevation', kwargs={'pk': self.rack1.pk})) + url = '{}?q=U20'.format(reverse('dcim-api:rack-elevation', kwargs={'pk': rack.pk})) response = self.client.get(url, **self.header) self.assertEqual(response.data['count'], 1) def test_get_rack_elevation(self): - - url = reverse('dcim-api:rack-elevation', kwargs={'pk': self.rack1.pk}) + """ + GET a single rack elevation. + """ + rack = Rack.objects.first() + url = reverse('dcim-api:rack-elevation', kwargs={'pk': rack.pk}) response = self.client.get(url, **self.header) self.assertEqual(response.data['count'], 42) def test_get_rack_elevation_svg(self): - - url = '{}?render=svg'.format(reverse('dcim-api:rack-elevation', kwargs={'pk': self.rack1.pk})) + """ + GET a single rack elevation in SVG format. + """ + rack = Rack.objects.first() + url = '{}?render=svg'.format(reverse('dcim-api:rack-elevation', kwargs={'pk': rack.pk})) response = self.client.get(url, **self.header) self.assertHttpStatus(response, status.HTTP_200_OK) self.assertEqual(response.get('Content-Type'), 'image/svg+xml') - def test_list_racks(self): - url = reverse('dcim-api:rack-list') - response = self.client.get(url, **self.header) +class RackReservationTest(APIViewTestCases.APIViewTestCase): + model = RackReservation - self.assertEqual(response.data['count'], 3) + @classmethod + def setUpTestData(cls): - def test_list_racks_brief(self): + user = User.objects.create(username='user1', is_active=True) - url = reverse('dcim-api:rack-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) + site = Site.objects.create(name='Test Site 1', slug='test-site-1') - self.assertEqual( - sorted(response.data['results'][0]), - ['device_count', 'display_name', 'id', 'name', 'url'] + cls.racks = ( + Rack(site=site, name='Rack 1'), + Rack(site=site, name='Rack 2'), ) + Rack.objects.bulk_create(cls.racks) - def test_create_rack(self): - - data = { - 'name': 'Test Rack 4', - 'facility_id': '1234', - 'site': self.site1.pk, - 'group': self.rackgroup1.pk, - 'role': self.rackrole1.pk, - } - - url = reverse('dcim-api:rack-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Rack.objects.count(), 4) - rack4 = Rack.objects.get(pk=response.data['id']) - self.assertEqual(rack4.name, data['name']) - self.assertEqual(rack4.site_id, data['site']) - self.assertEqual(rack4.group_id, data['group']) - self.assertEqual(rack4.role_id, data['role']) - - def test_create_rack_bulk(self): - - data = [ - { - 'name': 'Test Rack 4', - 'site': self.site1.pk, - 'group': self.rackgroup1.pk, - 'role': self.rackrole1.pk, - }, - { - 'name': 'Test Rack 5', - 'site': self.site1.pk, - 'group': self.rackgroup1.pk, - 'role': self.rackrole1.pk, - }, - { - 'name': 'Test Rack 6', - 'site': self.site1.pk, - 'group': self.rackgroup1.pk, - 'role': self.rackrole1.pk, - }, - ] - - url = reverse('dcim-api:rack-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Rack.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) - - def test_update_rack(self): - - data = { - 'name': 'Test Rack X', - 'site': self.site2.pk, - 'group': self.rackgroup2.pk, - 'role': self.rackrole2.pk, - } - - url = reverse('dcim-api:rack-detail', kwargs={'pk': self.rack1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(Rack.objects.count(), 3) - rack1 = Rack.objects.get(pk=response.data['id']) - self.assertEqual(rack1.name, data['name']) - self.assertEqual(rack1.site_id, data['site']) - self.assertEqual(rack1.group_id, data['group']) - self.assertEqual(rack1.role_id, data['role']) - - def test_delete_rack(self): - - url = reverse('dcim-api:rack-detail', kwargs={'pk': self.rack1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(Rack.objects.count(), 2) - - -class RackReservationTest(APITestCase): + rack_reservations = ( + RackReservation(rack=cls.racks[0], units=[1, 2, 3], user=user, description='Reservation #1'), + RackReservation(rack=cls.racks[0], units=[4, 5, 6], user=user, description='Reservation #2'), + RackReservation(rack=cls.racks[0], units=[7, 8, 9], user=user, description='Reservation #3'), + ) + RackReservation.objects.bulk_create(rack_reservations) def setUp(self): - super().setUp() - self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1') - self.rack1 = Rack.objects.create(site=self.site1, name='Test Rack 1') - self.rackreservation1 = RackReservation.objects.create( - rack=self.rack1, units=[1, 2, 3], user=self.user, description='Reservation #1', - ) - self.rackreservation2 = RackReservation.objects.create( - rack=self.rack1, units=[4, 5, 6], user=self.user, description='Reservation #2', - ) - self.rackreservation3 = RackReservation.objects.create( - rack=self.rack1, units=[7, 8, 9], user=self.user, description='Reservation #3', - ) - - def test_get_rackreservation(self): - - url = reverse('dcim-api:rackreservation-detail', kwargs={'pk': self.rackreservation1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['id'], self.rackreservation1.pk) - - def test_list_rackreservations(self): - - url = reverse('dcim-api:rackreservation-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_create_rackreservation(self): - - data = { - 'rack': self.rack1.pk, - 'units': [10, 11, 12], - 'user': self.user.pk, - 'description': 'Fourth reservation', - } - - url = reverse('dcim-api:rackreservation-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(RackReservation.objects.count(), 4) - rackreservation4 = RackReservation.objects.get(pk=response.data['id']) - self.assertEqual(rackreservation4.rack_id, data['rack']) - self.assertEqual(rackreservation4.units, data['units']) - self.assertEqual(rackreservation4.user_id, data['user']) - self.assertEqual(rackreservation4.description, data['description']) - - def test_create_rackreservation_bulk(self): - - data = [ + # We have to set creation data under setUp() because we need access to the test user. + self.create_data = [ { - 'rack': self.rack1.pk, + 'rack': self.racks[1].pk, 'units': [10, 11, 12], 'user': self.user.pk, 'description': 'Reservation #4', }, { - 'rack': self.rack1.pk, + 'rack': self.racks[1].pk, 'units': [13, 14, 15], 'user': self.user.pk, 'description': 'Reservation #5', }, { - 'rack': self.rack1.pk, + 'rack': self.racks[1].pk, 'units': [16, 17, 18], 'user': self.user.pk, 'description': 'Reservation #6', }, ] - url = reverse('dcim-api:rackreservation-list') - response = self.client.post(url, data, format='json', **self.header) - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(RackReservation.objects.count(), 6) - self.assertEqual(response.data[0]['description'], data[0]['description']) - self.assertEqual(response.data[1]['description'], data[1]['description']) - self.assertEqual(response.data[2]['description'], data[2]['description']) +class ManufacturerTest(APIViewTestCases.APIViewTestCase): + model = Manufacturer + brief_fields = ['devicetype_count', 'id', 'name', 'slug', 'url'] + create_data = [ + { + 'name': 'Manufacturer 4', + 'slug': 'manufacturer-4', + }, + { + 'name': 'Manufacturer 5', + 'slug': 'manufacturer-5', + }, + { + 'name': 'Manufacturer 6', + 'slug': 'manufacturer-6', + }, + ] - def test_update_rackreservation(self): + @classmethod + def setUpTestData(cls): - data = { - 'rack': self.rack1.pk, - 'units': [10, 11, 12], - 'user': self.user.pk, - 'description': 'Modified reservation', - } - - url = reverse('dcim-api:rackreservation-detail', kwargs={'pk': self.rackreservation1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(RackReservation.objects.count(), 3) - rackreservation1 = RackReservation.objects.get(pk=response.data['id']) - self.assertEqual(rackreservation1.units, data['units']) - self.assertEqual(rackreservation1.description, data['description']) - - def test_delete_rackreservation(self): - - url = reverse('dcim-api:rackreservation-detail', kwargs={'pk': self.rackreservation1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(RackReservation.objects.count(), 2) - - -class ManufacturerTest(APITestCase): - - def setUp(self): - - super().setUp() - - self.manufacturer1 = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') - self.manufacturer2 = Manufacturer.objects.create(name='Test Manufacturer 2', slug='test-manufacturer-2') - self.manufacturer3 = Manufacturer.objects.create(name='Test Manufacturer 3', slug='test-manufacturer-3') - - def test_get_manufacturer(self): - - url = reverse('dcim-api:manufacturer-detail', kwargs={'pk': self.manufacturer1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.manufacturer1.name) - - def test_list_manufacturers(self): - - url = reverse('dcim-api:manufacturer-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_list_manufacturers_brief(self): - - url = reverse('dcim-api:manufacturer-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['devicetype_count', 'id', 'name', 'slug', 'url'] + manufacturers = ( + Manufacturer(name='Manufacturer 1', slug='manufacturer-1'), + Manufacturer(name='Manufacturer 2', slug='manufacturer-2'), + Manufacturer(name='Manufacturer 3', slug='manufacturer-3'), ) + Manufacturer.objects.bulk_create(manufacturers) - def test_create_manufacturer(self): - data = { - 'name': 'Test Manufacturer 4', - 'slug': 'test-manufacturer-4', - } +class DeviceTypeTest(APIViewTestCases.APIViewTestCase): + model = DeviceType + brief_fields = ['device_count', 'display_name', 'id', 'manufacturer', 'model', 'slug', 'url'] - url = reverse('dcim-api:manufacturer-list') - response = self.client.post(url, data, format='json', **self.header) + @classmethod + def setUpTestData(cls): - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Manufacturer.objects.count(), 4) - manufacturer4 = Manufacturer.objects.get(pk=response.data['id']) - self.assertEqual(manufacturer4.name, data['name']) - self.assertEqual(manufacturer4.slug, data['slug']) + manufacturers = ( + Manufacturer(name='Manufacturer 1', slug='manufacturer-1'), + Manufacturer(name='Manufacturer 2', slug='manufacturer-2'), + ) + Manufacturer.objects.bulk_create(manufacturers) - def test_create_manufacturer_bulk(self): + device_types = ( + DeviceType(manufacturer=manufacturers[0], model='Device Type 1', slug='device-type-1'), + DeviceType(manufacturer=manufacturers[0], model='Device Type 2', slug='device-type-2'), + DeviceType(manufacturer=manufacturers[0], model='Device Type 3', slug='device-type-3'), + ) + DeviceType.objects.bulk_create(device_types) - data = [ + cls.create_data = [ { - 'name': 'Test Manufacturer 4', - 'slug': 'test-manufacturer-4', + 'manufacturer': manufacturers[1].pk, + 'model': 'Device Type 4', + 'slug': 'device-type-4', }, { - 'name': 'Test Manufacturer 5', - 'slug': 'test-manufacturer-5', + 'manufacturer': manufacturers[1].pk, + 'model': 'Device Type 5', + 'slug': 'device-type-5', }, { - 'name': 'Test Manufacturer 6', - 'slug': 'test-manufacturer-6', + 'manufacturer': manufacturers[1].pk, + 'model': 'Device Type 6', + 'slug': 'device-type-6', }, ] - url = reverse('dcim-api:manufacturer-list') - response = self.client.post(url, data, format='json', **self.header) - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Manufacturer.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) +class ConsolePortTemplateTest(APIViewTestCases.APIViewTestCase): + model = ConsolePortTemplate + brief_fields = ['id', 'name', 'url'] - def test_update_manufacturer(self): - - data = { - 'name': 'Test Manufacturer X', - 'slug': 'test-manufacturer-x', - } - - url = reverse('dcim-api:manufacturer-detail', kwargs={'pk': self.manufacturer1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(Manufacturer.objects.count(), 3) - manufacturer1 = Manufacturer.objects.get(pk=response.data['id']) - self.assertEqual(manufacturer1.name, data['name']) - self.assertEqual(manufacturer1.slug, data['slug']) - - def test_delete_manufacturer(self): - - url = reverse('dcim-api:manufacturer-detail', kwargs={'pk': self.manufacturer1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(Manufacturer.objects.count(), 2) - - -class DeviceTypeTest(APITestCase): - - def setUp(self): - - super().setUp() - - self.manufacturer1 = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') - self.manufacturer2 = Manufacturer.objects.create(name='Test Manufacturer 2', slug='test-manufacturer-2') - self.devicetype1 = DeviceType.objects.create( - manufacturer=self.manufacturer1, model='Test Device Type 1', slug='test-device-type-1' - ) - self.devicetype2 = DeviceType.objects.create( - manufacturer=self.manufacturer1, model='Test Device Type 2', slug='test-device-type-2' - ) - self.devicetype3 = DeviceType.objects.create( - manufacturer=self.manufacturer1, model='Test Device Type 3', slug='test-device-type-3' - ) - - def test_get_devicetype(self): - - url = reverse('dcim-api:devicetype-detail', kwargs={'pk': self.devicetype1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['model'], self.devicetype1.model) - - def test_list_devicetypes(self): - - url = reverse('dcim-api:devicetype-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_list_devicetypes_brief(self): - - url = reverse('dcim-api:devicetype-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['device_count', 'display_name', 'id', 'manufacturer', 'model', 'slug', 'url'] - ) - - def test_create_devicetype(self): - - data = { - 'manufacturer': self.manufacturer1.pk, - 'model': 'Test Device Type 4', - 'slug': 'test-device-type-4', - } - - url = reverse('dcim-api:devicetype-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(DeviceType.objects.count(), 4) - devicetype4 = DeviceType.objects.get(pk=response.data['id']) - self.assertEqual(devicetype4.manufacturer_id, data['manufacturer']) - self.assertEqual(devicetype4.model, data['model']) - self.assertEqual(devicetype4.slug, data['slug']) - - def test_create_devicetype_bulk(self): - - data = [ - { - 'manufacturer': self.manufacturer1.pk, - 'model': 'Test Device Type 4', - 'slug': 'test-device-type-4', - }, - { - 'manufacturer': self.manufacturer1.pk, - 'model': 'Test Device Type 5', - 'slug': 'test-device-type-5', - }, - { - 'manufacturer': self.manufacturer1.pk, - 'model': 'Test Device Type 6', - 'slug': 'test-device-type-6', - }, - ] - - url = reverse('dcim-api:devicetype-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(DeviceType.objects.count(), 6) - self.assertEqual(response.data[0]['model'], data[0]['model']) - self.assertEqual(response.data[1]['model'], data[1]['model']) - self.assertEqual(response.data[2]['model'], data[2]['model']) - - def test_update_devicetype(self): - - data = { - 'manufacturer': self.manufacturer2.pk, - 'model': 'Test Device Type X', - 'slug': 'test-device-type-x', - } - - url = reverse('dcim-api:devicetype-detail', kwargs={'pk': self.devicetype1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(DeviceType.objects.count(), 3) - devicetype1 = DeviceType.objects.get(pk=response.data['id']) - self.assertEqual(devicetype1.manufacturer_id, data['manufacturer']) - self.assertEqual(devicetype1.model, data['model']) - self.assertEqual(devicetype1.slug, data['slug']) - - def test_delete_devicetype(self): - - url = reverse('dcim-api:devicetype-detail', kwargs={'pk': self.devicetype1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(DeviceType.objects.count(), 2) - - -class ConsolePortTemplateTest(APITestCase): - - def setUp(self): - - super().setUp() - - self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') - self.devicetype = DeviceType.objects.create( - manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1' - ) - self.consoleporttemplate1 = ConsolePortTemplate.objects.create( - device_type=self.devicetype, name='Test CP Template 1' - ) - self.consoleporttemplate2 = ConsolePortTemplate.objects.create( - device_type=self.devicetype, name='Test CP Template 2' - ) - self.consoleporttemplate3 = ConsolePortTemplate.objects.create( - device_type=self.devicetype, name='Test CP Template 3' - ) - - def test_get_consoleporttemplate(self): - - url = reverse('dcim-api:consoleporttemplate-detail', kwargs={'pk': self.consoleporttemplate1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.consoleporttemplate1.name) - - def test_list_consoleporttemplates(self): - - url = reverse('dcim-api:consoleporttemplate-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_create_consoleporttemplate(self): - - data = { - 'device_type': self.devicetype.pk, - 'name': 'Test CP Template 4', - } - - url = reverse('dcim-api:consoleporttemplate-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(ConsolePortTemplate.objects.count(), 4) - consoleporttemplate4 = ConsolePortTemplate.objects.get(pk=response.data['id']) - self.assertEqual(consoleporttemplate4.device_type_id, data['device_type']) - self.assertEqual(consoleporttemplate4.name, data['name']) - - def test_create_consoleporttemplate_bulk(self): - - data = [ - { - 'device_type': self.devicetype.pk, - 'name': 'Test CP Template 4', - }, - { - 'device_type': self.devicetype.pk, - 'name': 'Test CP Template 5', - }, - { - 'device_type': self.devicetype.pk, - 'name': 'Test CP Template 6', - }, - ] - - url = reverse('dcim-api:consoleporttemplate-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(ConsolePortTemplate.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) - - def test_update_consoleporttemplate(self): - - data = { - 'device_type': self.devicetype.pk, - 'name': 'Test CP Template X', - } - - url = reverse('dcim-api:consoleporttemplate-detail', kwargs={'pk': self.consoleporttemplate1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(ConsolePortTemplate.objects.count(), 3) - consoleporttemplate1 = ConsolePortTemplate.objects.get(pk=response.data['id']) - self.assertEqual(consoleporttemplate1.name, data['name']) - - def test_delete_consoleporttemplate(self): - - url = reverse('dcim-api:consoleporttemplate-detail', kwargs={'pk': self.consoleporttemplate1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(ConsolePortTemplate.objects.count(), 2) - - -class ConsoleServerPortTemplateTest(APITestCase): - - def setUp(self): - - super().setUp() - - self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') - self.devicetype = DeviceType.objects.create( - manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1' - ) - self.consoleserverporttemplate1 = ConsoleServerPortTemplate.objects.create( - device_type=self.devicetype, name='Test CSP Template 1' - ) - self.consoleserverporttemplate2 = ConsoleServerPortTemplate.objects.create( - device_type=self.devicetype, name='Test CSP Template 2' - ) - self.consoleserverporttemplate3 = ConsoleServerPortTemplate.objects.create( - device_type=self.devicetype, name='Test CSP Template 3' - ) - - def test_get_consoleserverporttemplate(self): - - url = reverse('dcim-api:consoleserverporttemplate-detail', kwargs={'pk': self.consoleserverporttemplate1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.consoleserverporttemplate1.name) - - def test_list_consoleserverporttemplates(self): - - url = reverse('dcim-api:consoleserverporttemplate-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_create_consoleserverporttemplate(self): - - data = { - 'device_type': self.devicetype.pk, - 'name': 'Test CSP Template 4', - } - - url = reverse('dcim-api:consoleserverporttemplate-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(ConsoleServerPortTemplate.objects.count(), 4) - consoleserverporttemplate4 = ConsoleServerPortTemplate.objects.get(pk=response.data['id']) - self.assertEqual(consoleserverporttemplate4.device_type_id, data['device_type']) - self.assertEqual(consoleserverporttemplate4.name, data['name']) - - def test_create_consoleserverporttemplate_bulk(self): - - data = [ - { - 'device_type': self.devicetype.pk, - 'name': 'Test CSP Template 4', - }, - { - 'device_type': self.devicetype.pk, - 'name': 'Test CSP Template 5', - }, - { - 'device_type': self.devicetype.pk, - 'name': 'Test CSP Template 6', - }, - ] - - url = reverse('dcim-api:consoleserverporttemplate-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(ConsoleServerPortTemplate.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) - - def test_update_consoleserverporttemplate(self): - - data = { - 'device_type': self.devicetype.pk, - 'name': 'Test CSP Template X', - } - - url = reverse('dcim-api:consoleserverporttemplate-detail', kwargs={'pk': self.consoleserverporttemplate1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(ConsoleServerPortTemplate.objects.count(), 3) - consoleserverporttemplate1 = ConsoleServerPortTemplate.objects.get(pk=response.data['id']) - self.assertEqual(consoleserverporttemplate1.name, data['name']) - - def test_delete_consoleserverporttemplate(self): - - url = reverse('dcim-api:consoleserverporttemplate-detail', kwargs={'pk': self.consoleserverporttemplate1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(ConsoleServerPortTemplate.objects.count(), 2) - - -class PowerPortTemplateTest(APITestCase): - - def setUp(self): - - super().setUp() - - self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') - self.devicetype = DeviceType.objects.create( - manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1' - ) - self.powerporttemplate1 = PowerPortTemplate.objects.create( - device_type=self.devicetype, name='Test PP Template 1' - ) - self.powerporttemplate2 = PowerPortTemplate.objects.create( - device_type=self.devicetype, name='Test PP Template 2' - ) - self.powerporttemplate3 = PowerPortTemplate.objects.create( - device_type=self.devicetype, name='Test PP Template 3' - ) - - def test_get_powerporttemplate(self): - - url = reverse('dcim-api:powerporttemplate-detail', kwargs={'pk': self.powerporttemplate1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.powerporttemplate1.name) - - def test_list_powerporttemplates(self): - - url = reverse('dcim-api:powerporttemplate-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_create_powerporttemplate(self): - - data = { - 'device_type': self.devicetype.pk, - 'name': 'Test PP Template 4', - } - - url = reverse('dcim-api:powerporttemplate-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(PowerPortTemplate.objects.count(), 4) - powerporttemplate4 = PowerPortTemplate.objects.get(pk=response.data['id']) - self.assertEqual(powerporttemplate4.device_type_id, data['device_type']) - self.assertEqual(powerporttemplate4.name, data['name']) - - def test_create_powerporttemplate_bulk(self): - - data = [ - { - 'device_type': self.devicetype.pk, - 'name': 'Test PP Template 4', - }, - { - 'device_type': self.devicetype.pk, - 'name': 'Test PP Template 5', - }, - { - 'device_type': self.devicetype.pk, - 'name': 'Test PP Template 6', - }, - ] - - url = reverse('dcim-api:powerporttemplate-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(PowerPortTemplate.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) - - def test_update_powerporttemplate(self): - - data = { - 'device_type': self.devicetype.pk, - 'name': 'Test PP Template X', - } - - url = reverse('dcim-api:powerporttemplate-detail', kwargs={'pk': self.powerporttemplate1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(PowerPortTemplate.objects.count(), 3) - powerporttemplate1 = PowerPortTemplate.objects.get(pk=response.data['id']) - self.assertEqual(powerporttemplate1.name, data['name']) - - def test_delete_powerporttemplate(self): - - url = reverse('dcim-api:powerporttemplate-detail', kwargs={'pk': self.powerporttemplate1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(PowerPortTemplate.objects.count(), 2) - - -class PowerOutletTemplateTest(APITestCase): - - def setUp(self): - - super().setUp() - - self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') - self.devicetype = DeviceType.objects.create( - manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1' - ) - self.poweroutlettemplate1 = PowerOutletTemplate.objects.create( - device_type=self.devicetype, name='Test PO Template 1' - ) - self.poweroutlettemplate2 = PowerOutletTemplate.objects.create( - device_type=self.devicetype, name='Test PO Template 2' - ) - self.poweroutlettemplate3 = PowerOutletTemplate.objects.create( - device_type=self.devicetype, name='Test PO Template 3' - ) - - def test_get_poweroutlettemplate(self): - - url = reverse('dcim-api:poweroutlettemplate-detail', kwargs={'pk': self.poweroutlettemplate1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.poweroutlettemplate1.name) - - def test_list_poweroutlettemplates(self): - - url = reverse('dcim-api:poweroutlettemplate-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_create_poweroutlettemplate(self): - - data = { - 'device_type': self.devicetype.pk, - 'name': 'Test PO Template 4', - } - - url = reverse('dcim-api:poweroutlettemplate-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(PowerOutletTemplate.objects.count(), 4) - poweroutlettemplate4 = PowerOutletTemplate.objects.get(pk=response.data['id']) - self.assertEqual(poweroutlettemplate4.device_type_id, data['device_type']) - self.assertEqual(poweroutlettemplate4.name, data['name']) - - def test_create_poweroutlettemplate_bulk(self): - - data = [ - { - 'device_type': self.devicetype.pk, - 'name': 'Test PO Template 4', - }, - { - 'device_type': self.devicetype.pk, - 'name': 'Test PO Template 5', - }, - { - 'device_type': self.devicetype.pk, - 'name': 'Test PO Template 6', - }, - ] - - url = reverse('dcim-api:poweroutlettemplate-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(PowerOutletTemplate.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) - - def test_update_poweroutlettemplate(self): - - data = { - 'device_type': self.devicetype.pk, - 'name': 'Test PO Template X', - } - - url = reverse('dcim-api:poweroutlettemplate-detail', kwargs={'pk': self.poweroutlettemplate1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(PowerOutletTemplate.objects.count(), 3) - poweroutlettemplate1 = PowerOutletTemplate.objects.get(pk=response.data['id']) - self.assertEqual(poweroutlettemplate1.name, data['name']) - - def test_delete_poweroutlettemplate(self): - - url = reverse('dcim-api:poweroutlettemplate-detail', kwargs={'pk': self.poweroutlettemplate1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(PowerOutletTemplate.objects.count(), 2) - - -class InterfaceTemplateTest(APITestCase): - - def setUp(self): - - super().setUp() - - self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') - self.devicetype = DeviceType.objects.create( - manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1' - ) - self.interfacetemplate1 = InterfaceTemplate.objects.create( - device_type=self.devicetype, name='Test Interface Template 1', type='1000base-t' - ) - self.interfacetemplate2 = InterfaceTemplate.objects.create( - device_type=self.devicetype, name='Test Interface Template 2', type='1000base-t' - ) - self.interfacetemplate3 = InterfaceTemplate.objects.create( - device_type=self.devicetype, name='Test Interface Template 3', type='1000base-t' - ) - - def test_get_interfacetemplate(self): - - url = reverse('dcim-api:interfacetemplate-detail', kwargs={'pk': self.interfacetemplate1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.interfacetemplate1.name) - - def test_list_interfacetemplates(self): - - url = reverse('dcim-api:interfacetemplate-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_create_interfacetemplate(self): - - data = { - 'device_type': self.devicetype.pk, - 'name': 'Test Interface Template 4', - 'type': '1000base-t', - } - - url = reverse('dcim-api:interfacetemplate-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(InterfaceTemplate.objects.count(), 4) - interfacetemplate4 = InterfaceTemplate.objects.get(pk=response.data['id']) - self.assertEqual(interfacetemplate4.device_type_id, data['device_type']) - self.assertEqual(interfacetemplate4.name, data['name']) - - def test_create_interfacetemplate_bulk(self): - - data = [ - { - 'device_type': self.devicetype.pk, - 'name': 'Test Interface Template 4', - 'type': '1000base-t', - }, - { - 'device_type': self.devicetype.pk, - 'name': 'Test Interface Template 5', - 'type': '1000base-t', - }, - { - 'device_type': self.devicetype.pk, - 'name': 'Test Interface Template 6', - 'type': '1000base-t', - }, - ] - - url = reverse('dcim-api:interfacetemplate-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(InterfaceTemplate.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) - - def test_update_interfacetemplate(self): - - data = { - 'device_type': self.devicetype.pk, - 'name': 'Test Interface Template X', - 'type': '1000base-x-gbic', - } - - url = reverse('dcim-api:interfacetemplate-detail', kwargs={'pk': self.interfacetemplate1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(InterfaceTemplate.objects.count(), 3) - interfacetemplate1 = InterfaceTemplate.objects.get(pk=response.data['id']) - self.assertEqual(interfacetemplate1.name, data['name']) - - def test_delete_interfacetemplate(self): - - url = reverse('dcim-api:interfacetemplate-detail', kwargs={'pk': self.interfacetemplate1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(InterfaceTemplate.objects.count(), 2) - - -class DeviceBayTemplateTest(APITestCase): - - def setUp(self): - - super().setUp() - - self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') - self.devicetype = DeviceType.objects.create( - manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1' - ) - self.devicebaytemplate1 = DeviceBayTemplate.objects.create( - device_type=self.devicetype, name='Test Device Bay Template 1' - ) - self.devicebaytemplate2 = DeviceBayTemplate.objects.create( - device_type=self.devicetype, name='Test Device Bay Template 2' - ) - self.devicebaytemplate3 = DeviceBayTemplate.objects.create( - device_type=self.devicetype, name='Test Device Bay Template 3' - ) - - def test_get_devicebaytemplate(self): - - url = reverse('dcim-api:devicebaytemplate-detail', kwargs={'pk': self.devicebaytemplate1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.devicebaytemplate1.name) - - def test_list_devicebaytemplates(self): - - url = reverse('dcim-api:devicebaytemplate-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_create_devicebaytemplate(self): - - data = { - 'device_type': self.devicetype.pk, - 'name': 'Test Device Bay Template 4', - } - - url = reverse('dcim-api:devicebaytemplate-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(DeviceBayTemplate.objects.count(), 4) - devicebaytemplate4 = DeviceBayTemplate.objects.get(pk=response.data['id']) - self.assertEqual(devicebaytemplate4.device_type_id, data['device_type']) - self.assertEqual(devicebaytemplate4.name, data['name']) - - def test_create_devicebaytemplate_bulk(self): - - data = [ - { - 'device_type': self.devicetype.pk, - 'name': 'Test Device Bay Template 4', - }, - { - 'device_type': self.devicetype.pk, - 'name': 'Test Device Bay Template 5', - }, - { - 'device_type': self.devicetype.pk, - 'name': 'Test Device Bay Template 6', - }, - ] - - url = reverse('dcim-api:devicebaytemplate-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(DeviceBayTemplate.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) - - def test_update_devicebaytemplate(self): - - data = { - 'device_type': self.devicetype.pk, - 'name': 'Test Device Bay Template X', - } - - url = reverse('dcim-api:devicebaytemplate-detail', kwargs={'pk': self.devicebaytemplate1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(DeviceBayTemplate.objects.count(), 3) - devicebaytemplate1 = DeviceBayTemplate.objects.get(pk=response.data['id']) - self.assertEqual(devicebaytemplate1.name, data['name']) - - def test_delete_devicebaytemplate(self): - - url = reverse('dcim-api:devicebaytemplate-detail', kwargs={'pk': self.devicebaytemplate1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(DeviceBayTemplate.objects.count(), 2) - - -class DeviceRoleTest(APITestCase): - - def setUp(self): - - super().setUp() - - self.devicerole1 = DeviceRole.objects.create( - name='Test Device Role 1', slug='test-device-role-1', color='ff0000' - ) - self.devicerole2 = DeviceRole.objects.create( - name='Test Device Role 2', slug='test-device-role-2', color='00ff00' - ) - self.devicerole3 = DeviceRole.objects.create( - name='Test Device Role 3', slug='test-device-role-3', color='0000ff' - ) - - def test_get_devicerole(self): - - url = reverse('dcim-api:devicerole-detail', kwargs={'pk': self.devicerole1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.devicerole1.name) - - def test_list_deviceroles(self): - - url = reverse('dcim-api:devicerole-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_list_deviceroles_brief(self): - - url = reverse('dcim-api:devicerole-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['device_count', 'id', 'name', 'slug', 'url', 'virtualmachine_count'] - ) - - def test_create_devicerole(self): - - data = { - 'name': 'Test Device Role 4', - 'slug': 'test-device-role-4', - 'color': 'ffff00', - } - - url = reverse('dcim-api:devicerole-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(DeviceRole.objects.count(), 4) - devicerole4 = DeviceRole.objects.get(pk=response.data['id']) - self.assertEqual(devicerole4.name, data['name']) - self.assertEqual(devicerole4.slug, data['slug']) - self.assertEqual(devicerole4.color, data['color']) - - def test_create_devicerole_bulk(self): - - data = [ - { - 'name': 'Test Device Role 4', - 'slug': 'test-device-role-4', - 'color': 'ffff00', - }, - { - 'name': 'Test Device Role 5', - 'slug': 'test-device-role-5', - 'color': 'ffff00', - }, - { - 'name': 'Test Device Role 6', - 'slug': 'test-device-role-6', - 'color': 'ffff00', - }, - ] - - url = reverse('dcim-api:devicerole-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(DeviceRole.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) - - def test_update_devicerole(self): - - data = { - 'name': 'Test Device Role X', - 'slug': 'test-device-role-x', - 'color': '00ffff', - } - - url = reverse('dcim-api:devicerole-detail', kwargs={'pk': self.devicerole1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(DeviceRole.objects.count(), 3) - devicerole1 = DeviceRole.objects.get(pk=response.data['id']) - self.assertEqual(devicerole1.name, data['name']) - self.assertEqual(devicerole1.slug, data['slug']) - self.assertEqual(devicerole1.color, data['color']) - - def test_delete_devicerole(self): - - url = reverse('dcim-api:devicerole-detail', kwargs={'pk': self.devicerole1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(DeviceRole.objects.count(), 2) - - -class PlatformTest(APITestCase): - - def setUp(self): - - super().setUp() - - self.platform1 = Platform.objects.create(name='Test Platform 1', slug='test-platform-1') - self.platform2 = Platform.objects.create(name='Test Platform 2', slug='test-platform-2') - self.platform3 = Platform.objects.create(name='Test Platform 3', slug='test-platform-3') - - def test_get_platform(self): - - url = reverse('dcim-api:platform-detail', kwargs={'pk': self.platform1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.platform1.name) - - def test_list_platforms(self): - - url = reverse('dcim-api:platform-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_list_platforms_brief(self): - - url = reverse('dcim-api:platform-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['device_count', 'id', 'name', 'slug', 'url', 'virtualmachine_count'] - ) - - def test_create_platform(self): - - data = { - 'name': 'Test Platform 4', - 'slug': 'test-platform-4', - } - - url = reverse('dcim-api:platform-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Platform.objects.count(), 4) - platform4 = Platform.objects.get(pk=response.data['id']) - self.assertEqual(platform4.name, data['name']) - self.assertEqual(platform4.slug, data['slug']) - - def test_create_platform_bulk(self): - - data = [ - { - 'name': 'Test Platform 4', - 'slug': 'test-platform-4', - }, - { - 'name': 'Test Platform 5', - 'slug': 'test-platform-5', - }, - { - 'name': 'Test Platform 6', - 'slug': 'test-platform-6', - }, - ] - - url = reverse('dcim-api:platform-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Platform.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) - - def test_update_platform(self): - - data = { - 'name': 'Test Platform X', - 'slug': 'test-platform-x', - } - - url = reverse('dcim-api:platform-detail', kwargs={'pk': self.platform1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(Platform.objects.count(), 3) - platform1 = Platform.objects.get(pk=response.data['id']) - self.assertEqual(platform1.name, data['name']) - self.assertEqual(platform1.slug, data['slug']) - - def test_delete_platform(self): - - url = reverse('dcim-api:platform-detail', kwargs={'pk': self.platform1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(Platform.objects.count(), 2) - - -class DeviceTest(APITestCase): - - def setUp(self): - - super().setUp() - - self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1') - self.site2 = Site.objects.create(name='Test Site 2', slug='test-site-2') - self.rack1 = Rack.objects.create(name='Test Rack 1', site=self.site1, u_height=48) + @classmethod + def setUpTestData(cls): manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') - self.devicetype1 = DeviceType.objects.create( - manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1' - ) - self.devicetype2 = DeviceType.objects.create( - manufacturer=manufacturer, model='Test Device Type 2', slug='test-device-type-2' - ) - self.devicerole1 = DeviceRole.objects.create( - name='Test Device Role 1', slug='test-device-role-1', color='ff0000' - ) - self.devicerole2 = DeviceRole.objects.create( - name='Test Device Role 2', slug='test-device-role-2', color='00ff00' - ) - cluster_type = ClusterType.objects.create(name='Test Cluster Type 1', slug='test-cluster-type-1') - self.cluster1 = Cluster.objects.create(name='Test Cluster 1', type=cluster_type) - self.device1 = Device.objects.create( - device_type=self.devicetype1, - device_role=self.devicerole1, - name='Test Device 1', - site=self.site1, - cluster=self.cluster1 - ) - self.device2 = Device.objects.create( - device_type=self.devicetype1, - device_role=self.devicerole1, - name='Test Device 2', - site=self.site1, - cluster=self.cluster1 - ) - self.device3 = Device.objects.create( - device_type=self.devicetype1, - device_role=self.devicerole1, - name='Test Device 3', - site=self.site1, - cluster=self.cluster1 - ) - self.device_with_context_data = Device.objects.create( - device_type=self.devicetype1, - device_role=self.devicerole1, - name='Device with context data', - site=self.site1, - local_context_data={ - 'A': 1, - 'B': 2 - } + devicetype = DeviceType.objects.create( + manufacturer=manufacturer, model='Device Type 1', slug='device-type-1' ) - def test_get_device(self): + console_port_templates = ( + ConsolePortTemplate(device_type=devicetype, name='Console Port Template 1'), + ConsolePortTemplate(device_type=devicetype, name='Console Port Template 2'), + ConsolePortTemplate(device_type=devicetype, name='Console Port Template 3'), + ) + ConsolePortTemplate.objects.bulk_create(console_port_templates) - url = reverse('dcim-api:device-detail', kwargs={'pk': self.device1.pk}) - response = self.client.get(url, **self.header) + cls.create_data = [ + { + 'device_type': devicetype.pk, + 'name': 'Console Port Template 4', + }, + { + 'device_type': devicetype.pk, + 'name': 'Console Port Template 5', + }, + { + 'device_type': devicetype.pk, + 'name': 'Console Port Template 6', + }, + ] - self.assertEqual(response.data['name'], self.device1.name) - self.assertEqual(response.data['device_role']['id'], self.devicerole1.pk) - self.assertEqual(response.data['cluster']['id'], self.cluster1.pk) + +class ConsoleServerPortTemplateTest(APIViewTestCases.APIViewTestCase): + model = ConsoleServerPortTemplate + brief_fields = ['id', 'name', 'url'] + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') + devicetype = DeviceType.objects.create( + manufacturer=manufacturer, model='Device Type 1', slug='device-type-1' + ) + + console_server_port_templates = ( + ConsoleServerPortTemplate(device_type=devicetype, name='Console Server Port Template 1'), + ConsoleServerPortTemplate(device_type=devicetype, name='Console Server Port Template 2'), + ConsoleServerPortTemplate(device_type=devicetype, name='Console Server Port Template 3'), + ) + ConsoleServerPortTemplate.objects.bulk_create(console_server_port_templates) + + cls.create_data = [ + { + 'device_type': devicetype.pk, + 'name': 'Console Server Port Template 4', + }, + { + 'device_type': devicetype.pk, + 'name': 'Console Server Port Template 5', + }, + { + 'device_type': devicetype.pk, + 'name': 'Console Server Port Template 6', + }, + ] + + +class PowerPortTemplateTest(APIViewTestCases.APIViewTestCase): + model = PowerPortTemplate + brief_fields = ['id', 'name', 'url'] + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') + devicetype = DeviceType.objects.create( + manufacturer=manufacturer, model='Device Type 1', slug='device-type-1' + ) + + power_port_templates = ( + PowerPortTemplate(device_type=devicetype, name='Power Port Template 1'), + PowerPortTemplate(device_type=devicetype, name='Power Port Template 2'), + PowerPortTemplate(device_type=devicetype, name='Power Port Template 3'), + ) + PowerPortTemplate.objects.bulk_create(power_port_templates) + + cls.create_data = [ + { + 'device_type': devicetype.pk, + 'name': 'Power Port Template 4', + }, + { + 'device_type': devicetype.pk, + 'name': 'Power Port Template 5', + }, + { + 'device_type': devicetype.pk, + 'name': 'Power Port Template 6', + }, + ] + + +class PowerOutletTemplateTest(APIViewTestCases.APIViewTestCase): + model = PowerOutletTemplate + brief_fields = ['id', 'name', 'url'] + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') + devicetype = DeviceType.objects.create( + manufacturer=manufacturer, model='Device Type 1', slug='device-type-1' + ) + + power_outlet_templates = ( + PowerOutletTemplate(device_type=devicetype, name='Power Outlet Template 1'), + PowerOutletTemplate(device_type=devicetype, name='Power Outlet Template 2'), + PowerOutletTemplate(device_type=devicetype, name='Power Outlet Template 3'), + ) + PowerOutletTemplate.objects.bulk_create(power_outlet_templates) + + cls.create_data = [ + { + 'device_type': devicetype.pk, + 'name': 'Power Outlet Template 4', + }, + { + 'device_type': devicetype.pk, + 'name': 'Power Outlet Template 5', + }, + { + 'device_type': devicetype.pk, + 'name': 'Power Outlet Template 6', + }, + ] + + +class InterfaceTemplateTest(APIViewTestCases.APIViewTestCase): + model = InterfaceTemplate + brief_fields = ['id', 'name', 'url'] + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') + devicetype = DeviceType.objects.create( + manufacturer=manufacturer, model='Device Type 1', slug='device-type-1' + ) + + interface_templates = ( + InterfaceTemplate(device_type=devicetype, name='Interface Template 1', type='1000base-t'), + InterfaceTemplate(device_type=devicetype, name='Interface Template 2', type='1000base-t'), + InterfaceTemplate(device_type=devicetype, name='Interface Template 3', type='1000base-t'), + ) + InterfaceTemplate.objects.bulk_create(interface_templates) + + cls.create_data = [ + { + 'device_type': devicetype.pk, + 'name': 'Interface Template 4', + 'type': '1000base-t', + }, + { + 'device_type': devicetype.pk, + 'name': 'Interface Template 5', + 'type': '1000base-t', + }, + { + 'device_type': devicetype.pk, + 'name': 'Interface Template 6', + 'type': '1000base-t', + }, + ] + + +class DeviceBayTemplateTest(APIViewTestCases.APIViewTestCase): + model = DeviceBayTemplate + brief_fields = ['id', 'name', 'url'] + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') + devicetype = DeviceType.objects.create( + manufacturer=manufacturer, model='Device Type 1', slug='device-type-1' + ) + + device_bay_templates = ( + DeviceBayTemplate(device_type=devicetype, name='Device Bay Template 1'), + DeviceBayTemplate(device_type=devicetype, name='Device Bay Template 2'), + DeviceBayTemplate(device_type=devicetype, name='Device Bay Template 3'), + ) + DeviceBayTemplate.objects.bulk_create(device_bay_templates) + + cls.create_data = [ + { + 'device_type': devicetype.pk, + 'name': 'Device Bay Template 4', + }, + { + 'device_type': devicetype.pk, + 'name': 'Device Bay Template 5', + }, + { + 'device_type': devicetype.pk, + 'name': 'Device Bay Template 6', + }, + ] + + +class DeviceRoleTest(APIViewTestCases.APIViewTestCase): + model = DeviceRole + brief_fields = ['device_count', 'id', 'name', 'slug', 'url', 'virtualmachine_count'] + create_data = [ + { + 'name': 'Device Role 4', + 'slug': 'device-role-4', + 'color': 'ffff00', + }, + { + 'name': 'Device Role 5', + 'slug': 'device-role-5', + 'color': 'ffff00', + }, + { + 'name': 'Device Role 6', + 'slug': 'device-role-6', + 'color': 'ffff00', + }, + ] + + @classmethod + def setUpTestData(cls): + + device_roles = ( + DeviceRole(name='Device Role 1', slug='device-role-1', color='ff0000'), + DeviceRole(name='Device Role 2', slug='device-role-2', color='00ff00'), + DeviceRole(name='Device Role 3', slug='device-role-3', color='0000ff'), + ) + DeviceRole.objects.bulk_create(device_roles) + + +class PlatformTest(APIViewTestCases.APIViewTestCase): + model = Platform + brief_fields = ['device_count', 'id', 'name', 'slug', 'url', 'virtualmachine_count'] + create_data = [ + { + 'name': 'Platform 4', + 'slug': 'platform-4', + }, + { + 'name': 'Platform 5', + 'slug': 'platform-5', + }, + { + 'name': 'Platform 6', + 'slug': 'platform-6', + }, + ] + + @classmethod + def setUpTestData(cls): + + platforms = ( + Platform(name='Platform 1', slug='platform-1'), + Platform(name='Platform 2', slug='platform-2'), + Platform(name='Platform 3', slug='platform-3'), + ) + Platform.objects.bulk_create(platforms) + + +class DeviceTest(APIViewTestCases.APIViewTestCase): + model = Device + brief_fields = ['display_name', 'id', 'name', 'url'] + + @classmethod + def setUpTestData(cls): + + sites = ( + Site(name='Site 1', slug='site-1'), + Site(name='Site 2', slug='site-2'), + ) + Site.objects.bulk_create(sites) + + racks = ( + Rack(name='Rack 1', site=sites[0]), + Rack(name='Rack 2', site=sites[1]), + ) + Rack.objects.bulk_create(racks) + + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + + device_types = ( + DeviceType(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'), + DeviceType(manufacturer=manufacturer, model='Device Type 2', slug='device-type-2'), + ) + DeviceType.objects.bulk_create(device_types) + + device_roles = ( + DeviceRole(name='Device Role 1', slug='device-role-1', color='ff0000'), + DeviceRole(name='Device Role 2', slug='device-role-2', color='00ff00'), + ) + DeviceRole.objects.bulk_create(device_roles) + + cluster_type = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1') + + clusters = ( + Cluster(name='Cluster 1', type=cluster_type), + Cluster(name='Cluster 2', type=cluster_type), + ) + Cluster.objects.bulk_create(clusters) + + devices = ( + Device( + device_type=device_types[0], + device_role=device_roles[0], + name='Device 1', + site=sites[0], + rack=racks[0], + cluster=clusters[0], + local_context_data={'A': 1} + ), + Device( + device_type=device_types[0], + device_role=device_roles[0], + name='Device 2', + site=sites[0], + rack=racks[0], + cluster=clusters[0], + local_context_data={'B': 2} + ), + Device( + device_type=device_types[0], + device_role=device_roles[0], + name='Device 3', + site=sites[0], + rack=racks[0], + cluster=clusters[0], + local_context_data={'C': 3} + ), + ) + Device.objects.bulk_create(devices) + + cls.create_data = [ + { + 'device_type': device_types[1].pk, + 'device_role': device_roles[1].pk, + 'name': 'Test Device 4', + 'site': sites[1].pk, + 'rack': racks[1].pk, + 'cluster': clusters[1].pk, + }, + { + 'device_type': device_types[1].pk, + 'device_role': device_roles[1].pk, + 'name': 'Test Device 5', + 'site': sites[1].pk, + 'rack': racks[1].pk, + 'cluster': clusters[1].pk, + }, + { + 'device_type': device_types[1].pk, + 'device_role': device_roles[1].pk, + 'name': 'Test Device 6', + 'site': sites[1].pk, + 'rack': racks[1].pk, + 'cluster': clusters[1].pk, + }, + ] def test_get_device_graphs(self): + """ + Test retrieval of Graphs assigned to Devices. + """ + ct = ContentType.objects.get_for_model(Device) + graphs = ( + Graph(type=ct, name='Graph 1', source='http://example.com/graphs.py?device={{ obj.name }}&foo=1'), + Graph(type=ct, name='Graph 2', source='http://example.com/graphs.py?device={{ obj.name }}&foo=2'), + Graph(type=ct, name='Graph 3', source='http://example.com/graphs.py?device={{ obj.name }}&foo=3'), + ) + Graph.objects.bulk_create(graphs) - device_ct = ContentType.objects.get_for_model(Device) - self.graph1 = Graph.objects.create( - type=device_ct, - name='Test Graph 1', - source='http://example.com/graphs.py?device={{ obj.name }}&foo=1' - ) - self.graph2 = Graph.objects.create( - type=device_ct, - name='Test Graph 2', - source='http://example.com/graphs.py?device={{ obj.name }}&foo=2' - ) - self.graph3 = Graph.objects.create( - type=device_ct, - name='Test Graph 3', - source='http://example.com/graphs.py?device={{ obj.name }}&foo=3' - ) - - url = reverse('dcim-api:device-graphs', kwargs={'pk': self.device1.pk}) + url = reverse('dcim-api:device-graphs', kwargs={'pk': Device.objects.first().pk}) response = self.client.get(url, **self.header) self.assertEqual(len(response.data), 3) - self.assertEqual(response.data[0]['embed_url'], 'http://example.com/graphs.py?device=Test Device 1&foo=1') - - def test_list_devices(self): - - url = reverse('dcim-api:device-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 4) - - def test_list_devices_brief(self): - - url = reverse('dcim-api:device-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['display_name', 'id', 'name', 'url'] - ) - - def test_create_device(self): - - data = { - 'device_type': self.devicetype1.pk, - 'device_role': self.devicerole1.pk, - 'name': 'Test Device 4', - 'site': self.site1.pk, - 'rack': self.rack1.pk, - 'face': DeviceFaceChoices.FACE_FRONT, - 'position': 1, - 'cluster': self.cluster1.pk, - } - - url = reverse('dcim-api:device-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Device.objects.count(), 5) - device4 = Device.objects.get(pk=response.data['id']) - self.assertEqual(device4.device_type_id, data['device_type']) - self.assertEqual(device4.device_role_id, data['device_role']) - self.assertEqual(device4.name, data['name']) - self.assertEqual(device4.site.pk, data['site']) - self.assertEqual(device4.cluster.pk, data['cluster']) - - def test_create_device_bulk(self): - - data = [ - { - 'device_type': self.devicetype1.pk, - 'device_role': self.devicerole1.pk, - 'name': 'Test Device 4', - 'site': self.site1.pk, - }, - { - 'device_type': self.devicetype1.pk, - 'device_role': self.devicerole1.pk, - 'name': 'Test Device 5', - 'site': self.site1.pk, - }, - { - 'device_type': self.devicetype1.pk, - 'device_role': self.devicerole1.pk, - 'name': 'Test Device 6', - 'site': self.site1.pk, - }, - ] - - url = reverse('dcim-api:device-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Device.objects.count(), 7) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) - - def test_update_device(self): - - interface = Interface.objects.create(name='Test Interface 1', device=self.device1) - ip4_address = IPAddress.objects.create(address=IPNetwork('192.0.2.1/24'), interface=interface) - ip6_address = IPAddress.objects.create(address=IPNetwork('2001:db8::1/64'), interface=interface) - - data = { - 'device_type': self.devicetype2.pk, - 'device_role': self.devicerole2.pk, - 'name': 'Test Device X', - 'site': self.site2.pk, - 'primary_ip4': ip4_address.pk, - 'primary_ip6': ip6_address.pk, - } - - url = reverse('dcim-api:device-detail', kwargs={'pk': self.device1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(Device.objects.count(), 4) - device1 = Device.objects.get(pk=response.data['id']) - self.assertEqual(device1.device_type_id, data['device_type']) - self.assertEqual(device1.device_role_id, data['device_role']) - self.assertEqual(device1.name, data['name']) - self.assertEqual(device1.site.pk, data['site']) - self.assertEqual(device1.primary_ip4.pk, data['primary_ip4']) - self.assertEqual(device1.primary_ip6.pk, data['primary_ip6']) - - def test_delete_device(self): - - url = reverse('dcim-api:device-detail', kwargs={'pk': self.device1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(Device.objects.count(), 3) + self.assertEqual(response.data[0]['embed_url'], 'http://example.com/graphs.py?device=Device 1&foo=1') def test_config_context_included_by_default_in_list_view(self): - + """ + Check that config context data is included by default in the devices list. + """ url = reverse('dcim-api:device-list') + '?slug=device-with-context-data' response = self.client.get(url, **self.header) self.assertEqual(response.data['results'][0].get('config_context', {}).get('A'), 1) def test_config_context_excluded(self): - + """ + Check that config context data can be excluded by passing ?exclude=config_context. + """ url = reverse('dcim-api:device-list') + '?exclude=config_context' response = self.client.get(url, **self.header) self.assertFalse('config_context' in response.data['results'][0]) def test_unique_name_per_site_constraint(self): - + """ + Check that creating a device with a duplicate name within a site fails. + """ + device = Device.objects.first() data = { - 'device_type': self.devicetype1.pk, - 'device_role': self.devicerole1.pk, - 'name': 'Test Device 1', - 'site': self.site1.pk, + 'device_type': device.device_type.pk, + 'device_role': device.device_role.pk, + 'site': device.site.pk, + 'name': device.name, } url = reverse('dcim-api:device-list') @@ -2037,1401 +825,578 @@ class DeviceTest(APITestCase): self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) -class ConsolePortTest(APITestCase): +class ConsolePortTest(APIViewTestCases.APIViewTestCase): + model = ConsolePort + brief_fields = ['cable', 'connection_status', 'device', 'id', 'name', 'url'] - def setUp(self): - - super().setUp() - - site = Site.objects.create(name='Test Site 1', slug='test-site-1') + @classmethod + def setUpTestData(cls): manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') - devicetype = DeviceType.objects.create( - manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1' + devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1') + site = Site.objects.create(name='Site 1', slug='site-1') + devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000') + device = Device.objects.create(device_type=devicetype, device_role=devicerole, name='Device 1', site=site) + + console_ports = ( + ConsolePort(device=device, name='Console Port 1'), + ConsolePort(device=device, name='Console Port 2'), + ConsolePort(device=device, name='Console Port 3'), ) - devicerole = DeviceRole.objects.create( - name='Test Device Role 1', slug='test-device-role-1', color='ff0000' - ) - self.device = Device.objects.create( - device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site - ) - self.consoleport1 = ConsolePort.objects.create(device=self.device, name='Test Console Port 1') - self.consoleport2 = ConsolePort.objects.create(device=self.device, name='Test Console Port 2') - self.consoleport3 = ConsolePort.objects.create(device=self.device, name='Test Console Port 3') + ConsolePort.objects.bulk_create(console_ports) - def test_get_consoleport(self): - - url = reverse('dcim-api:consoleport-detail', kwargs={'pk': self.consoleport1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.consoleport1.name) - - def test_list_consoleports(self): - - url = reverse('dcim-api:consoleport-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_list_consoleports_brief(self): - - url = reverse('dcim-api:consoleport-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['cable', 'connection_status', 'device', 'id', 'name', 'url'] - ) - - def test_create_consoleport(self): - - data = { - 'device': self.device.pk, - 'name': 'Test Console Port 4', - } - - url = reverse('dcim-api:consoleport-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(ConsolePort.objects.count(), 4) - consoleport4 = ConsolePort.objects.get(pk=response.data['id']) - self.assertEqual(consoleport4.device_id, data['device']) - self.assertEqual(consoleport4.name, data['name']) - - def test_create_consoleport_bulk(self): - - data = [ + cls.create_data = [ { - 'device': self.device.pk, - 'name': 'Test Console Port 4', + 'device': device.pk, + 'name': 'Console Port 4', }, { - 'device': self.device.pk, - 'name': 'Test Console Port 5', + 'device': device.pk, + 'name': 'Console Port 5', }, { - 'device': self.device.pk, - 'name': 'Test Console Port 6', + 'device': device.pk, + 'name': 'Console Port 6', }, ] - url = reverse('dcim-api:consoleport-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(ConsolePort.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) - - def test_update_consoleport(self): - - consoleserverport = ConsoleServerPort.objects.create(device=self.device, name='Test CS Port 1') - - data = { - 'device': self.device.pk, - 'name': 'Test Console Port X', - } - - url = reverse('dcim-api:consoleport-detail', kwargs={'pk': self.consoleport1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(ConsolePort.objects.count(), 3) - consoleport1 = ConsolePort.objects.get(pk=response.data['id']) - self.assertEqual(consoleport1.name, data['name']) - - def test_delete_consoleport(self): - - url = reverse('dcim-api:consoleport-detail', kwargs={'pk': self.consoleport1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(ConsolePort.objects.count(), 2) - def test_trace_consoleport(self): - + """ + Test tracing a ConsolePort cable. + """ + consoleport = ConsolePort.objects.first() peer_device = Device.objects.create( site=Site.objects.first(), device_type=DeviceType.objects.first(), device_role=DeviceRole.objects.first(), name='Peer Device' ) - console_server_port = ConsoleServerPort.objects.create( + consoleserverport = ConsoleServerPort.objects.create( device=peer_device, name='Console Server Port 1' ) - cable = Cable(termination_a=self.consoleport1, termination_b=console_server_port, label='Cable 1') + cable = Cable(termination_a=consoleport, termination_b=consoleserverport, label='Cable 1') cable.save() - url = reverse('dcim-api:consoleport-trace', kwargs={'pk': self.consoleport1.pk}) + url = reverse('dcim-api:consoleport-trace', kwargs={'pk': consoleport.pk}) response = self.client.get(url, **self.header) self.assertHttpStatus(response, status.HTTP_200_OK) self.assertEqual(len(response.data), 1) segment1 = response.data[0] - self.assertEqual(segment1[0]['name'], self.consoleport1.name) + self.assertEqual(segment1[0]['name'], consoleport.name) self.assertEqual(segment1[1]['label'], cable.label) - self.assertEqual(segment1[2]['name'], console_server_port.name) + self.assertEqual(segment1[2]['name'], consoleserverport.name) -class ConsoleServerPortTest(APITestCase): +class ConsoleServerPortTest(APIViewTestCases.APIViewTestCase): + model = ConsoleServerPort + brief_fields = ['cable', 'connection_status', 'device', 'id', 'name', 'url'] - def setUp(self): - - super().setUp() - - site = Site.objects.create(name='Test Site 1', slug='test-site-1') + @classmethod + def setUpTestData(cls): manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') - devicetype = DeviceType.objects.create( - manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1' + devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1') + site = Site.objects.create(name='Site 1', slug='site-1') + devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000') + device = Device.objects.create(device_type=devicetype, device_role=devicerole, name='Device 1', site=site) + + console_server_ports = ( + ConsoleServerPort(device=device, name='Console Server Port 1'), + ConsoleServerPort(device=device, name='Console Server Port 2'), + ConsoleServerPort(device=device, name='Console Server Port 3'), ) - devicerole = DeviceRole.objects.create( - name='Test Device Role 1', slug='test-device-role-1', color='ff0000' - ) - self.device = Device.objects.create( - device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site - ) - self.consoleserverport1 = ConsoleServerPort.objects.create(device=self.device, name='Test CS Port 1') - self.consoleserverport2 = ConsoleServerPort.objects.create(device=self.device, name='Test CS Port 2') - self.consoleserverport3 = ConsoleServerPort.objects.create(device=self.device, name='Test CS Port 3') + ConsoleServerPort.objects.bulk_create(console_server_ports) - def test_get_consoleserverport(self): - - url = reverse('dcim-api:consoleserverport-detail', kwargs={'pk': self.consoleserverport1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.consoleserverport1.name) - - def test_list_consoleserverports(self): - - url = reverse('dcim-api:consoleserverport-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_list_consoleserverports_brief(self): - - url = reverse('dcim-api:consoleserverport-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['cable', 'connection_status', 'device', 'id', 'name', 'url'] - ) - - def test_create_consoleserverport(self): - - data = { - 'device': self.device.pk, - 'name': 'Test CS Port 4', - } - - url = reverse('dcim-api:consoleserverport-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(ConsoleServerPort.objects.count(), 4) - consoleserverport4 = ConsoleServerPort.objects.get(pk=response.data['id']) - self.assertEqual(consoleserverport4.device_id, data['device']) - self.assertEqual(consoleserverport4.name, data['name']) - - def test_create_consoleserverport_bulk(self): - - data = [ + cls.create_data = [ { - 'device': self.device.pk, - 'name': 'Test CS Port 4', + 'device': device.pk, + 'name': 'Console Server Port 4', }, { - 'device': self.device.pk, - 'name': 'Test CS Port 5', + 'device': device.pk, + 'name': 'Console Server Port 5', }, { - 'device': self.device.pk, - 'name': 'Test CS Port 6', + 'device': device.pk, + 'name': 'Console Server Port 6', }, ] - url = reverse('dcim-api:consoleserverport-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(ConsoleServerPort.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) - - def test_update_consoleserverport(self): - - data = { - 'device': self.device.pk, - 'name': 'Test CS Port X', - } - - url = reverse('dcim-api:consoleserverport-detail', kwargs={'pk': self.consoleserverport1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(ConsoleServerPort.objects.count(), 3) - consoleserverport1 = ConsoleServerPort.objects.get(pk=response.data['id']) - self.assertEqual(consoleserverport1.name, data['name']) - - def test_delete_consoleserverport(self): - - url = reverse('dcim-api:consoleserverport-detail', kwargs={'pk': self.consoleserverport1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(ConsoleServerPort.objects.count(), 2) - def test_trace_consoleserverport(self): - + """ + Test tracing a ConsoleServerPort cable. + """ + consoleserverport = ConsoleServerPort.objects.first() peer_device = Device.objects.create( site=Site.objects.first(), device_type=DeviceType.objects.first(), device_role=DeviceRole.objects.first(), name='Peer Device' ) - console_port = ConsolePort.objects.create( + consoleport = ConsolePort.objects.create( device=peer_device, name='Console Port 1' ) - cable = Cable(termination_a=self.consoleserverport1, termination_b=console_port, label='Cable 1') + cable = Cable(termination_a=consoleserverport, termination_b=consoleport, label='Cable 1') cable.save() - url = reverse('dcim-api:consoleserverport-trace', kwargs={'pk': self.consoleserverport1.pk}) + url = reverse('dcim-api:consoleserverport-trace', kwargs={'pk': consoleserverport.pk}) response = self.client.get(url, **self.header) self.assertHttpStatus(response, status.HTTP_200_OK) self.assertEqual(len(response.data), 1) segment1 = response.data[0] - self.assertEqual(segment1[0]['name'], self.consoleserverport1.name) + self.assertEqual(segment1[0]['name'], consoleserverport.name) self.assertEqual(segment1[1]['label'], cable.label) - self.assertEqual(segment1[2]['name'], console_port.name) + self.assertEqual(segment1[2]['name'], consoleport.name) -class PowerPortTest(APITestCase): +class PowerPortTest(APIViewTestCases.APIViewTestCase): + model = PowerPort + brief_fields = ['cable', 'connection_status', 'device', 'id', 'name', 'url'] - def setUp(self): - - super().setUp() - - site = Site.objects.create(name='Test Site 1', slug='test-site-1') + @classmethod + def setUpTestData(cls): manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') - devicetype = DeviceType.objects.create( - manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1' + devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1') + site = Site.objects.create(name='Site 1', slug='site-1') + devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000') + device = Device.objects.create(device_type=devicetype, device_role=devicerole, name='Device 1', site=site) + + power_ports = ( + PowerPort(device=device, name='Power Port 1'), + PowerPort(device=device, name='Power Port 2'), + PowerPort(device=device, name='Power Port 3'), ) - devicerole = DeviceRole.objects.create( - name='Test Device Role 1', slug='test-device-role-1', color='ff0000' - ) - self.device = Device.objects.create( - device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site - ) - self.powerport1 = PowerPort.objects.create(device=self.device, name='Test Power Port 1') - self.powerport2 = PowerPort.objects.create(device=self.device, name='Test Power Port 2') - self.powerport3 = PowerPort.objects.create(device=self.device, name='Test Power Port 3') + PowerPort.objects.bulk_create(power_ports) - def test_get_powerport(self): - - url = reverse('dcim-api:powerport-detail', kwargs={'pk': self.powerport1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.powerport1.name) - - def test_list_powerports(self): - - url = reverse('dcim-api:powerport-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_list_powerports_brief(self): - - url = reverse('dcim-api:powerport-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['cable', 'connection_status', 'device', 'id', 'name', 'url'] - ) - - def test_create_powerport(self): - - data = { - 'device': self.device.pk, - 'name': 'Test Power Port 4', - } - - url = reverse('dcim-api:powerport-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(PowerPort.objects.count(), 4) - powerport4 = PowerPort.objects.get(pk=response.data['id']) - self.assertEqual(powerport4.device_id, data['device']) - self.assertEqual(powerport4.name, data['name']) - - def test_create_powerport_bulk(self): - - data = [ + cls.create_data = [ { - 'device': self.device.pk, - 'name': 'Test Power Port 4', + 'device': device.pk, + 'name': 'Power Port 4', }, { - 'device': self.device.pk, - 'name': 'Test Power Port 5', + 'device': device.pk, + 'name': 'Power Port 5', }, { - 'device': self.device.pk, - 'name': 'Test Power Port 6', + 'device': device.pk, + 'name': 'Power Port 6', }, ] - url = reverse('dcim-api:powerport-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(PowerPort.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) - - def test_update_powerport(self): - - poweroutlet = PowerOutlet.objects.create(device=self.device, name='Test Power Outlet 1') - - data = { - 'device': self.device.pk, - 'name': 'Test Power Port X', - } - - url = reverse('dcim-api:powerport-detail', kwargs={'pk': self.powerport1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(PowerPort.objects.count(), 3) - powerport1 = PowerPort.objects.get(pk=response.data['id']) - self.assertEqual(powerport1.name, data['name']) - - def test_delete_powerport(self): - - url = reverse('dcim-api:powerport-detail', kwargs={'pk': self.powerport1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(PowerPort.objects.count(), 2) - def test_trace_powerport(self): - + """ + Test tracing a PowerPort cable. + """ + powerport = PowerPort.objects.first() peer_device = Device.objects.create( site=Site.objects.first(), device_type=DeviceType.objects.first(), device_role=DeviceRole.objects.first(), name='Peer Device' ) - power_outlet = PowerOutlet.objects.create( + poweroutlet = PowerOutlet.objects.create( device=peer_device, name='Power Outlet 1' ) - cable = Cable(termination_a=self.powerport1, termination_b=power_outlet, label='Cable 1') + cable = Cable(termination_a=powerport, termination_b=poweroutlet, label='Cable 1') cable.save() - url = reverse('dcim-api:powerport-trace', kwargs={'pk': self.powerport1.pk}) + url = reverse('dcim-api:powerport-trace', kwargs={'pk': powerport.pk}) response = self.client.get(url, **self.header) self.assertHttpStatus(response, status.HTTP_200_OK) self.assertEqual(len(response.data), 1) segment1 = response.data[0] - self.assertEqual(segment1[0]['name'], self.powerport1.name) + self.assertEqual(segment1[0]['name'], powerport.name) self.assertEqual(segment1[1]['label'], cable.label) - self.assertEqual(segment1[2]['name'], power_outlet.name) + self.assertEqual(segment1[2]['name'], poweroutlet.name) -class PowerOutletTest(APITestCase): +class PowerOutletTest(APIViewTestCases.APIViewTestCase): + model = PowerOutlet + brief_fields = ['cable', 'connection_status', 'device', 'id', 'name', 'url'] - def setUp(self): - - super().setUp() - - site = Site.objects.create(name='Test Site 1', slug='test-site-1') + @classmethod + def setUpTestData(cls): manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') - devicetype = DeviceType.objects.create( - manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1' + devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1') + site = Site.objects.create(name='Site 1', slug='site-1') + devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000') + device = Device.objects.create(device_type=devicetype, device_role=devicerole, name='Device 1', site=site) + + power_outlets = ( + PowerOutlet(device=device, name='Power Outlet 1'), + PowerOutlet(device=device, name='Power Outlet 2'), + PowerOutlet(device=device, name='Power Outlet 3'), ) - devicerole = DeviceRole.objects.create( - name='Test Device Role 1', slug='test-device-role-1', color='ff0000' - ) - self.device = Device.objects.create( - device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site - ) - self.poweroutlet1 = PowerOutlet.objects.create(device=self.device, name='Test Power Outlet 1') - self.poweroutlet2 = PowerOutlet.objects.create(device=self.device, name='Test Power Outlet 2') - self.poweroutlet3 = PowerOutlet.objects.create(device=self.device, name='Test Power Outlet 3') + PowerOutlet.objects.bulk_create(power_outlets) - def test_get_poweroutlet(self): - - url = reverse('dcim-api:poweroutlet-detail', kwargs={'pk': self.poweroutlet1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.poweroutlet1.name) - - def test_list_poweroutlets(self): - - url = reverse('dcim-api:poweroutlet-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_list_poweroutlets_brief(self): - - url = reverse('dcim-api:poweroutlet-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['cable', 'connection_status', 'device', 'id', 'name', 'url'] - ) - - def test_create_poweroutlet(self): - - data = { - 'device': self.device.pk, - 'name': 'Test Power Outlet 4', - } - - url = reverse('dcim-api:poweroutlet-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(PowerOutlet.objects.count(), 4) - poweroutlet4 = PowerOutlet.objects.get(pk=response.data['id']) - self.assertEqual(poweroutlet4.device_id, data['device']) - self.assertEqual(poweroutlet4.name, data['name']) - - def test_create_poweroutlet_bulk(self): - - data = [ + cls.create_data = [ { - 'device': self.device.pk, - 'name': 'Test Power Outlet 4', + 'device': device.pk, + 'name': 'Power Outlet 4', }, { - 'device': self.device.pk, - 'name': 'Test Power Outlet 5', + 'device': device.pk, + 'name': 'Power Outlet 5', }, { - 'device': self.device.pk, - 'name': 'Test Power Outlet 6', + 'device': device.pk, + 'name': 'Power Outlet 6', }, ] - url = reverse('dcim-api:poweroutlet-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(PowerOutlet.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) - - def test_update_poweroutlet(self): - - data = { - 'device': self.device.pk, - 'name': 'Test Power Outlet X', - } - - url = reverse('dcim-api:poweroutlet-detail', kwargs={'pk': self.poweroutlet1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(PowerOutlet.objects.count(), 3) - poweroutlet1 = PowerOutlet.objects.get(pk=response.data['id']) - self.assertEqual(poweroutlet1.name, data['name']) - - def test_delete_poweroutlet(self): - - url = reverse('dcim-api:poweroutlet-detail', kwargs={'pk': self.poweroutlet1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(PowerOutlet.objects.count(), 2) - def test_trace_poweroutlet(self): - + """ + Test tracing a PowerOutlet cable. + """ + poweroutlet = PowerOutlet.objects.first() peer_device = Device.objects.create( site=Site.objects.first(), device_type=DeviceType.objects.first(), device_role=DeviceRole.objects.first(), name='Peer Device' ) - power_port = PowerPort.objects.create( + powerport = PowerPort.objects.create( device=peer_device, name='Power Port 1' ) - cable = Cable(termination_a=self.poweroutlet1, termination_b=power_port, label='Cable 1') + cable = Cable(termination_a=poweroutlet, termination_b=powerport, label='Cable 1') cable.save() - url = reverse('dcim-api:poweroutlet-trace', kwargs={'pk': self.poweroutlet1.pk}) + url = reverse('dcim-api:poweroutlet-trace', kwargs={'pk': poweroutlet.pk}) response = self.client.get(url, **self.header) self.assertHttpStatus(response, status.HTTP_200_OK) self.assertEqual(len(response.data), 1) segment1 = response.data[0] - self.assertEqual(segment1[0]['name'], self.poweroutlet1.name) + self.assertEqual(segment1[0]['name'], poweroutlet.name) self.assertEqual(segment1[1]['label'], cable.label) - self.assertEqual(segment1[2]['name'], power_port.name) + self.assertEqual(segment1[2]['name'], powerport.name) -class InterfaceTest(APITestCase): +class InterfaceTest(APIViewTestCases.APIViewTestCase): + model = Interface + brief_fields = ['cable', 'connection_status', 'device', 'id', 'name', 'url'] - def setUp(self): - - super().setUp() - - site = Site.objects.create(name='Test Site 1', slug='test-site-1') + @classmethod + def setUpTestData(cls): manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') - devicetype = DeviceType.objects.create( - manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1' + devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1') + site = Site.objects.create(name='Site 1', slug='site-1') + devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000') + device = Device.objects.create(device_type=devicetype, device_role=devicerole, name='Device 1', site=site) + + interfaces = ( + Interface(device=device, name='Interface 1', type='1000base-t'), + Interface(device=device, name='Interface 2', type='1000base-t'), + Interface(device=device, name='Interface 3', type='1000base-t'), ) - devicerole = DeviceRole.objects.create( - name='Test Device Role 1', slug='test-device-role-1', color='ff0000' + Interface.objects.bulk_create(interfaces) + + vlans = ( + VLAN(name='VLAN 1', vid=1), + VLAN(name='VLAN 2', vid=2), + VLAN(name='VLAN 3', vid=3), ) - self.device = Device.objects.create( - device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site - ) - self.interface1 = Interface.objects.create(device=self.device, name='Test Interface 1', type='1000base-t') - self.interface2 = Interface.objects.create(device=self.device, name='Test Interface 2', type='1000base-t') - self.interface3 = Interface.objects.create(device=self.device, name='Test Interface 3', type='1000base-t') + VLAN.objects.bulk_create(vlans) - self.vlan1 = VLAN.objects.create(name="Test VLAN 1", vid=1) - self.vlan2 = VLAN.objects.create(name="Test VLAN 2", vid=2) - self.vlan3 = VLAN.objects.create(name="Test VLAN 3", vid=3) - - def test_get_interface(self): - - url = reverse('dcim-api:interface-detail', kwargs={'pk': self.interface1.pk}) - response = self.client.get(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(response.data['name'], self.interface1.name) + cls.create_data = [ + { + 'device': device.pk, + 'name': 'Interface 4', + 'type': '1000base-t', + 'mode': InterfaceModeChoices.MODE_TAGGED, + 'tagged_vlans': [vlans[0].pk, vlans[1].pk], + 'untagged_vlan': vlans[2].pk, + }, + { + 'device': device.pk, + 'name': 'Interface 5', + 'type': '1000base-t', + 'mode': InterfaceModeChoices.MODE_TAGGED, + 'tagged_vlans': [vlans[0].pk, vlans[1].pk], + 'untagged_vlan': vlans[2].pk, + }, + { + 'device': device.pk, + 'name': 'Interface 6', + 'type': '1000base-t', + 'mode': InterfaceModeChoices.MODE_TAGGED, + 'tagged_vlans': [vlans[0].pk, vlans[1].pk], + 'untagged_vlan': vlans[2].pk, + }, + ] def test_get_interface_graphs(self): + """ + Test retrieval of Graphs assigned to Devices. + """ + ct = ContentType.objects.get_for_model(Interface) + graphs = ( + Graph(type=ct, name='Graph 1', source='http://example.com/graphs.py?interface={{ obj.name }}&foo=1'), + Graph(type=ct, name='Graph 2', source='http://example.com/graphs.py?interface={{ obj.name }}&foo=2'), + Graph(type=ct, name='Graph 3', source='http://example.com/graphs.py?interface={{ obj.name }}&foo=3'), + ) + Graph.objects.bulk_create(graphs) - interface_ct = ContentType.objects.get_for_model(Interface) - self.graph1 = Graph.objects.create( - type=interface_ct, - name='Test Graph 1', - source='http://example.com/graphs.py?interface={{ obj.name }}&foo=1' - ) - self.graph2 = Graph.objects.create( - type=interface_ct, - name='Test Graph 2', - source='http://example.com/graphs.py?interface={{ obj.name }}&foo=2' - ) - self.graph3 = Graph.objects.create( - type=interface_ct, - name='Test Graph 3', - source='http://example.com/graphs.py?interface={{ obj.name }}&foo=3' - ) - - url = reverse('dcim-api:interface-graphs', kwargs={'pk': self.interface1.pk}) + url = reverse('dcim-api:interface-graphs', kwargs={'pk': Interface.objects.first().pk}) response = self.client.get(url, **self.header) self.assertEqual(len(response.data), 3) - self.assertEqual(response.data[0]['embed_url'], 'http://example.com/graphs.py?interface=Test Interface 1&foo=1') - - def test_list_interfaces(self): - - url = reverse('dcim-api:interface-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_list_interfaces_brief(self): - - url = reverse('dcim-api:interface-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['cable', 'connection_status', 'device', 'id', 'name', 'url'] - ) - - def test_create_interface(self): - - data = { - 'device': self.device.pk, - 'name': 'Test Interface 4', - 'type': '1000base-t', - } - - url = reverse('dcim-api:interface-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Interface.objects.count(), 4) - interface4 = Interface.objects.get(pk=response.data['id']) - self.assertEqual(interface4.device_id, data['device']) - self.assertEqual(interface4.name, data['name']) - - def test_create_interface_with_802_1q(self): - - data = { - 'device': self.device.pk, - 'name': 'Test Interface 4', - 'type': '1000base-t', - 'mode': InterfaceModeChoices.MODE_TAGGED, - 'untagged_vlan': self.vlan3.id, - 'tagged_vlans': [self.vlan1.id, self.vlan2.id], - } - - url = reverse('dcim-api:interface-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Interface.objects.count(), 4) - self.assertEqual(response.data['device']['id'], data['device']) - self.assertEqual(response.data['name'], data['name']) - self.assertEqual(response.data['untagged_vlan']['id'], data['untagged_vlan']) - self.assertEqual([v['id'] for v in response.data['tagged_vlans']], data['tagged_vlans']) - - def test_create_interface_bulk(self): - - data = [ - { - 'device': self.device.pk, - 'name': 'Test Interface 4', - 'type': '1000base-t', - }, - { - 'device': self.device.pk, - 'name': 'Test Interface 5', - 'type': '1000base-t', - }, - { - 'device': self.device.pk, - 'name': 'Test Interface 6', - 'type': '1000base-t', - }, - ] - - url = reverse('dcim-api:interface-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Interface.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) - - def test_create_interface_802_1q_bulk(self): - - data = [ - { - 'device': self.device.pk, - 'name': 'Test Interface 4', - 'type': '1000base-t', - 'mode': InterfaceModeChoices.MODE_TAGGED, - 'untagged_vlan': self.vlan2.id, - 'tagged_vlans': [self.vlan1.id], - }, - { - 'device': self.device.pk, - 'name': 'Test Interface 5', - 'type': '1000base-t', - 'mode': InterfaceModeChoices.MODE_TAGGED, - 'untagged_vlan': self.vlan2.id, - 'tagged_vlans': [self.vlan1.id], - }, - { - 'device': self.device.pk, - 'name': 'Test Interface 6', - 'type': '1000base-t', - 'mode': InterfaceModeChoices.MODE_TAGGED, - 'untagged_vlan': self.vlan2.id, - 'tagged_vlans': [self.vlan1.id], - }, - ] - - url = reverse('dcim-api:interface-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Interface.objects.count(), 6) - for i in range(0, 3): - self.assertEqual(response.data[i]['name'], data[i]['name']) - self.assertEqual([v['id'] for v in response.data[i]['tagged_vlans']], data[i]['tagged_vlans']) - self.assertEqual(response.data[i]['untagged_vlan']['id'], data[i]['untagged_vlan']) - - def test_update_interface(self): - - lag_interface = Interface.objects.create( - device=self.device, name='Test LAG Interface', type=InterfaceTypeChoices.TYPE_LAG - ) - - data = { - 'device': self.device.pk, - 'name': 'Test Interface X', - 'type': '1000base-x-gbic', - 'lag': lag_interface.pk, - } - - url = reverse('dcim-api:interface-detail', kwargs={'pk': self.interface1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(Interface.objects.count(), 4) - interface1 = Interface.objects.get(pk=response.data['id']) - self.assertEqual(interface1.name, data['name']) - self.assertEqual(interface1.lag_id, data['lag']) - - def test_delete_interface(self): - - url = reverse('dcim-api:interface-detail', kwargs={'pk': self.interface1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(Interface.objects.count(), 2) + self.assertEqual(response.data[0]['embed_url'], 'http://example.com/graphs.py?interface=Interface 1&foo=1') -class FrontPortTest(APITestCase): +class FrontPortTest(APIViewTestCases.APIViewTestCase): + model = FrontPort + brief_fields = ['cable', 'device', 'id', 'name', 'url'] - def setUp(self): - - super().setUp() - - site = Site.objects.create(name='Test Site 1', slug='test-site-1') + @classmethod + def setUpTestData(cls): manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') - devicetype = DeviceType.objects.create( - manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1' + devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1') + site = Site.objects.create(name='Site 1', slug='site-1') + devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000') + device = Device.objects.create(device_type=devicetype, device_role=devicerole, name='Device 1', site=site) + + rear_ports = ( + RearPort(device=device, name='Rear Port 1', type=PortTypeChoices.TYPE_8P8C), + RearPort(device=device, name='Rear Port 2', type=PortTypeChoices.TYPE_8P8C), + RearPort(device=device, name='Rear Port 3', type=PortTypeChoices.TYPE_8P8C), + RearPort(device=device, name='Rear Port 4', type=PortTypeChoices.TYPE_8P8C), + RearPort(device=device, name='Rear Port 5', type=PortTypeChoices.TYPE_8P8C), + RearPort(device=device, name='Rear Port 6', type=PortTypeChoices.TYPE_8P8C), ) - devicerole = DeviceRole.objects.create( - name='Test Device Role 1', slug='test-device-role-1', color='ff0000' + RearPort.objects.bulk_create(rear_ports) + + front_ports = ( + FrontPort(device=device, name='Front Port 1', type=PortTypeChoices.TYPE_8P8C, rear_port=rear_ports[0]), + FrontPort(device=device, name='Front Port 2', type=PortTypeChoices.TYPE_8P8C, rear_port=rear_ports[1]), + FrontPort(device=device, name='Front Port 3', type=PortTypeChoices.TYPE_8P8C, rear_port=rear_ports[2]), ) - self.device = Device.objects.create( - device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site - ) - rear_ports = RearPort.objects.bulk_create(( - RearPort(device=self.device, name='Rear Port 1', type=PortTypeChoices.TYPE_8P8C), - RearPort(device=self.device, name='Rear Port 2', type=PortTypeChoices.TYPE_8P8C), - RearPort(device=self.device, name='Rear Port 3', type=PortTypeChoices.TYPE_8P8C), - RearPort(device=self.device, name='Rear Port 4', type=PortTypeChoices.TYPE_8P8C), - RearPort(device=self.device, name='Rear Port 5', type=PortTypeChoices.TYPE_8P8C), - RearPort(device=self.device, name='Rear Port 6', type=PortTypeChoices.TYPE_8P8C), - )) - self.frontport1 = FrontPort.objects.create(device=self.device, name='Front Port 1', type=PortTypeChoices.TYPE_8P8C, rear_port=rear_ports[0]) - self.frontport3 = FrontPort.objects.create(device=self.device, name='Front Port 2', type=PortTypeChoices.TYPE_8P8C, rear_port=rear_ports[1]) - self.frontport1 = FrontPort.objects.create(device=self.device, name='Front Port 3', type=PortTypeChoices.TYPE_8P8C, rear_port=rear_ports[2]) + FrontPort.objects.bulk_create(front_ports) - def test_get_frontport(self): - - url = reverse('dcim-api:frontport-detail', kwargs={'pk': self.frontport1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.frontport1.name) - - def test_list_frontports(self): - - url = reverse('dcim-api:frontport-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_list_frontports_brief(self): - - url = reverse('dcim-api:frontport-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['cable', 'device', 'id', 'name', 'url'] - ) - - def test_create_frontport(self): - - rear_port = RearPort.objects.get(name='Rear Port 4') - data = { - 'device': self.device.pk, - 'name': 'Front Port 4', - 'type': PortTypeChoices.TYPE_8P8C, - 'rear_port': rear_port.pk, - 'rear_port_position': 1, - } - - url = reverse('dcim-api:frontport-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(FrontPort.objects.count(), 4) - frontport4 = FrontPort.objects.get(pk=response.data['id']) - self.assertEqual(frontport4.device_id, data['device']) - self.assertEqual(frontport4.name, data['name']) - - def test_create_frontport_bulk(self): - - rear_ports = RearPort.objects.filter(frontports__isnull=True) - data = [ + cls.create_data = [ { - 'device': self.device.pk, + 'device': device.pk, 'name': 'Front Port 4', 'type': PortTypeChoices.TYPE_8P8C, - 'rear_port': rear_ports[0].pk, + 'rear_port': rear_ports[3].pk, 'rear_port_position': 1, }, { - 'device': self.device.pk, + 'device': device.pk, 'name': 'Front Port 5', 'type': PortTypeChoices.TYPE_8P8C, - 'rear_port': rear_ports[1].pk, + 'rear_port': rear_ports[4].pk, 'rear_port_position': 1, }, { - 'device': self.device.pk, + 'device': device.pk, 'name': 'Front Port 6', 'type': PortTypeChoices.TYPE_8P8C, - 'rear_port': rear_ports[2].pk, + 'rear_port': rear_ports[5].pk, 'rear_port_position': 1, }, ] - url = reverse('dcim-api:frontport-list') - response = self.client.post(url, data, format='json', **self.header) - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(FrontPort.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) +class RearPortTest(APIViewTestCases.APIViewTestCase): + model = RearPort + brief_fields = ['cable', 'device', 'id', 'name', 'url'] - def test_update_frontport(self): - - rear_port = RearPort.objects.get(name='Rear Port 4') - data = { - 'device': self.device.pk, - 'name': 'Front Port X', - 'type': PortTypeChoices.TYPE_110_PUNCH, - 'rear_port': rear_port.pk, - 'rear_port_position': 1, - } - - url = reverse('dcim-api:frontport-detail', kwargs={'pk': self.frontport1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(FrontPort.objects.count(), 3) - frontport1 = FrontPort.objects.get(pk=response.data['id']) - self.assertEqual(frontport1.name, data['name']) - self.assertEqual(frontport1.type, data['type']) - self.assertEqual(frontport1.rear_port, rear_port) - - def test_delete_frontport(self): - - url = reverse('dcim-api:frontport-detail', kwargs={'pk': self.frontport1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(FrontPort.objects.count(), 2) - - -class RearPortTest(APITestCase): - - def setUp(self): - - super().setUp() - - site = Site.objects.create(name='Test Site 1', slug='test-site-1') + @classmethod + def setUpTestData(cls): manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') - devicetype = DeviceType.objects.create( - manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1' + devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1') + site = Site.objects.create(name='Site 1', slug='site-1') + devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000') + device = Device.objects.create(device_type=devicetype, device_role=devicerole, name='Device 1', site=site) + + rear_ports = ( + RearPort(device=device, name='Rear Port 1', type=PortTypeChoices.TYPE_8P8C), + RearPort(device=device, name='Rear Port 2', type=PortTypeChoices.TYPE_8P8C), + RearPort(device=device, name='Rear Port 3', type=PortTypeChoices.TYPE_8P8C), ) - devicerole = DeviceRole.objects.create( - name='Test Device Role 1', slug='test-device-role-1', color='ff0000' - ) - self.device = Device.objects.create( - device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site - ) - self.rearport1 = RearPort.objects.create(device=self.device, type=PortTypeChoices.TYPE_8P8C, name='Rear Port 1') - self.rearport3 = RearPort.objects.create(device=self.device, type=PortTypeChoices.TYPE_8P8C, name='Rear Port 2') - self.rearport1 = RearPort.objects.create(device=self.device, type=PortTypeChoices.TYPE_8P8C, name='Rear Port 3') + RearPort.objects.bulk_create(rear_ports) - def test_get_rearport(self): - - url = reverse('dcim-api:rearport-detail', kwargs={'pk': self.rearport1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.rearport1.name) - - def test_list_rearports(self): - - url = reverse('dcim-api:rearport-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_list_rearports_brief(self): - - url = reverse('dcim-api:rearport-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['cable', 'device', 'id', 'name', 'url'] - ) - - def test_create_rearport(self): - - data = { - 'device': self.device.pk, - 'name': 'Front Port 4', - 'type': PortTypeChoices.TYPE_8P8C, - } - - url = reverse('dcim-api:rearport-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(RearPort.objects.count(), 4) - rearport4 = RearPort.objects.get(pk=response.data['id']) - self.assertEqual(rearport4.device_id, data['device']) - self.assertEqual(rearport4.name, data['name']) - - def test_create_rearport_bulk(self): - - data = [ + cls.create_data = [ { - 'device': self.device.pk, + 'device': device.pk, 'name': 'Rear Port 4', 'type': PortTypeChoices.TYPE_8P8C, }, { - 'device': self.device.pk, + 'device': device.pk, 'name': 'Rear Port 5', 'type': PortTypeChoices.TYPE_8P8C, }, { - 'device': self.device.pk, + 'device': device.pk, 'name': 'Rear Port 6', 'type': PortTypeChoices.TYPE_8P8C, }, ] - url = reverse('dcim-api:rearport-list') - response = self.client.post(url, data, format='json', **self.header) - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(RearPort.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) +class DeviceBayTest(APIViewTestCases.APIViewTestCase): + model = DeviceBay + brief_fields = ['device', 'id', 'name', 'url'] - def test_update_rearport(self): - - data = { - 'device': self.device.pk, - 'name': 'Front Port X', - 'type': PortTypeChoices.TYPE_110_PUNCH - } - - url = reverse('dcim-api:rearport-detail', kwargs={'pk': self.rearport1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(RearPort.objects.count(), 3) - rearport1 = RearPort.objects.get(pk=response.data['id']) - self.assertEqual(rearport1.name, data['name']) - self.assertEqual(rearport1.type, data['type']) - - def test_delete_rearport(self): - - url = reverse('dcim-api:rearport-detail', kwargs={'pk': self.rearport1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(RearPort.objects.count(), 2) - - -class DeviceBayTest(APITestCase): - - def setUp(self): - - super().setUp() - - site = Site.objects.create(name='Test Site 1', slug='test-site-1') + @classmethod + def setUpTestData(cls): manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') - self.devicetype1 = DeviceType.objects.create( - manufacturer=manufacturer, model='Parent Device Type', slug='parent-device-type', - subdevice_role=SubdeviceRoleChoices.ROLE_PARENT + site = Site.objects.create(name='Site 1', slug='site-1') + devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000') + + device_types = ( + DeviceType( + manufacturer=manufacturer, + model='Device Type 1', + slug='device-type-1', + subdevice_role=SubdeviceRoleChoices.ROLE_PARENT + ), + DeviceType( + manufacturer=manufacturer, + model='Device Type 2', + slug='device-type-2', + subdevice_role=SubdeviceRoleChoices.ROLE_CHILD + ), ) - self.devicetype2 = DeviceType.objects.create( - manufacturer=manufacturer, model='Child Device Type', slug='child-device-type', - subdevice_role=SubdeviceRoleChoices.ROLE_CHILD + DeviceType.objects.bulk_create(device_types) + + devices = ( + Device(device_type=device_types[0], device_role=devicerole, name='Device 1', site=site), + Device(device_type=device_types[1], device_role=devicerole, name='Device 2', site=site), + Device(device_type=device_types[1], device_role=devicerole, name='Device 3', site=site), + Device(device_type=device_types[1], device_role=devicerole, name='Device 4', site=site), ) - devicerole = DeviceRole.objects.create( - name='Test Device Role 1', slug='test-device-role-1', color='ff0000' + Device.objects.bulk_create(devices) + + device_bays = ( + DeviceBay(device=devices[0], name='Device Bay 1'), + DeviceBay(device=devices[0], name='Device Bay 2'), + DeviceBay(device=devices[0], name='Device Bay 3'), ) - self.parent_device = Device.objects.create( - device_type=self.devicetype1, device_role=devicerole, name='Parent Device 1', site=site - ) - self.child_device = Device.objects.create( - device_type=self.devicetype2, device_role=devicerole, name='Child Device 1', site=site - ) - self.devicebay1 = DeviceBay.objects.create(device=self.parent_device, name='Test Device Bay 1') - self.devicebay2 = DeviceBay.objects.create(device=self.parent_device, name='Test Device Bay 2') - self.devicebay3 = DeviceBay.objects.create(device=self.parent_device, name='Test Device Bay 3') + DeviceBay.objects.bulk_create(device_bays) - def test_get_devicebay(self): - - url = reverse('dcim-api:devicebay-detail', kwargs={'pk': self.devicebay1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.devicebay1.name) - - def test_list_devicebays(self): - - url = reverse('dcim-api:devicebay-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_list_devicebays_brief(self): - - url = reverse('dcim-api:devicebay-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['device', 'id', 'name', 'url'] - ) - - def test_create_devicebay(self): - - data = { - 'device': self.parent_device.pk, - 'name': 'Test Device Bay 4', - 'installed_device': self.child_device.pk, - } - - url = reverse('dcim-api:devicebay-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(DeviceBay.objects.count(), 4) - devicebay4 = DeviceBay.objects.get(pk=response.data['id']) - self.assertEqual(devicebay4.device_id, data['device']) - self.assertEqual(devicebay4.name, data['name']) - self.assertEqual(devicebay4.installed_device_id, data['installed_device']) - - def test_create_devicebay_bulk(self): - - data = [ + cls.create_data = [ { - 'device': self.parent_device.pk, - 'name': 'Test Device Bay 4', + 'device': devices[0].pk, + 'name': 'Device Bay 4', + 'installed_device': devices[1].pk, }, { - 'device': self.parent_device.pk, - 'name': 'Test Device Bay 5', + 'device': devices[0].pk, + 'name': 'Device Bay 5', + 'installed_device': devices[2].pk, }, { - 'device': self.parent_device.pk, - 'name': 'Test Device Bay 6', + 'device': devices[0].pk, + 'name': 'Device Bay 6', + 'installed_device': devices[3].pk, }, ] - url = reverse('dcim-api:devicebay-list') - response = self.client.post(url, data, format='json', **self.header) - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(DeviceBay.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) +class InventoryItemTest(APIViewTestCases.APIViewTestCase): + model = InventoryItem + brief_fields = ['id', 'name', 'url'] - def test_update_devicebay(self): + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') + devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1') + site = Site.objects.create(name='Site 1', slug='site-1') + devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000') + device = Device.objects.create(device_type=devicetype, device_role=devicerole, name='Device 1', site=site) - data = { - 'device': self.parent_device.pk, - 'name': 'Test Device Bay X', - 'installed_device': self.child_device.pk, - } - - url = reverse('dcim-api:devicebay-detail', kwargs={'pk': self.devicebay1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(DeviceBay.objects.count(), 3) - devicebay1 = DeviceBay.objects.get(pk=response.data['id']) - self.assertEqual(devicebay1.name, data['name']) - self.assertEqual(devicebay1.installed_device_id, data['installed_device']) - - def test_delete_devicebay(self): - - url = reverse('dcim-api:devicebay-detail', kwargs={'pk': self.devicebay1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(DeviceBay.objects.count(), 2) - - -class InventoryItemTest(APITestCase): - - def setUp(self): - - super().setUp() - - site = Site.objects.create(name='Test Site 1', slug='test-site-1') - self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') - devicetype = DeviceType.objects.create( - manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1' + inventory_items = ( + InventoryItem(device=device, name='Inventory Item 1', manufacturer=manufacturer), + InventoryItem(device=device, name='Inventory Item 2', manufacturer=manufacturer), + InventoryItem(device=device, name='Inventory Item 3', manufacturer=manufacturer), ) - devicerole = DeviceRole.objects.create( - name='Test Device Role 1', slug='test-device-role-1', color='ff0000' - ) - self.device = Device.objects.create( - device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site - ) - self.inventoryitem1 = InventoryItem.objects.create(device=self.device, name='Test Inventory Item 1') - self.inventoryitem2 = InventoryItem.objects.create(device=self.device, name='Test Inventory Item 2') - self.inventoryitem3 = InventoryItem.objects.create(device=self.device, name='Test Inventory Item 3') + InventoryItem.objects.bulk_create(inventory_items) - def test_get_inventoryitem(self): - - url = reverse('dcim-api:inventoryitem-detail', kwargs={'pk': self.inventoryitem1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.inventoryitem1.name) - - def test_list_inventoryitems(self): - - url = reverse('dcim-api:inventoryitem-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_create_inventoryitem(self): - - data = { - 'device': self.device.pk, - 'parent': self.inventoryitem1.pk, - 'name': 'Test Inventory Item 4', - 'manufacturer': self.manufacturer.pk, - } - - url = reverse('dcim-api:inventoryitem-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(InventoryItem.objects.count(), 4) - inventoryitem4 = InventoryItem.objects.get(pk=response.data['id']) - self.assertEqual(inventoryitem4.device_id, data['device']) - self.assertEqual(inventoryitem4.parent_id, data['parent']) - self.assertEqual(inventoryitem4.name, data['name']) - self.assertEqual(inventoryitem4.manufacturer_id, data['manufacturer']) - - def test_create_inventoryitem_bulk(self): - - data = [ + cls.create_data = [ { - 'device': self.device.pk, - 'parent': self.inventoryitem1.pk, - 'name': 'Test Inventory Item 4', - 'manufacturer': self.manufacturer.pk, + 'device': device.pk, + 'name': 'Inventory Item 4', + 'manufacturer': manufacturer.pk, }, { - 'device': self.device.pk, - 'parent': self.inventoryitem1.pk, - 'name': 'Test Inventory Item 5', - 'manufacturer': self.manufacturer.pk, + 'device': device.pk, + 'name': 'Inventory Item 5', + 'manufacturer': manufacturer.pk, }, { - 'device': self.device.pk, - 'parent': self.inventoryitem1.pk, - 'name': 'Test Inventory Item 6', - 'manufacturer': self.manufacturer.pk, + 'device': device.pk, + 'name': 'Inventory Item 6', + 'manufacturer': manufacturer.pk, }, ] - url = reverse('dcim-api:inventoryitem-list') - response = self.client.post(url, data, format='json', **self.header) - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(InventoryItem.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) +class CableTest(APIViewTestCases.APIViewTestCase): + model = Cable + brief_fields = ['id', 'label', 'url'] - def test_update_inventoryitem(self): + # TODO: Allow updating cable terminations + test_update_object = None - data = { - 'device': self.device.pk, - 'parent': self.inventoryitem1.pk, - 'name': 'Test Inventory Item X', - 'manufacturer': self.manufacturer.pk, - } + @classmethod + def setUpTestData(cls): + site = Site.objects.create(name='Site 1', slug='site-1') + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1') + devicerole = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1', color='ff0000') - url = reverse('dcim-api:inventoryitem-detail', kwargs={'pk': self.inventoryitem1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(InventoryItem.objects.count(), 3) - inventoryitem1 = InventoryItem.objects.get(pk=response.data['id']) - self.assertEqual(inventoryitem1.device_id, data['device']) - self.assertEqual(inventoryitem1.parent_id, data['parent']) - self.assertEqual(inventoryitem1.name, data['name']) - self.assertEqual(inventoryitem1.manufacturer_id, data['manufacturer']) - - def test_delete_inventoryitem(self): - - url = reverse('dcim-api:inventoryitem-detail', kwargs={'pk': self.inventoryitem1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(InventoryItem.objects.count(), 2) - - -class CableTest(APITestCase): - - def setUp(self): - - super().setUp() - - site = Site.objects.create(name='Test Site 1', slug='test-site-1') - self.manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1') - devicetype = DeviceType.objects.create( - manufacturer=self.manufacturer, model='Test Device Type 1', slug='test-device-type-1' + devices = ( + Device(device_type=devicetype, device_role=devicerole, name='Device 1', site=site), + Device(device_type=devicetype, device_role=devicerole, name='Device 2', site=site), ) - devicerole = DeviceRole.objects.create( - name='Test Device Role 1', slug='test-device-role-1', color='ff0000' - ) - self.device1 = Device.objects.create( - device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site - ) - self.device2 = Device.objects.create( - device_type=devicetype, device_role=devicerole, name='Test Device 2', site=site - ) - for device in [self.device1, self.device2]: + Device.objects.bulk_create(devices) + + interfaces = [] + for device in devices: for i in range(0, 10): - Interface(device=device, type=InterfaceTypeChoices.TYPE_1GE_FIXED, name='eth{}'.format(i)).save() + interfaces.append(Interface(device=device, type=InterfaceTypeChoices.TYPE_1GE_FIXED, name=f'eth{i}')) + Interface.objects.bulk_create(interfaces) - self.cable1 = Cable( - termination_a=self.device1.interfaces.get(name='eth0'), - termination_b=self.device2.interfaces.get(name='eth0'), - label='Test Cable 1' + cables = ( + Cable(termination_a=interfaces[0], termination_b=interfaces[10], label='Cable 1'), + Cable(termination_a=interfaces[1], termination_b=interfaces[11], label='Cable 2'), + Cable(termination_a=interfaces[2], termination_b=interfaces[12], label='Cable 3'), ) - self.cable1.save() - self.cable2 = Cable( - termination_a=self.device1.interfaces.get(name='eth1'), - termination_b=self.device2.interfaces.get(name='eth1'), - label='Test Cable 2' - ) - self.cable2.save() - self.cable3 = Cable( - termination_a=self.device1.interfaces.get(name='eth2'), - termination_b=self.device2.interfaces.get(name='eth2'), - label='Test Cable 3' - ) - self.cable3.save() + for cable in cables: + cable.save() - def test_get_cable(self): - - url = reverse('dcim-api:cable-detail', kwargs={'pk': self.cable1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['id'], self.cable1.pk) - - def test_list_cables(self): - - url = reverse('dcim-api:cable-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_create_cable(self): - - interface_a = self.device1.interfaces.get(name='eth3') - interface_b = self.device2.interfaces.get(name='eth3') - data = { - 'termination_a_type': 'dcim.interface', - 'termination_a_id': interface_a.pk, - 'termination_b_type': 'dcim.interface', - 'termination_b_id': interface_b.pk, - 'status': CableStatusChoices.STATUS_PLANNED, - 'label': 'Test Cable 4', - } - - url = reverse('dcim-api:cable-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Cable.objects.count(), 4) - cable4 = Cable.objects.get(pk=response.data['id']) - self.assertEqual(cable4.termination_a, interface_a) - self.assertEqual(cable4.termination_b, interface_b) - self.assertEqual(cable4.status, data['status']) - self.assertEqual(cable4.label, data['label']) - - def test_create_cable_bulk(self): - - data = [ + cls.create_data = [ { 'termination_a_type': 'dcim.interface', - 'termination_a_id': self.device1.interfaces.get(name='eth3').pk, + 'termination_a_id': interfaces[4].pk, 'termination_b_type': 'dcim.interface', - 'termination_b_id': self.device2.interfaces.get(name='eth3').pk, - 'label': 'Test Cable 4', + 'termination_b_id': interfaces[14].pk, + 'label': 'Cable 4', }, { 'termination_a_type': 'dcim.interface', - 'termination_a_id': self.device1.interfaces.get(name='eth4').pk, + 'termination_a_id': interfaces[5].pk, 'termination_b_type': 'dcim.interface', - 'termination_b_id': self.device2.interfaces.get(name='eth4').pk, - 'label': 'Test Cable 5', + 'termination_b_id': interfaces[15].pk, + 'label': 'Cable 5', }, { 'termination_a_type': 'dcim.interface', - 'termination_a_id': self.device1.interfaces.get(name='eth5').pk, + 'termination_a_id': interfaces[6].pk, 'termination_b_type': 'dcim.interface', - 'termination_b_id': self.device2.interfaces.get(name='eth5').pk, - 'label': 'Test Cable 6', + 'termination_b_id': interfaces[16].pk, + 'label': 'Cable 6', }, ] - url = reverse('dcim-api:cable-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(Cable.objects.count(), 6) - self.assertEqual(response.data[0]['label'], data[0]['label']) - self.assertEqual(response.data[1]['label'], data[1]['label']) - self.assertEqual(response.data[2]['label'], data[2]['label']) - - def test_update_cable(self): - - data = { - 'label': 'Test Cable X', - 'status': CableStatusChoices.STATUS_CONNECTED, - } - - url = reverse('dcim-api:cable-detail', kwargs={'pk': self.cable1.pk}) - response = self.client.patch(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(Cable.objects.count(), 3) - cable1 = Cable.objects.get(pk=response.data['id']) - self.assertEqual(cable1.status, data['status']) - self.assertEqual(cable1.label, data['label']) - - def test_delete_cable(self): - - url = reverse('dcim-api:cable-detail', kwargs={'pk': self.cable1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(Cable.objects.count(), 2) - class ConnectionTest(APITestCase): @@ -3839,426 +1804,159 @@ class ConnectedDeviceTest(APITestCase): self.assertEqual(response.data['name'], self.device1.name) -class VirtualChassisTest(APITestCase): - - def setUp(self): - - super().setUp() +class VirtualChassisTest(APIViewTestCases.APIViewTestCase): + model = VirtualChassis + brief_fields = ['id', 'master', 'member_count', 'url'] + @classmethod + def setUpTestData(cls): site = Site.objects.create(name='Test Site', slug='test-site') - manufacturer = Manufacturer.objects.create(name='Test Manufacturer', slug='test-manufacturer') - device_type = DeviceType.objects.create( - manufacturer=manufacturer, model='Test Device Type', slug='test-device-type' - ) - device_role = DeviceRole.objects.create( - name='Test Device Role', slug='test-device-role', color='ff0000' - ) + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type', slug='device-type') + devicerole = DeviceRole.objects.create(name='Device Role', slug='device-role', color='ff0000') - # Create 9 member Devices with 12 interfaces each - self.device1 = Device.objects.create( - device_type=device_type, device_role=device_role, name='StackSwitch1', site=site + devices = ( + Device(name='Device 1', device_type=devicetype, device_role=devicerole, site=site), + Device(name='Device 2', device_type=devicetype, device_role=devicerole, site=site), + Device(name='Device 3', device_type=devicetype, device_role=devicerole, site=site), + Device(name='Device 4', device_type=devicetype, device_role=devicerole, site=site), + Device(name='Device 5', device_type=devicetype, device_role=devicerole, site=site), + Device(name='Device 6', device_type=devicetype, device_role=devicerole, site=site), + Device(name='Device 7', device_type=devicetype, device_role=devicerole, site=site), + Device(name='Device 8', device_type=devicetype, device_role=devicerole, site=site), + Device(name='Device 9', device_type=devicetype, device_role=devicerole, site=site), ) - self.device2 = Device.objects.create( - device_type=device_type, device_role=device_role, name='StackSwitch2', site=site - ) - self.device3 = Device.objects.create( - device_type=device_type, device_role=device_role, name='StackSwitch3', site=site - ) - self.device4 = Device.objects.create( - device_type=device_type, device_role=device_role, name='StackSwitch4', site=site - ) - self.device5 = Device.objects.create( - device_type=device_type, device_role=device_role, name='StackSwitch5', site=site - ) - self.device6 = Device.objects.create( - device_type=device_type, device_role=device_role, name='StackSwitch6', site=site - ) - self.device7 = Device.objects.create( - device_type=device_type, device_role=device_role, name='StackSwitch7', site=site - ) - self.device8 = Device.objects.create( - device_type=device_type, device_role=device_role, name='StackSwitch8', site=site - ) - self.device9 = Device.objects.create( - device_type=device_type, device_role=device_role, name='StackSwitch9', site=site - ) - for i in range(0, 13): - Interface.objects.create(device=self.device1, name='1/{}'.format(i), type=InterfaceTypeChoices.TYPE_1GE_FIXED) - for i in range(0, 13): - Interface.objects.create(device=self.device2, name='2/{}'.format(i), type=InterfaceTypeChoices.TYPE_1GE_FIXED) - for i in range(0, 13): - Interface.objects.create(device=self.device3, name='3/{}'.format(i), type=InterfaceTypeChoices.TYPE_1GE_FIXED) - for i in range(0, 13): - Interface.objects.create(device=self.device4, name='1/{}'.format(i), type=InterfaceTypeChoices.TYPE_1GE_FIXED) - for i in range(0, 13): - Interface.objects.create(device=self.device5, name='2/{}'.format(i), type=InterfaceTypeChoices.TYPE_1GE_FIXED) - for i in range(0, 13): - Interface.objects.create(device=self.device6, name='3/{}'.format(i), type=InterfaceTypeChoices.TYPE_1GE_FIXED) - for i in range(0, 13): - Interface.objects.create(device=self.device7, name='1/{}'.format(i), type=InterfaceTypeChoices.TYPE_1GE_FIXED) - for i in range(0, 13): - Interface.objects.create(device=self.device8, name='2/{}'.format(i), type=InterfaceTypeChoices.TYPE_1GE_FIXED) - for i in range(0, 13): - Interface.objects.create(device=self.device9, name='3/{}'.format(i), type=InterfaceTypeChoices.TYPE_1GE_FIXED) + Device.objects.bulk_create(devices) + + # Create 12 interfaces per device + interfaces = [] + for i, device in enumerate(devices): + for j in range(0, 13): + interfaces.append( + # Interface name starts with parent device's position in VC; e.g. 1/1, 1/2, 1/3... + Interface(device=device, name=f'{i%3+1}/{j}', type=InterfaceTypeChoices.TYPE_1GE_FIXED) + ) + Interface.objects.bulk_create(interfaces) # Create two VirtualChassis with three members each - self.vc1 = VirtualChassis.objects.create(master=self.device1, domain='test-domain-1') - Device.objects.filter(pk=self.device2.pk).update(virtual_chassis=self.vc1, vc_position=2) - Device.objects.filter(pk=self.device3.pk).update(virtual_chassis=self.vc1, vc_position=3) - self.vc2 = VirtualChassis.objects.create(master=self.device4, domain='test-domain-2') - Device.objects.filter(pk=self.device5.pk).update(virtual_chassis=self.vc2, vc_position=2) - Device.objects.filter(pk=self.device6.pk).update(virtual_chassis=self.vc2, vc_position=3) - - def test_get_virtualchassis(self): - - url = reverse('dcim-api:virtualchassis-detail', kwargs={'pk': self.vc1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['domain'], self.vc1.domain) - - def test_list_virtualchassis(self): - - url = reverse('dcim-api:virtualchassis-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 2) - - def test_list_virtualchassis_brief(self): - - url = reverse('dcim-api:virtualchassis-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['id', 'master', 'member_count', 'url'] + virtual_chassis = ( + VirtualChassis(master=devices[0], domain='domain-1'), + VirtualChassis(master=devices[3], domain='domain-2'), ) + VirtualChassis.objects.bulk_create(virtual_chassis) + Device.objects.filter(pk=devices[1].pk).update(virtual_chassis=virtual_chassis[0], vc_position=2) + Device.objects.filter(pk=devices[2].pk).update(virtual_chassis=virtual_chassis[0], vc_position=3) + Device.objects.filter(pk=devices[4].pk).update(virtual_chassis=virtual_chassis[1], vc_position=2) + Device.objects.filter(pk=devices[5].pk).update(virtual_chassis=virtual_chassis[1], vc_position=3) - def test_create_virtualchassis(self): - - data = { - 'master': self.device7.pk, - 'domain': 'test-domain-3', + cls.update_data = { + 'master': devices[1].pk, + 'domain': 'domain-x', } - url = reverse('dcim-api:virtualchassis-list') - response = self.client.post(url, data, format='json', **self.header) - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(VirtualChassis.objects.count(), 3) - vc3 = VirtualChassis.objects.get(pk=response.data['id']) - self.assertEqual(vc3.master.pk, data['master']) - self.assertEqual(vc3.domain, data['domain']) - - # Verify that the master device was automatically assigned to the VC - self.assertTrue(Device.objects.filter(pk=vc3.master.pk, virtual_chassis=vc3.pk).exists()) - - def test_create_virtualchassis_bulk(self): - - data = [ + cls.create_data = [ { - 'master': self.device7.pk, - 'domain': 'test-domain-3', + 'master': devices[6].pk, + 'domain': 'domain-3', }, { - 'master': self.device8.pk, - 'domain': 'test-domain-4', + 'master': devices[7].pk, + 'domain': 'domain-4', }, { - 'master': self.device9.pk, - 'domain': 'test-domain-5', + 'master': devices[8].pk, + 'domain': 'domain-5', }, ] - url = reverse('dcim-api:virtualchassis-list') - response = self.client.post(url, data, format='json', **self.header) - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(VirtualChassis.objects.count(), 5) - for i in range(0, 3): - self.assertEqual(response.data[i]['master']['id'], data[i]['master']) - self.assertEqual(response.data[i]['domain'], data[i]['domain']) - def test_update_virtualchassis(self): +class PowerPanelTest(APIViewTestCases.APIViewTestCase): + model = PowerPanel + brief_fields = ['id', 'name', 'powerfeed_count', 'url'] - data = { - 'master': self.device2.pk, - 'domain': 'test-domain-x', - } + @classmethod + def setUpTestData(cls): + site = Site.objects.create(name='Site 1', slug='site-1') - url = reverse('dcim-api:virtualchassis-detail', kwargs={'pk': self.vc1.pk}) - response = self.client.put(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(VirtualChassis.objects.count(), 2) - vc1 = VirtualChassis.objects.get(pk=response.data['id']) - self.assertEqual(vc1.master.pk, data['master']) - self.assertEqual(vc1.domain, data['domain']) - - def test_delete_virtualchassis(self): - - url = reverse('dcim-api:virtualchassis-detail', kwargs={'pk': self.vc1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(VirtualChassis.objects.count(), 1) - - # Verify that all VC members have had their VC-related fields nullified - for d in [self.device1, self.device2, self.device3]: - self.assertTrue( - Device.objects.filter(pk=d.pk, virtual_chassis=None, vc_position=None, vc_priority=None) - ) - - -class PowerPanelTest(APITestCase): - - def setUp(self): - - super().setUp() - - self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1') - self.rackgroup1 = RackGroup.objects.create(site=self.site1, name='Test Rack Group 1', slug='test-rack-group-1') - self.rackgroup2 = RackGroup.objects.create(site=self.site1, name='Test Rack Group 2', slug='test-rack-group-2') - self.rackgroup3 = RackGroup.objects.create(site=self.site1, name='Test Rack Group 3', slug='test-rack-group-3') - self.powerpanel1 = PowerPanel.objects.create( - site=self.site1, rack_group=self.rackgroup1, name='Test Power Panel 1' - ) - self.powerpanel2 = PowerPanel.objects.create( - site=self.site1, rack_group=self.rackgroup2, name='Test Power Panel 2' - ) - self.powerpanel3 = PowerPanel.objects.create( - site=self.site1, rack_group=self.rackgroup3, name='Test Power Panel 3' + rack_groups = ( + RackGroup.objects.create(name='Rack Group 1', slug='rack-group-1', site=site), + RackGroup.objects.create(name='Rack Group 2', slug='rack-group-2', site=site), + RackGroup.objects.create(name='Rack Group 3', slug='rack-group-3', site=site), ) - def test_get_powerpanel(self): - - url = reverse('dcim-api:powerpanel-detail', kwargs={'pk': self.powerpanel1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.powerpanel1.name) - - def test_list_powerpanels(self): - - url = reverse('dcim-api:powerpanel-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 3) - - def test_list_powerpanels_brief(self): - - url = reverse('dcim-api:powerpanel-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['id', 'name', 'powerfeed_count', 'url'] + power_panels = ( + PowerPanel(site=site, rack_group=rack_groups[0], name='Power Panel 1'), + PowerPanel(site=site, rack_group=rack_groups[1], name='Power Panel 2'), + PowerPanel(site=site, rack_group=rack_groups[2], name='Power Panel 3'), ) + PowerPanel.objects.bulk_create(power_panels) - def test_create_powerpanel(self): - - data = { - 'name': 'Test Power Panel 4', - 'site': self.site1.pk, - 'rack_group': self.rackgroup1.pk, - } - - url = reverse('dcim-api:powerpanel-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(PowerPanel.objects.count(), 4) - powerpanel4 = PowerPanel.objects.get(pk=response.data['id']) - self.assertEqual(powerpanel4.name, data['name']) - self.assertEqual(powerpanel4.site_id, data['site']) - self.assertEqual(powerpanel4.rack_group_id, data['rack_group']) - - def test_create_powerpanel_bulk(self): - - data = [ + cls.create_data = [ { - 'name': 'Test Power Panel 4', - 'site': self.site1.pk, - 'rack_group': self.rackgroup1.pk, + 'name': 'Power Panel 4', + 'site': site.pk, + 'rack_group': rack_groups[0].pk, }, { - 'name': 'Test Power Panel 5', - 'site': self.site1.pk, - 'rack_group': self.rackgroup2.pk, + 'name': 'Power Panel 5', + 'site': site.pk, + 'rack_group': rack_groups[1].pk, }, { - 'name': 'Test Power Panel 6', - 'site': self.site1.pk, - 'rack_group': self.rackgroup3.pk, + 'name': 'Power Panel 6', + 'site': site.pk, + 'rack_group': rack_groups[2].pk, }, ] - url = reverse('dcim-api:powerpanel-list') - response = self.client.post(url, data, format='json', **self.header) - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(PowerPanel.objects.count(), 6) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - self.assertEqual(response.data[2]['name'], data[2]['name']) +class PowerFeedTest(APIViewTestCases.APIViewTestCase): + model = PowerFeed + brief_fields = ['id', 'name', 'url'] - def test_update_powerpanel(self): + @classmethod + def setUpTestData(cls): + site = Site.objects.create(name='Site 1', slug='site-1') + rackgroup = RackGroup.objects.create(site=site, name='Rack Group 1', slug='rack-group-1') + rackrole = RackRole.objects.create(name='Rack Role 1', slug='rack-role-1', color='ff0000') - data = { - 'name': 'Test Power Panel X', - 'rack_group': self.rackgroup2.pk, - } - - url = reverse('dcim-api:powerpanel-detail', kwargs={'pk': self.powerpanel1.pk}) - response = self.client.patch(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(PowerPanel.objects.count(), 3) - powerpanel1 = PowerPanel.objects.get(pk=response.data['id']) - self.assertEqual(powerpanel1.name, data['name']) - self.assertEqual(powerpanel1.rack_group_id, data['rack_group']) - - def test_delete_powerpanel(self): - - url = reverse('dcim-api:powerpanel-detail', kwargs={'pk': self.powerpanel1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(PowerPanel.objects.count(), 2) - - -class PowerFeedTest(APITestCase): - - def setUp(self): - - super().setUp() - - self.site1 = Site.objects.create(name='Test Site 1', slug='test-site-1') - self.rackgroup1 = RackGroup.objects.create(site=self.site1, name='Test Rack Group 1', slug='test-rack-group-1') - self.rackrole1 = RackRole.objects.create(name='Test Rack Role 1', slug='test-rack-role-1', color='ff0000') - self.rack1 = Rack.objects.create( - site=self.site1, group=self.rackgroup1, role=self.rackrole1, name='Test Rack 1', u_height=42, + racks = ( + Rack(site=site, group=rackgroup, role=rackrole, name='Rack 1'), + Rack(site=site, group=rackgroup, role=rackrole, name='Rack 2'), + Rack(site=site, group=rackgroup, role=rackrole, name='Rack 3'), + Rack(site=site, group=rackgroup, role=rackrole, name='Rack 4'), ) - self.rack2 = Rack.objects.create( - site=self.site1, group=self.rackgroup1, role=self.rackrole1, name='Test Rack 2', u_height=42, + Rack.objects.bulk_create(racks) + + power_panels = ( + PowerPanel(site=site, rack_group=rackgroup, name='Power Panel 1'), + PowerPanel(site=site, rack_group=rackgroup, name='Power Panel 2'), ) - self.rack3 = Rack.objects.create( - site=self.site1, group=self.rackgroup1, role=self.rackrole1, name='Test Rack 3', u_height=42, - ) - self.rack4 = Rack.objects.create( - site=self.site1, group=self.rackgroup1, role=self.rackrole1, name='Test Rack 4', u_height=42, - ) - self.powerpanel1 = PowerPanel.objects.create( - site=self.site1, rack_group=self.rackgroup1, name='Test Power Panel 1' - ) - self.powerpanel2 = PowerPanel.objects.create( - site=self.site1, rack_group=self.rackgroup1, name='Test Power Panel 2' - ) - self.powerfeed1 = PowerFeed.objects.create( - power_panel=self.powerpanel1, rack=self.rack1, name='Test Power Feed 1A', type=PowerFeedTypeChoices.TYPE_PRIMARY - ) - self.powerfeed2 = PowerFeed.objects.create( - power_panel=self.powerpanel2, rack=self.rack1, name='Test Power Feed 1B', type=PowerFeedTypeChoices.TYPE_REDUNDANT - ) - self.powerfeed3 = PowerFeed.objects.create( - power_panel=self.powerpanel1, rack=self.rack2, name='Test Power Feed 2A', type=PowerFeedTypeChoices.TYPE_PRIMARY - ) - self.powerfeed4 = PowerFeed.objects.create( - power_panel=self.powerpanel2, rack=self.rack2, name='Test Power Feed 2B', type=PowerFeedTypeChoices.TYPE_REDUNDANT - ) - self.powerfeed5 = PowerFeed.objects.create( - power_panel=self.powerpanel1, rack=self.rack3, name='Test Power Feed 3A', type=PowerFeedTypeChoices.TYPE_PRIMARY - ) - self.powerfeed6 = PowerFeed.objects.create( - power_panel=self.powerpanel2, rack=self.rack3, name='Test Power Feed 3B', type=PowerFeedTypeChoices.TYPE_REDUNDANT + PowerPanel.objects.bulk_create(power_panels) + + PRIMARY = PowerFeedTypeChoices.TYPE_PRIMARY + REDUNDANT = PowerFeedTypeChoices.TYPE_REDUNDANT + power_feeds = ( + PowerFeed(power_panel=power_panels[0], rack=racks[0], name='Power Feed 1A', type=PRIMARY), + PowerFeed(power_panel=power_panels[1], rack=racks[0], name='Power Feed 1B', type=REDUNDANT), + PowerFeed(power_panel=power_panels[0], rack=racks[1], name='Power Feed 2A', type=PRIMARY), + PowerFeed(power_panel=power_panels[1], rack=racks[1], name='Power Feed 2B', type=REDUNDANT), + PowerFeed(power_panel=power_panels[0], rack=racks[2], name='Power Feed 3A', type=PRIMARY), + PowerFeed(power_panel=power_panels[1], rack=racks[2], name='Power Feed 3B', type=REDUNDANT), ) + PowerFeed.objects.bulk_create(power_feeds) - def test_get_powerfeed(self): - - url = reverse('dcim-api:powerfeed-detail', kwargs={'pk': self.powerfeed1.pk}) - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['name'], self.powerfeed1.name) - - def test_list_powerfeeds(self): - - url = reverse('dcim-api:powerfeed-list') - response = self.client.get(url, **self.header) - - self.assertEqual(response.data['count'], 6) - - def test_list_powerfeeds_brief(self): - - url = reverse('dcim-api:powerfeed-list') - response = self.client.get('{}?brief=1'.format(url), **self.header) - - self.assertEqual( - sorted(response.data['results'][0]), - ['id', 'name', 'url'] - ) - - def test_create_powerfeed(self): - - data = { - 'name': 'Test Power Feed 4A', - 'power_panel': self.powerpanel1.pk, - 'rack': self.rack4.pk, - 'type': PowerFeedTypeChoices.TYPE_PRIMARY, - } - - url = reverse('dcim-api:powerfeed-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(PowerFeed.objects.count(), 7) - powerfeed4 = PowerFeed.objects.get(pk=response.data['id']) - self.assertEqual(powerfeed4.name, data['name']) - self.assertEqual(powerfeed4.power_panel_id, data['power_panel']) - self.assertEqual(powerfeed4.rack_id, data['rack']) - - def test_create_powerfeed_bulk(self): - - data = [ + cls.create_data = [ { - 'name': 'Test Power Feed 4A', - 'power_panel': self.powerpanel1.pk, - 'rack': self.rack4.pk, - 'type': PowerFeedTypeChoices.TYPE_PRIMARY, + 'name': 'Power Feed 4A', + 'power_panel': power_panels[0].pk, + 'rack': racks[3].pk, + 'type': PRIMARY, }, { - 'name': 'Test Power Feed 4B', - 'power_panel': self.powerpanel1.pk, - 'rack': self.rack4.pk, - 'type': PowerFeedTypeChoices.TYPE_REDUNDANT, + 'name': 'Power Feed 4B', + 'power_panel': power_panels[1].pk, + 'rack': racks[3].pk, + 'type': REDUNDANT, }, ] - - url = reverse('dcim-api:powerfeed-list') - response = self.client.post(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_201_CREATED) - self.assertEqual(PowerFeed.objects.count(), 8) - self.assertEqual(response.data[0]['name'], data[0]['name']) - self.assertEqual(response.data[1]['name'], data[1]['name']) - - def test_update_powerfeed(self): - - data = { - 'name': 'Test Power Feed X', - 'rack': self.rack4.pk, - 'type': PowerFeedTypeChoices.TYPE_REDUNDANT, - } - - url = reverse('dcim-api:powerfeed-detail', kwargs={'pk': self.powerfeed1.pk}) - response = self.client.patch(url, data, format='json', **self.header) - - self.assertHttpStatus(response, status.HTTP_200_OK) - self.assertEqual(PowerFeed.objects.count(), 6) - powerfeed1 = PowerFeed.objects.get(pk=response.data['id']) - self.assertEqual(powerfeed1.name, data['name']) - self.assertEqual(powerfeed1.rack_id, data['rack']) - self.assertEqual(powerfeed1.type, data['type']) - - def test_delete_powerfeed(self): - - url = reverse('dcim-api:powerfeed-detail', kwargs={'pk': self.powerfeed1.pk}) - response = self.client.delete(url, **self.header) - - self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - self.assertEqual(PowerFeed.objects.count(), 5)