2
0

test_permissions.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. from django.test import TestCase
  2. from core.models import ObjectType
  3. from dcim.models import Device, Site
  4. from netbox.registry import registry
  5. from users.forms.model_forms import ObjectPermissionForm
  6. from users.models import ObjectPermission
  7. from utilities.permissions import ModelAction, register_model_actions
  8. from virtualization.models import VirtualMachine
  9. class ModelActionTest(TestCase):
  10. def test_hash(self):
  11. action1 = ModelAction(name='sync')
  12. action2 = ModelAction(name='sync', help_text='Different help')
  13. self.assertEqual(hash(action1), hash(action2))
  14. def test_equality_with_model_action(self):
  15. action1 = ModelAction(name='sync')
  16. action2 = ModelAction(name='sync', help_text='Different help')
  17. action3 = ModelAction(name='merge')
  18. self.assertEqual(action1, action2)
  19. self.assertNotEqual(action1, action3)
  20. def test_equality_with_string(self):
  21. action = ModelAction(name='sync')
  22. self.assertEqual(action, 'sync')
  23. self.assertNotEqual(action, 'merge')
  24. def test_usable_in_set(self):
  25. action1 = ModelAction(name='sync')
  26. action2 = ModelAction(name='sync', help_text='Different')
  27. action3 = ModelAction(name='merge')
  28. actions = {action1, action2, action3}
  29. self.assertEqual(len(actions), 2)
  30. class RegisterModelActionsTest(TestCase):
  31. def setUp(self):
  32. self.original_actions = dict(registry['model_actions'])
  33. def tearDown(self):
  34. registry['model_actions'].clear()
  35. registry['model_actions'].update(self.original_actions)
  36. def test_register_model_action_objects(self):
  37. register_model_actions(Site, [
  38. ModelAction('test_action', help_text='Test help'),
  39. ])
  40. actions = registry['model_actions']['dcim.site']
  41. self.assertEqual(len(actions), 1)
  42. self.assertEqual(actions[0].name, 'test_action')
  43. self.assertEqual(actions[0].help_text, 'Test help')
  44. def test_register_string_actions(self):
  45. register_model_actions(Site, ['action1', 'action2'])
  46. actions = registry['model_actions']['dcim.site']
  47. self.assertEqual(len(actions), 2)
  48. self.assertIsInstance(actions[0], ModelAction)
  49. self.assertEqual(actions[0].name, 'action1')
  50. self.assertEqual(actions[1].name, 'action2')
  51. def test_register_mixed_actions(self):
  52. register_model_actions(Site, [
  53. ModelAction('with_help', help_text='Has help'),
  54. 'without_help',
  55. ])
  56. actions = registry['model_actions']['dcim.site']
  57. self.assertEqual(len(actions), 2)
  58. self.assertEqual(actions[0].help_text, 'Has help')
  59. self.assertEqual(actions[1].help_text, '')
  60. def test_multiple_registrations_append(self):
  61. register_model_actions(Site, [ModelAction('first')])
  62. register_model_actions(Site, [ModelAction('second')])
  63. actions = registry['model_actions']['dcim.site']
  64. self.assertEqual(len(actions), 2)
  65. self.assertEqual(actions[0].name, 'first')
  66. self.assertEqual(actions[1].name, 'second')
  67. class ObjectPermissionFormTest(TestCase):
  68. def setUp(self):
  69. self.original_actions = dict(registry['model_actions'])
  70. def tearDown(self):
  71. registry['model_actions'].clear()
  72. registry['model_actions'].update(self.original_actions)
  73. def test_shared_action_preselection(self):
  74. register_model_actions(Device, [ModelAction('render_config')])
  75. register_model_actions(VirtualMachine, [ModelAction('render_config')])
  76. device_ct = ObjectType.objects.get_for_model(Device)
  77. vm_ct = ObjectType.objects.get_for_model(VirtualMachine)
  78. permission = ObjectPermission.objects.create(
  79. name='Test Permission',
  80. actions=['view', 'render_config'],
  81. )
  82. permission.object_types.set([device_ct, vm_ct])
  83. form = ObjectPermissionForm(instance=permission)
  84. initial = form.fields['registered_actions'].initial
  85. self.assertIn('dcim.device.render_config', initial)
  86. self.assertIn('virtualization.virtualmachine.render_config', initial)
  87. # Should not leak into the additional actions field
  88. self.assertEqual(form.initial['actions'], [])
  89. permission.delete()