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