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)
|