Browse Source

Added bulk creation API tests

Jeremy Stretch 7 years ago
parent
commit
b27529d927

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

@@ -77,6 +77,32 @@ class ProviderTest(HttpStatusMixin, APITestCase):
         self.assertEqual(provider4.name, data['name'])
         self.assertEqual(provider4.slug, data['slug'])
 
+    def test_create_provider_bulk(self):
+
+        data = [
+            {
+                'name': 'Test Provider 4',
+                'slug': 'test-provider-4',
+            },
+            {
+                'name': 'Test Provider 5',
+                'slug': 'test-provider-5',
+            },
+            {
+                'name': 'Test Provider 6',
+                'slug': 'test-provider-6',
+            },
+        ]
+
+        url = reverse('circuits-api:provider-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(Provider.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_provider(self):
 
         data = {
@@ -217,6 +243,35 @@ class CircuitTest(HttpStatusMixin, APITestCase):
         self.assertEqual(circuit4.provider_id, data['provider'])
         self.assertEqual(circuit4.type_id, data['type'])
 
+    def test_create_circuit_bulk(self):
+
+        data = [
+            {
+                'cid': 'TEST0004',
+                'provider': self.provider1.pk,
+                'type': self.circuittype1.pk,
+            },
+            {
+                'cid': 'TEST0005',
+                'provider': self.provider1.pk,
+                'type': self.circuittype1.pk,
+            },
+            {
+                'cid': 'TEST0006',
+                'provider': self.provider1.pk,
+                'type': self.circuittype1.pk,
+            },
+        ]
+
+        url = reverse('circuits-api:circuit-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(Circuit.objects.count(), 6)
+        self.assertEqual(response.data[0]['cid'], data[0]['cid'])
+        self.assertEqual(response.data[1]['cid'], data[1]['cid'])
+        self.assertEqual(response.data[2]['cid'], data[2]['cid'])
+
     def test_update_circuit(self):
 
         data = {

File diff suppressed because it is too large
+ 763 - 9
netbox/dcim/tests/test_api.py


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

@@ -63,6 +63,35 @@ class GraphTest(HttpStatusMixin, APITestCase):
         self.assertEqual(graph4.name, data['name'])
         self.assertEqual(graph4.source, data['source'])
 
+    def test_create_graph_bulk(self):
+
+        data = [
+            {
+                'type': GRAPH_TYPE_SITE,
+                'name': 'Test Graph 4',
+                'source': 'http://example.com/graphs.py?site={{ obj.name }}&foo=4',
+            },
+            {
+                'type': GRAPH_TYPE_SITE,
+                'name': 'Test Graph 5',
+                'source': 'http://example.com/graphs.py?site={{ obj.name }}&foo=5',
+            },
+            {
+                'type': GRAPH_TYPE_SITE,
+                'name': 'Test Graph 6',
+                'source': 'http://example.com/graphs.py?site={{ obj.name }}&foo=6',
+            },
+        ]
+
+        url = reverse('extras-api:graph-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(Graph.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_graph(self):
 
         data = {
@@ -144,6 +173,35 @@ class ExportTemplateTest(HttpStatusMixin, APITestCase):
         self.assertEqual(exporttemplate4.name, data['name'])
         self.assertEqual(exporttemplate4.template_code, data['template_code'])
 
+    def test_create_exporttemplate_bulk(self):
+
+        data = [
+            {
+                'content_type': self.content_type.pk,
+                'name': 'Test Export Template 4',
+                'template_code': '{% for obj in queryset %}{{ obj.name }}\n{% endfor %}',
+            },
+            {
+                'content_type': self.content_type.pk,
+                'name': 'Test Export Template 5',
+                'template_code': '{% for obj in queryset %}{{ obj.name }}\n{% endfor %}',
+            },
+            {
+                'content_type': self.content_type.pk,
+                'name': 'Test Export Template 6',
+                'template_code': '{% for obj in queryset %}{{ obj.name }}\n{% endfor %}',
+            },
+        ]
+
+        url = reverse('extras-api:exporttemplate-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(ExportTemplate.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_exporttemplate(self):
 
         data = {

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

@@ -55,6 +55,32 @@ class VRFTest(HttpStatusMixin, APITestCase):
         self.assertEqual(vrf4.name, data['name'])
         self.assertEqual(vrf4.rd, data['rd'])
 
+    def test_create_vrf_bulk(self):
+
+        data = [
+            {
+                'name': 'Test VRF 4',
+                'rd': '65000:4',
+            },
+            {
+                'name': 'Test VRF 5',
+                'rd': '65000:5',
+            },
+            {
+                'name': 'Test VRF 6',
+                'rd': '65000:6',
+            },
+        ]
+
+        url = reverse('ipam-api:vrf-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(VRF.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_vrf(self):
 
         data = {
@@ -122,6 +148,32 @@ class RIRTest(HttpStatusMixin, APITestCase):
         self.assertEqual(rir4.name, data['name'])
         self.assertEqual(rir4.slug, data['slug'])
 
+    def test_create_rir_bulk(self):
+
+        data = [
+            {
+                'name': 'Test RIR 4',
+                'slug': 'test-rir-4',
+            },
+            {
+                'name': 'Test RIR 5',
+                'slug': 'test-rir-5',
+            },
+            {
+                'name': 'Test RIR 6',
+                'slug': 'test-rir-6',
+            },
+        ]
+
+        url = reverse('ipam-api:rir-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(RIR.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_rir(self):
 
         data = {
@@ -191,6 +243,32 @@ class AggregateTest(HttpStatusMixin, APITestCase):
         self.assertEqual(str(aggregate4.prefix), data['prefix'])
         self.assertEqual(aggregate4.rir_id, data['rir'])
 
+    def test_create_aggregate_bulk(self):
+
+        data = [
+            {
+                'prefix': '100.0.0.0/8',
+                'rir': self.rir1.pk,
+            },
+            {
+                'prefix': '101.0.0.0/8',
+                'rir': self.rir1.pk,
+            },
+            {
+                'prefix': '102.0.0.0/8',
+                'rir': self.rir1.pk,
+            },
+        ]
+
+        url = reverse('ipam-api:aggregate-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(Aggregate.objects.count(), 6)
+        self.assertEqual(response.data[0]['prefix'], data[0]['prefix'])
+        self.assertEqual(response.data[1]['prefix'], data[1]['prefix'])
+        self.assertEqual(response.data[2]['prefix'], data[2]['prefix'])
+
     def test_update_aggregate(self):
 
         data = {
@@ -258,6 +336,32 @@ class RoleTest(HttpStatusMixin, APITestCase):
         self.assertEqual(role4.name, data['name'])
         self.assertEqual(role4.slug, data['slug'])
 
+    def test_create_role_bulk(self):
+
+        data = [
+            {
+                'name': 'Test Role 4',
+                'slug': 'test-role-4',
+            },
+            {
+                'name': 'Test Role 5',
+                'slug': 'test-role-5',
+            },
+            {
+                'name': 'Test Role 6',
+                'slug': 'test-role-6',
+            },
+        ]
+
+        url = reverse('ipam-api:role-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(Role.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_role(self):
 
         data = {
@@ -335,6 +439,29 @@ class PrefixTest(HttpStatusMixin, APITestCase):
         self.assertEqual(prefix4.vlan_id, data['vlan'])
         self.assertEqual(prefix4.role_id, data['role'])
 
+    def test_create_prefix_bulk(self):
+
+        data = [
+            {
+                'prefix': '10.0.1.0/24',
+            },
+            {
+                'prefix': '10.0.2.0/24',
+            },
+            {
+                'prefix': '10.0.3.0/24',
+            },
+        ]
+
+        url = reverse('ipam-api:prefix-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(Prefix.objects.count(), 6)
+        self.assertEqual(response.data[0]['prefix'], data[0]['prefix'])
+        self.assertEqual(response.data[1]['prefix'], data[1]['prefix'])
+        self.assertEqual(response.data[2]['prefix'], data[2]['prefix'])
+
     def test_update_prefix(self):
 
         data = {
@@ -530,6 +657,29 @@ class IPAddressTest(HttpStatusMixin, APITestCase):
         self.assertEqual(str(ipaddress4.address), data['address'])
         self.assertEqual(ipaddress4.vrf_id, data['vrf'])
 
+    def test_create_ipaddress_bulk(self):
+
+        data = [
+            {
+                'address': '192.168.0.4/24',
+            },
+            {
+                'address': '192.168.0.5/24',
+            },
+            {
+                'address': '192.168.0.6/24',
+            },
+        ]
+
+        url = reverse('ipam-api:ipaddress-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(IPAddress.objects.count(), 6)
+        self.assertEqual(response.data[0]['address'], data[0]['address'])
+        self.assertEqual(response.data[1]['address'], data[1]['address'])
+        self.assertEqual(response.data[2]['address'], data[2]['address'])
+
     def test_update_ipaddress(self):
 
         data = {
@@ -597,6 +747,32 @@ class VLANGroupTest(HttpStatusMixin, APITestCase):
         self.assertEqual(vlangroup4.name, data['name'])
         self.assertEqual(vlangroup4.slug, data['slug'])
 
+    def test_create_vlangroup_bulk(self):
+
+        data = [
+            {
+                'name': 'Test VLAN Group 4',
+                'slug': 'test-vlan-group-4',
+            },
+            {
+                'name': 'Test VLAN Group 5',
+                'slug': 'test-vlan-group-5',
+            },
+            {
+                'name': 'Test VLAN Group 6',
+                'slug': 'test-vlan-group-6',
+            },
+        ]
+
+        url = reverse('ipam-api:vlangroup-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(VLANGroup.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_vlangroup(self):
 
         data = {
@@ -664,6 +840,32 @@ class VLANTest(HttpStatusMixin, APITestCase):
         self.assertEqual(vlan4.vid, data['vid'])
         self.assertEqual(vlan4.name, data['name'])
 
+    def test_create_vlan_bulk(self):
+
+        data = [
+            {
+                'vid': 4,
+                'name': 'Test VLAN 4',
+            },
+            {
+                'vid': 5,
+                'name': 'Test VLAN 5',
+            },
+            {
+                'vid': 6,
+                'name': 'Test VLAN 6',
+            },
+        ]
+
+        url = reverse('ipam-api:vlan-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(VLAN.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_vlan(self):
 
         data = {
@@ -751,6 +953,38 @@ class ServiceTest(HttpStatusMixin, APITestCase):
         self.assertEqual(service4.protocol, data['protocol'])
         self.assertEqual(service4.port, data['port'])
 
+    def test_create_service_bulk(self):
+
+        data = [
+            {
+                'device': self.device1.pk,
+                'name': 'Test Service 4',
+                'protocol': IP_PROTOCOL_TCP,
+                'port': 4,
+            },
+            {
+                'device': self.device1.pk,
+                'name': 'Test Service 5',
+                'protocol': IP_PROTOCOL_TCP,
+                'port': 5,
+            },
+            {
+                'device': self.device1.pk,
+                'name': 'Test Service 6',
+                'protocol': IP_PROTOCOL_TCP,
+                'port': 6,
+            },
+        ]
+
+        url = reverse('ipam-api:service-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(Service.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_service(self):
 
         data = {

+ 57 - 2
netbox/secrets/tests/test_api.py

@@ -81,8 +81,8 @@ class SecretRoleTest(HttpStatusMixin, APITestCase):
     def test_create_secretrole(self):
 
         data = {
-            'name': 'Test SecretRole 4',
-            'slug': 'test-secretrole-4',
+            'name': 'Test Secret Role 4',
+            'slug': 'test-secret-role-4',
         }
 
         url = reverse('secrets-api:secretrole-list')
@@ -94,6 +94,32 @@ class SecretRoleTest(HttpStatusMixin, APITestCase):
         self.assertEqual(secretrole4.name, data['name'])
         self.assertEqual(secretrole4.slug, data['slug'])
 
+    def test_create_secretrole_bulk(self):
+
+        data = [
+            {
+                'name': 'Test Secret Role 4',
+                'slug': 'test-secret-role-4',
+            },
+            {
+                'name': 'Test Secret Role 5',
+                'slug': 'test-secret-role-5',
+            },
+            {
+                'name': 'Test Secret Role 6',
+                'slug': 'test-secret-role-6',
+            },
+        ]
+
+        url = reverse('secrets-api:secretrole-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(SecretRole.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_secretrole(self):
 
         data = {
@@ -201,6 +227,35 @@ class SecretTest(HttpStatusMixin, APITestCase):
         self.assertEqual(secret4.role_id, data['role'])
         self.assertEqual(secret4.plaintext, data['plaintext'])
 
+    def test_create_secret_bulk(self):
+
+        data = [
+            {
+                'device': self.device.pk,
+                'role': self.secretrole1.pk,
+                'plaintext': 'Secret #4 Plaintext',
+            },
+            {
+                'device': self.device.pk,
+                'role': self.secretrole1.pk,
+                'plaintext': 'Secret #5 Plaintext',
+            },
+            {
+                'device': self.device.pk,
+                'role': self.secretrole1.pk,
+                'plaintext': 'Secret #6 Plaintext',
+            },
+        ]
+
+        url = reverse('secrets-api:secret-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(Secret.objects.count(), 6)
+        self.assertEqual(response.data[0]['plaintext'], data[0]['plaintext'])
+        self.assertEqual(response.data[1]['plaintext'], data[1]['plaintext'])
+        self.assertEqual(response.data[2]['plaintext'], data[2]['plaintext'])
+
     def test_update_secret(self):
 
         data = {

+ 52 - 0
netbox/tenancy/tests/test_api.py

@@ -52,6 +52,32 @@ class TenantGroupTest(HttpStatusMixin, APITestCase):
         self.assertEqual(tenantgroup4.name, data['name'])
         self.assertEqual(tenantgroup4.slug, data['slug'])
 
+    def test_create_tenantgroup_bulk(self):
+
+        data = [
+            {
+                'name': 'Test Tenant Group 4',
+                'slug': 'test-tenant-group-4',
+            },
+            {
+                'name': 'Test Tenant Group 5',
+                'slug': 'test-tenant-group-5',
+            },
+            {
+                'name': 'Test Tenant Group 6',
+                'slug': 'test-tenant-group-6',
+            },
+        ]
+
+        url = reverse('tenancy-api:tenantgroup-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(TenantGroup.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_tenantgroup(self):
 
         data = {
@@ -123,6 +149,32 @@ class TenantTest(HttpStatusMixin, APITestCase):
         self.assertEqual(tenant4.slug, data['slug'])
         self.assertEqual(tenant4.group_id, data['group'])
 
+    def test_create_tenant_bulk(self):
+
+        data = [
+            {
+                'name': 'Test Tenant 4',
+                'slug': 'test-tenant-4',
+            },
+            {
+                'name': 'Test Tenant 5',
+                'slug': 'test-tenant-5',
+            },
+            {
+                'name': 'Test Tenant 6',
+                'slug': 'test-tenant-6',
+            },
+        ]
+
+        url = reverse('tenancy-api:tenant-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(Tenant.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_tenant(self):
 
         data = {

+ 112 - 5
netbox/virtualization/tests/test_api.py

@@ -52,6 +52,32 @@ class ClusterTypeTest(HttpStatusMixin, APITestCase):
         self.assertEqual(clustertype4.name, data['name'])
         self.assertEqual(clustertype4.slug, data['slug'])
 
+    def test_create_clustertype_bulk(self):
+
+        data = [
+            {
+                'name': 'Test Cluster Type 4',
+                'slug': 'test-cluster-type-4',
+            },
+            {
+                'name': 'Test Cluster Type 5',
+                'slug': 'test-cluster-type-5',
+            },
+            {
+                'name': 'Test Cluster Type 6',
+                'slug': 'test-cluster-type-6',
+            },
+        ]
+
+        url = reverse('virtualization-api:clustertype-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(ClusterType.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_clustertype(self):
 
         data = {
@@ -119,6 +145,32 @@ class ClusterGroupTest(HttpStatusMixin, APITestCase):
         self.assertEqual(clustergroup4.name, data['name'])
         self.assertEqual(clustergroup4.slug, data['slug'])
 
+    def test_create_clustergroup_bulk(self):
+
+        data = [
+            {
+                'name': 'Test Cluster Group 4',
+                'slug': 'test-cluster-group-4',
+            },
+            {
+                'name': 'Test Cluster Group 5',
+                'slug': 'test-cluster-group-5',
+            },
+            {
+                'name': 'Test Cluster Group 6',
+                'slug': 'test-cluster-group-6',
+            },
+        ]
+
+        url = reverse('virtualization-api:clustergroup-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(ClusterGroup.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_clustergroup(self):
 
         data = {
@@ -191,6 +243,35 @@ class ClusterTest(HttpStatusMixin, APITestCase):
         self.assertEqual(cluster4.type.pk, data['type'])
         self.assertEqual(cluster4.group.pk, data['group'])
 
+    def test_create_cluster_bulk(self):
+
+        data = [
+            {
+                'name': 'Test Cluster 4',
+                'type': ClusterType.objects.first().pk,
+                'group': ClusterGroup.objects.first().pk,
+            },
+            {
+                'name': 'Test Cluster 5',
+                'type': ClusterType.objects.first().pk,
+                'group': ClusterGroup.objects.first().pk,
+            },
+            {
+                'name': 'Test Cluster 6',
+                'type': ClusterType.objects.first().pk,
+                'group': ClusterGroup.objects.first().pk,
+            },
+        ]
+
+        url = reverse('virtualization-api:cluster-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(Cluster.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_cluster(self):
 
         cluster_type2 = ClusterType.objects.create(name='Test Cluster Type 2', slug='test-cluster-type-2')
@@ -230,11 +311,11 @@ class VirtualMachineTest(HttpStatusMixin, APITestCase):
 
         cluster_type = ClusterType.objects.create(name='Test Cluster Type 1', slug='test-cluster-type-1')
         cluster_group = ClusterGroup.objects.create(name='Test Cluster Group 1', slug='test-cluster-group-1')
-        cluster = Cluster.objects.create(name='Test Cluster 1', type=cluster_type, group=cluster_group)
+        self.cluster1 = Cluster.objects.create(name='Test Cluster 1', type=cluster_type, group=cluster_group)
 
-        self.virtualmachine1 = VirtualMachine.objects.create(name='Test Virtual Machine 1', cluster=cluster)
-        self.virtualmachine2 = VirtualMachine.objects.create(name='Test Virtual Machine 2', cluster=cluster)
-        self.virtualmachine3 = VirtualMachine.objects.create(name='Test Virtual Machine 3', cluster=cluster)
+        self.virtualmachine1 = VirtualMachine.objects.create(name='Test Virtual Machine 1', cluster=self.cluster1)
+        self.virtualmachine2 = VirtualMachine.objects.create(name='Test Virtual Machine 2', cluster=self.cluster1)
+        self.virtualmachine3 = VirtualMachine.objects.create(name='Test Virtual Machine 3', cluster=self.cluster1)
 
     def test_get_virtualmachine(self):
 
@@ -254,7 +335,7 @@ class VirtualMachineTest(HttpStatusMixin, APITestCase):
 
         data = {
             'name': 'Test Virtual Machine 4',
-            'cluster': Cluster.objects.first().pk,
+            'cluster': self.cluster1.pk,
         }
 
         url = reverse('virtualization-api:virtualmachine-list')
@@ -266,6 +347,32 @@ class VirtualMachineTest(HttpStatusMixin, APITestCase):
         self.assertEqual(virtualmachine4.name, data['name'])
         self.assertEqual(virtualmachine4.cluster.pk, data['cluster'])
 
+    def test_create_virtualmachine_bulk(self):
+
+        data = [
+            {
+                'name': 'Test Virtual Machine 4',
+                'cluster': self.cluster1.pk,
+            },
+            {
+                'name': 'Test Virtual Machine 5',
+                'cluster': self.cluster1.pk,
+            },
+            {
+                'name': 'Test Virtual Machine 6',
+                'cluster': self.cluster1.pk,
+            },
+        ]
+
+        url = reverse('virtualization-api:virtualmachine-list')
+        response = self.client.post(url, data, format='json', **self.header)
+
+        self.assertHttpStatus(response, status.HTTP_201_CREATED)
+        self.assertEqual(VirtualMachine.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_virtualmachine(self):
 
         cluster2 = Cluster.objects.create(