From aff753b8270dcd2a3ffc3849d940211f748cbdeb Mon Sep 17 00:00:00 2001
From: Vincent Simonin <vincent.simonin@ext.ec.europa.eu>
Date: Wed, 12 Jul 2023 12:59:00 +0200
Subject: [PATCH] Increase the mapping URL max length to 2000 char

---
 .../netbox_rps_plugin/__init__.py             |  2 +-
 .../migrations/0006_url_max_length.py         | 27 +++++++++
 .../netbox_rps_plugin/models.py               |  8 +--
 plugins/netbox-rps-plugin/setup.py            |  2 +-
 .../tests/e2e/test_mapping_creation.py        | 15 +++++
 .../tests/e2e/test_mapping_unique.py          |  1 -
 .../tests/e2e/test_url_max_length.py          | 60 +++++++++++++++++++
 7 files changed, 107 insertions(+), 8 deletions(-)
 create mode 100644 plugins/netbox-rps-plugin/netbox_rps_plugin/migrations/0006_url_max_length.py
 create mode 100644 plugins/netbox-rps-plugin/tests/e2e/test_url_max_length.py

diff --git a/plugins/netbox-rps-plugin/netbox_rps_plugin/__init__.py b/plugins/netbox-rps-plugin/netbox_rps_plugin/__init__.py
index 0709e6b..cad9ec1 100644
--- a/plugins/netbox-rps-plugin/netbox_rps_plugin/__init__.py
+++ b/plugins/netbox-rps-plugin/netbox_rps_plugin/__init__.py
@@ -5,7 +5,7 @@ class NetBoxRpsConfig(PluginConfig):
     name = 'netbox_rps_plugin'
     verbose_name = 'NetBox RPS'
     description = 'A Netbox plugin to add RPS resources'
-    version = '0.8.4'
+    version = '0.8.5'
     author = "Vincent Simonin"
     author_email = "vincent.simonin@ext.ec.europa.eu"
     base_url = 'rps'
diff --git a/plugins/netbox-rps-plugin/netbox_rps_plugin/migrations/0006_url_max_length.py b/plugins/netbox-rps-plugin/netbox_rps_plugin/migrations/0006_url_max_length.py
new file mode 100644
index 0000000..3cc70a9
--- /dev/null
+++ b/plugins/netbox-rps-plugin/netbox_rps_plugin/migrations/0006_url_max_length.py
@@ -0,0 +1,27 @@
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('netbox_rps_plugin', '0005_source_mapping_unique_constraint')
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='mapping',
+            name='source',
+            field=models.CharField(null=False, blank=False, max_length=2000, unique=True),
+        ),
+        migrations.AlterField(
+            model_name='mapping',
+            name='target',
+            field=models.CharField(null=False, blank=False, max_length=2000),
+        ),
+        migrations.AlterField(
+            model_name='mapping',
+            name='testingpage',
+            field=models.CharField(null=True, blank=True, max_length=2000),
+        ),
+    ]
diff --git a/plugins/netbox-rps-plugin/netbox_rps_plugin/models.py b/plugins/netbox-rps-plugin/netbox_rps_plugin/models.py
index 1110787..b4c7c43 100644
--- a/plugins/netbox-rps-plugin/netbox_rps_plugin/models.py
+++ b/plugins/netbox-rps-plugin/netbox_rps_plugin/models.py
@@ -30,20 +30,18 @@ class ApplyToChoices(ChoiceSet):
 
 
 class Mapping(NetBoxModel):
