debian-zeep/tests/test_wsdl.py

904 lines
34 KiB
Python

import io
import pytest
import requests_mock
from lxml import etree
from pretend import stub
from six import StringIO
from tests.utils import DummyTransport, assert_nodes_equal
from zeep import Client, wsdl
from zeep.transports import Transport
@pytest.mark.requests
def test_parse_soap_wsdl():
client = Client('tests/wsdl_files/soap.wsdl', transport=Transport(),)
response = """
<?xml version="1.0"?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:stoc="http://example.com/stockquote.xsd">
<soapenv:Header/>
<soapenv:Body>
<stoc:TradePrice>
<price>120.123</price>
</stoc:TradePrice>
</soapenv:Body>
</soapenv:Envelope>
""".strip()
client.set_ns_prefix('stoc', 'http://example.com/stockquote.xsd')
with requests_mock.mock() as m:
m.post('http://example.com/stockquote', text=response)
account_type = client.get_type('stoc:account')
account = account_type(id=100)
account.user = 'mvantellingen'
country = client.get_element('stoc:country').type()
country.name = 'The Netherlands'
country.code = 'NL'
result = client.service.GetLastTradePrice(
tickerSymbol='foobar',
account=account,
country=country)
assert result == 120.123
request = m.request_history[0]
# Compare request body
expected = """
<soap-env:Envelope
xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:stoc="http://example.com/stockquote.xsd">
<soap-env:Body>
<stoc:TradePriceRequest>
<tickerSymbol>foobar</tickerSymbol>
<account>
<id>100</id>
<user>mvantellingen</user>
</account>
<stoc:country>
<name>The Netherlands</name>
<code>NL</code>
</stoc:country>
</stoc:TradePriceRequest>
</soap-env:Body>
</soap-env:Envelope>
"""
assert_nodes_equal(expected, request.body)
@pytest.mark.requests
def test_parse_soap_header_wsdl():
client = Client('tests/wsdl_files/soap_header.wsdl', transport=Transport(),)
response = """
<?xml version="1.0"?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:stoc="http://example.com/stockquote.xsd">
<soapenv:Header/>
<soapenv:Body>
<stoc:TradePrice>
<price>120.123</price>
</stoc:TradePrice>
</soapenv:Body>
</soapenv:Envelope>
""".strip()
with requests_mock.mock() as m:
m.post('http://example.com/stockquote', text=response)
result = client.service.GetLastTradePrice(
tickerSymbol='foobar',
_soapheaders={
'header': {
'username': 'ikke',
'password': 'oeh-is-geheim!',
}
})
assert result.body.price == 120.123
assert result.header.body is None
request = m.request_history[0]
# Compare request body
expected = """
<soap-env:Envelope
xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:Header>
<ns0:Authentication xmlns:ns0="http://example.com/stockquote.xsd">
<username>ikke</username>
<password>oeh-is-geheim!</password>
</ns0:Authentication>
</soap-env:Header>
<soap-env:Body>
<ns0:TradePriceRequest xmlns:ns0="http://example.com/stockquote.xsd">
<tickerSymbol>foobar</tickerSymbol>
</ns0:TradePriceRequest>
</soap-env:Body>
</soap-env:Envelope>
"""
assert_nodes_equal(expected, request.body)
def test_parse_types_multiple_schemas():
content = StringIO("""
<?xml version="1.0"?>
<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:s1="http://microsoft.com/wsdl/types/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://tests.python-zeep.org/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="http://tests.python-zeep.org/">
<wsdl:types>
<xsd:schema elementFormDefault="qualified"
xmlns:s1="http://microsoft.com/wsdl/types/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://tests.python-zeep.org//"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://tests.python-zeep.org/">
<xsd:import namespace="http://microsoft.com/wsdl/types/" />
<xsd:element name="foobardiedar" type="s1:guid"/>
</xsd:schema>
<xsd:schema elementFormDefault="qualified"
targetNamespace="http://microsoft.com/wsdl/types/">
<xsd:simpleType name="guid">
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
</xsd:schema>
</wsdl:types>
</wsdl:definitions>
""".strip())
assert wsdl.Document(content, None)
def test_parse_types_nsmap_issues():
content = StringIO("""
<?xml version="1.0"?>
<wsdl:definitions targetNamespace="urn:ec.europa.eu:taxud:vies:services:checkVat"
xmlns:tns1="urn:ec.europa.eu:taxud:vies:services:checkVat:types"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:impl="urn:ec.europa.eu:taxud:vies:services:checkVat"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/">
<wsdl:types>
<xsd:schema attributeFormDefault="qualified"
elementFormDefault="qualified"
targetNamespace="urn:ec.europa.eu:taxud:vies:services:checkVat:types"
xmlns="urn:ec.europa.eu:taxud:vies:services:checkVat:types">
<xsd:element name="checkVatApprox">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="0"
name="traderCompanyType"
type="tns1:companyTypeCode"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="companyTypeCode">
<xsd:restriction base="xsd:string">
<xsd:pattern value="[A-Z]{2}\-[1-9][0-9]?"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
</wsdl:types>
</wsdl:definitions>
""".strip())
assert wsdl.Document(content, None)
@pytest.mark.requests
def test_parse_soap_import_wsdl():
client = stub(transport=Transport(), wsse=None)
content = io.open(
'tests/wsdl_files/soap-enc.xsd', 'r', encoding='utf-8').read()
with requests_mock.mock() as m:
m.get('http://schemas.xmlsoap.org/soap/encoding/', text=content)
obj = wsdl.Document(
'tests/wsdl_files/soap_import_main.wsdl', transport=client.transport)
assert len(obj.services) == 1
assert obj.types.is_empty is False
obj.dump()
def test_multiple_extension():
content = StringIO("""
<?xml version="1.0"?>
<wsdl:definitions
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/">
<wsdl:types>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tests.python-zeep.org/a"
targetNamespace="http://tests.python-zeep.org/a"
xmlns:b="http://tests.python-zeep.org/b"
elementFormDefault="qualified">
<xs:import namespace="http://tests.python-zeep.org/b"/>
<xs:complexType name="type_a">
<xs:complexContent>
<xs:extension base="b:type_b"/>
</xs:complexContent>
</xs:complexType>
<xs:element name="typetje" type="tns:type_a"/>
</xs:schema>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tests.python-zeep.org/b"
targetNamespace="http://tests.python-zeep.org/b"
xmlns:c="http://tests.python-zeep.org/c"
elementFormDefault="qualified">
<xs:import namespace="http://tests.python-zeep.org/c"/>
<xs:complexType name="type_b">
<xs:complexContent>
<xs:extension base="c:type_c"/>
</xs:complexContent>
</xs:complexType>
</xs:schema>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tests.python-zeep.org/c"
targetNamespace="http://tests.python-zeep.org/c"
elementFormDefault="qualified">
<xs:complexType name="type_c">
<xs:complexContent>
<xs:extension base="tns:type_d"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="type_d">
<xs:attribute name="wat" type="xs:string" />
</xs:complexType>
</xs:schema>
</wsdl:types>
</wsdl:definitions>
""".strip())
document = wsdl.Document(content, None)
type_a = document.types.get_element('ns0:typetje')
type_a(wat='x')
type_a = document.types.get_type('ns0:type_a')
type_a(wat='x')
def test_create_import_schema(recwarn):
content = StringIO("""
<?xml version="1.0"?>
<wsdl:definitions
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/">
<wsdl:types>
<xsd:schema>
<xsd:import namespace="http://tests.python-zeep.org/a"
schemaLocation="a.xsd"/>
</xsd:schema>
<xsd:schema>
<xsd:import namespace="http://tests.python-zeep.org/b"
schemaLocation="b.xsd"/>
</xsd:schema>
</wsdl:types>
</wsdl:definitions>
""".strip())
schema_node_a = etree.fromstring("""
<?xml version="1.0"?>
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tests.python-zeep.org/a"
targetNamespace="http://tests.python-zeep.org/a"
xmlns:b="http://tests.python-zeep.org/b"
elementFormDefault="qualified">
</xsd:schema>
""".strip())
schema_node_b = etree.fromstring("""
<?xml version="1.0"?>
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tests.python-zeep.org/b"
targetNamespace="http://tests.python-zeep.org/b"
elementFormDefault="qualified">
<xsd:element name="global" type="xsd:string"/>
</xsd:schema>
""".strip())
transport = DummyTransport()
transport.bind('http://tests.python-zeep.org/a.xsd', schema_node_a)
transport.bind('http://tests.python-zeep.org/b.xsd', schema_node_b)
document = wsdl.Document(
content, transport, 'http://tests.python-zeep.org/content.wsdl')
assert len(recwarn) == 0
assert document.types.get_element('{http://tests.python-zeep.org/b}global')
def test_wsdl_imports_xsd(recwarn):
content = StringIO("""
<?xml version="1.0"?>
<wsdl:definitions
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/">
<wsdl:import location="a.xsd" namespace="http://tests.python-zeep.org/a"/>
</wsdl:definitions>
""".strip())
schema_node_a = etree.fromstring("""
<?xml version="1.0"?>
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tests.python-zeep.org/a"
targetNamespace="http://tests.python-zeep.org/a"
xmlns:b="http://tests.python-zeep.org/b"
elementFormDefault="qualified">
<xsd:import namespace="http://tests.python-zeep.org/b" schemaLocation="b.xsd"/>
</xsd:schema>
""".strip())
schema_node_b = etree.fromstring("""
<?xml version="1.0"?>
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tests.python-zeep.org/b"
targetNamespace="http://tests.python-zeep.org/b"
elementFormDefault="qualified">
</xsd:schema>
""".strip())
transport = DummyTransport()
transport.bind('http://tests.python-zeep.org/a.xsd', schema_node_a)
transport.bind('http://tests.python-zeep.org/b.xsd', schema_node_b)
wsdl.Document(
content, transport, 'http://tests.python-zeep.org/content.wsdl')
def test_import_schema_without_location(recwarn):
content = StringIO("""
<?xml version="1.0"?>
<wsdl:definitions
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:b="http://tests.python-zeep.org/b"
xmlns:c="http://tests.python-zeep.org/c"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
targetNamespace="http://tests.python-zeep.org/transient"
xmlns:tns="http://tests.python-zeep.org/transient">
<wsdl:types>
<xsd:schema>
<xsd:import namespace="http://tests.python-zeep.org/a"
schemaLocation="a.xsd"/>
</xsd:schema>
<xsd:schema targetNamespace="http://tests.python-zeep.org/c">
<xsd:element name="bar" type="b:foo"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="method">
<wsdl:part name="param" element="c:bar"/>
</wsdl:message>
<wsdl:portType name="port_type">
<wsdl:operation name="method" parameterOrder="param">
<wsdl:input message="tns:method" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="binding" type="tns:port_type" >
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="method" >
<soap:operation soapAction="method"/>
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
</wsdl:operation>
</wsdl:binding>
</wsdl:definitions>
""".strip())
schema_node_a = etree.fromstring("""
<?xml version="1.0"?>
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tests.python-zeep.org/a"
targetNamespace="http://tests.python-zeep.org/a"
xmlns:b="http://tests.python-zeep.org/b"
elementFormDefault="qualified">
<xsd:import namespace="http://tests.python-zeep.org/b"
schemaLocation="b.xsd"/>
</xsd:schema>
""".strip())
schema_node_b = etree.fromstring("""
<?xml version="1.0"?>
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tests.python-zeep.org/b"
targetNamespace="http://tests.python-zeep.org/b"
elementFormDefault="qualified">
<xsd:complexType name="foo">
<xsd:sequence>
<xsd:element name="item_1" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
""".strip())
transport = DummyTransport()
transport.bind('http://tests.python-zeep.org/a.xsd', schema_node_a)
transport.bind('http://tests.python-zeep.org/b.xsd', schema_node_b)
document = wsdl.Document(
content, transport, 'http://tests.python-zeep.org/content.wsdl')
assert len(recwarn) == 0
assert document.types.get_type('{http://tests.python-zeep.org/b}foo')
def test_wsdl_import(recwarn):
wsdl_main = StringIO("""
<?xml version="1.0"?>
<wsdl:definitions
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tests.python-zeep.org/xsd-main"
xmlns:sec="http://tests.python-zeep.org/wsdl-secondary"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
targetNamespace="http://tests.python-zeep.org/xsd-main">
<wsdl:import namespace="http://tests.python-zeep.org/wsdl-secondary"
location="http://tests.python-zeep.org/schema-2.wsdl"/>
<wsdl:types>
<xsd:schema
targetNamespace="http://tests.python-zeep.org/xsd-main"
xmlns:tns="http://tests.python-zeep.org/xsd-main">
<xsd:element name="input" type="xsd:string"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="message-1">
<wsdl:part name="response" element="tns:input"/>
</wsdl:message>
<wsdl:portType name="TestPortType">
<wsdl:operation name="TestOperation1">
<wsdl:input message="message-1"/>
</wsdl:operation>
<wsdl:operation name="TestOperation2">
<wsdl:input message="sec:message-2"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="TestBinding" type="tns:TestPortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="TestOperation1">
<soap:operation soapAction=""/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
</wsdl:operation>
<wsdl:operation name="TestOperation2">
<soap:operation soapAction=""/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="TestService">
<wsdl:documentation>Test service</wsdl:documentation>
<wsdl:port name="TestPortType" binding="tns:TestBinding">
<soap:address location="http://tests.python-zeep.org/test"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
""".strip())
wsdl_2 = ("""
<?xml version="1.0"?>
<wsdl:definitions
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tests.python-zeep.org/wsdl-secondary"
xmlns:mine="http://tests.python-zeep.org/xsd-secondary"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
targetNamespace="http://tests.python-zeep.org/wsdl-secondary">
<wsdl:types>
<xsd:schema
targetNamespace="http://tests.python-zeep.org/xsd-secondary"
xmlns:tns="http://tests.python-zeep.org/xsd-secondary">
<xsd:element name="input2" type="xsd:string"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="message-2">
<wsdl:part name="response" element="mine:input2"/>
</wsdl:message>
</wsdl:definitions>
""".strip())
transport = DummyTransport()
transport.bind('http://tests.python-zeep.org/schema-2.wsdl', wsdl_2)
document = wsdl.Document(wsdl_main, transport)
document.dump()
def test_wsdl_import_transitive(recwarn):
wsdl_main = StringIO("""
<?xml version="1.0"?>
<wsdl:definitions
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tests.python-zeep.org/xsd-main"
xmlns:sec="http://tests.python-zeep.org/wsdl-2"
xmlns:third="http://tests.python-zeep.org/wsdl-3"
xmlns:fourth="http://tests.python-zeep.org/wsdl-4"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
targetNamespace="http://tests.python-zeep.org/xsd-main">
<wsdl:import namespace="http://tests.python-zeep.org/wsdl-2"
location="http://tests.python-zeep.org/schema-2.wsdl"/>
<wsdl:types>
<xsd:schema
targetNamespace="http://tests.python-zeep.org/xsd-main"
xmlns:tns="http://tests.python-zeep.org/xsd-main">
<xsd:element name="input" type="xsd:string"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="message-1">
<wsdl:part name="response" element="tns:input"/>
</wsdl:message>
<wsdl:portType name="TestPortType">
<wsdl:operation name="TestOperation1">
<wsdl:input message="message-1"/>
</wsdl:operation>
<wsdl:operation name="TestOperation2">
<wsdl:input message="sec:message-2"/>
</wsdl:operation>
<wsdl:operation name="TestOperation3">
<wsdl:input message="third:message-3"/>
</wsdl:operation>
<wsdl:operation name="TestOperation4">
<wsdl:input message="fourth:message-4"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="TestBinding" type="tns:TestPortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="TestOperation1">
<soap:operation soapAction=""/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
</wsdl:operation>
<wsdl:operation name="TestOperation2">
<soap:operation soapAction=""/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
</wsdl:operation>
<wsdl:operation name="TestOperation3">
<soap:operation soapAction=""/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="TestService">
<wsdl:documentation>Test service</wsdl:documentation>
<wsdl:port name="TestPortType" binding="tns:TestBinding">
<soap:address location="http://tests.python-zeep.org/test"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
""".strip())
wsdl_2 = ("""
<?xml version="1.0"?>
<wsdl:definitions
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tests.python-zeep.org/wsdl-2"
xmlns:mine="http://tests.python-zeep.org/xsd-2"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
targetNamespace="http://tests.python-zeep.org/wsdl-2">
<wsdl:import namespace="http://tests.python-zeep.org/wsdl-3"
location="http://tests.python-zeep.org/schema-3.wsdl"/>
<wsdl:types>
<xsd:schema
targetNamespace="http://tests.python-zeep.org/xsd-2"
xmlns:tns="http://tests.python-zeep.org/xsd-2">
<xsd:element name="input2" type="xsd:string"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="message-2">
<wsdl:part name="response" element="mine:input2"/>
</wsdl:message>
</wsdl:definitions>
""".strip())
wsdl_3 = ("""
<?xml version="1.0"?>
<wsdl:definitions
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tests.python-zeep.org/wsdl-third"
xmlns:mine="http://tests.python-zeep.org/xsd-3"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
targetNamespace="http://tests.python-zeep.org/wsdl-3">
<wsdl:import namespace="http://tests.python-zeep.org/wsdl-2"
location="http://tests.python-zeep.org/schema-2.wsdl"/>
<wsdl:import namespace="http://tests.python-zeep.org/wsdl-4"
location="http://tests.python-zeep.org/schema-4.wsdl"/>
<wsdl:types>
<xsd:schema
targetNamespace="http://tests.python-zeep.org/xsd-3"
xmlns:tns="http://tests.python-zeep.org/xsd-3">
<xsd:element name="input3" type="xsd:string"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="message-3">
<wsdl:part name="response" element="mine:input3"/>
</wsdl:message>
</wsdl:definitions>
""".strip())
wsdl_4 = ("""
<?xml version="1.0"?>
<wsdl:definitions
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tests.python-zeep.org/wsdl-4"
xmlns:mine="http://tests.python-zeep.org/xsd-4"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
targetNamespace="http://tests.python-zeep.org/wsdl-4">
<wsdl:import namespace="http://tests.python-zeep.org/wsdl-3"
location="http://tests.python-zeep.org/schema-3.wsdl"/>
<wsdl:message name="message-4">
<wsdl:part name="response" type="xsd:string"/>
</wsdl:message>
</wsdl:definitions>
""".strip())
transport = DummyTransport()
transport.bind('http://tests.python-zeep.org/schema-2.wsdl', wsdl_2)
transport.bind('http://tests.python-zeep.org/schema-3.wsdl', wsdl_3)
transport.bind('http://tests.python-zeep.org/schema-4.wsdl', wsdl_4)
document = wsdl.Document(wsdl_main, transport)
document.dump()
def test_wsdl_import_xsd_references(recwarn):
wsdl_main = StringIO("""
<?xml version="1.0"?>
<wsdl:definitions
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tests.python-zeep.org/xsd-main"
xmlns:sec="http://tests.python-zeep.org/wsdl-secondary"
xmlns:xsd-sec="http://tests.python-zeep.org/xsd-secondary"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
targetNamespace="http://tests.python-zeep.org/xsd-main">
<wsdl:import namespace="http://tests.python-zeep.org/wsdl-secondary"
location="http://tests.python-zeep.org/schema-2.wsdl"/>
<wsdl:types>
<xsd:schema
targetNamespace="http://tests.python-zeep.org/xsd-main"
xmlns:tns="http://tests.python-zeep.org/xsd-main">
<xsd:element name="input" type="xsd:string"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="message-1">
<wsdl:part name="response" element="tns:input"/>
</wsdl:message>
<wsdl:message name="message-2">
<wsdl:part name="response" element="xsd-sec:input2"/>
</wsdl:message>
<wsdl:portType name="TestPortType">
<wsdl:operation name="TestOperation1">
<wsdl:input message="message-1"/>
</wsdl:operation>
<wsdl:operation name="TestOperation2">
<wsdl:input message="sec:message-2"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="TestBinding" type="tns:TestPortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="TestOperation1">
<soap:operation soapAction=""/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
</wsdl:operation>
<wsdl:operation name="TestOperation2">
<soap:operation soapAction=""/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="TestService">
<wsdl:documentation>Test service</wsdl:documentation>
<wsdl:port name="TestPortType" binding="tns:TestBinding">
<soap:address location="http://tests.python-zeep.org/test"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
""".strip())
wsdl_2 = ("""
<?xml version="1.0"?>
<wsdl:definitions
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tests.python-zeep.org/wsdl-secondary"
xmlns:mine="http://tests.python-zeep.org/xsd-secondary"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
targetNamespace="http://tests.python-zeep.org/wsdl-secondary">
<wsdl:types>
<xsd:schema
targetNamespace="http://tests.python-zeep.org/xsd-secondary"
xmlns:tns="http://tests.python-zeep.org/xsd-secondary">
<xsd:element name="input2" type="xsd:string"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="message-2">
<wsdl:part name="response" element="mine:input2"/>
</wsdl:message>
</wsdl:definitions>
""".strip())
transport = DummyTransport()
transport.bind('http://tests.python-zeep.org/schema-2.wsdl', wsdl_2)
document = wsdl.Document(wsdl_main, transport)
document.dump()
def test_parse_operation_empty_nodes():
content = StringIO("""
<?xml version="1.0"?>
<wsdl:definitions xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:tns="http://tests.python-zeep.org/"
xmlns:s1="http://microsoft.com/wsdl/types/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
targetNamespace="http://tests.python-zeep.org/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema targetNamespace="http://tests.python-zeep.org/">
<s:import namespace="http://microsoft.com/wsdl/types/" />
<s:element name="ExampleMethod">
</s:element>
</s:schema>
<s:schema targetNamespace="http://microsoft.com/wsdl/types/">
<s:simpleType name="char">
<s:restriction base="s:unsignedShort" />
</s:simpleType>
</s:schema>
</wsdl:types>
<wsdl:message name="MessageIn">
<wsdl:part name="parameters" element="tns:ExampleMethod" />
</wsdl:message>
<wsdl:message name="MessageOut">
<wsdl:part name="parameters" element="tns:ExampleMethod" />
</wsdl:message>
<wsdl:portType name="ExampleSoap">
<wsdl:operation name="ExampleMethod">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
Example documentation.
</wsdl:documentation>
<wsdl:input message="tns:MessageIn" />
<wsdl:output message="tns:MessageOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ExampleSoap" type="tns:ExampleSoap">
<http:binding verb="POST" />
<wsdl:operation name="ExampleMethod">
<http:operation location="/ExampleMethod" />
<wsdl:input>
<mime:content type="application/x-www-form-urlencoded" />
</wsdl:input>
<wsdl:output />
</wsdl:operation>
</wsdl:binding>
</wsdl:definitions>
""".strip())
assert wsdl.Document(content, None)
def test_wsdl_duplicate_tns(recwarn):
wsdl_main = StringIO("""
<?xml version="1.0"?>
<wsdl:definitions
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tests.python-zeep.org/xsd-main"
xmlns:sec="http://tests.python-zeep.org/wsdl-secondary"
xmlns:xsd-sec="http://tests.python-zeep.org/xsd-secondary"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
targetNamespace="http://tests.python-zeep.org/xsd-main">
<wsdl:import namespace="http://tests.python-zeep.org/xsd-main"
location="http://tests.python-zeep.org/schema-2.wsdl"/>
<wsdl:binding name="TestBinding" type="tns:TestPortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="TestOperation1">
<soap:operation soapAction=""/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="TestService">
<wsdl:documentation>Test service</wsdl:documentation>
<wsdl:port name="TestPortType" binding="tns:TestBinding">
<soap:address location="http://tests.python-zeep.org/test"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
""".strip())
wsdl_2 = ("""
<?xml version="1.0"?>
<wsdl:definitions
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://tests.python-zeep.org/xsd-main"
xmlns:mine="http://tests.python-zeep.org/xsd-secondary"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
targetNamespace="http://tests.python-zeep.org/xsd-main">
<wsdl:types>
<xsd:schema
targetNamespace="http://tests.python-zeep.org/xsd-main"
xmlns:tns="http://tests.python-zeep.org/xsd-main">
<xsd:element name="input" type="xsd:string"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="message-1">
<wsdl:part name="response" element="tns:input"/>
</wsdl:message>
<wsdl:portType name="TestPortType">
<wsdl:operation name="TestOperation1">
<wsdl:input message="message-1"/>
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>
""".strip())
transport = DummyTransport()
transport.bind('http://tests.python-zeep.org/schema-2.wsdl', wsdl_2)
document = wsdl.Document(wsdl_main, transport)
document.dump()