Test_00_2   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 29
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 29
rs 10
c 0
b 0
f 0
wmc 5

5 Methods

Rating   Name   Duplication   Size   Complexity  
A test_00_container_to_etree__None() 0 2 1
A test_12_container_to_etree__text_attrs_tags() 0 6 1
A test_20_container_to_etree__child() 0 5 1
A test_10_container_to_etree__text_attrs() 0 5 1
A test_22_container_to_etree__children() 0 5 1
1
# -*- coding: utf-8 -*-
2
#
3
# Copyright (C) 2012 - 2017 Satoru SATOH <ssato @ redhat.com>
4
# License: MIT
5
#
6
# pylint: disable=missing-docstring,invalid-name,too-few-public-methods
7
# pylint: disable=ungrouped-imports,protected-access
8
from __future__ import absolute_import
9
import unittest
10
import anyconfig.backend.xml as TT
11
import anyconfig.compat
12
import tests.backend.common as TBC
13
14
from tests.common import dicts_equal, to_bytes
15
16
17
XML_W_NS_S = """
18
<a xmlns="http://example.com/ns/config"
19
   xmlns:val="http://example.com/ns/config/val">
20
   <b>1</b>
21
   <val:c>C</val:c>
22
</a>
23
"""
24
25
CNF_0 = {'config': {'@attrs': {'val:name': 'foo',
26
                               'xmlns': 'http://example.com/ns/cnf',
27
                               'xmlns:val': 'http://example.com/ns/cnf/val'},
28
                    'val:a': '0',
29
                    'val:b': {'@attrs': {'id': 'b0'}, '@text': 'bbb'},
30
                    'val:c': None,
31
                    'sect0': {'val:d': 'x, y, z'},
32
                    'list1': [{'item': '0'}, {'item': '1'}, {'item': '2'}],
33
                    'list2': {'@attrs': {'id': 'list2'},
34
                              '@children': [{'item': 'i'},
35
                                            {'item': 'j'}]}}}
36
CNF_0_S = to_bytes("""\
37
<?xml version="1.0" encoding="UTF-8"?>
38
<config xmlns="http://example.com/ns/cnf"
39
        xmlns:val="http://example.com/ns/cnf/val"
40
        val:name='foo'>
41
  <val:a>0</val:a>
42
  <val:b id="b0">bbb</val:b>
43
  <val:c/>
44
  <sect0>
45
    <val:d>x, y, z</val:d>
46
  </sect0>
47
  <list1>
48
    <item>0</item>
49
    <item>1</item>
50
    <item>2</item>
51
  </list1>
52
  <list2 id="list2">
53
    <item>i</item>
54
    <item>j</item>
55
  </list2>
56
</config>
57
""")
58
59
60
class Test_00(unittest.TestCase):
61
62
    def test_10__namespaces_from_file(self):
63
        ref = {"http://example.com/ns/config": '',
64
               "http://example.com/ns/config/val": "val"}
65
        xmlfile = anyconfig.compat.StringIO(XML_W_NS_S)
66
        self.assertTrue(dicts_equal(TT._namespaces_from_file(xmlfile), ref))
67
68
    def test_20__process_elem_text__whitespaces(self):
69
        (elem, dic, subdic) = (TT.ET.XML("<a> </a>"), {}, {})
70
        TT._process_elem_text(elem, dic, subdic)
71
        self.assertTrue(not dic)
72
        self.assertTrue(not subdic)
73
74
    def test_22__process_elem_text__wo_attrs_and_children(self):
75
        (elem, dic, subdic) = (TT.ET.XML("<a>A</a>"), {}, {})
76
        TT._process_elem_text(elem, dic, subdic, text="#text")
77
        self.assertTrue(dicts_equal(dic, {"a": 'A'}))
78
        self.assertTrue(not subdic)
79
80
    def test_22__process_elem_text__wo_attrs_and_children_parse(self):
81
        (elem, dic, subdic) = (TT.ET.XML("<a>A</a>"), {}, {})
82
        TT._process_elem_text(elem, dic, subdic, text="#text",
83
                              ac_parse_value=True)
84
        self.assertTrue(dicts_equal(dic, {"a": 'A'}))
85
        self.assertTrue(not subdic)
86
87
        (elem, dic, subdic) = (TT.ET.XML("<a>1</a>"), {}, {})
88
        TT._process_elem_text(elem, dic, subdic, text="#text",
89
                              ac_parse_value=True)
90
        self.assertTrue(dicts_equal(dic, {"a": 1}))
91
        self.assertTrue(not subdic)
92
93
    def test_24__process_elem_text__w_attrs(self):
94
        (elem, dic, subdic) = (TT.ET.XML("<a id='1'>A</a>"), {}, {})
95
        TT._process_elem_text(elem, dic, subdic, text="#text")
96
        self.assertTrue(not dic)
97
        self.assertTrue(dicts_equal(subdic, {"#text": 'A'}))
