summaryrefslogtreecommitdiffstats
path: root/ansible_collections/community/aws/tests/unit/mock/yaml_helper.py
blob: 8c99ef40f4425b761ffd96c10f17beff783ef20c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

__metaclass__ = type

import io

import yaml

from ansible.module_utils.six import PY3
from ansible.parsing.yaml.dumper import AnsibleDumper
from ansible.parsing.yaml.loader import AnsibleLoader


class YamlTestUtils(object):
    """Mixin class to combine with a unittest.TestCase subclass."""

    def _loader(self, stream):
        """Vault related tests will want to override this.

        Vault cases should setup a AnsibleLoader that has the vault password."""
        return AnsibleLoader(stream)

    def _dump_stream(self, obj, stream, dumper=None):
        """Dump to a py2-unicode or py3-string stream."""
        if PY3:
            return yaml.dump(obj, stream, Dumper=dumper)
        else:
            return yaml.dump(obj, stream, Dumper=dumper, encoding=None)

    def _dump_string(self, obj, dumper=None):
        """Dump to a py2-unicode or py3-string"""
        if PY3:
            return yaml.dump(obj, Dumper=dumper)
        else:
            return yaml.dump(obj, Dumper=dumper, encoding=None)

    def _dump_load_cycle(self, obj):
        # Each pass though a dump or load revs the 'generation'
        # obj to yaml string
        string_from_object_dump = self._dump_string(obj, dumper=AnsibleDumper)

        # wrap a stream/file like StringIO around that yaml
        stream_from_object_dump = io.StringIO(string_from_object_dump)
        loader = self._loader(stream_from_object_dump)
        # load the yaml stream to create a new instance of the object (gen 2)
        obj_2 = loader.get_data()

        # dump the gen 2 objects directory to strings
        string_from_object_dump_2 = self._dump_string(obj_2, dumper=AnsibleDumper)

        # The gen 1 and gen 2 yaml strings
        self.assertEqual(string_from_object_dump, string_from_object_dump_2)
        # the gen 1 (orig) and gen 2 py object
        self.assertEqual(obj, obj_2)

        # again! gen 3... load strings into py objects
        stream_3 = io.StringIO(string_from_object_dump_2)
        loader_3 = self._loader(stream_3)
        obj_3 = loader_3.get_data()

        string_from_object_dump_3 = self._dump_string(obj_3, dumper=AnsibleDumper)

        self.assertEqual(obj, obj_3)
        # should be transitive, but...
        self.assertEqual(obj_2, obj_3)
        self.assertEqual(string_from_object_dump, string_from_object_dump_3)

    def _old_dump_load_cycle(self, obj):
        """Dump the passed in object to yaml, load it back up, dump again, compare."""
        stream = io.StringIO()

        yaml_string = self._dump_string(obj, dumper=AnsibleDumper)
        self._dump_stream(obj, stream, dumper=AnsibleDumper)

        yaml_string_from_stream = stream.getvalue()

        # reset stream
        stream.seek(0)

        loader = self._loader(stream)
        # loader = AnsibleLoader(stream, vault_password=self.vault_password)
        obj_from_stream = loader.get_data()

        stream_from_string = io.StringIO(yaml_string)
        loader2 = self._loader(stream_from_string)
        # loader2 = AnsibleLoader(stream_from_string, vault_password=self.vault_password)
        obj_from_string = loader2.get_data()

        stream_obj_from_stream = io.StringIO()
        stream_obj_from_string = io.StringIO()

        if PY3:
            yaml.dump(obj_from_stream, stream_obj_from_stream, Dumper=AnsibleDumper)
            yaml.dump(obj_from_stream, stream_obj_from_string, Dumper=AnsibleDumper)
        else:
            yaml.dump(obj_from_stream, stream_obj_from_stream, Dumper=AnsibleDumper, encoding=None)
            yaml.dump(obj_from_stream, stream_obj_from_string, Dumper=AnsibleDumper, encoding=None)

        yaml_string_stream_obj_from_stream = stream_obj_from_stream.getvalue()
        yaml_string_stream_obj_from_string = stream_obj_from_string.getvalue()

        stream_obj_from_stream.seek(0)
        stream_obj_from_string.seek(0)

        if PY3:
            yaml_string_obj_from_stream = yaml.dump(obj_from_stream, Dumper=AnsibleDumper)
            yaml_string_obj_from_string = yaml.dump(obj_from_string, Dumper=AnsibleDumper)
        else:
            yaml_string_obj_from_stream = yaml.dump(obj_from_stream, Dumper=AnsibleDumper, encoding=None)
            yaml_string_obj_from_string = yaml.dump(obj_from_string, Dumper=AnsibleDumper, encoding=None)

        assert yaml_string == yaml_string_obj_from_stream
        assert yaml_string == yaml_string_obj_from_stream == yaml_string_obj_from_string
        assert (
            yaml_string
            == yaml_string_obj_from_stream
            == yaml_string_obj_from_string
            == yaml_string_stream_obj_from_stream
            == yaml_string_stream_obj_from_string
        )
        assert obj == obj_from_stream
        assert obj == obj_from_string
        assert obj == yaml_string_obj_from_stream
        assert obj == yaml_string_obj_from_string
        assert obj == obj_from_stream == obj_from_string == yaml_string_obj_from_stream == yaml_string_obj_from_string
        return {
            "obj": obj,
            "yaml_string": yaml_string,
            "yaml_string_from_stream": yaml_string_from_stream,
            "obj_from_stream": obj_from_stream,
            "obj_from_string": obj_from_string,
            "yaml_string_obj_from_string": yaml_string_obj_from_string,
        }