From a10880753410abcbb788843037474a14b109a3e5 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 17 Apr 2019 10:54:50 -0400 Subject: [PATCH] Add tests for WritableNestedSerializer --- netbox/utilities/tests/test_api.py | 119 +++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 netbox/utilities/tests/test_api.py diff --git a/netbox/utilities/tests/test_api.py b/netbox/utilities/tests/test_api.py new file mode 100644 index 000000000..3ff4b3876 --- /dev/null +++ b/netbox/utilities/tests/test_api.py @@ -0,0 +1,119 @@ +from django.urls import reverse +from rest_framework import status + +from dcim.models import Region, Site +from ipam.models import VLAN +from utilities.testing import APITestCase + + +class WritableNestedSerializerTest(APITestCase): + """ + Test the operation of WritableNestedSerializer using VLANSerializer as our test subject. + """ + + def setUp(self): + + super().setUp() + + self.region_a = Region.objects.create(name='Region A', slug='region-a') + self.site1 = Site.objects.create(region=self.region_a, name='Site 1', slug='site-1') + self.site2 = Site.objects.create(region=self.region_a, name='Site 2', slug='site-2') + + def test_related_by_pk(self): + + data = { + 'vid': 100, + 'name': 'Test VLAN 100', + 'site': self.site1.pk, + } + + 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(response.data['site']['id'], self.site1.pk) + vlan = VLAN.objects.get(pk=response.data['id']) + self.assertEqual(vlan.site, self.site1) + + def test_related_by_pk_no_match(self): + + data = { + 'vid': 100, + 'name': 'Test VLAN 100', + 'site': 999, + } + + url = reverse('ipam-api:vlan-list') + response = self.client.post(url, data, format='json', **self.header) + + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + self.assertEqual(VLAN.objects.count(), 0) + self.assertTrue(response.data['site'][0].startswith("Related object not found")) + + def test_related_by_attributes(self): + + data = { + 'vid': 100, + 'name': 'Test VLAN 100', + 'site': { + 'name': 'Site 1' + }, + } + + 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(response.data['site']['id'], self.site1.pk) + vlan = VLAN.objects.get(pk=response.data['id']) + self.assertEqual(vlan.site, self.site1) + + def test_related_by_attributes_no_match(self): + + data = { + 'vid': 100, + 'name': 'Test VLAN 100', + 'site': { + 'name': 'Site X' + }, + } + + url = reverse('ipam-api:vlan-list') + response = self.client.post(url, data, format='json', **self.header) + + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + self.assertEqual(VLAN.objects.count(), 0) + self.assertTrue(response.data['site'][0].startswith("Related object not found")) + + def test_related_by_attributes_multiple_matches(self): + + data = { + 'vid': 100, + 'name': 'Test VLAN 100', + 'site': { + 'region': { + "name": "Region A", + }, + }, + } + + url = reverse('ipam-api:vlan-list') + response = self.client.post(url, data, format='json', **self.header) + + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + self.assertEqual(VLAN.objects.count(), 0) + self.assertTrue(response.data['site'][0].startswith("Multiple objects match")) + + def test_related_by_invalid(self): + + data = { + 'vid': 100, + 'name': 'Test VLAN 100', + 'site': 'XXX', + } + + url = reverse('ipam-api:vlan-list') + response = self.client.post(url, data, format='json', **self.header) + + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + self.assertEqual(VLAN.objects.count(), 0)