test_plugins.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. from unittest import skipIf
  2. from django.conf import settings
  3. from django.core.exceptions import ImproperlyConfigured
  4. from django.test import Client, TestCase, override_settings
  5. from django.urls import reverse
  6. from extras.registry import registry
  7. from extras.tests.dummy_plugin import config as dummy_config
  8. from netbox.graphql.schema import Query
  9. @skipIf('extras.tests.dummy_plugin' not in settings.PLUGINS, "dummy_plugin not in settings.PLUGINS")
  10. class PluginTest(TestCase):
  11. def test_config(self):
  12. self.assertIn('extras.tests.dummy_plugin.DummyPluginConfig', settings.INSTALLED_APPS)
  13. def test_models(self):
  14. from extras.tests.dummy_plugin.models import DummyModel
  15. # Test saving an instance
  16. instance = DummyModel(name='Instance 1', number=100)
  17. instance.save()
  18. self.assertIsNotNone(instance.pk)
  19. # Test deleting an instance
  20. instance.delete()
  21. self.assertIsNone(instance.pk)
  22. def test_admin(self):
  23. # Test admin view URL resolution
  24. url = reverse('admin:dummy_plugin_dummymodel_add')
  25. self.assertEqual(url, '/admin/dummy_plugin/dummymodel/add/')
  26. def test_views(self):
  27. # Test URL resolution
  28. url = reverse('plugins:dummy_plugin:dummy_models')
  29. self.assertEqual(url, '/plugins/dummy-plugin/models/')
  30. # Test GET request
  31. client = Client()
  32. response = client.get(url)
  33. self.assertEqual(response.status_code, 200)
  34. @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'])
  35. def test_api_views(self):
  36. # Test URL resolution
  37. url = reverse('plugins-api:dummy_plugin-api:dummymodel-list')
  38. self.assertEqual(url, '/api/plugins/dummy-plugin/dummy-models/')
  39. # Test GET request
  40. client = Client()
  41. response = client.get(url)
  42. self.assertEqual(response.status_code, 200)
  43. def test_menu_items(self):
  44. """
  45. Check that plugin MenuItems and MenuButtons are registered.
  46. """
  47. self.assertIn('Dummy plugin', registry['plugins']['menu_items'])
  48. menu_items = registry['plugins']['menu_items']['Dummy plugin']
  49. self.assertEqual(len(menu_items), 2)
  50. self.assertEqual(len(menu_items[0].buttons), 2)
  51. def test_template_extensions(self):
  52. """
  53. Check that plugin TemplateExtensions are registered.
  54. """
  55. from extras.tests.dummy_plugin.template_content import SiteContent
  56. self.assertIn(SiteContent, registry['plugins']['template_extensions']['dcim.site'])
  57. def test_user_preferences(self):
  58. """
  59. Check that plugin UserPreferences are registered.
  60. """
  61. self.assertIn('dummy_plugin', registry['plugins']['preferences'])
  62. user_preferences = registry['plugins']['preferences']['dummy_plugin']
  63. self.assertEqual(type(user_preferences), dict)
  64. self.assertEqual(list(user_preferences.keys()), ['pref1', 'pref2'])
  65. def test_middleware(self):
  66. """
  67. Check that plugin middleware is registered.
  68. """
  69. self.assertIn('extras.tests.dummy_plugin.middleware.DummyMiddleware', settings.MIDDLEWARE)
  70. def test_queues(self):
  71. """
  72. Check that plugin queues are registered with the accurate name.
  73. """
  74. self.assertIn('extras.tests.dummy_plugin.testing-low', settings.RQ_QUEUES)
  75. self.assertIn('extras.tests.dummy_plugin.testing-medium', settings.RQ_QUEUES)
  76. self.assertIn('extras.tests.dummy_plugin.testing-high', settings.RQ_QUEUES)
  77. def test_min_version(self):
  78. """
  79. Check enforcement of minimum NetBox version.
  80. """
  81. with self.assertRaises(ImproperlyConfigured):
  82. dummy_config.validate({}, '0.9')
  83. def test_max_version(self):
  84. """
  85. Check enforcement of maximum NetBox version.
  86. """
  87. with self.assertRaises(ImproperlyConfigured):
  88. dummy_config.validate({}, '10.0')
  89. def test_required_settings(self):
  90. """
  91. Validate enforcement of required settings.
  92. """
  93. class DummyConfigWithRequiredSettings(dummy_config):
  94. required_settings = ['foo']
  95. # Validation should pass when all required settings are present
  96. DummyConfigWithRequiredSettings.validate({'foo': True}, settings.VERSION)
  97. # Validation should fail when a required setting is missing
  98. with self.assertRaises(ImproperlyConfigured):
  99. DummyConfigWithRequiredSettings.validate({}, settings.VERSION)
  100. def test_default_settings(self):
  101. """
  102. Validate population of default config settings.
  103. """
  104. class DummyConfigWithDefaultSettings(dummy_config):
  105. default_settings = {
  106. 'bar': 123,
  107. }
  108. # Populate the default value if setting has not been specified
  109. user_config = {}
  110. DummyConfigWithDefaultSettings.validate(user_config, settings.VERSION)
  111. self.assertEqual(user_config['bar'], 123)
  112. # Don't overwrite specified values
  113. user_config = {'bar': 456}
  114. DummyConfigWithDefaultSettings.validate(user_config, settings.VERSION)
  115. self.assertEqual(user_config['bar'], 456)
  116. def test_graphql(self):
  117. """
  118. Validate the registration and operation of plugin-provided GraphQL schemas.
  119. """
  120. from extras.tests.dummy_plugin.graphql import DummyQuery
  121. self.assertIn(DummyQuery, registry['plugins']['graphql_schemas'])
  122. self.assertTrue(issubclass(Query, DummyQuery))