Esempio n. 1
0
def test_indexes_deserialization():
    @pb.model()
    class TestModel:
        field = pb.field(idx=2)

    obj = TestModel(field="value1")
    with pytest.raises(
            exc.SerializationError,
            match=
            r"serialization can't be completed because field\[2\] is going to be serialized, "
            r"but field\[1\] is not serialized."):
        pb.to_xml(obj)
Esempio n. 2
0
def test_nested_list_serialization():
    @pb.model
    class NestedModel:
        element = pb.field()

    @pb.model
    class TestModel:
        elements = pb.as_list(pb.nested(NestedModel))

    obj = TestModel(elements=[
        NestedModel(element="value1"),
        NestedModel(element="value2")
    ])

    expected_xml = '''<?xml version="1.0" encoding="utf-8"?>
    <TestModel>
        <NestedModel>
            <element>value1</element>
        </NestedModel>
        <NestedModel>
            <element>value2</element>
        </NestedModel>
    </TestModel>
    '''

    actual_xml = pb.to_xml(obj)

    assert not xmldiff.main.diff_texts(actual_xml, expected_xml.encode())
Esempio n. 3
0
def test_serialization_order():
    @pb.model(order=('element2', 'element1'))
    class TestModel:
        element1 = pb.field()
        element2 = pb.field()
        element3 = pb.field()
        element4 = pb.field()

    obj = TestModel(element1='value1',
                    element2='value2',
                    element3='value3',
                    element4='value4')

    expected_xml = '''<?xml version="1.0" encoding="utf-8"?>
    <TestModel>
        <element2>value2</element2>
        <element1>value1</element1>
        <element3>value3</element3>
        <element4>value4</element4>
    </TestModel>
    '''

    actual_xml = pb.to_xml(obj)

    assert not xmldiff.main.diff_texts(actual_xml, expected_xml.encode())
Esempio n. 4
0
def test_nested_serialization():
    @pb.model
    class NestedModel2:
        element = pb.field()

    @pb.model
    class NestedModel1:
        nested = pb.nested(NestedModel2)

    @pb.model
    class TestModel:
        nested = pb.nested(NestedModel1)

    obj = TestModel(nested=NestedModel1(nested=NestedModel2(element="value")))

    expected_xml = '''<?xml version="1.0" encoding="utf-8"?>
    <TestModel>
        <NestedModel1>
            <NestedModel2>
                <element>value</element>
            </NestedModel2>
        </NestedModel1>
    </TestModel>
    '''

    actual_xml = pb.to_xml(obj)

    assert not xmldiff.main.diff_texts(actual_xml, expected_xml.encode())
Esempio n. 5
0
def test_inheritance_serialization():
    @pb.model
    class TestBaseModel:
        element1 = pb.field()

    @pb.model
    class TestExtendedModel(TestBaseModel):
        element2 = pb.field()

    @pb.model
    class TestRootModel:
        model1 = pb.nested(TestBaseModel)
        model2 = pb.nested(TestExtendedModel)

    obj = TestRootModel(model1=TestBaseModel(element1="value1"),
                        model2=TestExtendedModel(element1="value2",
                                                 element2="value3"))

    expected_xml = '''<?xml version="1.0" encoding="utf-8"?>
    <TestRootModel>
        <TestBaseModel>
            <element1>value1</element1>
        </TestBaseModel>
        <TestExtendedModel>
            <element1>value2</element1>
            <element2>value3</element2>
        </TestExtendedModel>
    </TestRootModel>
    '''

    actual_xml = pb.to_xml(obj)

    assert not xmldiff.main.diff_texts(actual_xml, expected_xml.encode())
Esempio n. 6
0
def test_empty_model_serialization():
    @pb.model(name='test_model')
    class TestModel:
        element1 = pb.field(default=None)

    obj = TestModel()

    assert pb.to_xml(obj) is None
Esempio n. 7
0
def test_empty_model_serialization_with_list():
    @pb.model(name='test_model')
    class TestModel:
        element1 = pb.lst(pb.field())

    obj = TestModel(element1=[])

    assert pb.to_xml(obj) is None
Esempio n. 8
0
def test_indexes_deserialization():
    @pb.model(name='nested')
    class Nested:
        field = pb.field('element')

    @pb.model(name='root')
    class TestModel:
        field1 = pb.field('element', idx=1)
        field2 = pb.field('element', idx=2)

        field3 = pb.wrap('wrapper', pb.field('element'), idx=1)
        field4 = pb.wrap('wrapper', pb.field('element'), idx=2)

        nested1 = pb.nested(Nested, idx=1)
        nested2 = pb.nested(Nested, idx=2)

    obj = TestModel(
        field1="value1",
        field2="value2",
        field3="value3",
        field4="value4",
        nested1=Nested(field="value5"),
        nested2=Nested(field="value6"),
    )

    expected_xml = '''<?xml version="1.0" encoding="utf-8"?>
    <root>
        <element>value1</element>
        <element>value2</element>

        <wrapper>
            <element>value3</element>
        </wrapper>
        <wrapper>
            <element>value4</element>
        </wrapper>

        <nested>
            <element>value5</element>
        </nested>
        <nested>
            <element>value6</element>
        </nested>
    </root>
    '''

    actual_xml = pb.to_xml(obj)

    assert not xmldiff.main.diff_texts(actual_xml, expected_xml.encode())
