diff --git a/netbox_sys_plugin/migrations/0005_alter_webhooksettings_payload_url.py b/netbox_sys_plugin/migrations/0005_alter_webhooksettings_payload_url.py new file mode 100644 index 0000000000000000000000000000000000000000..d9715a99fa2c3949b6447c9cc26e597911d10bdb --- /dev/null +++ b/netbox_sys_plugin/migrations/0005_alter_webhooksettings_payload_url.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.16 on 2025-01-23 12:30 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('netbox_sys_plugin', '0004_alter_domainnames_domain_names'), + ] + + operations = [ + migrations.AlterField( + model_name='webhooksettings', + name='payload_url', + field=models.CharField(max_length=500, validators=[django.core.validators.URLValidator(schemes=['http', 'https'])]), + ), + ] diff --git a/netbox_sys_plugin/models/operation.py b/netbox_sys_plugin/models/operation.py index 9666d0c94cf4076ef82343d84041145a28f2e338..7d3eb4d425411a2e63019c5f2c091dc134c5645e 100644 --- a/netbox_sys_plugin/models/operation.py +++ b/netbox_sys_plugin/models/operation.py @@ -3,16 +3,17 @@ from django.urls import reverse from django.db import models from django.utils.translation import gettext_lazy as _ +from django.core.validators import URLValidator from netbox.models import NetBoxModel - class WebhookSettings(NetBoxModel): """Webhook settings config definition class""" payload_url = models.CharField( max_length=500, verbose_name=_('URL'), + validators=[URLValidator(schemes=["http", "https"])], help_text=_( "This URL will be called using the HTTP POST when the webhook is called." ) diff --git a/netbox_sys_plugin/tests/vm_machine_type/__init__.py b/netbox_sys_plugin/tests/virtual_machine_type/__init__.py similarity index 100% rename from netbox_sys_plugin/tests/vm_machine_type/__init__.py rename to netbox_sys_plugin/tests/virtual_machine_type/__init__.py diff --git a/netbox_sys_plugin/tests/vm_machine_type/test_vm_machine_type_api.py b/netbox_sys_plugin/tests/virtual_machine_type/test_virtual_machine_type_api.py similarity index 99% rename from netbox_sys_plugin/tests/vm_machine_type/test_vm_machine_type_api.py rename to netbox_sys_plugin/tests/virtual_machine_type/test_virtual_machine_type_api.py index 81b1e8136aed12aa7cf98d79e9426d95b0e09e15..43662c6590c94ec0101e37ec8ab2a46f98d235ac 100644 --- a/netbox_sys_plugin/tests/vm_machine_type/test_vm_machine_type_api.py +++ b/netbox_sys_plugin/tests/virtual_machine_type/test_virtual_machine_type_api.py @@ -7,7 +7,7 @@ from virtualization.models import ClusterType from netbox_sys_plugin.models import VirtualMachineType from ..base import BaseAPITestCase -class VmMachineTypeApiTestCase(BaseAPITestCase): +class VitualMachineTypeApiTestCase(BaseAPITestCase): """Test suite for VmMachineType API""" model = VirtualMachineType brief_fields = ["virtual_machine_type_name","virtual_machine_type_desc","assigned_object_id", "assigned_object_type"] diff --git a/netbox_sys_plugin/tests/vm_machine_type/test_vm_machine_type_view.py b/netbox_sys_plugin/tests/virtual_machine_type/test_virtual_machine_type_view.py similarity index 87% rename from netbox_sys_plugin/tests/vm_machine_type/test_vm_machine_type_view.py rename to netbox_sys_plugin/tests/virtual_machine_type/test_virtual_machine_type_view.py index aa991c49623c85bc6ef45fa56b6891feed391d4f..91b515d0a10129ded5a004dd01ad3e9cb5f0a4db 100644 --- a/netbox_sys_plugin/tests/vm_machine_type/test_vm_machine_type_view.py +++ b/netbox_sys_plugin/tests/virtual_machine_type/test_virtual_machine_type_view.py @@ -5,11 +5,11 @@ from users.models import ObjectPermission from virtualization.models import ClusterType from netbox_sys_plugin.models import VirtualMachineType from netbox_sys_plugin.forms import VmTypeForm -from .. base import BaseModelViewTestCase +from ..base import BaseModelViewTestCase -class VmMachineTypeFormTestCase( +class VirtualMachineTypeFormTestCase( BaseModelViewTestCase, ): """VM Machine Type Test Case Class""" @@ -27,11 +27,11 @@ class VmMachineTypeFormTestCase( cluster_type1 = ClusterType.objects.create(name="Test ClusterType1", slug="ClusterType1") cluster_type2 = ClusterType.objects.create(name="Test ClusterType2", slug="ClusterType2") - vmMachineType1 = VirtualMachineType.objects.create(virtual_machine_type_name='vm_type_name1', + virtual_machine_type1 = VirtualMachineType.objects.create(virtual_machine_type_name='vm_type_name1', virtual_machine_type_desc='vm_type_desc_1', assigned_object_type=cluster_type_content_type, assigned_object_id=cluster_type1.pk) - vmMachineType2 = VirtualMachineType.objects.create(virtual_machine_type_name='vm_type_name2', + virtual_machine_type2 = VirtualMachineType.objects.create(virtual_machine_type_name='vm_type_name2', virtual_machine_type_desc='vm_type_desc_2', assigned_object_type=cluster_type_content_type, assigned_object_id=cluster_type2.pk) @@ -49,8 +49,8 @@ class VmMachineTypeFormTestCase( cls.csv_update_data = ( "id,virtual_machine_type_name","virtual_machine_type_desc","assigned_object_type","assigned_object_id\n" - f"{vmMachineType1.pk},vm_type_new_name1,vm_type_desc_new,{cluster_type_content_type.pk},{cluster_type1.pk}\n" - f"{vmMachineType2.pk},vm_type_new_name2,vm_type_desc_new2,{cluster_type_content_type.pk},{cluster_type2.pk}\n" + f"{virtual_machine_type1.pk},vm_type_new_name1,vm_type_desc_new,{cluster_type_content_type.pk},{cluster_type1.pk}\n" + f"{virtual_machine_type2.pk},vm_type_new_name2,vm_type_desc_new2,{cluster_type_content_type.pk},{cluster_type2.pk}\n" ) def test_create_already_existing_vm_type(self): diff --git a/netbox_sys_plugin/tests/webhook_settings/__init__.py b/netbox_sys_plugin/tests/webhook_settings/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/netbox_sys_plugin/tests/webhook_settings/test_webhook_settings_view.py b/netbox_sys_plugin/tests/webhook_settings/test_webhook_settings_view.py new file mode 100644 index 0000000000000000000000000000000000000000..5e8e8f7ed1c4fd45d56636c3eff5989c4acbaf6b --- /dev/null +++ b/netbox_sys_plugin/tests/webhook_settings/test_webhook_settings_view.py @@ -0,0 +1,110 @@ +"""Webhook Settings Test Case Class""" + +from django.contrib.contenttypes.models import ContentType +from users.models import ObjectPermission +from netbox_sys_plugin.models import WebhookSettings +from netbox_sys_plugin.forms import WebhookSettingsForm +from ..base import BaseModelViewTestCase + + +class WebhookSettingsFormTestCase( + BaseModelViewTestCase, +): + """Webhook Settings Test Case Class""" + + model = WebhookSettings + form = WebhookSettingsForm + + def test_create_valid_webhook_settings(self): + """Create a valid webhook settings""" + + form = WebhookSettingsForm(data= { + "payload_url": "https://www.test.com", + "http_content_type": "test http content type" + }) + self.assertTrue(form.is_valid()) + + # Setup object permissions for the test user + obj_perm = ObjectPermission( + name='Test permission', + actions=['add', 'change'] + ) + obj_perm.save() + obj_perm.users.add(self.user) # pylint: disable=no-member + obj_perm.object_types.add(ContentType.objects.get_for_model(self.model)) # pylint: disable=no-member + + def test_invalid_webhook_settings_format(self): + """ + Test invalid webhook settings invalid format. + """ + + # pylint: disable=W0201 + # Set up valid form data + self.invalid_valid_form_data = { + "payload_url": "https://www.test.com", + "http_content_type": "test http content type" + } + + #Invalid payload url + invalid_form_data = self.invalid_valid_form_data.copy() + invalid_form_data["payload_url"] = "Invalid" # Invalid format + form = self.form(data=invalid_form_data) + self.assertFalse(form.is_valid()) + self.assertIn( + "Enter a valid URL.", + form.errors.get("payload_url", []), + ) + + #Missing payload url + invalid_form_data = self.invalid_valid_form_data.copy() + invalid_form_data["payload_url"] = None # Invalid format + form = self.form(data=invalid_form_data) + self.assertFalse(form.is_valid()) + self.assertIn( + "This field is required.", + form.errors.get("payload_url", []), + ) + + #Missing http content type + invalid_form_data = self.invalid_valid_form_data.copy() + invalid_form_data["http_content_type"] = None # Invalid format + form = self.form(data=invalid_form_data) + self.assertFalse(form.is_valid()) + self.assertIn( + "This field is required.", + form.errors.get("http_content_type", []), + ) + + def test_create_more_than_one_webhook_settings(self): + """Test the creation of 2 webhook settings""" + + # pylint: disable=W0201 + self.vmMachineType1 = WebhookSettings.objects.create( + payload_url='https://www.test.com', + http_content_type='test http content type') + + form = WebhookSettingsForm(data= { + "payload_url": "https://www.test2.com", + "http_content_type": "test http content type 2" + }) + + self.assertFalse(form.is_valid()) + # Setup object permissions for the test user + obj_perm = ObjectPermission( + name='Test permission', + actions=['add', 'change'] + ) + obj_perm.save() + obj_perm.users.add(self.user) # pylint: disable=no-member + obj_perm.object_types.add(ContentType.objects.get_for_model(self.model)) # pylint: disable=no-member + + self.assertIn( + "You can only have one webbook setting", + form.errors.get("__all__",[]) + ) + + + def tearDown(self) -> None:# pylint: disable=invalid-name + """Method called immediately after the test method has been called and the result recorded.""" + WebhookSettings.objects.all().delete() + super().tearDown() diff --git a/netbox_sys_plugin/views.py b/netbox_sys_plugin/views.py index 48e31e94b2d7d8b8edf8e8464186a12a1a71d9d1..977300ce5656a39ff98ba4b645a00b43b4d8b310 100644 --- a/netbox_sys_plugin/views.py +++ b/netbox_sys_plugin/views.py @@ -193,7 +193,6 @@ class WebhookSettingsListView(generic.ObjectListView): queryset = models.WebhookSettings.objects.all() table = tables.WebhookSettingsTable - filterset_form = forms.WebhookSettingsFilterForm class WebhookSettingsEditView(generic.ObjectEditView): """