test_changelog.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. from django.contrib.contenttypes.models import ContentType
  2. from django.urls import reverse
  3. from rest_framework import status
  4. from dcim.models import Site
  5. from extras.choices import *
  6. from extras.models import CustomField, CustomFieldValue, ObjectChange
  7. from utilities.testing import APITestCase
  8. class ChangeLogTest(APITestCase):
  9. def setUp(self):
  10. super().setUp()
  11. # Create a custom field on the Site model
  12. ct = ContentType.objects.get_for_model(Site)
  13. cf = CustomField(
  14. type=CustomFieldTypeChoices.TYPE_TEXT,
  15. name='my_field',
  16. required=False
  17. )
  18. cf.save()
  19. cf.obj_type.set([ct])
  20. def test_create_object(self):
  21. data = {
  22. 'name': 'Test Site 1',
  23. 'slug': 'test-site-1',
  24. 'custom_fields': {
  25. 'my_field': 'ABC'
  26. },
  27. }
  28. self.assertEqual(ObjectChange.objects.count(), 0)
  29. url = reverse('dcim-api:site-list')
  30. self.add_permissions('dcim.add_site')
  31. response = self.client.post(url, data, format='json', **self.header)
  32. self.assertHttpStatus(response, status.HTTP_201_CREATED)
  33. site = Site.objects.get(pk=response.data['id'])
  34. oc = ObjectChange.objects.get(
  35. changed_object_type=ContentType.objects.get_for_model(Site),
  36. changed_object_id=site.pk
  37. )
  38. self.assertEqual(oc.changed_object, site)
  39. self.assertEqual(oc.action, ObjectChangeActionChoices.ACTION_CREATE)
  40. self.assertEqual(oc.object_data['custom_fields'], data['custom_fields'])
  41. def test_update_object(self):
  42. site = Site(name='Test Site 1', slug='test-site-1')
  43. site.save()
  44. data = {
  45. 'name': 'Test Site X',
  46. 'slug': 'test-site-x',
  47. 'custom_fields': {
  48. 'my_field': 'DEF'
  49. },
  50. }
  51. self.assertEqual(ObjectChange.objects.count(), 0)
  52. self.add_permissions('dcim.change_site')
  53. url = reverse('dcim-api:site-detail', kwargs={'pk': site.pk})
  54. response = self.client.put(url, data, format='json', **self.header)
  55. self.assertHttpStatus(response, status.HTTP_200_OK)
  56. site = Site.objects.get(pk=response.data['id'])
  57. oc = ObjectChange.objects.get(
  58. changed_object_type=ContentType.objects.get_for_model(Site),
  59. changed_object_id=site.pk
  60. )
  61. self.assertEqual(oc.changed_object, site)
  62. self.assertEqual(oc.action, ObjectChangeActionChoices.ACTION_UPDATE)
  63. self.assertEqual(oc.object_data['custom_fields'], data['custom_fields'])
  64. def test_delete_object(self):
  65. site = Site(
  66. name='Test Site 1',
  67. slug='test-site-1'
  68. )
  69. site.save()
  70. CustomFieldValue.objects.create(
  71. field=CustomField.objects.get(name='my_field'),
  72. obj=site,
  73. value='ABC'
  74. )
  75. self.assertEqual(ObjectChange.objects.count(), 0)
  76. self.add_permissions('dcim.delete_site')
  77. url = reverse('dcim-api:site-detail', kwargs={'pk': site.pk})
  78. response = self.client.delete(url, **self.header)
  79. self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT)
  80. self.assertEqual(Site.objects.count(), 0)
  81. oc = ObjectChange.objects.first()
  82. self.assertEqual(oc.changed_object, None)
  83. self.assertEqual(oc.object_repr, site.name)
  84. self.assertEqual(oc.action, ObjectChangeActionChoices.ACTION_DELETE)
  85. self.assertEqual(oc.object_data['custom_fields'], {'my_field': 'ABC'})