-
     source = models.CharField(
-        max_length=120,
+        max_length=2000,
         blank=False,
         verbose_name='Source',
         validators=[URLValidator(message='It must be a url')],
         unique=True
     )
     target = models.CharField(
-        max_length=120,
+        max_length=2000,
         blank=False,
         verbose_name='Target',
         validators=[URLValidator(message='It must be a url')],
-
     )
     authentication = models.CharField(
         max_length=30,
@@ -53,7 +51,7 @@ class Mapping(NetBoxModel):
         verbose_name='Auth',
     )
     testingpage = models.CharField(
-        max_length=120,
+        max_length=2000,
         blank=True,
         null=True,
         validators=[URLValidator(message='It must be a url')],
diff --git a/plugins/netbox-rps-plugin/setup.py b/plugins/netbox-rps-plugin/setup.py
index 79bdd00..5ba2bcd 100644
--- a/plugins/netbox-rps-plugin/setup.py
+++ b/plugins/netbox-rps-plugin/setup.py
@@ -2,7 +2,7 @@ from setuptools import find_packages, setup
 
 setup(
     name='netbox_rps_plugin',
-    version='0.8.4',
+    version='0.8.5',
     description='A Netbox plugin to add RPS resources',
     install_requires=[],
     packages=find_packages(),
diff --git a/plugins/netbox-rps-plugin/tests/e2e/test_mapping_creation.py b/plugins/netbox-rps-plugin/tests/e2e/test_mapping_creation.py
index fbed01a..e5390d1 100644
--- a/plugins/netbox-rps-plugin/tests/e2e/test_mapping_creation.py
+++ b/plugins/netbox-rps-plugin/tests/e2e/test_mapping_creation.py
@@ -1,8 +1,10 @@
 import unittest
 import requests
+import json
 
 
 class TestMappingCreation(unittest.TestCase):
+    mappingId=None
 
     def test_that_mapping_is_created(self):
         r = requests.post(
@@ -20,6 +22,19 @@ class TestMappingCreation(unittest.TestCase):
 
         self.assertEqual(r.status_code, 201)
 
+        self.mappingId = json.loads(r.content)['id'];
+
+    def tearDown(self) -> None:
+        requests.delete(
+            url='http://localhost:8000/api/plugins/rps/mapping/',
+            json=[{
+                "id": self.mappingId
+            }],
+            headers={
+                "Authorization": "Token 52121418bdd7411f6a0ee99b41561099810a8785"
+            }
+        )
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/plugins/netbox-rps-plugin/tests/e2e/test_mapping_unique.py b/plugins/netbox-rps-plugin/tests/e2e/test_mapping_unique.py
index 636c7ad..97bef4a 100644
--- a/plugins/netbox-rps-plugin/tests/e2e/test_mapping_unique.py
+++ b/plugins/netbox-rps-plugin/tests/e2e/test_mapping_unique.py
@@ -1,7 +1,6 @@
 import unittest
 import requests
 import json
-from pprint import pp
 
 
 class TestMappingUnique(unittest.TestCase):
diff --git a/plugins/netbox-rps-plugin/tests/e2e/test_url_max_length.py b/plugins/netbox-rps-plugin/tests/e2e/test_url_max_length.py
new file mode 100644
index 0000000..44f33d8
--- /dev/null
+++ b/plugins/netbox-rps-plugin/tests/e2e/test_url_max_length.py
@@ -0,0 +1,60 @@
+import unittest
+import requests
+
+
+class TestMappingCreation(unittest.TestCase):
+
+    def test_that_source_url_has_max_length(self):
+        r = requests.post(
+            url='http://localhost:8000/api/plugins/rps/mapping/',
+            json={
+                "source": "https://truc.com/api" + ('i' * 1981),
+                "target": "http://10.10.10.10:1886/api",
+                "authentication": "none",
+                "testingpage": None
+            },
+            headers={
+                "Authorization": "Token 52121418bdd7411f6a0ee99b41561099810a8785"
+            }
+        )
+
+        self.assertEqual(r.status_code, 400)
+        self.assertEqual(r.content, b'{"source":["Ensure this field has no more than 2000 characters."]}')
+
+    def test_that_target_url_has_max_length(self):
+        r = requests.post(
+            url='http://localhost:8000/api/plugins/rps/mapping/',
+            json={
+                "source": "https://truc.com/api",
+                "target": "http://10.10.10.10:1886/api" + ('i' * 1974),
+                "authentication": "none",
+                "testingpage": None
+            },
+            headers={
+                "Authorization": "Token 52121418bdd7411f6a0ee99b41561099810a8785"
+            }
+        )
+
+        self.assertEqual(r.status_code, 400)
+        self.assertEqual(r.content, b'{"target":["Ensure this field has no more than 2000 characters."]}')
+
+    def test_that_testingpage_url_has_max_length(self):
+        r = requests.post(
+            url='http://localhost:8000/api/plugins/rps/mapping/',
+            json={
+                "source": "https://truc.com/api",
+                "target": "http://10.10.10.10:1886/api",
+                "authentication": "none",
+                "testingpage": "https://truc.com/api" + ('i' * 1981),
+            },
+            headers={
+                "Authorization": "Token 52121418bdd7411f6a0ee99b41561099810a8785"
+            }
+        )
+
+        self.assertEqual(r.status_code, 400)
+        self.assertEqual(r.content, b'{"testingpage":["Ensure this field has no more than 2000 characters."]}')
+
+
+if __name__ == '__main__':
+    unittest.main()
-- 
GitLab