121 lines
4.2 KiB
Python
121 lines
4.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright 2020 Red Hat
|
|
# 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 unittest
|
|
from ansible_collections.ansible.utils.plugins.module_utils.common.index_of import (
|
|
index_of,
|
|
)
|
|
from ansible.template import Templar
|
|
|
|
|
|
class TestIndexOfFilter(unittest.TestCase):
|
|
def setUp(self):
|
|
self._tests = Templar(loader=None).environment.tests
|
|
|
|
def test_fail_no_qualfier(self):
|
|
obj, test, value = [1, 2], "@@", 1
|
|
with self.assertRaises(Exception) as exc:
|
|
index_of(obj, test, value, tests=self._tests)
|
|
self.assertIn("the test '@@' was not found", str(exc.exception))
|
|
obj, test, value, key = [{"a": 1}], "@@", 1, "a"
|
|
with self.assertRaises(Exception) as exc:
|
|
index_of(obj, test, value, key, tests=self._tests)
|
|
self.assertIn("the test '@@' was not found", str(exc.exception))
|
|
|
|
def test_fail_mixed_list(self):
|
|
obj, test, value, key = [{"a": "b"}, True, 1, "a"], "==", "b", "a"
|
|
with self.assertRaises(Exception) as exc:
|
|
index_of(obj, test, value, key, tests=self._tests)
|
|
self.assertIn("required to be dictionaries", str(exc.exception))
|
|
|
|
def test_fail_key_not_valid(self):
|
|
obj, test, value, key = [{"a": "b"}], "==", "b", [1, 2]
|
|
with self.assertRaises(Exception) as exc:
|
|
index_of(obj, test, value, key, tests=self._tests)
|
|
self.assertIn("Unknown key type", str(exc.exception))
|
|
|
|
def test_fail_on_missing(self):
|
|
obj, test, value, key = [{"a": True}, {"c": False}], "==", True, "a"
|
|
with self.assertRaises(Exception) as exc:
|
|
index_of(
|
|
obj, test, value, key, fail_on_missing=True, tests=self._tests
|
|
)
|
|
self.assertIn("'a' was not found", str(exc.exception))
|
|
|
|
def test_just_test(self):
|
|
"""Limit to jinja < 2.11 tests"""
|
|
objs = [
|
|
# ([True], "true", 0),
|
|
# ([False], "not false", []),
|
|
# ([False, 5], "boolean", 0),
|
|
# ([0, False], "false", 1),
|
|
([3, 4], "not even", 0),
|
|
([3, 4], "even", 1),
|
|
([3, 3], "even", []),
|
|
([3, 3, 3, 4], "odd", [0, 1, 2]),
|
|
# ([3.3, 3.4], "float", [0, 1]),
|
|
]
|
|
for entry in objs:
|
|
obj, test, answer = entry
|
|
result = index_of(obj, test, tests=self._tests)
|
|
expected = answer
|
|
self.assertEqual(result, expected)
|
|
|
|
def test_simple_lists(self):
|
|
objs = [
|
|
([1, 2, 3], "==", 2, 1),
|
|
(["a", "b", "c"], "eq", "c", 2),
|
|
([True, False, 0, 1], "equalto", False, [1, 2]),
|
|
([True, False, "0", "1"], "==", False, 1),
|
|
([True, False, "", "1"], "==", False, 1),
|
|
([True, False, "", "1"], "in", False, 1),
|
|
([True, False, "", "1", "a"], "in", [False, "1"], [1, 3]),
|
|
([1, 2, 3, "a", "b", "c"], "!=", "c", [0, 1, 2, 3, 4]),
|
|
([1, 2, 3], "!<", 3, 2),
|
|
]
|
|
for entry in objs:
|
|
obj, test, value, answer = entry
|
|
result = index_of(obj, test, value, tests=self._tests)
|
|
expected = answer
|
|
self.assertEqual(result, expected)
|
|
|
|
def test_simple_dict(self):
|
|
objs = [
|
|
([{"a": 1}], "==", 1, "a", 0),
|
|
([{"a": 1}], "==", 1, "b", []),
|
|
([{"a": 1}], "==", 2, "a", []),
|
|
(
|
|
[{"a": 1}, {"a": 1}, {"a": 1}, {"a": 2}],
|
|
"==",
|
|
1,
|
|
"a",
|
|
[0, 1, 2],
|
|
),
|
|
(
|
|
[{"a": "abc"}, {"a": "def"}, {"a": "ghi"}, {"a": "jkl"}],
|
|
"ansible.builtin.match",
|
|
"^a",
|
|
"a",
|
|
0,
|
|
),
|
|
(
|
|
[{"a": "abc"}, {"a": "def"}, {"a": "ghi"}, {"a": "jkl"}],
|
|
"ansible.builtin.search",
|
|
"e",
|
|
"a",
|
|
1,
|
|
),
|
|
]
|
|
for entry in objs:
|
|
obj, test, value, key, answer = entry
|
|
result = index_of(obj, test, value, key, tests=self._tests)
|
|
self.assertEqual(result, answer)
|