mirror of
https://github.com/ansible-collections/community.general.git
synced 2026-05-06 13:22:48 +00:00
Move utility functions out of basic.py (#51715)
Move the following methods to lib/anisble/module_utils/common/validation.py: - _count_terms() - _check_mutually_exclusive() - _check_required_one_of() - _check_required_together() - _check_required_by() - _check_required_arguments() - _check_required_if - fail_on_missing_params() --> create check_missing_parameters()
This commit is contained in:
@@ -94,13 +94,16 @@ def complex_argspec():
|
||||
foo=dict(required=True, aliases=['dup']),
|
||||
bar=dict(),
|
||||
bam=dict(),
|
||||
bing=dict(),
|
||||
bang=dict(),
|
||||
bong=dict(),
|
||||
baz=dict(fallback=(basic.env_fallback, ['BAZ'])),
|
||||
bar1=dict(type='bool'),
|
||||
bar3=dict(type='list', elements='path'),
|
||||
zardoz=dict(choices=['one', 'two']),
|
||||
zardoz2=dict(type='list', choices=['one', 'two', 'three']),
|
||||
)
|
||||
mut_ex = (('bar', 'bam'),)
|
||||
mut_ex = (('bar', 'bam'), ('bing', 'bang', 'bong'))
|
||||
req_to = (('bam', 'baz'),)
|
||||
|
||||
kwargs = dict(
|
||||
@@ -137,7 +140,7 @@ def options_argspec_list():
|
||||
elements='dict',
|
||||
options=options_spec,
|
||||
mutually_exclusive=[
|
||||
['bam', 'bam1']
|
||||
['bam', 'bam1'],
|
||||
],
|
||||
required_if=[
|
||||
['foo', 'hello', ['bam']],
|
||||
@@ -241,7 +244,7 @@ class TestComplexArgSpecs:
|
||||
assert isinstance(am.params['baz'], str)
|
||||
assert am.params['baz'] == 'test data'
|
||||
|
||||
@pytest.mark.parametrize('stdin', [{'foo': 'hello', 'bar': 'bad', 'bam': 'bad2'}], indirect=['stdin'])
|
||||
@pytest.mark.parametrize('stdin', [{'foo': 'hello', 'bar': 'bad', 'bam': 'bad2', 'bing': 'a', 'bang': 'b', 'bong': 'c'}], indirect=['stdin'])
|
||||
def test_fail_mutually_exclusive(self, capfd, stdin, complex_argspec):
|
||||
"""Fail because of mutually exclusive parameters"""
|
||||
with pytest.raises(SystemExit):
|
||||
@@ -251,7 +254,7 @@ class TestComplexArgSpecs:
|
||||
results = json.loads(out)
|
||||
|
||||
assert results['failed']
|
||||
assert results['msg'] == "parameters are mutually exclusive: bar, bam"
|
||||
assert results['msg'] == "parameters are mutually exclusive: bar|bam, bing|bang|bong"
|
||||
|
||||
@pytest.mark.parametrize('stdin', [{'foo': 'hello', 'bam': 'bad2'}], indirect=['stdin'])
|
||||
def test_fail_required_together(self, capfd, stdin, complex_argspec):
|
||||
@@ -403,7 +406,7 @@ class TestComplexOptions:
|
||||
({'foobar': [{"foo": "hello", "bam": "good", "invalid": "bad"}]}, 'module: invalid found in foobar. Supported parameters include'),
|
||||
# Mutually exclusive options found
|
||||
({'foobar': [{"foo": "test", "bam": "bad", "bam1": "bad", "baz": "req_to"}]},
|
||||
'parameters are mutually exclusive: bam, bam1 found in foobar'),
|
||||
'parameters are mutually exclusive: bam|bam1 found in foobar'),
|
||||
# required_if fails
|
||||
({'foobar': [{"foo": "hello", "bar": "bad"}]},
|
||||
'foo is hello but all of the following are missing: bam found in foobar'),
|
||||
@@ -427,7 +430,7 @@ class TestComplexOptions:
|
||||
'module: invalid found in foobar. Supported parameters include'),
|
||||
# Mutually exclusive options found
|
||||
({'foobar': {"foo": "test", "bam": "bad", "bam1": "bad", "baz": "req_to"}},
|
||||
'parameters are mutually exclusive: bam, bam1 found in foobar'),
|
||||
'parameters are mutually exclusive: bam|bam1 found in foobar'),
|
||||
# required_if fails
|
||||
({'foobar': {"foo": "hello", "bar": "bad"}},
|
||||
'foo is hello but all of the following are missing: bam found in foobar'),
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
# -*- 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 = "TypeError('parameters are mutually exclusive: string1|string2, box|fox|socks',)"
|
||||
|
||||
with pytest.raises(TypeError) as e:
|
||||
check_mutually_exclusive(mutually_exclusive_terms, params)
|
||||
assert 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 "TypeError: 'NoneType' object is not iterable" in to_native(te.error)
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user