98
99
    def test_24__process_elem_text__w_children(self):
100
        (elem, dic, subdic) = (TT.ET.XML("<a>A<b/></a>"), {}, {})
101
        TT._process_elem_text(elem, dic, subdic, text="#text")
102
        self.assertTrue(not dic)
103
        self.assertTrue(dicts_equal(subdic, {"#text": 'A'}))
104
105
    def test_30__process_elem_attrs__wo_text_and_children(self):
106
        (elem, dic, subdic) = (TT.ET.XML("<a id='A'/>"), {}, {})
107
        TT._process_elem_attrs(elem, dic, subdic)
108
        self.assertTrue(not dic)
109
        self.assertTrue(dicts_equal(subdic, {"@attrs": {"id": 'A'}}))
110
111
    def test_32__process_elem_attrs__w_text(self):
112
        (elem, dic, subdic) = (TT.ET.XML("<a id='A'>AAA</a>"), {}, {})
113
        TT._process_elem_attrs(elem, dic, subdic)
114
        self.assertTrue(not dic)
115
        self.assertTrue(dicts_equal(subdic, {"@attrs": {"id": 'A'}}))
116
117
    def test_34__process_elem_attrs__merge_attrs(self):
118
        (elem, dic, subdic) = (TT.ET.XML("<a id='A'/>"), {}, {})
119
        TT._process_elem_attrs(elem, dic, subdic, merge_attrs=True)
120
        self.assertTrue(dicts_equal(dic, {"a": {"id": 'A'}}))
121
        self.assertTrue(not subdic)
122
123
    def test_36__process_elem_attrs__wo_text_and_children_parse(self):
124
        (elem, dic, subdic) = (TT.ET.XML("<a id='1'/>"), {}, {})
125
        TT._process_elem_attrs(elem, dic, subdic, ac_parse_value=True)
126
        self.assertTrue(not dic)
127
        self.assertTrue(dicts_equal(subdic, {"@attrs": {"id": 1}}))
128
129
        (elem, dic, subdic) = (TT.ET.XML("<a id='A'/>"), {}, {})
130
        TT._process_elem_attrs(elem, dic, subdic, ac_parse_value=True)
131
        self.assertTrue(not dic)
132
        self.assertTrue(dicts_equal(subdic, {"@attrs": {"id": 'A'}}))
133
134
        (elem, dic, subdic) = (TT.ET.XML("<a id='true'/>"), {}, {})
135
        TT._process_elem_attrs(elem, dic, subdic, ac_parse_value=True)
136
        self.assertTrue(not dic)
137
        self.assertTrue(dicts_equal(subdic, {"@attrs": {"id": True}}))
138
139
    def test_40__process_children_elems__root(self):
140
        (elem, dic, subdic) = (TT.ET.XML("<list><i>A</i><i>B</i></list>"), {},
141
                               {})
142
        TT._process_children_elems(elem, dic, subdic)
143
        self.assertTrue(dicts_equal(dic, {"list": [{"i": "A"}, {"i": "B"}]}))
144
        self.assertTrue(not subdic)
145
146
    def test_42__process_children_elems__w_attr(self):
147
        (elem, dic) = (TT.ET.XML("<list id='xyz'><i>A</i><i>B</i></list>"), {})
148
        subdic = {"id": "xyz"}
149
        ref = subdic.copy()
150
        ref.update({"#children": [{"i": "A"}, {"i": "B"}]})
151
152
        TT._process_children_elems(elem, dic, subdic, children="#children")
153
        self.assertTrue(not dic)
154
        self.assertTrue(dicts_equal(subdic, ref), subdic)
155
156
    def test_44__process_children_elems__w_children_have_unique_keys(self):
157
        (elem, dic, subdic) = (TT.ET.XML("<a><x>X</x><y>Y</y></a>"), {}, {})
158
        TT._process_children_elems(elem, dic, subdic)
159
        self.assertTrue(dicts_equal(dic, {"a": {"x": "X", "y": "Y"}}))
160
        self.assertTrue(not subdic)
161
162
    def test_46__process_children_elems__w_merge_attrs(self):
163
        elem = TT.ET.XML("<a z='Z'><x>X</x><y>Y</y></a>")
164
        dic = {"a": {"@attrs": {"z": "Z"}}}
165
        subdic = dic["a"]["@attrs"]
166
        TT._process_children_elems(elem, dic, subdic, merge_attrs=True)
167
        self.assertTrue(dicts_equal(dic, {"a": {"x": "X", "y": "Y",
168
                                                "z": "Z"}}), dic)
169
170
171
class Test_00_1(unittest.TestCase):
172
173
    def _assert_eq_dic_from_snippet(self, snippet, ref, **opts):
174
        self.assertEqual(TT.elem_to_container(TT.ET.XML(snippet), **opts), ref)
175
176
    def test_10_elem_to_container__None(self):
177
        self.assertEqual(TT.elem_to_container(None), dict())
