summaryrefslogtreecommitdiffstats
path: root/test/units/parsing/yaml/test_constructor.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/units/parsing/yaml/test_constructor.py')
-rw-r--r--test/units/parsing/yaml/test_constructor.py84
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)