summaryrefslogtreecommitdiffstats
path: root/test/units/module_utils/common/validation
diff options
context:
space:
mode:
Diffstat (limited to 'test/units/module_utils/common/validation')
-rw-r--r--test/units/module_utils/common/validation/test_check_missing_parameters.py35
-rw-r--r--test/units/module_utils/common/validation/test_check_mutually_exclusive.py57
-rw-r--r--test/units/module_utils/common/validation/test_check_required_arguments.py88
-rw-r--r--test/units/module_utils/common/validation/test_check_required_by.py98
-rw-r--r--test/units/module_utils/common/validation/test_check_required_if.py79
-rw-r--r--test/units/module_utils/common/validation/test_check_required_one_of.py47
-rw-r--r--test/units/module_utils/common/validation/test_check_required_together.py57
-rw-r--r--test/units/module_utils/common/validation/test_check_type_bits.py43
-rw-r--r--test/units/module_utils/common/validation/test_check_type_bool.py49
-rw-r--r--test/units/module_utils/common/validation/test_check_type_bytes.py50
-rw-r--r--test/units/module_utils/common/validation/test_check_type_dict.py34
-rw-r--r--test/units/module_utils/common/validation/test_check_type_float.py38
-rw-r--r--test/units/module_utils/common/validation/test_check_type_int.py34
-rw-r--r--test/units/module_utils/common/validation/test_check_type_jsonarg.py36
-rw-r--r--test/units/module_utils/common/validation/test_check_type_list.py32
-rw-r--r--test/units/module_utils/common/validation/test_check_type_path.py28
-rw-r--r--test/units/module_utils/common/validation/test_check_type_raw.py23
-rw-r--r--test/units/module_utils/common/validation/test_check_type_str.py33
-rw-r--r--test/units/module_utils/common/validation/test_count_terms.py40
19 files changed, 901 insertions, 0 deletions
diff --git a/test/units/module_utils/common/validation/test_check_missing_parameters.py b/test/units/module_utils/common/validation/test_check_missing_parameters.py
new file mode 100644
index 0000000..6cbcb8b
--- /dev/null
+++ b/test/units/module_utils/common/validation/test_check_missing_parameters.py
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+# Copyright: (c) 2021, Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils._text import to_native
+from ansible.module_utils.common.validation import check_required_one_of
+from ansible.module_utils.common.validation import check_missing_parameters
+
+
+@pytest.fixture
+def arguments_terms():
+ return {"path": ""}
+
+
+def test_check_missing_parameters():
+ assert check_missing_parameters([], {}) == []
+
+
+def test_check_missing_parameters_list():
+ expected = "missing required arguments: path"
+
+ with pytest.raises(TypeError) as e:
+ check_missing_parameters({}, ["path"])
+
+ assert to_native(e.value) == expected
+
+
+def test_check_missing_parameters_positive():
+ assert check_missing_parameters({"path": "/foo"}, ["path"]) == []
diff --git a/test/units/module_utils/common/validation/test_check_mutually_exclusive.py b/test/units/module_utils/common/validation/test_check_mutually_exclusive.py
new file mode 100644
index 0000000..7bf9076
--- /dev/null
+++ b/test/units/module_utils/common/validation/test_check_mutually_exclusive.py
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019 Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils._text import to_native
+from ansible.module_utils.common.validation import check_mutually_exclusive
+
+
+@pytest.fixture
+def mutually_exclusive_terms():
+ return [
+ ('string1', 'string2',),
+ ('box', 'fox', 'socks'),
+ ]
+
+
+def test_check_mutually_exclusive(mutually_exclusive_terms):
+ params = {
+ 'string1': 'cat',
+ 'fox': 'hat',
+ }
+ assert check_mutually_exclusive(mutually_exclusive_terms, params) == []
+
+
+def test_check_mutually_exclusive_found(mutually_exclusive_terms):
+ params = {
+ 'string1': 'cat',
+ 'string2': 'hat',
+ 'fox': 'red',
+ 'socks': 'blue',
+ }
+ expected = "parameters are mutually exclusive: string1|string2, box|fox|socks"
+
+ with pytest.raises(TypeError) as e:
+ check_mutually_exclusive(mutually_exclusive_terms, params)
+
+ assert to_native(e.value) == expected
+
+
+def test_check_mutually_exclusive_none():
+ terms = None
+ params = {
+ 'string1': 'cat',
+ 'fox': 'hat',
+ }
+ assert check_mutually_exclusive(terms, params) == []
+
+
+def test_check_mutually_exclusive_no_params(mutually_exclusive_terms):
+ with pytest.raises(TypeError) as te:
+ check_mutually_exclusive(mutually_exclusive_terms, None)
+ assert "'NoneType' object is not iterable" in to_native(te.value)
diff --git a/test/units/module_utils/common/validation/test_check_required_arguments.py b/test/units/module_utils/common/validation/test_check_required_arguments.py
new file mode 100644
index 0000000..1dd5458
--- /dev/null
+++ b/test/units/module_utils/common/validation/test_check_required_arguments.py
@@ -0,0 +1,88 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2020 Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils._text import to_native
+from ansible.module_utils.common.validation import check_required_arguments
+
+
+@pytest.fixture
+def arguments_terms():
+ return {
+ 'foo': {
+ 'required': True,
+ },
+ 'bar': {
+ 'required': False,
+ },
+ 'tomato': {
+ 'irrelevant': 72,
+ },
+ }
+
+
+@pytest.fixture
+def arguments_terms_multiple():
+ return {
+ 'foo': {
+ 'required': True,
+ },
+ 'bar': {
+ 'required': True,
+ },
+ 'tomato': {
+ 'irrelevant': 72,
+ },
+ }
+
+
+def test_check_required_arguments(arguments_terms):
+ params = {
+ 'foo': 'hello',
+ 'bar': 'haha',
+ }
+ assert check_required_arguments(arguments_terms, params) == []
+
+
+def test_check_required_arguments_missing(arguments_terms):
+ params = {
+ 'apples': 'woohoo',
+ }
+ expected = "missing required arguments: foo"
+
+ with pytest.raises(TypeError) as e:
+ check_required_arguments(arguments_terms, params)
+
+ assert to_native(e.value) == expected
+
+
+def test_check_required_arguments_missing_multiple(arguments_terms_multiple):
+ params = {
+ 'apples': 'woohoo',
+ }
+ expected = "missing required arguments: bar, foo"
+
+ with pytest.raises(TypeError) as e:
+ check_required_arguments(arguments_terms_multiple, params)
+
+ assert to_native(e.value) == expected
+
+
+def test_check_required_arguments_missing_none():
+ terms = None
+ params = {
+ 'foo': 'bar',
+ 'baz': 'buzz',
+ }
+ assert check_required_arguments(terms, params) == []
+
+
+def test_check_required_arguments_no_params(arguments_terms):
+ with pytest.raises(TypeError) as te:
+ check_required_arguments(arguments_terms, None)
+ assert "'NoneType' is not iterable" in to_native(te.value)
diff --git a/test/units/module_utils/common/validation/test_check_required_by.py b/test/units/module_utils/common/validation/test_check_required_by.py
new file mode 100644
index 0000000..62cccff
--- /dev/null
+++ b/test/units/module_utils/common/validation/test_check_required_by.py
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+# Copyright: (c) 2021, Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils._text import to_native
+from ansible.module_utils.common.validation import check_required_by
+
+
+@pytest.fixture
+def path_arguments_terms():
+ return {
+ "path": ["mode", "owner"],
+ }
+
+
+def test_check_required_by():
+ arguments_terms = {}
+ params = {}
+ assert check_required_by(arguments_terms, params) == {}
+
+
+def test_check_required_by_missing():
+ arguments_terms = {
+ "force": "force_reason",
+ }
+ params = {"force": True}
+ expected = "missing parameter(s) required by 'force': force_reason"
+
+ with pytest.raises(TypeError) as e:
+ check_required_by(arguments_terms, params)
+
+ assert to_native(e.value) == expected
+
+
+def test_check_required_by_multiple(path_arguments_terms):
+ params = {
+ "path": "/foo/bar",
+ }
+ expected = "missing parameter(s) required by 'path': mode, owner"
+
+ with pytest.raises(TypeError) as e:
+ check_required_by(path_arguments_terms, params)
+
+ assert to_native(e.value) == expected
+
+
+def test_check_required_by_single(path_arguments_terms):
+ params = {"path": "/foo/bar", "mode": "0700"}
+ expected = "missing parameter(s) required by 'path': owner"
+
+ with pytest.raises(TypeError) as e:
+ check_required_by(path_arguments_terms, params)
+
+ assert to_native(e.value) == expected
+
+
+def test_check_required_by_missing_none(path_arguments_terms):
+ params = {
+ "path": "/foo/bar",
+ "mode": "0700",
+ "owner": "root",
+ }
+ assert check_required_by(path_arguments_terms, params)
+
+
+def test_check_required_by_options_context(path_arguments_terms):
+ params = {"path": "/foo/bar", "mode": "0700"}
+
+ options_context = ["foo_context"]
+
+ expected = "missing parameter(s) required by 'path': owner found in foo_context"
+
+ with pytest.raises(TypeError) as e:
+ check_required_by(path_arguments_terms, params, options_context)
+
+ assert to_native(e.value) == expected
+
+
+def test_check_required_by_missing_multiple_options_context(path_arguments_terms):
+ params = {
+ "path": "/foo/bar",
+ }
+ options_context = ["foo_context"]
+
+ expected = (
+ "missing parameter(s) required by 'path': mode, owner found in foo_context"
+ )
+
+ with pytest.raises(TypeError) as e:
+ check_required_by(path_arguments_terms, params, options_context)
+
+ assert to_native(e.value) == expected
diff --git a/test/units/module_utils/common/validation/test_check_required_if.py b/test/units/module_utils/common/validation/test_check_required_if.py
new file mode 100644
index 0000000..4189164
--- /dev/null
+++ b/test/units/module_utils/common/validation/test_check_required_if.py
@@ -0,0 +1,79 @@
+# -*- coding: utf-8 -*-
+# Copyright: (c) 2021, Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils._text import to_native
+from ansible.module_utils.common.validation import check_required_if
+
+
+def test_check_required_if():
+ arguments_terms = {}
+ params = {}
+ assert check_required_if(arguments_terms, params) == []
+
+
+def test_check_required_if_missing():
+ arguments_terms = [["state", "present", ("path",)]]
+ params = {"state": "present"}
+ expected = "state is present but all of the following are missing: path"
+
+ with pytest.raises(TypeError) as e:
+ check_required_if(arguments_terms, params)
+
+ assert to_native(e.value) == expected
+
+
+def test_check_required_if_missing_required():
+ arguments_terms = [["state", "present", ("path", "owner"), True]]
+ params = {"state": "present"}
+ expected = "state is present but any of the following are missing: path, owner"
+
+ with pytest.raises(TypeError) as e:
+ check_required_if(arguments_terms, params)
+
+ assert to_native(e.value) == expected
+
+
+def test_check_required_if_missing_multiple():
+ arguments_terms = [["state", "present", ("path", "owner")]]
+ params = {
+ "state": "present",
+ }
+ expected = "state is present but all of the following are missing: path, owner"
+
+ with pytest.raises(TypeError) as e:
+ check_required_if(arguments_terms, params)
+
+ assert to_native(e.value) == expected
+
+
+def test_check_required_if_missing_multiple_with_context():
+ arguments_terms = [["state", "present", ("path", "owner")]]
+ params = {
+ "state": "present",
+ }
+ options_context = ["foo_context"]
+ expected = "state is present but all of the following are missing: path, owner found in foo_context"
+
+ with pytest.raises(TypeError) as e:
+ check_required_if(arguments_terms, params, options_context)
+
+ assert to_native(e.value) == expected
+
+
+def test_check_required_if_multiple():
+ arguments_terms = [["state", "present", ("path", "owner")]]
+ params = {
+ "state": "present",
+ "path": "/foo",
+ "owner": "root",
+ }
+ options_context = ["foo_context"]
+ assert check_required_if(arguments_terms, params) == []
+ assert check_required_if(arguments_terms, params, options_context) == []
diff --git a/test/units/module_utils/common/validation/test_check_required_one_of.py b/test/units/module_utils/common/validation/test_check_required_one_of.py
new file mode 100644
index 0000000..b081889
--- /dev/null
+++ b/test/units/module_utils/common/validation/test_check_required_one_of.py
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+# Copyright: (c) 2021, Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils._text import to_native
+from ansible.module_utils.common.validation import check_required_one_of
+
+
+@pytest.fixture
+def arguments_terms():
+ return [["path", "owner"]]
+
+
+def test_check_required_one_of():
+ assert check_required_one_of([], {}) == []
+
+
+def test_check_required_one_of_missing(arguments_terms):
+ params = {"state": "present"}
+ expected = "one of the following is required: path, owner"
+
+ with pytest.raises(TypeError) as e:
+ check_required_one_of(arguments_terms, params)
+
+ assert to_native(e.value) == expected
+
+
+def test_check_required_one_of_provided(arguments_terms):
+ params = {"state": "present", "path": "/foo"}
+ assert check_required_one_of(arguments_terms, params) == []
+
+
+def test_check_required_one_of_context(arguments_terms):
+ params = {"state": "present"}
+ expected = "one of the following is required: path, owner found in foo_context"
+ option_context = ["foo_context"]
+
+ with pytest.raises(TypeError) as e:
+ check_required_one_of(arguments_terms, params, option_context)
+
+ assert to_native(e.value) == expected
diff --git a/test/units/module_utils/common/validation/test_check_required_together.py b/test/units/module_utils/common/validation/test_check_required_together.py
new file mode 100644
index 0000000..8a2daab
--- /dev/null
+++ b/test/units/module_utils/common/validation/test_check_required_together.py
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2020 Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils._text import to_native
+from ansible.module_utils.common.validation import check_required_together
+
+
+@pytest.fixture
+def together_terms():
+ return [
+ ['bananas', 'potatoes'],
+ ['cats', 'wolves']
+ ]
+
+
+def test_check_required_together(together_terms):
+ params = {
+ 'bananas': 'hello',
+ 'potatoes': 'this is here too',
+ 'dogs': 'haha',
+ }
+ assert check_required_together(together_terms, params) == []
+
+
+def test_check_required_together_missing(together_terms):
+ params = {
+ 'bananas': 'woohoo',
+ 'wolves': 'uh oh',
+ }
+ expected = "parameters are required together: bananas, potatoes"
+
+ with pytest.raises(TypeError) as e:
+ check_required_together(together_terms, params)
+
+ assert to_native(e.value) == expected
+
+
+def test_check_required_together_missing_none():
+ terms = None
+ params = {
+ 'foo': 'bar',
+ 'baz': 'buzz',
+ }
+ assert check_required_together(terms, params) == []
+
+
+def test_check_required_together_no_params(together_terms):
+ with pytest.raises(TypeError) as te:
+ check_required_together(together_terms, None)
+
+ assert "'NoneType' object is not iterable" in to_native(te.value)
diff --git a/test/units/module_utils/common/validation/test_check_type_bits.py b/test/units/module_utils/common/validation/test_check_type_bits.py
new file mode 100644
index 0000000..7f6b11d
--- /dev/null
+++ b/test/units/module_utils/common/validation/test_check_type_bits.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019 Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils._text import to_native
+from ansible.module_utils.common.validation import check_type_bits
+
+
+def test_check_type_bits():
+ test_cases = (
+ ('1', 1),
+ (99, 99),
+ (1.5, 2),
+ ('1.5', 2),
+ ('2b', 2),
+ ('2k', 2048),
+ ('2K', 2048),
+ ('1m', 1048576),
+ ('1M', 1048576),
+ ('1g', 1073741824),
+ ('1G', 1073741824),
+ (1073741824, 1073741824),
+ )
+ for case in test_cases:
+ assert case[1] == check_type_bits(case[0])
+
+
+def test_check_type_bits_fail():
+ test_cases = (
+ 'foo',
+ '2KB',
+ '1MB',
+ '1GB',
+ )
+ for case in test_cases:
+ with pytest.raises(TypeError) as e:
+ check_type_bits(case)
+ assert 'cannot be converted to a Bit value' in to_native(e.value)
diff --git a/test/units/module_utils/common/validation/test_check_type_bool.py b/test/units/module_utils/common/validation/test_check_type_bool.py
new file mode 100644
index 0000000..bd867dc
--- /dev/null
+++ b/test/units/module_utils/common/validation/test_check_type_bool.py
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019 Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils._text import to_native
+from ansible.module_utils.common.validation import check_type_bool
+
+
+def test_check_type_bool():
+ test_cases = (
+ (True, True),
+ (False, False),
+ ('1', True),
+ ('on', True),
+ (1, True),
+ ('0', False),
+ (0, False),
+ ('n', False),
+ ('f', False),
+ ('false', False),
+ ('true', True),
+ ('y', True),
+ ('t', True),
+ ('yes', True),
+ ('no', False),
+ ('off', False),
+ )
+ for case in test_cases:
+ assert case[1] == check_type_bool(case[0])
+
+
+def test_check_type_bool_fail():
+ default_test_msg = 'cannot be converted to a bool'
+ test_cases = (
+ ({'k1': 'v1'}, 'is not a valid bool'),
+ (3.14159, default_test_msg),
+ (-1, default_test_msg),
+ (-90810398401982340981023948192349081, default_test_msg),
+ (90810398401982340981023948192349081, default_test_msg),
+ )
+ for case in test_cases:
+ with pytest.raises(TypeError) as e:
+ check_type_bool(case)
+ assert 'cannot be converted to a bool' in to_native(e.value)
diff --git a/test/units/module_utils/common/validation/test_check_type_bytes.py b/test/units/module_utils/common/validation/test_check_type_bytes.py
new file mode 100644
index 0000000..6ff62dc
--- /dev/null
+++ b/test/units/module_utils/common/validation/test_check_type_bytes.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019 Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils._text import to_native
+from ansible.module_utils.common.validation import check_type_bytes
+
+
+def test_check_type_bytes():
+ test_cases = (
+ ('1', 1),
+ (99, 99),
+ (1.5, 2),
+ ('1.5', 2),
+ ('2b', 2),
+ ('2B', 2),
+ ('2k', 2048),
+ ('2K', 2048),
+ ('2KB', 2048),
+ ('1m', 1048576),
+ ('1M', 1048576),
+ ('1MB', 1048576),
+ ('1g', 1073741824),
+ ('1G', 1073741824),
+ ('1GB', 1073741824),
+ (1073741824, 1073741824),
+ )
+ for case in test_cases:
+ assert case[1] == check_type_bytes(case[0])
+
+
+def test_check_type_bytes_fail():
+ test_cases = (
+ 'foo',
+ '2kb',
+ '2Kb',
+ '1mb',
+ '1Mb',
+ '1gb',
+ '1Gb',
+ )
+ for case in test_cases:
+ with pytest.raises(TypeError) as e:
+ check_type_bytes(case)
+ assert 'cannot be converted to a Byte value' in to_native(e.value)
diff --git a/test/units/module_utils/common/validation/test_check_type_dict.py b/test/units/module_utils/common/validation/test_check_type_dict.py
new file mode 100644
index 0000000..75638c5
--- /dev/null
+++ b/test/units/module_utils/common/validation/test_check_type_dict.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019 Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils.common.validation import check_type_dict
+
+
+def test_check_type_dict():
+ test_cases = (
+ ({'k1': 'v1'}, {'k1': 'v1'}),
+ ('k1=v1,k2=v2', {'k1': 'v1', 'k2': 'v2'}),
+ ('k1=v1, k2=v2', {'k1': 'v1', 'k2': 'v2'}),
+ ('k1=v1, k2=v2, k3=v3', {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}),
+ ('{"key": "value", "list": ["one", "two"]}', {'key': 'value', 'list': ['one', 'two']})
+ )
+ for case in test_cases:
+ assert case[1] == check_type_dict(case[0])
+
+
+def test_check_type_dict_fail():
+ test_cases = (
+ 1,
+ 3.14159,
+ [1, 2],
+ 'a',
+ )
+ for case in test_cases:
+ with pytest.raises(TypeError):
+ check_type_dict(case)
diff --git a/test/units/module_utils/common/validation/test_check_type_float.py b/test/units/module_utils/common/validation/test_check_type_float.py
new file mode 100644
index 0000000..57837fa
--- /dev/null
+++ b/test/units/module_utils/common/validation/test_check_type_float.py
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019 Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils._text import to_native
+from ansible.module_utils.common.validation import check_type_float
+
+
+def test_check_type_float():
+ test_cases = (
+ ('1.5', 1.5),
+ ('''1.5''', 1.5),
+ (u'1.5', 1.5),
+ (1002, 1002.0),
+ (1.0, 1.0),
+ (3.141592653589793, 3.141592653589793),
+ ('3.141592653589793', 3.141592653589793),
+ (b'3.141592653589793', 3.141592653589793),
+ )
+ for case in test_cases:
+ assert case[1] == check_type_float(case[0])
+
+
+def test_check_type_float_fail():
+ test_cases = (
+ {'k1': 'v1'},
+ ['a', 'b'],
+ 'b',
+ )
+ for case in test_cases:
+ with pytest.raises(TypeError) as e:
+ check_type_float(case)
+ assert 'cannot be converted to a float' in to_native(e.value)
diff --git a/test/units/module_utils/common/validation/test_check_type_int.py b/test/units/module_utils/common/validation/test_check_type_int.py
new file mode 100644
index 0000000..22cedf6
--- /dev/null
+++ b/test/units/module_utils/common/validation/test_check_type_int.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019 Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils._text import to_native
+from ansible.module_utils.common.validation import check_type_int
+
+
+def test_check_type_int():
+ test_cases = (
+ ('1', 1),
+ (u'1', 1),
+ (1002, 1002),
+ )
+ for case in test_cases:
+ assert case[1] == check_type_int(case[0])
+
+
+def test_check_type_int_fail():
+ test_cases = (
+ {'k1': 'v1'},
+ (b'1', 1),
+ (3.14159, 3),
+ 'b',
+ )
+ for case in test_cases:
+ with pytest.raises(TypeError) as e:
+ check_type_int(case)
+ assert 'cannot be converted to an int' in to_native(e.value)
diff --git a/test/units/module_utils/common/validation/test_check_type_jsonarg.py b/test/units/module_utils/common/validation/test_check_type_jsonarg.py
new file mode 100644
index 0000000..e78e54b
--- /dev/null
+++ b/test/units/module_utils/common/validation/test_check_type_jsonarg.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019 Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils._text import to_native
+from ansible.module_utils.common.validation import check_type_jsonarg
+
+
+def test_check_type_jsonarg():
+ test_cases = (
+ ('a', 'a'),
+ ('a ', 'a'),
+ (b'99', b'99'),
+ (b'99 ', b'99'),
+ ({'k1': 'v1'}, '{"k1": "v1"}'),
+ ([1, 'a'], '[1, "a"]'),
+ ((1, 2, 'three'), '[1, 2, "three"]'),
+ )
+ for case in test_cases:
+ assert case[1] == check_type_jsonarg(case[0])
+
+
+def test_check_type_jsonarg_fail():
+ test_cases = (
+ 1.5,
+ 910313498012384012341982374109384098,
+ )
+ for case in test_cases:
+ with pytest.raises(TypeError) as e:
+ check_type_jsonarg(case)
+ assert 'cannot be converted to a json string' in to_native(e.value)
diff --git a/test/units/module_utils/common/validation/test_check_type_list.py b/test/units/module_utils/common/validation/test_check_type_list.py
new file mode 100644
index 0000000..3f7a9ee
--- /dev/null
+++ b/test/units/module_utils/common/validation/test_check_type_list.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019 Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils.common.validation import check_type_list
+
+
+def test_check_type_list():
+ test_cases = (
+ ([1, 2], [1, 2]),
+ (1, ['1']),
+ (['a', 'b'], ['a', 'b']),
+ ('a', ['a']),
+ (3.14159, ['3.14159']),
+ ('a,b,1,2', ['a', 'b', '1', '2'])
+ )
+ for case in test_cases:
+ assert case[1] == check_type_list(case[0])
+
+
+def test_check_type_list_failure():
+ test_cases = (
+ {'k1': 'v1'},
+ )
+ for case in test_cases:
+ with pytest.raises(TypeError):
+ check_type_list(case)
diff --git a/test/units/module_utils/common/validation/test_check_type_path.py b/test/units/module_utils/common/validation/test_check_type_path.py
new file mode 100644
index 0000000..d6ff433
--- /dev/null
+++ b/test/units/module_utils/common/validation/test_check_type_path.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019 Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+import re
+
+import os
+from ansible.module_utils.common.validation import check_type_path
+
+
+def mock_expand(value):
+ return re.sub(r'~|\$HOME', '/home/testuser', value)
+
+
+def test_check_type_path(monkeypatch):
+ monkeypatch.setattr(os.path, 'expandvars', mock_expand)
+ monkeypatch.setattr(os.path, 'expanduser', mock_expand)
+ test_cases = (
+ ('~/foo', '/home/testuser/foo'),
+ ('$HOME/foo', '/home/testuser/foo'),
+ ('/home/jane', '/home/jane'),
+ (u'/home/jané', u'/home/jané'),
+ )
+ for case in test_cases:
+ assert case[1] == check_type_path(case[0])
diff --git a/test/units/module_utils/common/validation/test_check_type_raw.py b/test/units/module_utils/common/validation/test_check_type_raw.py
new file mode 100644
index 0000000..988e554
--- /dev/null
+++ b/test/units/module_utils/common/validation/test_check_type_raw.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019 Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+
+from ansible.module_utils.common.validation import check_type_raw
+
+
+def test_check_type_raw():
+ test_cases = (
+ (1, 1),
+ ('1', '1'),
+ ('a', 'a'),
+ ({'k1': 'v1'}, {'k1': 'v1'}),
+ ([1, 2], [1, 2]),
+ (b'42', b'42'),
+ (u'42', u'42'),
+ )
+ for case in test_cases:
+ assert case[1] == check_type_raw(case[0])
diff --git a/test/units/module_utils/common/validation/test_check_type_str.py b/test/units/module_utils/common/validation/test_check_type_str.py
new file mode 100644
index 0000000..f10dad2
--- /dev/null
+++ b/test/units/module_utils/common/validation/test_check_type_str.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019 Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils._text import to_native
+from ansible.module_utils.common.validation import check_type_str
+
+
+TEST_CASES = (
+ ('string', 'string'),
+ (100, '100'),
+ (1.5, '1.5'),
+ ({'k1': 'v1'}, "{'k1': 'v1'}"),
+ ([1, 2, 'three'], "[1, 2, 'three']"),
+ ((1, 2,), '(1, 2)'),
+)
+
+
+@pytest.mark.parametrize('value, expected', TEST_CASES)
+def test_check_type_str(value, expected):
+ assert expected == check_type_str(value)
+
+
+@pytest.mark.parametrize('value, expected', TEST_CASES[1:])
+def test_check_type_str_no_conversion(value, expected):
+ with pytest.raises(TypeError) as e:
+ check_type_str(value, allow_conversion=False)
+ assert 'is not a string and conversion is not allowed' in to_native(e.value)
diff --git a/test/units/module_utils/common/validation/test_count_terms.py b/test/units/module_utils/common/validation/test_count_terms.py
new file mode 100644
index 0000000..f41dc40
--- /dev/null
+++ b/test/units/module_utils/common/validation/test_count_terms.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2019 Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+__metaclass__ = type
+
+import pytest
+
+from ansible.module_utils.common.validation import count_terms
+
+
+@pytest.fixture
+def params():
+ return {
+ 'name': 'bob',
+ 'dest': '/etc/hosts',
+ 'state': 'present',
+ 'value': 5,
+ }
+
+
+def test_count_terms(params):
+ check = set(('name', 'dest'))
+ assert count_terms(check, params) == 2
+
+
+def test_count_terms_str_input(params):
+ check = 'name'
+ assert count_terms(check, params) == 1
+
+
+def test_count_terms_tuple_input(params):
+ check = ('name', 'dest')
+ assert count_terms(check, params) == 2
+
+
+def test_count_terms_list_input(params):
+ check = ['name', 'dest']
+ assert count_terms(check, params) == 2