178
179
    def test_10_root_to_container__None(self):
180
        self.assertEqual(TT.root_to_container(None), dict())
181
182
    def test_12_elem_to_container__empty(self):
183
        self._assert_eq_dic_from_snippet("<a/>", dict(a=None))
184
185
    def test_20_elem_to_container__attrs(self):
186
        ref = dict(a={"@attrs": dict(x='1', y='y')})
187
        self._assert_eq_dic_from_snippet("<a x='1' y='y'/>", ref)
188
189
    def test_30_elem_to_container__child(self):
190
        ref = dict(a=dict(b="b"))
191
        self._assert_eq_dic_from_snippet("<a><b>b</b></a>", ref)
192
193
    def test_32_elem_to_container__children__same_keys(self):
194
        ref = {'a': [{'b': '1'}, {'b': '2'}]}
195
        self._assert_eq_dic_from_snippet("<a><b>1</b><b>2</b></a>", ref)
196
197
    def test_34_elem_to_container__children(self):
198
        ref = {'a': {'b': 'b', 'c': 'c'}}
199
        self._assert_eq_dic_from_snippet("<a><b>b</b><c>c</c></a>", ref)
200
201
    def test_36_elem_to_container__children__same_keys_w_text(self):
202
        ref = {'a': {'@text': 'aaa', '@children': [{'b': '1'}, {'b': '2'}]}}
203
        self._assert_eq_dic_from_snippet("<a>aaa<b>1</b><b>2</b></a>", ref)
204
205
    def test_40_elem_to_container__text(self):
206
        self._assert_eq_dic_from_snippet("<a>A</a>", {'a': 'A'})
207
208
    def test_42_elem_to_container__text_attrs(self):
209
        ref = dict(a={"@attrs": {'x': 'X'}, "@text": "A"})
210
        self._assert_eq_dic_from_snippet("<a x='X'>A</a>", ref)
211
212
    def test_50_root_to_container__text_attrs_tags(self):
213
        ref = dict(a={"_attrs": {'x': 'X'}, "_text": "A"})
214
        tags = dict(attrs="_attrs", text="_text")
215
        self.assertEqual(TT.root_to_container(TT.ET.XML("<a x='X'>A</a>"),
216
                                              dict, {}, tags=tags),
217
                         ref)
218
219
220
def tree_to_string(tree):
221
    return TT.ET.tostring(tree.getroot())
222
223
224
class Test_00_2(unittest.TestCase):
225
226
    def test_00_container_to_etree__None(self):
227
        self.assertTrue(TT.container_to_etree(None) is None)
228
229
    def test_10_container_to_etree__text_attrs(self):
230
        ref = to_bytes('<a x="X" y="Y">A</a>')
231
        obj = dict(a={"@attrs": {'x': 'X', 'y': 'Y'}, "@text": "A"})
232
        res = TT.container_to_etree(obj)
233
        self.assertEqual(tree_to_string(res), ref)
234
235
    def test_12_container_to_etree__text_attrs_tags(self):
236
        ref = to_bytes('<a x="X" y="Y">A</a>')
237
        obj = dict(a={"_attrs": {'x': 'X', 'y': 'Y'}, "_text": "A"})
238
        tags = dict(attrs="_attrs", text="_text")
239
        res = TT.container_to_etree(obj, tags=tags)
240
        self.assertEqual(tree_to_string(res), ref)
241
242
    def test_20_container_to_etree__child(self):
243
        ref = to_bytes("<a><b>b</b></a>")
244
        obj = dict(a=dict(b="b"))
245
        res = TT.container_to_etree(obj)
246
        self.assertEqual(tree_to_string(res), ref)
247
248
    def test_22_container_to_etree__children(self):
249
        ref = to_bytes("<a><b>b</b><c>c</c></a>")
250
        obj = {'a': {'@children': [{'b': 'b'}, {'c': 'c'}]}}
251
        res = TT.container_to_etree(obj)
252
        self.assertEqual(tree_to_string(res), ref)
253
254
255
class HasParserTrait(TBC.HasParserTrait):
256
257
    psr = TT.Parser()
258
    cnf = CNF_0
259
    cnf_s = CNF_0_S
260
261
262
class Test_10(TBC.Test_10_dumps_and_loads, HasParserTrait):
263
264
    load_options = dump_options = dict(ac_parse_value=False)
265
266
267
class Test_20(TBC.Test_20_dump_and_load, HasParserTrait):
268
269
    def test_40_load_w_options(self):
270
        cnf = self.psr.load(self.ioi, ac_parse_value=False)
271
        self._assert_dicts_equal(cnf)
272
273
    def test_42_dump_with_special_option(self):
274
        ioi = self._to_ioinfo(self.cnf_path)
275
        self.psr.dump(self.cnf, ioi, ac_parse_value=False)
276
        cnf = self.psr.load(self.ioi)
277
        self._assert_dicts_equal(cnf)
278
279
# vim:sw=4:ts=4:et:
280