File: build_test.py

package info (click to toggle)
python-dict2xml 1.7.7-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 188 kB
  • sloc: python: 875; xml: 108; sh: 35; makefile: 7
file content (112 lines) | stat: -rw-r--r-- 3,815 bytes parent folder | download
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
import json
import os
from textwrap import dedent
from unittest import mock

import pytest

from dict2xml import Converter, DataSorter, dict2xml

examples = os.path.join(os.path.dirname(__file__), "examples")


class TestBuild:
    class TestConvenienceFunction:
        def test_it_creates_a_converter_with_args_and_kwargs_and_calls_build_on_it_with_provided_data(
            self,
        ):
            data = mock.Mock(name="data")
            serialized = mock.Mock(name="serialized")

            converter = mock.Mock(name="converter")
            converter.build.return_value = serialized

            FakeConverter = mock.Mock(name="Converter", return_value=converter)
            data_sorter = DataSorter.never()

            with mock.patch("dict2xml.Converter", FakeConverter):
                assert (
                    dict2xml(
                        data,
                        wrap="wrap",
                        indent="indent",
                        newlines=False,
                        iterables_repeat_wrap=False,
                        closed_tags_for=["one"],
                        data_sorter=data_sorter,
                    )
                    is serialized
                )

            FakeConverter.assert_called_once_with(wrap="wrap", indent="indent", newlines=False)
            converter.build.assert_called_once_with(
                data,
                iterables_repeat_wrap=False,
                closed_tags_for=["one"],
                data_sorter=data_sorter,
            )

    class TestJustWorking:
        @pytest.fixture()
        def assertResult(self):
            def assertResult(result, **kwargs):
                data = {"a": [1, 2, 3], "b": {"c": "d", "e": {"f": "g"}}, "d": 1}

                converter = Converter(wrap="all", **kwargs)
                print(converter.build(data))
                assert dedent(result).strip() == converter.build(data)

            return assertResult

        def test_with_both_indentation_and_newlines(self, assertResult):
            expected = """
                <all>
                  <a>1</a>
                  <a>2</a>
                  <a>3</a>
                  <b>
                    <c>d</c>
                    <e>
                      <f>g</f>
                    </e>
                  </b>
                  <d>1</d>
                </all>
            """
            assertResult(expected, indent="  ", newlines=True)

        def test_with_just_newlines(self, assertResult):
            expected = """
                <all>
                <a>1</a>
                <a>2</a>
                <a>3</a>
                <b>
                <c>d</c>
                <e>
                <f>g</f>
                </e>
                </b>
                <d>1</d>
                </all>
            """
            assertResult(expected, indent=None, newlines=True)

        def test_with_just_indentation(self, assertResult):
            # Indentation requires newlines to work
            expected = "<all><a>1</a><a>2</a><a>3</a><b><c>d</c><e><f>g</f></e></b><d>1</d></all>"
            assertResult(expected, indent="  ", newlines=False)

        def test_with_no_whitespace(self, assertResult):
            expected = "<all><a>1</a><a>2</a><a>3</a><b><c>d</c><e><f>g</f></e></b><d>1</d></all>"
            assertResult(expected, indent=None, newlines=False)

        def test_works_on_a_massive_complex_dictionary(self):
            with open(os.path.join(examples, "python_dict.json"), "r") as fle:
                data = json.load(fle)

            with open(os.path.join(examples, "result.xml"), "r") as fle:
                result = fle.read()

            converter = Converter(wrap="all", indent="  ", newlines=True)
            assert dedent(result).strip() == converter.build(data)