From 1489bf9190f0463392ea67c2370f7fd342014bfa Mon Sep 17 00:00:00 2001 From: Felix Fontein Date: Thu, 22 Oct 2020 21:05:59 +0200 Subject: [PATCH] Adds argspec tests for required, required_one_of and required_by (#72245) * Improve variable names. * Add test for required. * Add test for required_one_of. * Add test for required_by. --- .../targets/argspec/library/argspec.py | 32 ++++ .../targets/argspec/tasks/main.yml | 139 +++++++++++++++++- 2 files changed, 167 insertions(+), 4 deletions(-) diff --git a/test/integration/targets/argspec/library/argspec.py b/test/integration/targets/argspec/library/argspec.py index d14adf24f7e..724b34e0c85 100644 --- a/test/integration/targets/argspec/library/argspec.py +++ b/test/integration/targets/argspec/library/argspec.py @@ -11,6 +11,14 @@ from ansible.module_utils.basic import AnsibleModule def main(): module = AnsibleModule( { + 'required': { + 'required': True, + }, + 'required_one_of_one': {}, + 'required_one_of_two': {}, + 'required_by_one': {}, + 'required_by_two': {}, + 'required_by_three': {}, 'state': { 'type': 'str', 'choices': ['absent', 'present'], @@ -20,6 +28,24 @@ def main(): 'mapping': { 'type': 'dict', }, + 'required_one_of': { + 'required_one_of': [['thing', 'other']], + 'type': 'list', + 'elements': 'dict', + 'options': { + 'thing': {}, + 'other': {}, + }, + }, + 'required_by': { + 'required_by': {'thing': 'other'}, + 'type': 'list', + 'elements': 'dict', + 'options': { + 'thing': {}, + 'other': {}, + }, + }, 'required_together': { 'required_together': [['thing', 'other']], 'type': 'list', @@ -72,6 +98,12 @@ def main(): mutually_exclusive=( ('path', 'content'), ), + required_one_of=( + ('required_one_of_one', 'required_one_of_two'), + ), + required_by={ + 'required_by_one': ('required_by_two', 'required_by_three'), + }, required_together=( ('required_together_one', 'required_together_two'), ), diff --git a/test/integration/targets/argspec/tasks/main.yml b/test/integration/targets/argspec/tasks/main.yml index 9f89cfc0be5..6fcaa7b5014 100644 --- a/test/integration/targets/argspec/tasks/main.yml +++ b/test/integration/targets/argspec/tasks/main.yml @@ -1,46 +1,99 @@ +- argspec: + required: value + required_one_of_one: value + +- argspec: + required_one_of_one: value + register: argspec_required_fail + ignore_errors: true + +- argspec: + required: value + required_one_of_two: value + +- argspec: + required: value + register: argspec_required_one_of_fail + ignore_errors: true + +- argspec: + required: value + required_one_of_two: value + required_by_one: value + required_by_two: value + required_by_three: value + +- argspec: + required: value + required_one_of_two: value + required_by_one: value + required_by_two: value + register: argspec_required_by_fail + ignore_errors: true + - argspec: state: absent + required: value + required_one_of_one: value - argspec: state: present + required: value + required_one_of_one: value register: argspec_required_if_fail ignore_errors: true - argspec: state: present path: foo + required: value + required_one_of_one: value - argspec: state: present content: foo + required: value + required_one_of_one: value - argspec: state: present content: foo path: foo + required: value + required_one_of_one: value register: argspec_mutually_exclusive_fail ignore_errors: true - argspec: mapping: foo: bar + required: value + required_one_of_one: value register: argspec_good_mapping - argspec: mapping: foo=bar + required: value + required_one_of_one: value register: argspec_good_mapping_kv - argspec: mapping: !!str '{"foo": "bar"}' + required: value + required_one_of_one: value register: argspec_good_mapping_json - argspec: mapping: foo + required: value + required_one_of_one: value register: argspec_bad_mapping_string ignore_errors: true - argspec: mapping: 1 + required: value + required_one_of_one: value register: argspec_bad_mapping_int ignore_errors: true @@ -48,6 +101,8 @@ mapping: - foo - bar + required: value + required_one_of_one: value register: argspec_bad_mapping_list ignore_errors: true @@ -56,14 +111,20 @@ - thing: foo other: bar another: baz + required: value + required_one_of_one: value - argspec: required_together: - another: baz + required: value + required_one_of_one: value - argspec: required_together: - thing: foo + required: value + required_one_of_one: value register: argspec_required_together_fail ignore_errors: true @@ -71,33 +132,77 @@ required_together: - thing: foo other: bar + required: value + required_one_of_one: value - argspec: required_if: - thing: bar + required: value + required_one_of_one: value - argspec: required_if: - thing: foo other: bar + required: value + required_one_of_one: value - argspec: required_if: - thing: foo - register: argpsec_required_if_fail + required: value + required_one_of_one: value + register: argspec_required_if_fail_2 + ignore_errors: true + +- argspec: + required_one_of: + - thing: foo + other: bar + required: value + required_one_of_one: value + +- argspec: + required_one_of: + - {} + required: value + required_one_of_one: value + register: argspec_required_one_of_fail_2 + ignore_errors: true + +- argspec: + required_by: + - thing: foo + other: bar + required: value + required_one_of_one: value + +- argspec: + required_by: + - thing: foo + required: value + required_one_of_one: value + register: argspec_required_by_fail_2 ignore_errors: true - argspec: json: !!str '{"foo": "bar"}' + required: value + required_one_of_one: value register: argspec_good_json_string - argspec: json: foo: bar + required: value + required_one_of_one: value register: argspec_good_json_dict - argspec: json: 1 + required: value + required_one_of_one: value register: argspec_bad_json ignore_errors: true @@ -105,41 +210,63 @@ fail_on_missing_params: - needed_param needed_param: whatever + required: value + required_one_of_one: value - argspec: fail_on_missing_params: - needed_param + required: value + required_one_of_one: value register: argspec_fail_on_missing_params_bad ignore_errors: true - argspec: required_together_one: foo required_together_two: bar + required: value + required_one_of_one: value - argspec: required_together_one: foo - register: argspec_fail_required_together + required: value + required_one_of_one: value + register: argspec_fail_required_together_2 ignore_errors: true - argspec: suboptions_list_no_elements: - thing: foo + required: value + required_one_of_one: value register: argspec_suboptions_list_no_elements - argspec: choices_with_strings_like_bools: on + required: value + required_one_of_one: value register: argspec_choices_with_strings_like_bools_true - argspec: choices_with_strings_like_bools: 'on' + required: value + required_one_of_one: value register: argspec_choices_with_strings_like_bools_true_bool - argspec: choices_with_strings_like_bools: off + required: value + required_one_of_one: value register: argspec_choices_with_strings_like_bools_false - assert: that: + - argspec_required_fail is failed + + - argspec_required_one_of_fail is failed + + - argspec_required_by_fail is failed + - argspec_required_if_fail is failed - argspec_mutually_exclusive_fail is failed @@ -159,7 +286,11 @@ - argspec_required_together_fail is failed - - argpsec_required_if_fail is failed + - argspec_required_if_fail_2 is failed + + - argspec_required_one_of_fail_2 is failed + + - argspec_required_by_fail_2 is failed - argspec_good_json_string is successful - >- @@ -171,7 +302,7 @@ - argspec_fail_on_missing_params_bad is failed - - argspec_fail_required_together is failed + - argspec_fail_required_together_2 is failed - >- argspec_suboptions_list_no_elements.suboptions_list_no_elements.0 == {'thing': 'foo'}