diff options
Diffstat (limited to 'test/units/parsing/yaml/test_constructor.py')
-rw-r--r-- | test/units/parsing/yaml/test_constructor.py | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/test/units/parsing/yaml/test_constructor.py b/test/units/parsing/yaml/test_constructor.py new file mode 100644 index 0000000..717bf35 --- /dev/null +++ b/test/units/parsing/yaml/test_constructor.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +# (c) 2020 Matt Martz <matt@sivel.net> +# 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 yaml import MappingNode, Mark, ScalarNode +from yaml.constructor import ConstructorError + +import ansible.constants as C +from ansible.utils.display import Display +from ansible.parsing.yaml.constructor import AnsibleConstructor + + +@pytest.fixture +def dupe_node(): + tag = 'tag:yaml.org,2002:map' + scalar_tag = 'tag:yaml.org,2002:str' + mark = Mark(tag, 0, 0, 0, None, None) + node = MappingNode( + tag, + [ + ( + ScalarNode(tag=scalar_tag, value='bar', start_mark=mark), + ScalarNode(tag=scalar_tag, value='baz', start_mark=mark) + ), + ( + ScalarNode(tag=scalar_tag, value='bar', start_mark=mark), + ScalarNode(tag=scalar_tag, value='qux', start_mark=mark) + ), + ], + start_mark=mark + ) + + return node + + +class Capture: + def __init__(self): + self.called = False + self.calls = [] + + def __call__(self, *args, **kwargs): + self.called = True + self.calls.append(( + args, + kwargs + )) + + +def test_duplicate_yaml_dict_key_ignore(dupe_node, monkeypatch): + monkeypatch.setattr(C, 'DUPLICATE_YAML_DICT_KEY', 'ignore') + cap = Capture() + monkeypatch.setattr(Display(), 'warning', cap) + ac = AnsibleConstructor() + ac.construct_mapping(dupe_node) + assert not cap.called + + +def test_duplicate_yaml_dict_key_warn(dupe_node, monkeypatch): + monkeypatch.setattr(C, 'DUPLICATE_YAML_DICT_KEY', 'warn') + cap = Capture() + monkeypatch.setattr(Display(), 'warning', cap) + ac = AnsibleConstructor() + ac.construct_mapping(dupe_node) + assert cap.called + expected = [ + ( + ( + 'While constructing a mapping from tag:yaml.org,2002:map, line 1, column 1, ' + 'found a duplicate dict key (bar). Using last defined value only.', + ), + {} + ) + ] + assert cap.calls == expected + + +def test_duplicate_yaml_dict_key_error(dupe_node, monkeypatch, mocker): + monkeypatch.setattr(C, 'DUPLICATE_YAML_DICT_KEY', 'error') + ac = AnsibleConstructor() + pytest.raises(ConstructorError, ac.construct_mapping, dupe_node) |