Parcourir la source

Introduced HttpStatusMixin to provide more detail on HTTP response status test failures

Jeremy Stretch il y a 8 ans
Parent
commit
42fd14f5c0

+ 17 - 16
netbox/circuits/tests/test_api.py

@@ -7,9 +7,10 @@ from django.urls import reverse
 from dcim.models import Site
 from circuits.models import Circuit, CircuitTermination, CircuitType, Provider, TERM_SIDE_A, TERM_SIDE_Z
 from users.models import Token
+from utilities.tests import HttpStatusMixin
 
 
-class ProviderTest(APITestCase):
+class ProviderTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -45,7 +46,7 @@ class ProviderTest(APITestCase):
         url = reverse('circuits-api:provider-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(Provider.objects.count(), 4)
         provider4 = Provider.objects.get(pk=response.data['id'])
         self.assertEqual(provider4.name, data['name'])
@@ -61,7 +62,7 @@ class ProviderTest(APITestCase):
         url = reverse('circuits-api:provider-detail', kwargs={'pk': self.provider1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(Provider.objects.count(), 3)
         provider1 = Provider.objects.get(pk=response.data['id'])
         self.assertEqual(provider1.name, data['name'])
@@ -72,11 +73,11 @@ class ProviderTest(APITestCase):
         url = reverse('circuits-api:provider-detail', kwargs={'pk': self.provider1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(Provider.objects.count(), 2)
 
 
-class CircuitTypeTest(APITestCase):
+class CircuitTypeTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -112,7 +113,7 @@ class CircuitTypeTest(APITestCase):
         url = reverse('circuits-api:circuittype-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(CircuitType.objects.count(), 4)
         circuittype4 = CircuitType.objects.get(pk=response.data['id'])
         self.assertEqual(circuittype4.name, data['name'])
@@ -128,7 +129,7 @@ class CircuitTypeTest(APITestCase):
         url = reverse('circuits-api:circuittype-detail', kwargs={'pk': self.circuittype1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(CircuitType.objects.count(), 3)
         circuittype1 = CircuitType.objects.get(pk=response.data['id'])
         self.assertEqual(circuittype1.name, data['name'])
@@ -139,11 +140,11 @@ class CircuitTypeTest(APITestCase):
         url = reverse('circuits-api:circuittype-detail', kwargs={'pk': self.circuittype1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(CircuitType.objects.count(), 2)
 
 
-class CircuitTest(APITestCase):
+class CircuitTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -184,7 +185,7 @@ class CircuitTest(APITestCase):
         url = reverse('circuits-api:circuit-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(Circuit.objects.count(), 4)
         circuit4 = Circuit.objects.get(pk=response.data['id'])
         self.assertEqual(circuit4.cid, data['cid'])
@@ -202,7 +203,7 @@ class CircuitTest(APITestCase):
         url = reverse('circuits-api:circuit-detail', kwargs={'pk': self.circuit1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(Circuit.objects.count(), 3)
         circuit1 = Circuit.objects.get(pk=response.data['id'])
         self.assertEqual(circuit1.cid, data['cid'])
@@ -214,11 +215,11 @@ class CircuitTest(APITestCase):
         url = reverse('circuits-api:circuit-detail', kwargs={'pk': self.circuit1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(Circuit.objects.count(), 2)
 
 
-class CircuitTerminationTest(APITestCase):
+class CircuitTerminationTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -269,7 +270,7 @@ class CircuitTerminationTest(APITestCase):
         url = reverse('circuits-api:circuittermination-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(CircuitTermination.objects.count(), 4)
         circuittermination4 = CircuitTermination.objects.get(pk=response.data['id'])
         self.assertEqual(circuittermination4.circuit_id, data['circuit'])
@@ -289,7 +290,7 @@ class CircuitTerminationTest(APITestCase):
         url = reverse('circuits-api:circuittermination-detail', kwargs={'pk': self.circuittermination1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(CircuitTermination.objects.count(), 3)
         circuittermination1 = CircuitTermination.objects.get(pk=response.data['id'])
         self.assertEqual(circuittermination1.circuit_id, data['circuit'])
@@ -302,5 +303,5 @@ class CircuitTerminationTest(APITestCase):
         url = reverse('circuits-api:circuittermination-detail', kwargs={'pk': self.circuittermination1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(CircuitTermination.objects.count(), 2)

+ 101 - 100
netbox/dcim/tests/test_api.py

@@ -11,9 +11,10 @@ from dcim.models import (
     RackReservation, RackRole, Region, Site, SUBDEVICE_ROLE_CHILD, SUBDEVICE_ROLE_PARENT,
 )
 from users.models import Token
+from utilities.tests import HttpStatusMixin
 
 
-class RegionTest(APITestCase):
+class RegionTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -49,7 +50,7 @@ class RegionTest(APITestCase):
         url = reverse('dcim-api:region-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -65,7 +66,7 @@ class RegionTest(APITestCase):
         url = reverse('dcim-api:region-detail', kwargs={'pk': self.region1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -76,11 +77,11 @@ class RegionTest(APITestCase):
         url = reverse('dcim-api:region-detail', kwargs={'pk': self.region1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(Region.objects.count(), 2)
 
 
-class SiteTest(APITestCase):
+class SiteTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -119,7 +120,7 @@ class SiteTest(APITestCase):
         url = reverse('dcim-api:site-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -137,7 +138,7 @@ class SiteTest(APITestCase):
         url = reverse('dcim-api:site-detail', kwargs={'pk': self.site1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -149,11 +150,11 @@ class SiteTest(APITestCase):
         url = reverse('dcim-api:site-detail', kwargs={'pk': self.site1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(Site.objects.count(), 2)
 
 
-class RackGroupTest(APITestCase):
+class RackGroupTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -192,7 +193,7 @@ class RackGroupTest(APITestCase):
         url = reverse('dcim-api:rackgroup-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(RackGroup.objects.count(), 4)
         rackgroup4 = RackGroup.objects.get(pk=response.data['id'])
         self.assertEqual(rackgroup4.name, data['name'])
@@ -210,7 +211,7 @@ class RackGroupTest(APITestCase):
         url = reverse('dcim-api:rackgroup-detail', kwargs={'pk': self.rackgroup1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(RackGroup.objects.count(), 3)
         rackgroup1 = RackGroup.objects.get(pk=response.data['id'])
         self.assertEqual(rackgroup1.name, data['name'])
@@ -222,11 +223,11 @@ class RackGroupTest(APITestCase):
         url = reverse('dcim-api:rackgroup-detail', kwargs={'pk': self.rackgroup1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(RackGroup.objects.count(), 2)
 
 
-class RackRoleTest(APITestCase):
+class RackRoleTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -263,7 +264,7 @@ class RackRoleTest(APITestCase):
         url = reverse('dcim-api:rackrole-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -281,7 +282,7 @@ class RackRoleTest(APITestCase):
         url = reverse('dcim-api:rackrole-detail', kwargs={'pk': self.rackrole1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -293,11 +294,11 @@ class RackRoleTest(APITestCase):
         url = reverse('dcim-api:rackrole-detail', kwargs={'pk': self.rackrole1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(RackRole.objects.count(), 2)
 
 
-class RackTest(APITestCase):
+class RackTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -347,7 +348,7 @@ class RackTest(APITestCase):
         url = reverse('dcim-api:rack-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -367,7 +368,7 @@ class RackTest(APITestCase):
         url = reverse('dcim-api:rack-detail', kwargs={'pk': self.rack1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -380,11 +381,11 @@ class RackTest(APITestCase):
         url = reverse('dcim-api:rack-detail', kwargs={'pk': self.rack1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(Rack.objects.count(), 2)
 
 
-class RackReservationTest(APITestCase):
+class RackReservationTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -431,7 +432,7 @@ class RackReservationTest(APITestCase):
         url = reverse('dcim-api:rackreservation-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -451,7 +452,7 @@ class RackReservationTest(APITestCase):
         url = reverse('dcim-api:rackreservation-detail', kwargs={'pk': self.rackreservation1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -462,11 +463,11 @@ class RackReservationTest(APITestCase):
         url = reverse('dcim-api:rackreservation-detail', kwargs={'pk': self.rackreservation1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(RackReservation.objects.count(), 2)
 
 
-class ManufacturerTest(APITestCase):
+class ManufacturerTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -502,7 +503,7 @@ class ManufacturerTest(APITestCase):
         url = reverse('dcim-api:manufacturer-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -518,7 +519,7 @@ class ManufacturerTest(APITestCase):
         url = reverse('dcim-api:manufacturer-detail', kwargs={'pk': self.manufacturer1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -529,11 +530,11 @@ class ManufacturerTest(APITestCase):
         url = reverse('dcim-api:manufacturer-detail', kwargs={'pk': self.manufacturer1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(Manufacturer.objects.count(), 2)
 
 
-class DeviceTypeTest(APITestCase):
+class DeviceTypeTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -578,7 +579,7 @@ class DeviceTypeTest(APITestCase):
         url = reverse('dcim-api:devicetype-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -596,7 +597,7 @@ class DeviceTypeTest(APITestCase):
         url = reverse('dcim-api:devicetype-detail', kwargs={'pk': self.devicetype1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -608,11 +609,11 @@ class DeviceTypeTest(APITestCase):
         url = reverse('dcim-api:devicetype-detail', kwargs={'pk': self.devicetype1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(DeviceType.objects.count(), 2)
 
 
-class ConsolePortTemplateTest(APITestCase):
+class ConsolePortTemplateTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -658,7 +659,7 @@ class ConsolePortTemplateTest(APITestCase):
         url = reverse('dcim-api:consoleporttemplate-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -674,7 +675,7 @@ class ConsolePortTemplateTest(APITestCase):
         url = reverse('dcim-api:consoleporttemplate-detail', kwargs={'pk': self.consoleporttemplate1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -684,11 +685,11 @@ class ConsolePortTemplateTest(APITestCase):
         url = reverse('dcim-api:consoleporttemplate-detail', kwargs={'pk': self.consoleporttemplate1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(ConsolePortTemplate.objects.count(), 2)
 
 
-class ConsoleServerPortTemplateTest(APITestCase):
+class ConsoleServerPortTemplateTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -734,7 +735,7 @@ class ConsoleServerPortTemplateTest(APITestCase):
         url = reverse('dcim-api:consoleserverporttemplate-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -750,7 +751,7 @@ class ConsoleServerPortTemplateTest(APITestCase):
         url = reverse('dcim-api:consoleserverporttemplate-detail', kwargs={'pk': self.consoleserverporttemplate1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -760,11 +761,11 @@ class ConsoleServerPortTemplateTest(APITestCase):
         url = reverse('dcim-api:consoleserverporttemplate-detail', kwargs={'pk': self.consoleserverporttemplate1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(ConsoleServerPortTemplate.objects.count(), 2)
 
 
-class PowerPortTemplateTest(APITestCase):
+class PowerPortTemplateTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -810,7 +811,7 @@ class PowerPortTemplateTest(APITestCase):
         url = reverse('dcim-api:powerporttemplate-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -826,7 +827,7 @@ class PowerPortTemplateTest(APITestCase):
         url = reverse('dcim-api:powerporttemplate-detail', kwargs={'pk': self.powerporttemplate1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -836,11 +837,11 @@ class PowerPortTemplateTest(APITestCase):
         url = reverse('dcim-api:powerporttemplate-detail', kwargs={'pk': self.powerporttemplate1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(PowerPortTemplate.objects.count(), 2)
 
 
-class PowerOutletTemplateTest(APITestCase):
+class PowerOutletTemplateTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -886,7 +887,7 @@ class PowerOutletTemplateTest(APITestCase):
         url = reverse('dcim-api:poweroutlettemplate-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -902,7 +903,7 @@ class PowerOutletTemplateTest(APITestCase):
         url = reverse('dcim-api:poweroutlettemplate-detail', kwargs={'pk': self.poweroutlettemplate1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -912,11 +913,11 @@ class PowerOutletTemplateTest(APITestCase):
         url = reverse('dcim-api:poweroutlettemplate-detail', kwargs={'pk': self.poweroutlettemplate1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(PowerOutletTemplate.objects.count(), 2)
 
 
-class InterfaceTemplateTest(APITestCase):
+class InterfaceTemplateTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -962,7 +963,7 @@ class InterfaceTemplateTest(APITestCase):
         url = reverse('dcim-api:interfacetemplate-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -978,7 +979,7 @@ class InterfaceTemplateTest(APITestCase):
         url = reverse('dcim-api:interfacetemplate-detail', kwargs={'pk': self.interfacetemplate1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -988,11 +989,11 @@ class InterfaceTemplateTest(APITestCase):
         url = reverse('dcim-api:interfacetemplate-detail', kwargs={'pk': self.interfacetemplate1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(InterfaceTemplate.objects.count(), 2)
 
 
-class DeviceBayTemplateTest(APITestCase):
+class DeviceBayTemplateTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -1038,7 +1039,7 @@ class DeviceBayTemplateTest(APITestCase):
         url = reverse('dcim-api:devicebaytemplate-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -1054,7 +1055,7 @@ class DeviceBayTemplateTest(APITestCase):
         url = reverse('dcim-api:devicebaytemplate-detail', kwargs={'pk': self.devicebaytemplate1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -1064,11 +1065,11 @@ class DeviceBayTemplateTest(APITestCase):
         url = reverse('dcim-api:devicebaytemplate-detail', kwargs={'pk': self.devicebaytemplate1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(DeviceBayTemplate.objects.count(), 2)
 
 
-class DeviceRoleTest(APITestCase):
+class DeviceRoleTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -1111,7 +1112,7 @@ class DeviceRoleTest(APITestCase):
         url = reverse('dcim-api:devicerole-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -1129,7 +1130,7 @@ class DeviceRoleTest(APITestCase):
         url = reverse('dcim-api:devicerole-detail', kwargs={'pk': self.devicerole1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -1141,11 +1142,11 @@ class DeviceRoleTest(APITestCase):
         url = reverse('dcim-api:devicerole-detail', kwargs={'pk': self.devicerole1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(DeviceRole.objects.count(), 2)
 
 
-class PlatformTest(APITestCase):
+class PlatformTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -1181,7 +1182,7 @@ class PlatformTest(APITestCase):
         url = reverse('dcim-api:platform-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -1197,7 +1198,7 @@ class PlatformTest(APITestCase):
         url = reverse('dcim-api:platform-detail', kwargs={'pk': self.platform1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -1208,11 +1209,11 @@ class PlatformTest(APITestCase):
         url = reverse('dcim-api:platform-detail', kwargs={'pk': self.platform1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(Platform.objects.count(), 2)
 
 
-class DeviceTest(APITestCase):
+class DeviceTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -1271,7 +1272,7 @@ class DeviceTest(APITestCase):
         url = reverse('dcim-api:device-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(Device.objects.count(), 4)
         device4 = Device.objects.get(pk=response.data['id'])
         self.assertEqual(device4.device_type_id, data['device_type'])
@@ -1291,7 +1292,7 @@ class DeviceTest(APITestCase):
         url = reverse('dcim-api:device-detail', kwargs={'pk': self.device1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(Device.objects.count(), 3)
         device1 = Device.objects.get(pk=response.data['id'])
         self.assertEqual(device1.device_type_id, data['device_type'])
@@ -1304,11 +1305,11 @@ class DeviceTest(APITestCase):
         url = reverse('dcim-api:device-detail', kwargs={'pk': self.device1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(Device.objects.count(), 2)
 
 
-class ConsolePortTest(APITestCase):
+class ConsolePortTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -1355,7 +1356,7 @@ class ConsolePortTest(APITestCase):
         url = reverse('dcim-api:consoleport-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -1374,7 +1375,7 @@ class ConsolePortTest(APITestCase):
         url = reverse('dcim-api:consoleport-detail', kwargs={'pk': self.consoleport1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -1385,11 +1386,11 @@ class ConsolePortTest(APITestCase):
         url = reverse('dcim-api:consoleport-detail', kwargs={'pk': self.consoleport1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(ConsolePort.objects.count(), 2)
 
 
-class ConsoleServerPortTest(APITestCase):
+class ConsoleServerPortTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -1436,7 +1437,7 @@ class ConsoleServerPortTest(APITestCase):
         url = reverse('dcim-api:consoleserverport-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -1452,7 +1453,7 @@ class ConsoleServerPortTest(APITestCase):
         url = reverse('dcim-api:consoleserverport-detail', kwargs={'pk': self.consoleserverport1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -1462,11 +1463,11 @@ class ConsoleServerPortTest(APITestCase):
         url = reverse('dcim-api:consoleserverport-detail', kwargs={'pk': self.consoleserverport1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(ConsoleServerPort.objects.count(), 2)
 
 
-class PowerPortTest(APITestCase):
+class PowerPortTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -1513,7 +1514,7 @@ class PowerPortTest(APITestCase):
         url = reverse('dcim-api:powerport-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -1532,7 +1533,7 @@ class PowerPortTest(APITestCase):
         url = reverse('dcim-api:powerport-detail', kwargs={'pk': self.powerport1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -1543,11 +1544,11 @@ class PowerPortTest(APITestCase):
         url = reverse('dcim-api:powerport-detail', kwargs={'pk': self.powerport1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(PowerPort.objects.count(), 2)
 
 
-class PowerOutletTest(APITestCase):
+class PowerOutletTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -1594,7 +1595,7 @@ class PowerOutletTest(APITestCase):
         url = reverse('dcim-api:poweroutlet-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -1610,7 +1611,7 @@ class PowerOutletTest(APITestCase):
         url = reverse('dcim-api:poweroutlet-detail', kwargs={'pk': self.poweroutlet1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -1620,11 +1621,11 @@ class PowerOutletTest(APITestCase):
         url = reverse('dcim-api:poweroutlet-detail', kwargs={'pk': self.poweroutlet1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(PowerOutlet.objects.count(), 2)
 
 
-class InterfaceTest(APITestCase):
+class InterfaceTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -1671,7 +1672,7 @@ class InterfaceTest(APITestCase):
         url = reverse('dcim-api:interface-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -1692,7 +1693,7 @@ class InterfaceTest(APITestCase):
         url = reverse('dcim-api:interface-detail', kwargs={'pk': self.interface1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -1703,11 +1704,11 @@ class InterfaceTest(APITestCase):
         url = reverse('dcim-api:interface-detail', kwargs={'pk': self.interface1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(Interface.objects.count(), 2)
 
 
-class DeviceBayTest(APITestCase):
+class DeviceBayTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -1763,7 +1764,7 @@ class DeviceBayTest(APITestCase):
         url = reverse('dcim-api:devicebay-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        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'])
@@ -1781,7 +1782,7 @@ class DeviceBayTest(APITestCase):
         url = reverse('dcim-api:devicebay-detail', kwargs={'pk': self.devicebay1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        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'])
@@ -1792,11 +1793,11 @@ class DeviceBayTest(APITestCase):
         url = reverse('dcim-api:devicebay-detail', kwargs={'pk': self.devicebay1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(DeviceBay.objects.count(), 2)
 
 
-class ModuleTest(APITestCase):
+class ModuleTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -1845,7 +1846,7 @@ class ModuleTest(APITestCase):
         url = reverse('dcim-api:module-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(Module.objects.count(), 4)
         module4 = Module.objects.get(pk=response.data['id'])
         self.assertEqual(module4.device_id, data['device'])
@@ -1865,7 +1866,7 @@ class ModuleTest(APITestCase):
         url = reverse('dcim-api:module-detail', kwargs={'pk': self.module1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(Module.objects.count(), 3)
         module1 = Module.objects.get(pk=response.data['id'])
         self.assertEqual(module1.device_id, data['device'])
@@ -1878,11 +1879,11 @@ class ModuleTest(APITestCase):
         url = reverse('dcim-api:module-detail', kwargs={'pk': self.module1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(Module.objects.count(), 2)
 
 
-class InterfaceConnectionTest(APITestCase):
+class InterfaceConnectionTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -1944,7 +1945,7 @@ class InterfaceConnectionTest(APITestCase):
         url = reverse('dcim-api:interfaceconnection-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(InterfaceConnection.objects.count(), 4)
         interfaceconnection4 = InterfaceConnection.objects.get(pk=response.data['id'])
         self.assertEqual(interfaceconnection4.interface_a_id, data['interface_a'])
@@ -1963,7 +1964,7 @@ class InterfaceConnectionTest(APITestCase):
         url = reverse('dcim-api:interfaceconnection-detail', kwargs={'pk': self.interfaceconnection1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(InterfaceConnection.objects.count(), 3)
         interfaceconnection1 = InterfaceConnection.objects.get(pk=response.data['id'])
         self.assertEqual(interfaceconnection1.interface_a_id, data['interface_a'])
@@ -1975,5 +1976,5 @@ class InterfaceConnectionTest(APITestCase):
         url = reverse('dcim-api:interfaceconnection-detail', kwargs={'pk': self.interfaceconnection1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(InterfaceConnection.objects.count(), 2)

+ 37 - 36
netbox/ipam/tests/test_api.py

@@ -11,9 +11,10 @@ from ipam.models import (
     Aggregate, IPAddress, IP_PROTOCOL_TCP, IP_PROTOCOL_UDP, Prefix, RIR, Role, Service, VLAN, VLANGroup, VRF,
 )
 from users.models import Token
+from utilities.tests import HttpStatusMixin
 
 
-class VRFTest(APITestCase):
+class VRFTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -49,7 +50,7 @@ class VRFTest(APITestCase):
         url = reverse('ipam-api:vrf-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(VRF.objects.count(), 4)
         vrf4 = VRF.objects.get(pk=response.data['id'])
         self.assertEqual(vrf4.name, data['name'])
@@ -65,7 +66,7 @@ class VRFTest(APITestCase):
         url = reverse('ipam-api:vrf-detail', kwargs={'pk': self.vrf1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(VRF.objects.count(), 3)
         vrf1 = VRF.objects.get(pk=response.data['id'])
         self.assertEqual(vrf1.name, data['name'])
@@ -76,11 +77,11 @@ class VRFTest(APITestCase):
         url = reverse('ipam-api:vrf-detail', kwargs={'pk': self.vrf1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(VRF.objects.count(), 2)
 
 
-class RIRTest(APITestCase):
+class RIRTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -116,7 +117,7 @@ class RIRTest(APITestCase):
         url = reverse('ipam-api:rir-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(RIR.objects.count(), 4)
         rir4 = RIR.objects.get(pk=response.data['id'])
         self.assertEqual(rir4.name, data['name'])
@@ -132,7 +133,7 @@ class RIRTest(APITestCase):
         url = reverse('ipam-api:rir-detail', kwargs={'pk': self.rir1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(RIR.objects.count(), 3)
         rir1 = RIR.objects.get(pk=response.data['id'])
         self.assertEqual(rir1.name, data['name'])
@@ -143,11 +144,11 @@ class RIRTest(APITestCase):
         url = reverse('ipam-api:rir-detail', kwargs={'pk': self.rir1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(RIR.objects.count(), 2)
 
 
-class AggregateTest(APITestCase):
+class AggregateTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -185,7 +186,7 @@ class AggregateTest(APITestCase):
         url = reverse('ipam-api:aggregate-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(Aggregate.objects.count(), 4)
         aggregate4 = Aggregate.objects.get(pk=response.data['id'])
         self.assertEqual(str(aggregate4.prefix), data['prefix'])
@@ -201,7 +202,7 @@ class AggregateTest(APITestCase):
         url = reverse('ipam-api:aggregate-detail', kwargs={'pk': self.aggregate1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(Aggregate.objects.count(), 3)
         aggregate1 = Aggregate.objects.get(pk=response.data['id'])
         self.assertEqual(str(aggregate1.prefix), data['prefix'])
@@ -212,11 +213,11 @@ class AggregateTest(APITestCase):
         url = reverse('ipam-api:aggregate-detail', kwargs={'pk': self.aggregate1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(Aggregate.objects.count(), 2)
 
 
-class RoleTest(APITestCase):
+class RoleTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -252,7 +253,7 @@ class RoleTest(APITestCase):
         url = reverse('ipam-api:role-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(Role.objects.count(), 4)
         role4 = Role.objects.get(pk=response.data['id'])
         self.assertEqual(role4.name, data['name'])
@@ -268,7 +269,7 @@ class RoleTest(APITestCase):
         url = reverse('ipam-api:role-detail', kwargs={'pk': self.role1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(Role.objects.count(), 3)
         role1 = Role.objects.get(pk=response.data['id'])
         self.assertEqual(role1.name, data['name'])
@@ -279,11 +280,11 @@ class RoleTest(APITestCase):
         url = reverse('ipam-api:role-detail', kwargs={'pk': self.role1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(Role.objects.count(), 2)
 
 
-class PrefixTest(APITestCase):
+class PrefixTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -326,7 +327,7 @@ class PrefixTest(APITestCase):
         url = reverse('ipam-api:prefix-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(Prefix.objects.count(), 4)
         prefix4 = Prefix.objects.get(pk=response.data['id'])
         self.assertEqual(str(prefix4.prefix), data['prefix'])
@@ -348,7 +349,7 @@ class PrefixTest(APITestCase):
         url = reverse('ipam-api:prefix-detail', kwargs={'pk': self.prefix1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(Prefix.objects.count(), 3)
         prefix1 = Prefix.objects.get(pk=response.data['id'])
         self.assertEqual(str(prefix1.prefix), data['prefix'])
@@ -362,11 +363,11 @@ class PrefixTest(APITestCase):
         url = reverse('ipam-api:prefix-detail', kwargs={'pk': self.prefix1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(Prefix.objects.count(), 2)
 
 
-class IPAddressTest(APITestCase):
+class IPAddressTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -403,7 +404,7 @@ class IPAddressTest(APITestCase):
         url = reverse('ipam-api:ipaddress-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(IPAddress.objects.count(), 4)
         ipaddress4 = IPAddress.objects.get(pk=response.data['id'])
         self.assertEqual(str(ipaddress4.address), data['address'])
@@ -419,7 +420,7 @@ class IPAddressTest(APITestCase):
         url = reverse('ipam-api:ipaddress-detail', kwargs={'pk': self.ipaddress1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(IPAddress.objects.count(), 3)
         ipaddress1 = IPAddress.objects.get(pk=response.data['id'])
         self.assertEqual(str(ipaddress1.address), data['address'])
@@ -430,11 +431,11 @@ class IPAddressTest(APITestCase):
         url = reverse('ipam-api:ipaddress-detail', kwargs={'pk': self.ipaddress1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(IPAddress.objects.count(), 2)
 
 
-class VLANGroupTest(APITestCase):
+class VLANGroupTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -470,7 +471,7 @@ class VLANGroupTest(APITestCase):
         url = reverse('ipam-api:vlangroup-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(VLANGroup.objects.count(), 4)
         vlangroup4 = VLANGroup.objects.get(pk=response.data['id'])
         self.assertEqual(vlangroup4.name, data['name'])
@@ -486,7 +487,7 @@ class VLANGroupTest(APITestCase):
         url = reverse('ipam-api:vlangroup-detail', kwargs={'pk': self.vlangroup1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(VLANGroup.objects.count(), 3)
         vlangroup1 = VLANGroup.objects.get(pk=response.data['id'])
         self.assertEqual(vlangroup1.name, data['name'])
@@ -497,11 +498,11 @@ class VLANGroupTest(APITestCase):
         url = reverse('ipam-api:vlangroup-detail', kwargs={'pk': self.vlangroup1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(VLANGroup.objects.count(), 2)
 
 
-class VLANTest(APITestCase):
+class VLANTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -537,7 +538,7 @@ class VLANTest(APITestCase):
         url = reverse('ipam-api:vlan-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(VLAN.objects.count(), 4)
         vlan4 = VLAN.objects.get(pk=response.data['id'])
         self.assertEqual(vlan4.vid, data['vid'])
@@ -553,7 +554,7 @@ class VLANTest(APITestCase):
         url = reverse('ipam-api:vlan-detail', kwargs={'pk': self.vlan1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(VLAN.objects.count(), 3)
         vlan1 = VLAN.objects.get(pk=response.data['id'])
         self.assertEqual(vlan1.vid, data['vid'])
@@ -564,11 +565,11 @@ class VLANTest(APITestCase):
         url = reverse('ipam-api:vlan-detail', kwargs={'pk': self.vlan1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(VLAN.objects.count(), 2)
 
 
-class ServiceTest(APITestCase):
+class ServiceTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -622,7 +623,7 @@ class ServiceTest(APITestCase):
         url = reverse('ipam-api:service-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(Service.objects.count(), 4)
         service4 = Service.objects.get(pk=response.data['id'])
         self.assertEqual(service4.device_id, data['device'])
@@ -642,7 +643,7 @@ class ServiceTest(APITestCase):
         url = reverse('ipam-api:service-detail', kwargs={'pk': self.service1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(Service.objects.count(), 3)
         service1 = Service.objects.get(pk=response.data['id'])
         self.assertEqual(service1.device_id, data['device'])
@@ -655,5 +656,5 @@ class ServiceTest(APITestCase):
         url = reverse('ipam-api:service-detail', kwargs={'pk': self.service1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(Service.objects.count(), 2)

+ 9 - 8
netbox/secrets/tests/test_api.py

@@ -8,6 +8,7 @@ from django.urls import reverse
 from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Site
 from secrets.models import Secret, SecretRole, SessionKey, UserKey
 from users.models import Token
+from utilities.tests import HttpStatusMixin
 
 
 # Dummy RSA key pair for testing use only
@@ -50,7 +51,7 @@ qQIDAQAB
 -----END PUBLIC KEY-----"""
 
 
-class SecretRoleTest(APITestCase):
+class SecretRoleTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -86,7 +87,7 @@ class SecretRoleTest(APITestCase):
         url = reverse('secrets-api:secretrole-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(SecretRole.objects.count(), 4)
         secretrole4 = SecretRole.objects.get(pk=response.data['id'])
         self.assertEqual(secretrole4.name, data['name'])
@@ -102,7 +103,7 @@ class SecretRoleTest(APITestCase):
         url = reverse('secrets-api:secretrole-detail', kwargs={'pk': self.secretrole1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(SecretRole.objects.count(), 3)
         secretrole1 = SecretRole.objects.get(pk=response.data['id'])
         self.assertEqual(secretrole1.name, data['name'])
@@ -113,11 +114,11 @@ class SecretRoleTest(APITestCase):
         url = reverse('secrets-api:secretrole-detail', kwargs={'pk': self.secretrole1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(SecretRole.objects.count(), 2)
 
 
-class SecretTest(APITestCase):
+class SecretTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -191,7 +192,7 @@ class SecretTest(APITestCase):
         url = reverse('secrets-api:secret-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED, response.data)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(response.data['plaintext'], data['plaintext'])
         self.assertEqual(Secret.objects.count(), 4)
         secret4 = Secret.objects.get(pk=response.data['id'])
@@ -210,7 +211,7 @@ class SecretTest(APITestCase):
         url = reverse('secrets-api:secret-detail', kwargs={'pk': self.secret1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK, response.data)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(response.data['plaintext'], data['plaintext'])
         self.assertEqual(Secret.objects.count(), 3)
         secret1 = Secret.objects.get(pk=response.data['id'])
@@ -223,5 +224,5 @@ class SecretTest(APITestCase):
         url = reverse('secrets-api:secret-detail', kwargs={'pk': self.secret1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(Secret.objects.count(), 2)

+ 9 - 8
netbox/tenancy/tests/test_api.py

@@ -6,9 +6,10 @@ from django.urls import reverse
 
 from tenancy.models import Tenant, TenantGroup
 from users.models import Token
+from utilities.tests import HttpStatusMixin
 
 
-class TenantGroupTest(APITestCase):
+class TenantGroupTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -44,7 +45,7 @@ class TenantGroupTest(APITestCase):
         url = reverse('tenancy-api:tenantgroup-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(TenantGroup.objects.count(), 4)
         tenantgroup4 = TenantGroup.objects.get(pk=response.data['id'])
         self.assertEqual(tenantgroup4.name, data['name'])
@@ -60,7 +61,7 @@ class TenantGroupTest(APITestCase):
         url = reverse('tenancy-api:tenantgroup-detail', kwargs={'pk': self.tenantgroup1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(TenantGroup.objects.count(), 3)
         tenantgroup1 = TenantGroup.objects.get(pk=response.data['id'])
         self.assertEqual(tenantgroup1.name, data['name'])
@@ -71,11 +72,11 @@ class TenantGroupTest(APITestCase):
         url = reverse('tenancy-api:tenantgroup-detail', kwargs={'pk': self.tenantgroup1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(TenantGroup.objects.count(), 2)
 
 
-class TenantTest(APITestCase):
+class TenantTest(HttpStatusMixin, APITestCase):
 
     def setUp(self):
 
@@ -114,7 +115,7 @@ class TenantTest(APITestCase):
         url = reverse('tenancy-api:tenant-list')
         response = self.client.post(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
         self.assertEqual(Tenant.objects.count(), 4)
         tenant4 = Tenant.objects.get(pk=response.data['id'])
         self.assertEqual(tenant4.name, data['name'])
@@ -132,7 +133,7 @@ class TenantTest(APITestCase):
         url = reverse('tenancy-api:tenant-detail', kwargs={'pk': self.tenant1.pk})
         response = self.client.put(url, data, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertHttpStatus(response, status.HTTP_200_OK)
         self.assertEqual(Tenant.objects.count(), 3)
         tenant1 = Tenant.objects.get(pk=response.data['id'])
         self.assertEqual(tenant1.name, data['name'])
@@ -144,5 +145,5 @@ class TenantTest(APITestCase):
         url = reverse('tenancy-api:tenant-detail', kwargs={'pk': self.tenant1.pk})
         response = self.client.delete(url, **self.header)
 
-        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+        self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
         self.assertEqual(Tenant.objects.count(), 2)

+ 10 - 0
netbox/utilities/tests.py

@@ -0,0 +1,10 @@
+class HttpStatusMixin(object):
+    """
+    Custom mixin to provide more detail in the event of an unexpected HTTP response.
+    """
+
+    def assertHttpStatus(self, response, expected_status):
+        err_message = "Expected HTTP status {}; received {}: {}"
+        self.assertEqual(response.status_code, expected_status, err_message.format(
+            expected_status, response.status_code, response.data
+        ))