ansible.utils/tests/unit/plugins/sub_plugins/validate/test_config.py

107 lines
2.9 KiB
Python

# (c) 2022 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.errors import AnsibleError
from ansible.module_utils._text import to_text
from ansible_collections.ansible.utils.plugins.plugin_utils.base.validate import _load_validator
@pytest.fixture(name="test_rule")
def criterion():
return {"name": "Rule name", "rule": "Rule regex", "action": "warn"}
@pytest.fixture(name="validator")
def config_validator():
engine, result = _load_validator(engine="ansible.utils.config", data="", criteria=[])
return engine
@pytest.mark.parametrize("key", ["name", "rule", "action"])
def test_check_args_missing_key(validator, test_rule, key):
del test_rule[key]
original = to_text(test_rule)
validator._criteria.append(test_rule)
try:
validator._check_args()
error = ""
except AnsibleError as exc:
error = to_text(exc)
assert error == 'Criteria {rule} missing "{key}" key'.format(rule=original, key=key)
def test_invalid_yaml(validator):
test_rule = "[This is not valid YAML"
validator._criteria = test_rule
try:
validator._check_args()
error = ""
except AnsibleError as exc:
error = to_text(exc)
expected_error = "'criteria' option value is invalid, value should be valid YAML."
# Don't test for exact error string, varies with Python version
assert error.startswith(expected_error)
def test_invalid_action(validator, test_rule):
test_rule["action"] = "flunge"
original = to_text(test_rule)
validator._criteria.append(test_rule)
try:
validator._check_args()
error = ""
except AnsibleError as exc:
error = to_text(exc)
expected_error = 'Action in criteria {item} is not one of "warn" or "fail"'.format(
item=original,
)
assert error == expected_error
def test_invalid_regex(validator, test_rule):
test_rule["rule"] = "reg(ex"
validator._criteria.append(test_rule)
try:
validator._check_args()
error = ""
except AnsibleError as exc:
error = to_text(exc)
expected_error = 'Failed to compile regex "reg(ex":'
# Don't test for exact error string, varies with Python version
assert error.startswith(expected_error)
def test_valid_warning(validator, test_rule):
validator._criteria.append(test_rule)
validator._data = "This line matches Rule regex."
validator.validate()
assert "errors" not in validator._result
assert len(validator._result["warnings"]) == 1
def test_valid_error(validator, test_rule):
test_rule["action"] = "fail"
validator._criteria.append(test_rule)
validator._data = "This line matches Rule regex."
validator.validate()
assert len(validator._result["errors"]) == 1
assert "warnings" not in validator._result