mirror of
https://github.com/ansible/awx.git
synced 2026-01-29 07:14:43 -03:30
Add a custom regex to URLField that allows numbers to be present in the top level domain, e.g. https://towerhost.org42 Set by variable allow_numbers_in_top_level_domain in URLField __init__, and is set to True by default. If set to False, it will use the regex specified in the built-in django URLValidator class. This solution was originally implemented in LDAPServerURIField, but is now implemented in URLField to support this behavior more generally. The changes in LDAPServerURIField are longer needed and have been removed in this commit. Adds unit testing to make sure URLField changes handle regex input and settings correctly.
155 lines
5.4 KiB
Python
155 lines
5.4 KiB
Python
import pytest
|
|
|
|
from rest_framework.fields import ValidationError
|
|
from awx.conf.fields import StringListBooleanField, StringListPathField, ListTuplesField, URLField
|
|
|
|
|
|
class TestStringListBooleanField():
|
|
|
|
FIELD_VALUES = [
|
|
("hello", "hello"),
|
|
(("a", "b"), ["a", "b"]),
|
|
(["a", "b", 1, 3.13, "foo", "bar", "foobar"], ["a", "b", "1", "3.13", "foo", "bar", "foobar"]),
|
|
("True", True),
|
|
("TRUE", True),
|
|
("true", True),
|
|
(True, True),
|
|
("False", False),
|
|
("FALSE", False),
|
|
("false", False),
|
|
(False, False),
|
|
("", None),
|
|
("null", None),
|
|
("NULL", None),
|
|
]
|
|
|
|
FIELD_VALUES_INVALID = [
|
|
1.245,
|
|
{"a": "b"},
|
|
]
|
|
|
|
@pytest.mark.parametrize("value_in, value_known", FIELD_VALUES)
|
|
def test_to_internal_value_valid(self, value_in, value_known):
|
|
field = StringListBooleanField()
|
|
v = field.to_internal_value(value_in)
|
|
assert v == value_known
|
|
|
|
@pytest.mark.parametrize("value", FIELD_VALUES_INVALID)
|
|
def test_to_internal_value_invalid(self, value):
|
|
field = StringListBooleanField()
|
|
with pytest.raises(ValidationError) as e:
|
|
field.to_internal_value(value)
|
|
assert e.value.detail[0] == "Expected None, True, False, a string or list " \
|
|
"of strings but got {} instead.".format(type(value))
|
|
|
|
@pytest.mark.parametrize("value_in, value_known", FIELD_VALUES)
|
|
def test_to_representation_valid(self, value_in, value_known):
|
|
field = StringListBooleanField()
|
|
v = field.to_representation(value_in)
|
|
assert v == value_known
|
|
|
|
@pytest.mark.parametrize("value", FIELD_VALUES_INVALID)
|
|
def test_to_representation_invalid(self, value):
|
|
field = StringListBooleanField()
|
|
with pytest.raises(ValidationError) as e:
|
|
field.to_representation(value)
|
|
assert e.value.detail[0] == "Expected None, True, False, a string or list " \
|
|
"of strings but got {} instead.".format(type(value))
|
|
|
|
|
|
class TestListTuplesField():
|
|
|
|
FIELD_VALUES = [
|
|
([('a', 'b'), ('abc', '123')], [("a", "b"), ("abc", "123")]),
|
|
]
|
|
|
|
FIELD_VALUES_INVALID = [
|
|
("abc", type("abc")),
|
|
([('a', 'b', 'c'), ('abc', '123', '456')], type(('a',))),
|
|
(['a', 'b'], type('a')),
|
|
(123, type(123)),
|
|
]
|
|
|
|
@pytest.mark.parametrize("value_in, value_known", FIELD_VALUES)
|
|
def test_to_internal_value_valid(self, value_in, value_known):
|
|
field = ListTuplesField()
|
|
v = field.to_internal_value(value_in)
|
|
assert v == value_known
|
|
|
|
@pytest.mark.parametrize("value, t", FIELD_VALUES_INVALID)
|
|
def test_to_internal_value_invalid(self, value, t):
|
|
field = ListTuplesField()
|
|
with pytest.raises(ValidationError) as e:
|
|
field.to_internal_value(value)
|
|
assert e.value.detail[0] == "Expected a list of tuples of max length 2 " \
|
|
"but got {} instead.".format(t)
|
|
|
|
|
|
class TestStringListPathField():
|
|
|
|
FIELD_VALUES = [
|
|
((".", "..", "/"), [".", "..", "/"]),
|
|
(("/home",), ["/home"]),
|
|
(("///home///",), ["/home"]),
|
|
(("/home/././././",), ["/home"]),
|
|
(("/home", "/home", "/home/"), ["/home"]),
|
|
(["/home/", "/home/", "/opt/", "/opt/", "/var/"], ["/home", "/opt", "/var"])
|
|
]
|
|
|
|
FIELD_VALUES_INVALID_TYPE = [
|
|
1.245,
|
|
{"a": "b"},
|
|
("/home"),
|
|
]
|
|
|
|
FIELD_VALUES_INVALID_PATH = [
|
|
"",
|
|
"~/",
|
|
"home",
|
|
"/invalid_path",
|
|
"/home/invalid_path",
|
|
]
|
|
|
|
@pytest.mark.parametrize("value_in, value_known", FIELD_VALUES)
|
|
def test_to_internal_value_valid(self, value_in, value_known):
|
|
field = StringListPathField()
|
|
v = field.to_internal_value(value_in)
|
|
assert v == value_known
|
|
|
|
@pytest.mark.parametrize("value", FIELD_VALUES_INVALID_TYPE)
|
|
def test_to_internal_value_invalid_type(self, value):
|
|
field = StringListPathField()
|
|
with pytest.raises(ValidationError) as e:
|
|
field.to_internal_value(value)
|
|
assert e.value.detail[0] == "Expected list of strings but got {} instead.".format(type(value))
|
|
|
|
@pytest.mark.parametrize("value", FIELD_VALUES_INVALID_PATH)
|
|
def test_to_internal_value_invalid_path(self, value):
|
|
field = StringListPathField()
|
|
with pytest.raises(ValidationError) as e:
|
|
field.to_internal_value([value])
|
|
assert e.value.detail[0] == "{} is not a valid path choice.".format(value)
|
|
|
|
|
|
class TestURLField():
|
|
regex = "^https://www.example.org$"
|
|
|
|
@pytest.mark.parametrize("url,schemes,regex, allow_numbers_in_top_level_domain, expect_no_error",[
|
|
("ldap://www.example.org42", "ldap", None, True, True),
|
|
("https://www.example.org42", "https", None, False, False),
|
|
("https://www.example.org", None, regex, None, True),
|
|
("https://www.example3.org", None, regex, None, False),
|
|
("ftp://www.example.org", "https", None, None, False)
|
|
])
|
|
def test_urls(self, url, schemes, regex, allow_numbers_in_top_level_domain, expect_no_error):
|
|
kwargs = {}
|
|
kwargs.setdefault("allow_numbers_in_top_level_domain", allow_numbers_in_top_level_domain)
|
|
kwargs.setdefault("schemes", schemes)
|
|
kwargs.setdefault("regex", regex)
|
|
field = URLField(**kwargs)
|
|
if expect_no_error:
|
|
field.run_validators(url)
|
|
else:
|
|
with pytest.raises(ValidationError):
|
|
field.run_validators(url)
|