test_api.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. from django.contrib.auth.models import Group, User
  2. from django.contrib.contenttypes.models import ContentType
  3. from django.test import override_settings
  4. from django.urls import reverse
  5. from rest_framework import status
  6. from users.models import ObjectPermission
  7. from utilities.testing import APIViewTestCases, APITestCase, disable_warnings
  8. class AppTest(APITestCase):
  9. def test_root(self):
  10. url = reverse('users-api:api-root')
  11. response = self.client.get('{}?format=api'.format(url), **self.header)
  12. self.assertEqual(response.status_code, 200)
  13. class UserTest(APIViewTestCases.APIViewTestCase):
  14. model = User
  15. view_namespace = 'users'
  16. brief_fields = ['id', 'url', 'username']
  17. create_data = [
  18. {
  19. 'username': 'User_4',
  20. },
  21. {
  22. 'username': 'User_5',
  23. },
  24. {
  25. 'username': 'User_6',
  26. },
  27. ]
  28. @classmethod
  29. def setUpTestData(cls):
  30. users = (
  31. User(username='User_1'),
  32. User(username='User_2'),
  33. User(username='User_3'),
  34. )
  35. User.objects.bulk_create(users)
  36. class GroupTest(APIViewTestCases.APIViewTestCase):
  37. model = Group
  38. view_namespace = 'users'
  39. brief_fields = ['id', 'name', 'url']
  40. create_data = [
  41. {
  42. 'name': 'Group 4',
  43. },
  44. {
  45. 'name': 'Group 5',
  46. },
  47. {
  48. 'name': 'Group 6',
  49. },
  50. ]
  51. @classmethod
  52. def setUpTestData(cls):
  53. users = (
  54. Group(name='Group 1'),
  55. Group(name='Group 2'),
  56. Group(name='Group 3'),
  57. )
  58. Group.objects.bulk_create(users)
  59. class ObjectPermissionTest(APIViewTestCases.APIViewTestCase):
  60. model = ObjectPermission
  61. brief_fields = ['actions', 'enabled', 'groups', 'id', 'name', 'object_types', 'url', 'users']
  62. @classmethod
  63. def setUpTestData(cls):
  64. groups = (
  65. Group(name='Group 1'),
  66. Group(name='Group 2'),
  67. Group(name='Group 3'),
  68. )
  69. Group.objects.bulk_create(groups)
  70. users = (
  71. User(username='User 1', is_active=True),
  72. User(username='User 2', is_active=True),
  73. User(username='User 3', is_active=True),
  74. )
  75. User.objects.bulk_create(users)
  76. object_type = ContentType.objects.get(app_label='dcim', model='device')
  77. for i in range(0, 3):
  78. objectpermission = ObjectPermission(
  79. actions=['view', 'add', 'change', 'delete'],
  80. constraints={'name': f'TEST{i+1}'}
  81. )
  82. objectpermission.save()
  83. objectpermission.object_types.add(object_type)
  84. objectpermission.groups.add(groups[i])
  85. objectpermission.users.add(users[i])
  86. cls.create_data = [
  87. {
  88. 'object_types': ['dcim.site'],
  89. 'groups': [groups[0].pk],
  90. 'users': [users[0].pk],
  91. 'actions': ['view', 'add', 'change', 'delete'],
  92. 'constraints': {'name': 'TEST4'},
  93. },
  94. {
  95. 'object_types': ['dcim.site'],
  96. 'groups': [groups[1].pk],
  97. 'users': [users[1].pk],
  98. 'actions': ['view', 'add', 'change', 'delete'],
  99. 'constraints': {'name': 'TEST5'},
  100. },
  101. {
  102. 'object_types': ['dcim.site'],
  103. 'groups': [groups[2].pk],
  104. 'users': [users[2].pk],
  105. 'actions': ['view', 'add', 'change', 'delete'],
  106. 'constraints': {'name': 'TEST6'},
  107. },
  108. ]
  109. @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'])
  110. def test_list_objects_anonymous(self):
  111. # Endpoint should never be exposed via EXEMPT_VIEW_PERMISSIONS
  112. url = self._get_list_url()
  113. with disable_warnings('django.request'):
  114. self.assertHttpStatus(self.client.get(url, **self.header), status.HTTP_403_FORBIDDEN)
  115. @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'])
  116. def test_get_object_anonymous(self):
  117. # Endpoint should never be exposed via EXEMPT_VIEW_PERMISSIONS
  118. url = self._get_detail_url(self._get_queryset().first())
  119. with disable_warnings('django.request'):
  120. self.assertHttpStatus(self.client.get(url, **self.header), status.HTTP_403_FORBIDDEN)