Esempio n. 9
0
def test_empty_attribute_serialization():
    @pb.model(name='test_model')
    class TestModel:
        attribute1 = pb.attr()
        attribute2 = pb.attr(default=None)

    obj = TestModel(attribute1='value1')

    expected_xml = '''<?xml version="1.0" encoding="utf-8"?>
    <test_model attribute1="value1"/>
    '''

    actual_xml = pb.to_xml(obj)

    assert not xmldiff.main.diff_texts(actual_xml, expected_xml.encode())
Esempio n. 10
0
def test_attribute_serialization_with_name():
    @pb.model
    class TestModel:
        attrib1 = pb.attr(name='attribute1')
        attrib2 = pb.attr(name='attribute2')

    obj = TestModel(attrib1="value1", attrib2="value2")

    expected_xml = '''<?xml version="1.0" encoding="utf-8"?>
    <TestModel attribute1="value1" attribute2="value2"/>
    '''

    actual_xml = pb.to_xml(obj)

    assert not xmldiff.main.diff_texts(actual_xml, expected_xml.encode())
Esempio n. 11
0
def test_root_serialization():
    @pb.model(name='test_model')
    class TestModel:
        element1 = pb.field()

    obj = TestModel(element1='value1')

    expected_xml = '''<?xml version="1.0" encoding="utf-8"?>
    <test_model>
        <element1>value1</element1>
    </test_model>
    '''

    actual_xml = pb.to_xml(obj)

    assert not xmldiff.main.diff_texts(actual_xml, expected_xml.encode())
Esempio n. 12
0
def test_element_list_serialization():
    @pb.model
    class TestModel:
        element1 = pb.as_list(pb.field())

    obj = TestModel(element1=["value1", "value2"])

    expected_xml = '''<?xml version="1.0" encoding="utf-8"?>
    <TestModel>
        <element1>value1</element1>
        <element1>value2</element1>
    </TestModel>
    '''

    actual_xml = pb.to_xml(obj)

    assert not xmldiff.main.diff_texts(actual_xml, expected_xml.encode())
Esempio n. 13
0
def test_namespaces_serialization():
    @pb.model(ns='testns1', ns_map={'testns2': 'http://www.test2.org'})
    class TestModel:
        schema = pb.attribute('schemaLocation', ns='xsi')
        element1 = pb.field(ns='')
        element2 = pb.field()
        element3 = pb.field(ns='testns2')
        element5 = pb.wrap('element4', pb.field(ns=''))
        element6 = pb.wrap('element4',
                           pb.field(ns='testns2'),
                           ns_map={'testns2': 'http://www.test22.org'})

    obj = TestModel(
        schema='http://www.test.com schema.xsd',
        element1="value1",
        element2="value2",
        element3="value3",
        element5="value5",
        element6="value6",
    )

    expected_xml = '''<?xml version="1.0" encoding="utf-8"?>
    <testns1:TestModel xmlns:testns1="http://www.test1.org"
                       xmlns:testns2="http://www.test2.org"
                       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                       xsi:schemaLocation="http://www.test.com schema.xsd">
        <element1>value1</element1>
        <testns1:element2>value2</testns1:element2>
        <testns2:element3>value3</testns2:element3>
        <testns1:element4 xmlns:testns2="http://www.test22.org">
            <element5>value5</element5>
            <testns2:element6>value6</testns2:element6>
        </testns1:element4>
    </testns1:TestModel>
    '''

    actual_xml = pb.to_xml(obj,
                           ns_map={
                               'xsi':
                               'http://www.w3.org/2001/XMLSchema-instance',
                               'testns1': 'http://www.test1.org',
                               'testns2': 'http://www.test2.org',
                           })

    assert not xmldiff.main.diff_texts(actual_xml, expected_xml.encode())
Esempio n. 14
0
def test_element_serialization_with_name():
    @pb.model
    class TestModel:
        elem1 = pb.field(name='element1')
        elem2 = pb.field(name='element2')

    obj = TestModel(elem1="value1", elem2="value2")

    expected_xml = '''<?xml version="1.0" encoding="utf-8"?>
    <TestModel>
        <element1>value1</element1>
        <element2>value2</element2>
    </TestModel>
    '''

    actual_xml = pb.to_xml(obj)

    assert not xmldiff.main.diff_texts(actual_xml, expected_xml.encode())
