diff --git a/plugins/netbox-rps-plugin/netbox_rps_plugin/__init__.py b/plugins/netbox-rps-plugin/netbox_rps_plugin/__init__.py index 60fba731067b0005aa33df8b8a1aa257b98a494f..0709e6bfeeabc7a039be45c68d96e7a7a8a6002d 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.3' + version = '0.8.4' 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/0005_source_mapping_unique_constraint.py b/plugins/netbox-rps-plugin/netbox_rps_plugin/migrations/0005_source_mapping_unique_constraint.py new file mode 100644 index 0000000000000000000000000000000000000000..ece218151a926915f2886e1c057a1823c61dbc27 --- /dev/null +++ b/plugins/netbox-rps-plugin/netbox_rps_plugin/migrations/0005_source_mapping_unique_constraint.py @@ -0,0 +1,17 @@ +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('netbox_rps_plugin', '0004_testingpage_nullable') + ] + + operations = [ + migrations.AlterField( + model_name='mapping', + name='source', + field=models.CharField(null=False, blank=False, max_length=120, unique=True), + ), + ] diff --git a/plugins/netbox-rps-plugin/netbox_rps_plugin/models.py b/plugins/netbox-rps-plugin/netbox_rps_plugin/models.py index c4504cfd22d7a23b053e064cd6d4b71d8faaee8d..1110787341c7d604b8b258b9e5a23d16b9c93297 100644 --- a/plugins/netbox-rps-plugin/netbox_rps_plugin/models.py +++ b/plugins/netbox-rps-plugin/netbox_rps_plugin/models.py @@ -36,6 +36,7 @@ class Mapping(NetBoxModel): blank=False, verbose_name='Source', validators=[URLValidator(message='It must be a url')], + unique=True ) target = models.CharField( max_length=120, diff --git a/plugins/netbox-rps-plugin/setup.py b/plugins/netbox-rps-plugin/setup.py index 3eb90ede0d8aa7567cc39a1fa0c4a67201566420..79bdd00a5ab2378ba0903ecfe7d698e6a7e01313 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.3', + version='0.8.4', 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 new file mode 100644 index 0000000000000000000000000000000000000000..fbed01a6eba881582172859109d06940bdf4d244 --- /dev/null +++ b/plugins/netbox-rps-plugin/tests/e2e/test_mapping_creation.py @@ -0,0 +1,25 @@ +import unittest +import requests + + +class TestMappingCreation(unittest.TestCase): + + def test_that_mapping_is_created(self): + r = requests.post( + url='http://localhost:8000/api/plugins/rps/mapping/', + json={ + "source": "https://truc6.com/api", + "target": "http://10.10.10.10:1886/api", + "authentication": "none", + "testingpage": None + }, + headers={ + "Authorization": "Token 52121418bdd7411f6a0ee99b41561099810a8785" + } + ) + + self.assertEqual(r.status_code, 201) + + +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 new file mode 100644 index 0000000000000000000000000000000000000000..636c7ad01b778b89e6d221ff6a251d86606a99b5 --- /dev/null +++ b/plugins/netbox-rps-plugin/tests/e2e/test_mapping_unique.py @@ -0,0 +1,57 @@ +import unittest +import requests +import json +from pprint import pp + + +class TestMappingUnique(unittest.TestCase): + mappingId=None + + def test_that_mapping_is_unique(self): + r = requests.post( + url='http://localhost:8000/api/plugins/rps/mapping/', + json={ + "source": "https://truc7.com/api", + "target": "http://10.10.10.10:1886/api", + "authentication": "none", + "testingpage": None + }, + headers={ + "Authorization": "Token 52121418bdd7411f6a0ee99b41561099810a8785" + } + ) + + self.assertEqual(r.status_code, 201) + + self.mappingId = json.loads(r.content)['id']; + + r = requests.post( + url='http://localhost:8000/api/plugins/rps/mapping/', + json={ + "source": "https://truc7.com/api", + "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":["mapping with this Source already exists."]}') + + 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_unauthenticated.py b/plugins/netbox-rps-plugin/tests/e2e/test_unauthenticated.py index 4ae2d5f9bb725343b6b92cf6e96e571b30a2305c..d4a41298c41538832850130447f93d369b0faab6 100644 --- a/plugins/netbox-rps-plugin/tests/e2e/test_unauthenticated.py +++ b/plugins/netbox-rps-plugin/tests/e2e/test_unauthenticated.py @@ -1,14 +1,8 @@ import unittest import requests - class TestUnauthenticatedMappings(unittest.TestCase): - def test_mappings_get_unauthenticated(self): - r = requests.get('http://localhost:8000/api/plugins/rps/') - - self.assertEqual(r.status_code, 403) - def test_mappings_get_unauthenticated(self): r = requests.get('http://localhost:8000/api/plugins/rps/mapping/') @@ -29,11 +23,6 @@ class TestUnauthenticatedMappings(unittest.TestCase): self.assertEqual(r.status_code, 403) - def test_mappings_put_unauthenticated(self): - r = requests.put('http://localhost:8000/api/plugins/rps/mapping') - - self.assertEqual(r.status_code, 403) - if __name__ == '__main__': unittest.main()