debian-zeep/tests/test_xsd_valueobjects.py

441 lines
12 KiB
Python

import json
import pickle
import pytest
import six
from lxml.etree import QName
from zeep import xsd
from zeep.xsd import valueobjects
def test_simple_args():
xsd_type = xsd.ComplexType(
xsd.Sequence([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String())
]))
args = tuple(['value-1', 'value-2'])
kwargs = {}
result = valueobjects._process_signature(xsd_type, args, kwargs)
assert result == {
'item_1': 'value-1',
'item_2': 'value-2',
}
def test_simple_args_attributes():
xsd_type = xsd.ComplexType(
xsd.Sequence([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String())
]),
[
xsd.Attribute('attr_1', xsd.String())
]
)
args = tuple(['value-1', 'value-2', 'bla'])
kwargs = {}
result = valueobjects._process_signature(xsd_type, args, kwargs)
assert result == {
'item_1': 'value-1',
'item_2': 'value-2',
'attr_1': 'bla',
}
def test_simple_args_attributes_as_kwargs():
xsd_type = xsd.ComplexType(
xsd.Sequence([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String())
]),
[
xsd.Attribute('attr_1', xsd.String())
]
)
args = tuple(['value-1', 'value-2'])
kwargs = {'attr_1': 'bla'}
result = valueobjects._process_signature(xsd_type, args, kwargs)
assert result == {
'item_1': 'value-1',
'item_2': 'value-2',
'attr_1': 'bla',
}
def test_simple_args_too_many():
xsd_type = xsd.ComplexType(
xsd.Sequence([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String())
]))
args = tuple(['value-1', 'value-2', 'value-3'])
kwargs = {}
try:
valueobjects._process_signature(xsd_type, args, kwargs)
except TypeError as exc:
assert six.text_type(exc) == (
'__init__() takes at most 2 positional arguments (3 given)')
else:
assert False, "TypeError not raised"
def test_simple_args_too_few():
xsd_type = xsd.ComplexType(
xsd.Sequence([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String())
]))
args = tuple(['value-1'])
kwargs = {}
valueobjects._process_signature(xsd_type, args, kwargs)
def test_simple_kwargs():
xsd_type = xsd.ComplexType(
xsd.Sequence([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String())
]))
args = tuple([])
kwargs = {'item_1': 'value-1', 'item_2': 'value-2'}
result = valueobjects._process_signature(xsd_type, args, kwargs)
assert result == {
'item_1': 'value-1',
'item_2': 'value-2',
}
def test_simple_mixed():
xsd_type = xsd.ComplexType(
xsd.Sequence([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String())
]))
args = tuple(['value-1'])
kwargs = {'item_2': 'value-2'}
result = valueobjects._process_signature(xsd_type, args, kwargs)
assert result == {
'item_1': 'value-1',
'item_2': 'value-2',
}
def test_choice():
xsd_type = xsd.ComplexType(
xsd.Sequence([
xsd.Choice([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String())
])
])
)
args = tuple([])
kwargs = {'item_2': 'value-2'}
result = valueobjects._process_signature(xsd_type, args, kwargs)
assert result == {'item_1': None, 'item_2': 'value-2'}
def test_choice_max_occurs_simple_interface():
fields = xsd.ComplexType(
xsd.Sequence([
xsd.Choice([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String())
], max_occurs=2)
])
)
args = tuple([])
kwargs = {
'_value_1': [{'item_1': 'foo'}, {'item_2': 'bar'}]
}
result = valueobjects._process_signature(fields, args, kwargs)
assert result == {
'_value_1': [
{'item_1': 'foo'},
{'item_2': 'bar'},
]
}
def test_choice_max_occurs():
fields = xsd.ComplexType(
xsd.Sequence([
xsd.Choice([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String())
], max_occurs=3)
])
)
args = tuple([])
kwargs = {
'_value_1': [
{'item_1': 'foo'}, {'item_2': 'bar'}, {'item_1': 'bla'}
]
}
result = valueobjects._process_signature(fields, args, kwargs)
assert result == {
'_value_1': [
{'item_1': 'foo'},
{'item_2': 'bar'},
{'item_1': 'bla'},
]
}
def test_choice_max_occurs_on_choice():
xsd_type = xsd.ComplexType(
xsd.Sequence([
xsd.Choice([
xsd.Element('item_1', xsd.String(), max_occurs=2),
xsd.Element('item_2', xsd.String())
], max_occurs=2)
])
)
args = tuple([])
kwargs = {
'_value_1': [
{'item_1': ['foo', 'bar']},
{'item_2': 'bla'},
]
}
result = valueobjects._process_signature(xsd_type, args, kwargs)
assert result == {
'_value_1': [
{'item_1': ['foo', 'bar']},
{'item_2': 'bla'}
]
}
def test_choice_mixed():
xsd_type = xsd.ComplexType(
xsd.Sequence([
xsd.Choice([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String()),
]),
xsd.Element('item_2', xsd.String())
]),
qname=QName('http://tests.python-zeep.org', 'container')
)
expected = '{http://tests.python-zeep.org}container(({item_1: xsd:string} | {item_2: xsd:string}), item_2__1: xsd:string)'
assert xsd_type.signature() == expected
args = tuple([])
kwargs = {'item_1': 'value-1', 'item_2__1': 'value-2'}
result = valueobjects._process_signature(xsd_type, args, kwargs)
assert result == {
'item_1': 'value-1',
'item_2': None,
'item_2__1': 'value-2',
}
def test_choice_sequences_simple():
xsd_type = xsd.ComplexType(
xsd.Sequence([
xsd.Choice([
xsd.Sequence([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String())
]),
xsd.Sequence([
xsd.Element('item_3', xsd.String()),
xsd.Element('item_4', xsd.String())
]),
])
])
)
args = tuple([])
kwargs = {'item_1': 'value-1', 'item_2': 'value-2'}
result = valueobjects._process_signature(xsd_type, args, kwargs)
assert result == {
'item_1': 'value-1',
'item_2': 'value-2',
'item_3': None,
'item_4': None,
}
def test_choice_sequences_no_match():
xsd_type = xsd.ComplexType(
xsd.Sequence([
xsd.Choice([
xsd.Sequence([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String())
]),
xsd.Sequence([
xsd.Element('item_3', xsd.String()),
xsd.Element('item_4', xsd.String())
]),
])
])
)
args = tuple([])
with pytest.raises(TypeError):
kwargs = {'item_1': 'value-1', 'item_3': 'value-3'}
valueobjects._process_signature(xsd_type, args, kwargs)
def test_choice_sequences_no_match_last():
xsd_type = xsd.ComplexType(
xsd.Sequence([
xsd.Choice([
xsd.Sequence([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String())
]),
xsd.Sequence([
xsd.Element('item_3', xsd.String()),
xsd.Element('item_4', xsd.String())
]),
])
])
)
args = tuple([])
with pytest.raises(TypeError):
kwargs = {'item_2': 'value-2', 'item_4': 'value-4'}
valueobjects._process_signature(xsd_type, args, kwargs)
def test_choice_sequences_no_match_nested():
xsd_type = xsd.ComplexType(
xsd.Sequence([
xsd.Choice([
xsd.Sequence([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String())
]),
])
])
)
args = tuple([])
kwargs = {'item_1': 'value-1'}
value = valueobjects._process_signature(xsd_type, args, kwargs)
assert value == {
'item_1': 'value-1',
'item_2': None,
}
def test_choice_sequences_optional_elms():
xsd_type = xsd.ComplexType(
xsd.Sequence([
xsd.Choice([
xsd.Sequence([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String(), min_occurs=0)
]),
xsd.Sequence([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String()),
xsd.Element('item_3', xsd.String())
]),
])
])
)
args = tuple([])
kwargs = {'item_1': 'value-1'}
result = valueobjects._process_signature(xsd_type, args, kwargs)
assert result == {
'item_1': 'value-1',
'item_2': None,
'item_3': None,
}
def test_choice_sequences_max_occur():
xsd_type = xsd.ComplexType(
xsd.Sequence([
xsd.Choice([
xsd.Sequence([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String())
]),
xsd.Sequence([
xsd.Element('item_2', xsd.String()),
xsd.Element('item_3', xsd.String()),
]),
], max_occurs=2)
]),
)
args = tuple([])
kwargs = {
'_value_1': [
{'item_1': 'value-1', 'item_2': 'value-2'},
{'item_2': 'value-2', 'item_3': 'value-3'},
]
}
result = valueobjects._process_signature(xsd_type, args, kwargs)
assert result == {
'_value_1': [
{'item_1': 'value-1', 'item_2': 'value-2'},
{'item_2': 'value-2', 'item_3': 'value-3'},
]
}
def test_choice_sequences_init_dict():
xsd_type = xsd.ComplexType(
xsd.Sequence([
xsd.Choice([
xsd.Sequence([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String())
]),
xsd.Sequence([
xsd.Element('item_2', xsd.String()),
xsd.Element('item_3', xsd.String()),
]),
], max_occurs=2)
]),
)
args = tuple([])
kwargs = {
'_value_1': {'item_1': 'value-1', 'item_2': 'value-2'},
}
result = valueobjects._process_signature(xsd_type, args, kwargs)
assert result == {
'_value_1': [
{'item_1': 'value-1', 'item_2': 'value-2'}
]
}
def test_pickle():
xsd_type = xsd.ComplexType(
xsd.Sequence([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String())
]))
obj = xsd_type(item_1='x', item_2='y')
data = pickle.dumps(obj)
obj_rt = pickle.loads(data)
assert obj.item_1 == 'x'
assert obj.item_2 == 'y'
assert obj_rt.item_1 == 'x'
assert obj_rt.item_2 == 'y'
def test_json():
xsd_type = xsd.ComplexType(
xsd.Sequence([
xsd.Element('item_1', xsd.String()),
xsd.Element('item_2', xsd.String())
]))
obj = xsd_type(item_1='x', item_2='y')
assert obj.__json__() == {
'item_1': 'x',
'item_2': 'y',
}