Esempio n. 15
0
def test_empty_wrapper_serialization():
    @pb.model(name='test_model')
    class TestModel:
        element1 = pb.field()
        element2 = pb.wrap('wrapper1',
                           pb.wrap('wrapper2', pb.field(default=None)))

    obj = TestModel(element1='value1')

    expected_xml = '''<?xml version="1.0" encoding="utf-8"?>
    <test_model>
        <element1>value1</element1>
    </test_model>
    '''

    actual_xml = pb.to_xml(obj)

    assert not xmldiff.main.diff_texts(actual_xml, expected_xml.encode())
Esempio n. 16
0
def test_wrapper_serialization():
    @pb.model
    class TestModel:
        element1 = pb.wrap('wrapper1', pb.wrap('wrapper2', pb.field()))

    obj = TestModel(element1="value1")

    expected_xml = '''<?xml version="1.0" encoding="utf-8"?>
    <TestModel>
        <wrapper1>
            <wrapper2>
                <element1>value1</element1>
            </wrapper2>
        </wrapper1>
    </TestModel>
    '''

    actual_xml = pb.to_xml(obj)

    assert not xmldiff.main.diff_texts(actual_xml, expected_xml.encode())
Esempio n. 17
0
def test_list_of_list_serialization():
    @pb.model
    class TestModel:
        elements = pb.as_list(
            pb.wrap('element1', pb.as_list(pb.field('element2'))))

    obj = TestModel(elements=[["value1", "value2"], ["value3", "value4"]])

    expected_xml = '''<?xml version="1.0" encoding="utf-8"?>
    <TestModel>
        <element1>
            <element2>value1</element2>
            <element2>value2</element2>
        </element1>
        <element1>
            <element2>value3</element2>
            <element2>value4</element2>
        </element1>
    </TestModel>
    '''

    actual_xml = pb.to_xml(obj)

    assert not xmldiff.main.diff_texts(actual_xml, expected_xml.encode())
Esempio n. 18
0
def test_complex_xml_serialization():
    @pb.model(name='occupation',
              ns='data',
              ns_map={'data': 'http://www.test2.org'})
    class Occupation:
        title = pb.attr()
        address = pb.field()
        employees = pb.field(converter=int)

    @pb.model(name='user', ns='doc', ns_map={'doc': 'http://www.test1.org'})
    class User:
        name = pb.attr()
        surname = pb.attr()
        age = pb.attr(converter=int)

        phone = pb.wrap('contacts', pb.field())
        emails = pb.wrap('contacts', pb.as_list(pb.field(name='email')))

        passport_series = pb.wrap('documents',
                                  pb.wrap('passport', pb.attr('series')))
        passport_number = pb.wrap('documents',
                                  pb.wrap('passport', pb.attr('number')))

        occupations = pb.wrap('occupations',
                              pb.lst(pb.nested(Occupation)),
                              ns='data')

        citizenship = pb.field(default='RU')

    occupation1 = Occupation(
        title='yandex',
        address='Moscow',
        employees=8854,
    )
    occupation2 = Occupation(
        title='skbkontur',
        address='Yekaterinburg',
        employees=7742,
    )

    obj = User(
        name='Alexey',
        surname='Ivanov',
        age=26,
        phone='+79204563539',
        emails=['*****@*****.**', '*****@*****.**'],
        passport_series='3127',
        passport_number='836815',
        occupations=[occupation1, occupation2],
        citizenship='RU',
    )

    expected_xml = '''<?xml version="1.0" encoding="utf-8"?>
    <doc:envelope xmlns:doc="http://www.test1.org"
                  xmlns:data="http://www.test2.org">
        <doc:user name="Alexey" surname="Ivanov" age="26">

            <doc:contacts>
                <doc:phone>+79204563539</doc:phone>
                <doc:email>[email protected]</doc:email>
                <doc:email>[email protected]</doc:email>
            </doc:contacts>

            <doc:documents>
                <doc:passport series="3127" number="836815"/>
            </doc:documents>

            <data:occupations>
                <data:occupation title="yandex">
                    <data:address>Moscow</data:address>
                    <data:employees>8854</data:employees>
                </data:occupation>
                <data:occupation title="skbkontur">
                    <data:address>Yekaterinburg</data:address>
                    <data:employees>7742</data:employees>
                </data:occupation>
            </data:occupations>

            <doc:citizenship>RU</doc:citizenship>

        </doc:user>
    </doc:envelope>
    '''

    actual_xml = pb.to_xml(obj,
                           envelope='doc:envelope',
                           ns_map={
                               'doc': 'http://www.test1.org',
                               'data': 'http://www.test2.org',
                           })

    assert not xmldiff.main.diff_texts(actual_xml, expected_xml.encode())