Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Verified Commit 71c2ef02 authored by Vincent SIMONIN's avatar Vincent SIMONIN
Browse files

:sparkles: Made protocol and array of choice

* Available choices: "http_https" and "websocket"
parent ad1add33
No related branches found
No related tags found
1 merge request!53✨ Add new mapping property `protocol`
Pipeline #114060 passed
Showing with 121 additions and 19 deletions
......@@ -123,7 +123,7 @@ class MappingSerializer(NetBoxModelSerializer):
"proxy_cache",
"proxy_read_timeout",
"client_max_body_size",
"protocol",
"protocols",
"sorry_page",
"custom_fields",
"created",
......
"""Filtersets definitions"""
from django_filters import filters
from netbox.filtersets import NetBoxModelFilterSet
from django.db.models import Q
from .models import Mapping, HttpHeader
......@@ -8,6 +9,8 @@ from .models import Mapping, HttpHeader
class MappingFilterSet(NetBoxModelFilterSet):
"""Mapping filterset definition class"""
protocols = filters.CharFilter(lookup_expr="icontains")
class Meta:
model = Mapping
fields = (
......@@ -17,7 +20,7 @@ class MappingFilterSet(NetBoxModelFilterSet):
"target",
"Comment",
"webdav",
"protocol",
"protocols",
"testingpage",
"gzip_proxied",
"keepalive_requests",
......
......@@ -23,6 +23,8 @@ from .models import (
class MappingForm(NetBoxModelForm):
"""Mapping form definition class"""
protocols = forms.MultipleChoiceField(choices=ProtocolChoices)
class Meta:
model = Mapping
fields = (
......@@ -30,7 +32,7 @@ class MappingForm(NetBoxModelForm):
"target",
"authentication",
"webdav",
"protocol",
"protocols",
"testingpage",
"gzip_proxied",
"keepalive_requests",
......@@ -57,7 +59,7 @@ class MappingForm(NetBoxModelForm):
"proxy_read_timeout": " Proxy read timeout (s)",
"client_max_body_size": "Client max body size (MB)",
"sorry_page": "Sorry Page URL",
"protocol": "Protocol",
"protocols": "Protocols",
}
......@@ -78,7 +80,7 @@ class MappingFilterForm(NetBoxModelFilterSetForm):
webdav = forms.BooleanField(
required=False, widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES)
)
protocol = forms.MultipleChoiceField(
protocols = forms.MultipleChoiceField(
choices=ProtocolChoices,
required=False,
)
......
"""Migration File"""
# pylint: disable=C0103
import django.contrib.postgres.fields
import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
import netbox_rps_plugin.models
class Migration(migrations.Migration):
......@@ -28,8 +30,12 @@ class Migration(migrations.Migration):
),
migrations.AddField(
model_name="mapping",
name="protocol",
field=models.CharField(default="http_https", max_length=32),
name="protocols",
field=django.contrib.postgres.fields.ArrayField(
base_field=models.CharField(max_length=32),
default=netbox_rps_plugin.models.default_protocol,
size=None,
),
),
migrations.AlterField(
model_name="httpheader",
......
......@@ -4,6 +4,7 @@ from django.conf import settings
from django.db import models
from django.urls import reverse
from django.core.validators import URLValidator, MaxValueValidator, MinValueValidator
from django.contrib.postgres.fields.array import ArrayField
from netbox.models import NetBoxModel
from utilities.choices import ChoiceSet
......@@ -43,14 +44,20 @@ class ProtocolChoices(ChoiceSet):
key = "Mapping.protocol"
DEFAULT_VALUE = "http_https"
HTTP_HTTPS = "http_https"
WEBSOCKET = "websocket"
CHOICES = [
("http_https", "HTTP / HTTPS", "dark"),
("websocket", "Websocket", "blue"),
(HTTP_HTTPS, "HTTP / HTTPS", "dark"),
(WEBSOCKET, "Websocket", "blue"),
]
def default_protocol():
"""Return the default protocols"""
return [ProtocolChoices.HTTP_HTTPS]
class Mapping(NetBoxModel):
"""Mapping definition class"""
......@@ -105,12 +112,12 @@ class Mapping(NetBoxModel):
validators=[URLValidator(message="It must be a url")],
default=DEFAULT_SORRY_PAGE,
)
protocol = models.CharField(
max_length=32,
choices=ProtocolChoices,
default=ProtocolChoices.DEFAULT_VALUE,
protocols = ArrayField(
base_field=models.CharField(max_length=32, choices=ProtocolChoices),
null=False,
blank=False,
verbose_name="Protocol",
verbose_name="Protocols",
default=default_protocol,
)
class Meta:
......
......@@ -27,7 +27,7 @@ class MappingTable(NetBoxTable):
"authentication",
"testingpage",
"webdav",
"protocol",
"protocols",
"Comment",
"gzip_proxied",
"keepalive_requests",
......@@ -46,7 +46,7 @@ class MappingTable(NetBoxTable):
"target",
"authentication",
"webdav",
"protocol",
"protocols",
"gzip_proxied",
"keepalive_requests",
"keepalive_timeout",
......
......@@ -68,7 +68,7 @@
</tr>
<tr>
<th scope="row">Protocol</th>
<td>{{ object.get_protocol_display|placeholder }}</td>
<td>{{ object.protocols|placeholder }}</td>
</tr>
<tr>
<th scope="row">Comment</th>
......
......@@ -54,7 +54,7 @@ class TestMappingCreation(Base):
content = json.loads(response.content)
self.assertEqual(content["authentication"], "none")
self.assertEqual(content["protocol"], "http_https")
self.assertEqual(content["protocols"], ["http_https"])
if __name__ == "__main__":
......
"""Test case for Mapping protocols"""
import unittest
import json
import os
import requests
from .base import Base
HOST = os.getenv("HOST", default="localhost")
PORT = os.getenv("PORT", default="8080")
API_KEY = os.getenv("API_KEY", "only4testingpurpose")
class TestMappingProtocols(Base):
"""Test case for Mapping protocols class"""
def test_that_mapping_protocols_default_value_is_set(self) -> None:
"""Test that mapping protocols default value is set"""
response = requests.post(
url=f"http://{HOST}:{PORT}/api/plugins/rps/mapping/",
json={
"source": "https://truc00.com/api",
"target": "http://10.10.10.10:1800/api",
},
headers={"Authorization": f"Token {API_KEY}"},
timeout=5,
)
self.assertEqual(response.status_code, 201)
self.mapping_id = json.loads(response.content)["id"]
content = json.loads(response.content)
self.assertEqual(content["protocols"], ["http_https"])
def test_that_mapping_protocols_are_not_valid(self) -> None:
"""Test that mapping protocols are not valid"""
response = requests.post(
url=f"http://{HOST}:{PORT}/api/plugins/rps/mapping/",
json={
"source": "https://truc00.com/api",
"target": "http://10.10.10.10:1800/api",
"protocols": ["thisisnotavalidprotocol", "websocket", "anotherone"],
},
headers={"Authorization": f"Token {API_KEY}"},
timeout=5,
)
self.assertEqual(response.status_code, 400)
self.assertEqual(
response.content,
b'{"protocols":{"0":["\\"thisisnotavalidprotocol\\" is not a valid choice."],'
+ b'"2":["\\"anotherone\\" is not a valid choice."]}}',
)
def test_that_mapping_protocols_are_valid(self) -> None:
"""Test that mapping protocols are not valid"""
response = requests.post(
url=f"http://{HOST}:{PORT}/api/plugins/rps/mapping/",
json={
"source": "https://truc00.com/api",
"target": "http://10.10.10.10:1800/api",
"protocols": ["http_https", "websocket"],
},
headers={"Authorization": f"Token {API_KEY}"},
timeout=5,
)
self.assertEqual(response.status_code, 201)
self.mapping_id = json.loads(response.content)["id"]
content = json.loads(response.content)
self.assertEqual(content["protocols"], ["http_https", "websocket"])
if __name__ == "__main__":
unittest.main()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment