From c822653283601789866628c2a5edfbda71b7066a Mon Sep 17 00:00:00 2001 From: Magdalena GomezFayren Medina <magdalena.gomez@ext.ec.europa.eu> Date: Thu, 23 Jan 2025 10:03:15 +0000 Subject: [PATCH 1/5] refactor virtual machine type tests folder --- .../__init__.py | 0 .../test_virtual_machine_type_api.py} | 2 +- .../test_virtual_machine_type_view.py} | 12 ++++++------ netbox_sys_plugin/tests/webhook_settings/__init__.py | 0 4 files changed, 7 insertions(+), 7 deletions(-) rename netbox_sys_plugin/tests/{vm_machine_type => virtual_machine_type}/__init__.py (100%) rename netbox_sys_plugin/tests/{vm_machine_type/test_vm_machine_type_api.py => virtual_machine_type/test_virtual_machine_type_api.py} (99%) rename netbox_sys_plugin/tests/{vm_machine_type/test_vm_machine_type_view.py => virtual_machine_type/test_virtual_machine_type_view.py} (87%) create mode 100644 netbox_sys_plugin/tests/webhook_settings/__init__.py 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 81b1e81..43662c6 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 aa991c4..91b515d 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 0000000..e69de29 -- GitLab From fa8e8aee4fef09489cc92499728da65053394f4c Mon Sep 17 00:00:00 2001 From: Magdalena GomezFayren Medina <magdalena.gomez@ext.ec.europa.eu> Date: Thu, 23 Jan 2025 13:03:32 +0000 Subject: [PATCH 2/5] Added url validator and removed webhook settings table filters --- .../0005_alter_webhooksettings_payload_url.py | 19 +++++++++++++++++++ netbox_sys_plugin/models/operation.py | 3 +++ netbox_sys_plugin/views.py | 1 - 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 netbox_sys_plugin/migrations/0005_alter_webhooksettings_payload_url.py 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 0000000..d9715a9 --- /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 9666d0c..0a5e0c4 100644 --- a/netbox_sys_plugin/models/operation.py +++ b/netbox_sys_plugin/models/operation.py @@ -4,6 +4,8 @@ from django.urls import reverse from django.db import models from django.utils.translation import gettext_lazy as _ from netbox.models import NetBoxModel +from django.core.validators import ( + URLValidator) @@ -13,6 +15,7 @@ class WebhookSettings(NetBoxModel): 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/views.py b/netbox_sys_plugin/views.py index 48e31e9..977300c 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): """ -- GitLab From 4e56133fcb7bf75b74fc555723aba31d442bc656 Mon Sep 17 00:00:00 2001 From: Magdalena GomezFayren Medina <magdalena.gomez@ext.ec.europa.eu> Date: Thu, 23 Jan 2025 13:04:16 +0000 Subject: [PATCH 3/5] Added ui tests --- .../test_webhook_settings_view.py | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 netbox_sys_plugin/tests/webhook_settings/test_webhook_settings_view.py 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 0000000..284a61e --- /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 virtualization.models import ClusterType +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. + """ + + # 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() -- GitLab From 5aee01e48c7cb949942231bd189e7eb23f105efc Mon Sep 17 00:00:00 2001 From: Magdalena GomezFayren Medina <magdalena.gomez@ext.ec.europa.eu> Date: Thu, 23 Jan 2025 14:38:18 +0000 Subject: [PATCH 4/5] Fixed linter --- netbox_sys_plugin/models/operation.py | 3 +-- .../tests/webhook_settings/test_webhook_settings_view.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/netbox_sys_plugin/models/operation.py b/netbox_sys_plugin/models/operation.py index 0a5e0c4..fd27eb8 100644 --- a/netbox_sys_plugin/models/operation.py +++ b/netbox_sys_plugin/models/operation.py @@ -4,8 +4,7 @@ from django.urls import reverse from django.db import models from django.utils.translation import gettext_lazy as _ from netbox.models import NetBoxModel -from django.core.validators import ( - URLValidator) +from django.core.validators import URLValidator 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 index 284a61e..5e8e8f7 100644 --- a/netbox_sys_plugin/tests/webhook_settings/test_webhook_settings_view.py +++ b/netbox_sys_plugin/tests/webhook_settings/test_webhook_settings_view.py @@ -2,7 +2,6 @@ from django.contrib.contenttypes.models import ContentType from users.models import ObjectPermission -from virtualization.models import ClusterType from netbox_sys_plugin.models import WebhookSettings from netbox_sys_plugin.forms import WebhookSettingsForm from ..base import BaseModelViewTestCase @@ -39,6 +38,7 @@ class WebhookSettingsFormTestCase( 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", -- GitLab From e6a3ac56ac573b9cfa510a871c64cc7992b610a0 Mon Sep 17 00:00:00 2001 From: Magdalena GomezFayren Medina <magdalena.gomez@ext.ec.europa.eu> Date: Thu, 23 Jan 2025 14:38:18 +0000 Subject: [PATCH 5/5] Fixed linter --- netbox_sys_plugin/models/operation.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/netbox_sys_plugin/models/operation.py b/netbox_sys_plugin/models/operation.py index fd27eb8..7d3eb4d 100644 --- a/netbox_sys_plugin/models/operation.py +++ b/netbox_sys_plugin/models/operation.py @@ -3,9 +3,8 @@ from django.urls import reverse from django.db import models from django.utils.translation import gettext_lazy as _ -from netbox.models import NetBoxModel from django.core.validators import URLValidator - +from netbox.models import NetBoxModel class WebhookSettings(NetBoxModel): -- GitLab