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
|
# coding: spec
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")
describe "Build":
describe "Convenience Function":
it "Creates a Converter with *args and **kwargs and calls build on it with provided data":
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
)
describe "Just Working":
@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
it "with both indentation and newlines", 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)
it "with just newlines", 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)
it "with just indentation", 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)
it "with no whitespace", 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)
it "works on a massive, complex dictionary":
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)
|