From 919817e2557764018d6c77d3852f6b62e1ea1b7f Mon Sep 17 00:00:00 2001 From: Martin Hauser Date: Thu, 14 May 2026 17:28:31 +0200 Subject: [PATCH] Closes #14914: Add test for automatic plugin dashboard widget registration (#22191) --- netbox/netbox/tests/dummy_plugin/__init__.py | 2 +- netbox/netbox/tests/dummy_plugin/widgets.py | 11 +++++++++++ netbox/netbox/tests/test_plugins.py | 10 ++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 netbox/netbox/tests/dummy_plugin/widgets.py diff --git a/netbox/netbox/tests/dummy_plugin/__init__.py b/netbox/netbox/tests/dummy_plugin/__init__.py index 01eb0baa5..4c2be48ad 100644 --- a/netbox/netbox/tests/dummy_plugin/__init__.py +++ b/netbox/netbox/tests/dummy_plugin/__init__.py @@ -24,7 +24,7 @@ class DummyPluginConfig(PluginConfig): def ready(self): super().ready() - from . import jobs, webhook_callbacks # noqa: F401 + from . import jobs, webhook_callbacks, widgets # noqa: F401 config = DummyPluginConfig diff --git a/netbox/netbox/tests/dummy_plugin/widgets.py b/netbox/netbox/tests/dummy_plugin/widgets.py new file mode 100644 index 000000000..95d186842 --- /dev/null +++ b/netbox/netbox/tests/dummy_plugin/widgets.py @@ -0,0 +1,11 @@ +from extras.dashboard.utils import register_widget +from extras.dashboard.widgets import DashboardWidget + + +@register_widget +class DummyDashboardWidget(DashboardWidget): + default_title = 'Dummy Dashboard Widget' + description = 'A dummy dashboard widget for testing plugin registration.' + + def render(self, request): + return 'Dummy dashboard widget content' diff --git a/netbox/netbox/tests/test_plugins.py b/netbox/netbox/tests/test_plugins.py index e9a70ae54..1292d5ad1 100644 --- a/netbox/netbox/tests/test_plugins.py +++ b/netbox/netbox/tests/test_plugins.py @@ -7,6 +7,7 @@ from django.urls import reverse from core.choices import JobIntervalChoices from core.models import ObjectType +from extras.dashboard.widgets import DashboardWidget from netbox.graphql.schema import Query from netbox.plugins.navigation import PluginMenu, PluginMenuButton, PluginMenuItem from netbox.plugins.utils import get_plugin_config @@ -103,6 +104,15 @@ class PluginTestCase(TestCase): self.assertIn(GlobalContent, registry['plugins']['template_extensions'][None]) self.assertIn(SiteContent, registry['plugins']['template_extensions']['dcim.site']) + def test_dashboard_widget(self): + """ + Check that plugin dashboard widgets are registered. + """ + self.assertIn('netbox.DummyDashboardWidget', registry['widgets']) + + widget_class = registry['widgets']['netbox.DummyDashboardWidget'] + self.assertTrue(issubclass(widget_class, DashboardWidget)) + def test_registered_columns(self): """ Check that a plugin can register a custom column on a core model table.