def test_multiple_only_target_ns(): 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" elementFormDefault="qualified"> <xsd:import schemaLocation="http://tests.python-zeep.org/b.xsd"/> <xsd:import schemaLocation="http://tests.python-zeep.org/c.xsd"/> </xsd:schema> """.strip()) node_b = etree.fromstring(""" <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://tests.python-zeep.org/duplicate-ns"> </xsd:schema> """.strip()) transport = DummyTransport() transport.bind('http://tests.python-zeep.org/b.xsd', node_b) transport.bind('http://tests.python-zeep.org/c.xsd', node_b) with pytest.warns(ZeepWarning): xsd.Schema(node_a, transport=transport)
def test_no_target_namespace(): 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" elementFormDefault="qualified"> <xsd:import schemaLocation="http://tests.python-zeep.org/b.xsd"/> <xsd:element name="container"> <xsd:complexType> <xsd:sequence> <xsd:element ref="bla"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> """.strip()) node_b = etree.fromstring(""" <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xsd:element name="bla" type="xsd:string"/> </xsd:schema> """.strip()) transport = DummyTransport() transport.bind('http://tests.python-zeep.org/b.xsd', node_b) xsd.Schema(node_a, transport=transport)
def test_soap_array_parse_remote_ns(): transport = DummyTransport() transport.bind( 'http://schemas.xmlsoap.org/soap/encoding/', load_xml(io.open('tests/wsdl_files/soap-enc.xsd', 'r').read().encode('utf-8'))) schema = xsd.Schema(load_xml(""" <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tests.python-zeep.org/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="http://tests.python-zeep.org/" elementFormDefault="qualified"> <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> <xsd:simpleType name="CountryCodeType"> <xsd:restriction base="xsd:string"> <xsd:length value="2"/> <xsd:pattern value="[a-zA-Z]{2}"/> </xsd:restriction> </xsd:simpleType> <xsd:complexType name="CountryItemType"> <xsd:sequence> <xsd:element name="code" type="tns:CountryCodeType"/> <xsd:element name="name" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="CountriesArrayType"> <xsd:complexContent> <xsd:restriction base="soapenc:Array"> <xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="tns:CountryItemType[]"/> </xsd:restriction> </xsd:complexContent> </xsd:complexType> <xsd:element name="countries" type="tns:CountriesArrayType"/> </xsd:schema> """), transport) doc = load_xml(""" <countries SOAP-ENC:arrayType="ns1:CountryItemType[1]" xsi:type="ns1:CountriesArrayType" xmlns:ns1="http://tests.python-zeep.org/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <item xsi:type="ns1:CountryItemType"> <code xsi:type="ns1:CountryCodeType">NL</code> <name xsi:type="xsd:string">The Netherlands</name> </item> </countries> """) elm = schema.get_element('ns0:countries') data = elm.parse(doc, schema) assert data[0].code == 'NL' assert data[0].name == 'The Netherlands'
def test_xml_namespace(): xmlns = load_xml(""" <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xml="http://www.w3.org/XML/1998/namespace" targetNamespace="http://www.w3.org/XML/1998/namespace" elementFormDefault="qualified"> <xs:attribute name="lang" type="xs:string"/> </xs:schema> """) transport = DummyTransport() transport.bind('http://www.w3.org/2001/xml.xsd', xmlns) xsd.Schema(load_xml(""" <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tests.python-zeep.org/" targetNamespace="http://tests.python-zeep.org/" elementFormDefault="qualified"> <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/> <xs:element name="container"> <xs:complexType> <xs:sequence/> <xs:attribute ref="xml:lang"/> </xs:complexType> </xs:element> </xs:schema> """), transport=transport)
def test_include_recursion(): node_a = etree.fromstring( """ <?xml version="1.0"?> <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 schemaLocation="http://tests.python-zeep.org/b.xsd" namespace="http://tests.python-zeep.org/b"/> </xs:schema> """.strip() ) node_b = etree.fromstring( """ <?xml version="1.0"?> <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" elementFormDefault="qualified"> <xs:include schemaLocation="http://tests.python-zeep.org/c.xsd"/> <xs:element name="bar" type="xs:string"/> </xs:schema> """.strip() ) node_c = etree.fromstring( """ <?xml version="1.0"?> <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" elementFormDefault="qualified"> <xs:include schemaLocation="http://tests.python-zeep.org/b.xsd"/> <xs:element name="foo" type="xs:string"/> </xs:schema> """.strip() ) transport = DummyTransport() transport.bind("http://tests.python-zeep.org/b.xsd", node_b) transport.bind("http://tests.python-zeep.org/c.xsd", node_c) schema = xsd.Schema(node_a, transport=transport) schema.get_element("{http://tests.python-zeep.org/b}foo") schema.get_element("{http://tests.python-zeep.org/b}bar")
def test_cyclic_imports(): schema_a = etree.fromstring( """ <?xml version="1.0"?> <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 schemaLocation="http://tests.python-zeep.org/b.xsd" namespace="http://tests.python-zeep.org/b"/> </xs:schema> """.strip() ) schema_b = etree.fromstring( """ <?xml version="1.0"?> <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 schemaLocation="http://tests.python-zeep.org/c.xsd" namespace="http://tests.python-zeep.org/c"/> </xs:schema> """.strip() ) schema_c = etree.fromstring( """ <?xml version="1.0"?> <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:import schemaLocation="http://tests.python-zeep.org/a.xsd" namespace="http://tests.python-zeep.org/a"/> </xs:schema> """.strip() ) transport = DummyTransport() transport.bind("http://tests.python-zeep.org/a.xsd", schema_a) transport.bind("http://tests.python-zeep.org/b.xsd", schema_b) transport.bind("http://tests.python-zeep.org/c.xsd", schema_c) xsd.Schema(schema_a, transport=transport, location="http://tests.python-zeep.org/a.xsd")
def test_wsdl_array_type(): transport = DummyTransport() transport.bind( 'http://schemas.xmlsoap.org/soap/encoding/', load_xml(io.open('tests/wsdl_files/soap-enc.xsd', 'r').read().encode('utf-8'))) schema = xsd.Schema(load_xml(""" <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tests.python-zeep.org/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://tests.python-zeep.org/" elementFormDefault="qualified"> <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> <xsd:complexType name="array"> <xsd:complexContent> <xsd:restriction base="SOAP-ENC:Array"> <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="tns:base[]"/> </xsd:restriction> </xsd:complexContent> </xsd:complexType> <xsd:complexType name="base"> <xsd:sequence> <xsd:element minOccurs="0" name="item_1" type="xsd:string"/> <xsd:element minOccurs="0" name="item_2" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:element name="array" type="tns:array"/> </xsd:schema> """), transport) array_elm = schema.get_element('{http://tests.python-zeep.org/}array') item_type = schema.get_type('{http://tests.python-zeep.org/}base') item_1 = item_type(item_1='foo_1', item_2='bar_1') item_2 = item_type(item_1='foo_2', item_2='bar_2') array = array_elm([ xsd.AnyObject(item_type, item_1), xsd.AnyObject(item_type, item_2), ]) node = etree.Element('document') array_elm.render(node, array) expected = """ <document> <ns0:array xmlns:ns0="http://tests.python-zeep.org/"> <ns0:item_1>foo_1</ns0:item_1> <ns0:item_2>bar_1</ns0:item_2> <ns0:item_1>foo_2</ns0:item_1> <ns0:item_2>bar_2</ns0:item_2> </ns0:array> </document> """ assert_nodes_equal(expected, node)
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_include_different_form_defaults(): node_a = etree.fromstring(""" <?xml version="1.0"?> <xs:schema xmlns="http://tests.python-zeep.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://tests.python-zeep.org/"> <xs:include schemaLocation="http://tests.python-zeep.org/b.xsd"/> </xs:schema> """.strip()) # include without default namespace, other xsd prefix node_b = load_xml(""" <?xml version="1.0"?> <xsd:schema elementFormDefault="qualified" attributeFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tests.python-zeep.org/b"> <xsd:element name="container" type="foo"/> <xsd:complexType name="foo"> <xsd:sequence> <xsd:element name="item" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="attr" type="xsd:string"/> </xsd:complexType> </xsd:schema> """) transport = DummyTransport() transport.bind('http://tests.python-zeep.org/b.xsd', node_b) schema = xsd.Schema(node_a, transport=transport) item = schema.get_element('{http://tests.python-zeep.org/}container') obj = item(item='foo', attr='bar') node = render_node(item, obj) expected = load_xml(""" <document> <ns0:container xmlns:ns0="http://tests.python-zeep.org/" ns0:attr="bar"> <ns0:item>foo</ns0:item> </ns0:container> </document> """) assert_nodes_equal(expected, node)
def test_duplicate_target_namespace(): schema_a = etree.fromstring( """ <?xml version="1.0"?> <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" elementFormDefault="qualified"> <xs:import schemaLocation="http://tests.python-zeep.org/b.xsd" namespace="http://tests.python-zeep.org/duplicate"/> <xs:import schemaLocation="http://tests.python-zeep.org/c.xsd" namespace="http://tests.python-zeep.org/duplicate"/> </xs:schema> """.strip() ) schema_b = etree.fromstring( """ <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://tests.python-zeep.org/duplicate" elementFormDefault="qualified"> </xsd:schema> """.strip() ) schema_c = etree.fromstring( """ <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://tests.python-zeep.org/duplicate" elementFormDefault="qualified"> </xsd:schema> """.strip() ) transport = DummyTransport() transport.bind("http://tests.python-zeep.org/a.xsd", schema_a) transport.bind("http://tests.python-zeep.org/b.xsd", schema_b) transport.bind("http://tests.python-zeep.org/c.xsd", schema_c) with pytest.warns(ZeepWarning): xsd.Schema(schema_a, transport=transport)
def test_wsdl_dtd_entities_rules(): wsdl_declaration = u"""<!DOCTYPE Author [ <!ENTITY writer "Donald Duck."> ]> <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_declaration) with pytest.raises(DTDForbidden): wsdl.Document( StringIO(wsdl_declaration), transport, settings=Settings(forbid_dtd=True)) with pytest.raises(EntitiesForbidden): wsdl.Document(StringIO(wsdl_declaration), transport) document = wsdl.Document( StringIO(wsdl_declaration), transport, settings=Settings(forbid_entities=False)) document.dump()
def test_auto_import_known_schema(): content = io.open('tests/wsdl_files/soap-enc.xsd', 'rb').read() transport = DummyTransport() transport.bind('http://schemas.xmlsoap.org/soap/encoding/', content) schema = xsd.Schema(load_xml(""" <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://tests.python-zeep.org/" targetNamespace="http://tests.python-zeep.org/" elementFormDefault="qualified"> <xs:import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> <xs:group ref="soap-enc:Struct"/> </xs:schema> """), transport=transport) schema.set_ns_prefix('soap-enc', 'http://schemas.xmlsoap.org/soap/encoding/') schema.get_group('soap-enc:Struct')
def test_include_no_default_namespace(): node_a = etree.fromstring(""" <?xml version="1.0"?> <xs:schema xmlns="http://tests.python-zeep.org/tns" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://tests.python-zeep.org/tns" elementFormDefault="qualified"> <xs:include schemaLocation="http://tests.python-zeep.org/b.xsd"/> <xs:element name="container" type="foo"/> </xs:schema> """.strip()) # include without default namespace, other xsd prefix 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"> <xsd:simpleType name="my-string"> <xsd:restriction base="xsd:boolean"/> </xsd:simpleType> <xsd:complexType name="foo"> <xsd:sequence> <xsd:element name="item" type="my-string"/> </xsd:sequence> </xsd:complexType> </xsd:schema> """.strip()) transport = DummyTransport() transport.bind('http://tests.python-zeep.org/b.xsd', node_b) schema = xsd.Schema(node_a, transport=transport) item = schema.get_element('{http://tests.python-zeep.org/tns}container') assert item
def test_get_type_through_import(): schema_a = etree.fromstring( """ <?xml version="1.0"?> <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 schemaLocation="http://tests.python-zeep.org/b.xsd" namespace="http://tests.python-zeep.org/b"/> <xs:element name="foo" type="b:bar"/> </xs:schema> """.strip() ) schema_b = etree.fromstring( """ <?xml version="1.0"?> <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:complexType name="bar"/> </xs:schema> """.strip() ) transport = DummyTransport() transport.bind("http://tests.python-zeep.org/a.xsd", schema_a) transport.bind("http://tests.python-zeep.org/b.xsd", schema_b) xsd.Schema(schema_a, transport=transport)
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_include_relative(): node_a = etree.fromstring(""" <?xml version="1.0"?> <xs:schema xmlns="http://tests.python-zeep.org/tns" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://tests.python-zeep.org/a" elementFormDefault="qualified"> <xs:include schemaLocation="http://tests.python-zeep.org/subdir/b.xsd"/> </xs:schema> """.strip()) node_b = etree.fromstring(""" <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:include schemaLocation="c.xsd"/> <xs:element name="bar" type="xs:string"/> </xs:schema> """.strip()) node_c = etree.fromstring(""" <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="foo" type="xs:string"/> </xs:schema> """.strip()) transport = DummyTransport() transport.bind('http://tests.python-zeep.org/subdir/b.xsd', node_b) transport.bind('http://tests.python-zeep.org/subdir/c.xsd', node_c) schema = xsd.Schema(node_a, transport=transport) schema.get_element('{http://tests.python-zeep.org/a}foo') schema.get_element('{http://tests.python-zeep.org/a}bar')
def test_cyclic_imports(): schema_a = etree.fromstring(""" <?xml version="1.0"?> <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 schemaLocation="http://tests.python-zeep.org/b.xsd" namespace="http://tests.python-zeep.org/b"/> </xs:schema> """.strip()) schema_b = etree.fromstring(""" <?xml version="1.0"?> <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 schemaLocation="http://tests.python-zeep.org/c.xsd" namespace="http://tests.python-zeep.org/c"/> </xs:schema> """.strip()) schema_c = etree.fromstring(""" <?xml version="1.0"?> <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:import schemaLocation="http://tests.python-zeep.org/a.xsd" namespace="http://tests.python-zeep.org/a"/> </xs:schema> """.strip()) transport = DummyTransport() transport.bind('http://tests.python-zeep.org/a.xsd', schema_a) transport.bind('http://tests.python-zeep.org/b.xsd', schema_b) transport.bind('http://tests.python-zeep.org/c.xsd', schema_c) xsd.Schema(schema_a, transport=transport, location='http://tests.python-zeep.org/a.xsd')
def test_duplicate_target_namespace(): schema_a = etree.fromstring(""" <?xml version="1.0"?> <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" elementFormDefault="qualified"> <xs:import schemaLocation="http://tests.python-zeep.org/b.xsd" namespace="http://tests.python-zeep.org/duplicate"/> <xs:import schemaLocation="http://tests.python-zeep.org/c.xsd" namespace="http://tests.python-zeep.org/duplicate"/> </xs:schema> """.strip()) schema_b = etree.fromstring(""" <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://tests.python-zeep.org/duplicate" elementFormDefault="qualified"> <xsd:element name="elm-in-b" type="xsd:string"/> </xsd:schema> """.strip()) schema_c = etree.fromstring(""" <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://tests.python-zeep.org/duplicate" elementFormDefault="qualified"> <xsd:element name="elm-in-c" type="xsd:string"/> </xsd:schema> """.strip()) transport = DummyTransport() transport.bind('http://tests.python-zeep.org/a.xsd', schema_a) transport.bind('http://tests.python-zeep.org/b.xsd', schema_b) transport.bind('http://tests.python-zeep.org/c.xsd', schema_c) with pytest.warns(ZeepWarning): schema = xsd.Schema(schema_a, transport=transport) assert schema.get_element( '{http://tests.python-zeep.org/duplicate}elm-in-b') with pytest.raises(LookupError): schema.get_element('{http://tests.python-zeep.org/duplicate}elm-in-c')
def test_include_no_parent_default_namespace(): schema_root = """ <?xml version="1.0"?> <xs:schema xmlns="http://tests.python-zeep.org/rootns" xmlns:tns="http://tests.python-zeep.org/tns" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://tests.python-zeep.org/rootns" elementFormDefault="qualified"> <xs:import namespace="http://tests.python-zeep.org/tns" schemaLocation="http://tests.python-zeep.org/tns.xsd"/> <xs:element name="root"> <xs:complexType> <xs:sequence> <xs:element name="container" type="tns:containerType" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> """.strip() # no default namespace, but targetNamespace schema_tns = """ <?xml version="1.0"?> <xs:schema xmlns:tns="http://tests.python-zeep.org/tns" targetNamespace="http://tests.python-zeep.org/tns" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:include schemaLocation="http://tests.python-zeep.org/include.xsd" /> </xs:schema> """.strip() # no default namespace and no targetNamespace schema_include = """ <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:complexType name="containerType"> <xs:sequence> <xs:element name="item" type="itemType" /> </xs:sequence> </xs:complexType> <xs:complexType name="itemType"> <xs:sequence> <xs:element name="intVal" type="xs:int" /> <xs:element name="boolVal" type="xs:boolean" /> </xs:sequence> </xs:complexType> </xs:schema> """.strip() class IncludeSchemaResolver(etree.Resolver): def resolve(self, url, id, context): if url == "http://tests.python-zeep.org/tns.xsd": return self.resolve_string(schema_tns, context) elif url == "http://tests.python-zeep.org/include.xsd": return self.resolve_string(schema_include, context) parser = etree.XMLParser() parser.resolvers.add(IncludeSchemaResolver()) schema = etree.XMLSchema(etree.fromstring(schema_root, parser=parser)) xml = """ <?xml version="1.0"?> <root xmlns="http://tests.python-zeep.org/rootns"> <container xmlns:tns="http://tests.python-zeep.org/tns"> <tns:item> <tns:intVal>42</tns:intVal> <tns:boolVal>true</tns:boolVal> </tns:item> </container> </root> """.strip() xml = etree.fromstring(xml) schema.assertValid(xml) # schema is ok for lxml schema_root = etree.fromstring(schema_root) schema_tns = etree.fromstring(schema_tns) schema_include = etree.fromstring(schema_include) transport = DummyTransport() transport.bind('http://tests.python-zeep.org/tns.xsd', schema_tns) transport.bind('http://tests.python-zeep.org/include.xsd', schema_include) xsd.Schema(schema_root, transport=transport)
def test_import_cyclic(): node_a = etree.fromstring( """ <?xml version="1.0"?> <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 schemaLocation="http://tests.python-zeep.org/b.xsd" namespace="http://tests.python-zeep.org/b"/> </xs:schema> """.strip() ) node_b = etree.fromstring( """ <?xml version="1.0"?> <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" elementFormDefault="qualified"> <xs:import schemaLocation="http://tests.python-zeep.org/a.xsd" namespace="http://tests.python-zeep.org/a"/> <xs:element name="bar" type="xs:string"/> </xs:schema> """.strip() ) wsdl_content = StringIO( """ <?xml version='1.0'?> <definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://tests.python-zeep.org/root" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://tests.python-zeep.org/root" name="root"> <types> <xsd:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tests.python-zeep.org/b" targetNamespace="http://tests.python-zeep.org/b" elementFormDefault="qualified"> <xs:import schemaLocation="http://tests.python-zeep.org/a.xsd" namespace="http://tests.python-zeep.org/a"/> <xs:import schemaLocation="http://tests.python-zeep.org/b.xsd" namespace="http://tests.python-zeep.org/b"/> <xs:element name="foo" type="xs:string"/> </xsd:schema> </types> </definitions> """.strip() ) transport = DummyTransport() transport.bind("https://tests.python-zeep.org/a.xsd", node_a) transport.bind("https://tests.python-zeep.org/b.xsd", node_b) document = wsdl.Document( wsdl_content, transport, "https://tests.python-zeep.org/content.wsdl" )
def test_wsdl_array_type(): transport = DummyTransport() transport.bind( "http://schemas.xmlsoap.org/soap/encoding/", load_xml( io.open("tests/wsdl_files/soap-enc.xsd", "r").read().encode("utf-8")), ) schema = xsd.Schema( load_xml(""" <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tests.python-zeep.org/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://tests.python-zeep.org/" elementFormDefault="qualified"> <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> <xsd:complexType name="array"> <xsd:complexContent> <xsd:restriction base="SOAP-ENC:Array"> <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="tns:base[]"/> </xsd:restriction> </xsd:complexContent> </xsd:complexType> <xsd:complexType name="base"> <xsd:sequence> <xsd:element minOccurs="0" name="item_1" type="xsd:string"/> <xsd:element minOccurs="0" name="item_2" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:element name="array" type="tns:array"/> </xsd:schema> """), transport, ) array_elm = schema.get_element("{http://tests.python-zeep.org/}array") item_type = schema.get_type("{http://tests.python-zeep.org/}base") item_1 = item_type(item_1="foo_1", item_2="bar_1") item_2 = item_type(item_1="foo_2", item_2="bar_2") # array = array_elm([ # xsd.AnyObject(item_type, item_1), # xsd.AnyObject(item_type, item_2), # ]) array = array_elm([item_1, item_2]) node = etree.Element("document") assert array_elm.signature(schema=schema) == "ns0:array(ns0:array)" array_type = schema.get_type("ns0:array") assert array_type.signature(schema=schema) == ( "ns0:array(_value_1: base[], arrayType: xsd:string, " + "offset: ns1:arrayCoordinate, id: xsd:ID, href: xsd:anyURI, _attr_1: {})" ) array_elm.render(node, array) expected = """ <document> <ns0:array xmlns:ns0="http://tests.python-zeep.org/"> <base> <ns0:item_1>foo_1</ns0:item_1> <ns0:item_2>bar_1</ns0:item_2> </base> <base> <ns0:item_1>foo_2</ns0:item_1> <ns0:item_2>bar_2</ns0:item_2> </base> </ns0:array> </document> """ assert_nodes_equal(expected, node)
def test_multiple_extension(): node_a = etree.fromstring(""" <?xml version="1.0"?> <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 schemaLocation="http://tests.python-zeep.org/b.xsd" 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> """.strip()) node_b = etree.fromstring(""" <?xml version="1.0"?> <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 schemaLocation="http://tests.python-zeep.org/c.xsd" 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> """.strip()) node_c = etree.fromstring(""" <?xml version="1.0"?> <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> """.strip()) etree.XMLSchema(node_c) transport = DummyTransport() transport.bind('http://tests.python-zeep.org/b.xsd', node_b) transport.bind('http://tests.python-zeep.org/c.xsd', node_c) schema = xsd.Schema(node_a, transport=transport) type_a = schema.get_type('ns0:type_a') type_a(wat='x')
def test_duplicate_target_namespace(): schema_a = etree.fromstring(""" <?xml version="1.0"?> <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" elementFormDefault="qualified"> <xs:import schemaLocation="http://tests.python-zeep.org/b.xsd" namespace="http://tests.python-zeep.org/duplicate"/> <xs:import schemaLocation="http://tests.python-zeep.org/c.xsd" namespace="http://tests.python-zeep.org/duplicate"/> </xs:schema> """.strip()) schema_b = etree.fromstring(""" <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tests.python-zeep.org/duplicate" targetNamespace="http://tests.python-zeep.org/duplicate" elementFormDefault="qualified"> <xsd:element name="elm-in-b" type="tns:item-c"/> <xsd:complexType name="item-c"> <xsd:sequence> <xsd:element name="item-a" type="xsd:string"/> <xsd:element name="item-b" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:schema> """.strip()) schema_c = etree.fromstring(""" <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tests.python-zeep.org/duplicate" targetNamespace="http://tests.python-zeep.org/duplicate" elementFormDefault="qualified"> <xsd:element name="elm-in-c" type="tns:item-c"/> <xsd:complexType name="item-c"> <xsd:sequence> <xsd:element name="item-a" type="xsd:string"/> <xsd:element name="item-b" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:schema> """.strip()) transport = DummyTransport() transport.bind('http://tests.python-zeep.org/a.xsd', schema_a) transport.bind('http://tests.python-zeep.org/b.xsd', schema_b) transport.bind('http://tests.python-zeep.org/c.xsd', schema_c) schema = xsd.Schema(schema_a, transport=transport) elm_b = schema.get_element('{http://tests.python-zeep.org/duplicate}elm-in-b') elm_c = schema.get_element('{http://tests.python-zeep.org/duplicate}elm-in-c') assert not isinstance(elm_b.type, xsd.UnresolvedType) assert not isinstance(elm_c.type, xsd.UnresolvedType)
def test_deserialize_rpc_literal(): # Based on #219 wsdl_content = StringIO(""" <?xml version="1.0"?> <wsdl:definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://tests.python-zeep.org/tns" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://tests.python-zeep.org/tns"> <wsdl:message name="getItemSoapIn"></wsdl:message> <wsdl:message name="getItemSoapOut"> <wsdl:part name="getItemReturn" type="xsd:string"/> </wsdl:message> <wsdl:portType name="Test"> <wsdl:operation name="getItem"> <wsdl:input message="tns:getItemSoapIn"/> <wsdl:output message="tns:getItemSoapOut"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="TestSoapBinding" type="tns:Test"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="getItem"> <soap:operation soapAction=""/> <wsdl:input> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://tests.python-zeep.org/tns" use="encoded"/> </wsdl:input> <wsdl:output> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://tests.python-zeep.org/tns" use="encoded"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="TestService"> <wsdl:port binding="tns:TestSoapBinding" name="Test"> <soap:address location="http://test.python-zeeo.org/rpc"/> </wsdl:port> </wsdl:service> </wsdl:definitions> """.strip()) transport = DummyTransport() root = wsdl.Document(wsdl_content, transport) binding = root.bindings[ '{http://tests.python-zeep.org/tns}TestSoapBinding'] operation = binding.get('getItem') document = load_xml(""" <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <ns1:getItemResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://tests.python-zeep.org/tns"> <ns1:getItemReturn xsi:type="xsd:string">foobar</ns1:getItemReturn> </ns1:getItemResponse> </soapenv:Body> </soapenv:Envelope> """) deserialized = operation.output.deserialize(document) assert deserialized == 'foobar'
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_global_element_and_type(): node_a = etree.fromstring(""" <?xml version="1.0"?> <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 schemaLocation="http://tests.python-zeep.org/b.xsd" namespace="http://tests.python-zeep.org/b"/> <xs:complexType name="refs"> <xs:sequence> <xs:element ref="b:ref_elm"/> </xs:sequence> <xs:attribute ref="b:ref_attr"/> </xs:complexType> </xs:schema> """.strip()) node_b = etree.fromstring(""" <?xml version="1.0"?> <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 schemaLocation="http://tests.python-zeep.org/c.xsd" namespace="http://tests.python-zeep.org/c"/> <xs:element name="ref_elm" type="xs:string"/> <xs:attribute name="ref_attr" type="xs:string"/> </xs:schema> """.strip()) node_c = etree.fromstring(""" <?xml version="1.0"?> <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_a"> <xs:sequence> <xs:element name="item_a" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:element name="item" type="xs:string"/> </xs:schema> """.strip()) etree.XMLSchema(node_c) transport = DummyTransport() transport.bind('http://tests.python-zeep.org/b.xsd', node_b) transport.bind('http://tests.python-zeep.org/c.xsd', node_c) schema = xsd.Schema(node_a, transport=transport) type_a = schema.get_type('{http://tests.python-zeep.org/c}type_a') type_a = schema.get_type('{http://tests.python-zeep.org/c}type_a') type_a(item_a='x') elm = schema.get_element('{http://tests.python-zeep.org/c}item') elm('x') elm = schema.get_type('{http://tests.python-zeep.org/a}refs') elm(ref_elm='foo', ref_attr='bar')
def test_force_wsa_soap12(recwarn, monkeypatch): monkeypatch.setattr( uuid, "uuid4", lambda: uuid.UUID("ada686f9-5995-4088-bea4-239f694b2eaf")) 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/soap12/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap12/" 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:element name="input2" type="xsd:string"/> </xsd:schema> </wsdl:types> <wsdl:message name="dummyRequest"> <wsdl:part name="response" element="tns:input"/> </wsdl:message> <wsdl:message name="dummyResponse"> <wsdl:part name="response" element="tns:input2"/> </wsdl:message> <wsdl:portType name="TestPortType"> <wsdl:operation name="TestOperation1"> <wsdl:input message="dummyRequest"/> <wsdl:output message="dummyResponse"/> </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="urn:dummyRequest"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </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()) client = stub(plugins=[wsa.WsAddressingPlugin()], wsse=None, settings=Settings()) transport = DummyTransport() doc = wsdl.Document(wsdl_main, transport, settings=client.settings) binding = doc.services.get("TestService").ports.get("TestPortType").binding envelope, headers = binding._create( "TestOperation1", args=["foo"], kwargs={}, client=client, options={"address": "http://tests.python-zeep.org/test"}, ) expected = """ <soap-env:Envelope xmlns:soap-env="http://www.w3.org/2003/05/soap-envelope"> <soap-env:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"> <wsa:Action>urn:dummyRequest</wsa:Action> <wsa:MessageID>urn:uuid:ada686f9-5995-4088-bea4-239f694b2eaf</wsa:MessageID> <wsa:To>http://tests.python-zeep.org/test</wsa:To> </soap-env:Header> <soap-env:Body> <ns0:input xmlns:ns0="http://tests.python-zeep.org/xsd-main">foo</ns0:input> </soap-env:Body> </soap-env:Envelope> """ assert_nodes_equal(expected, envelope) assert headers["Content-Type"] == ( 'application/soap+xml; charset=utf-8; action="urn:dummyRequest"')
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()
def test_duplicate_target_namespace(): schema_a = etree.fromstring(""" <?xml version="1.0"?> <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" elementFormDefault="qualified"> <xs:import schemaLocation="http://tests.python-zeep.org/b.xsd" namespace="http://tests.python-zeep.org/duplicate"/> <xs:import schemaLocation="http://tests.python-zeep.org/c.xsd" namespace="http://tests.python-zeep.org/duplicate"/> </xs:schema> """.strip()) schema_b = etree.fromstring(""" <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tests.python-zeep.org/duplicate" targetNamespace="http://tests.python-zeep.org/duplicate" elementFormDefault="qualified"> <xsd:element name="elm-in-b" type="tns:item-c"/> <xsd:complexType name="item-c"> <xsd:sequence> <xsd:element name="item-a" type="xsd:string"/> <xsd:element name="item-b" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:schema> """.strip()) schema_c = etree.fromstring(""" <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tests.python-zeep.org/duplicate" targetNamespace="http://tests.python-zeep.org/duplicate" elementFormDefault="qualified"> <xsd:element name="elm-in-c" type="tns:item-c"/> <xsd:complexType name="item-c"> <xsd:sequence> <xsd:element name="item-a" type="xsd:string"/> <xsd:element name="item-b" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:schema> """.strip()) transport = DummyTransport() transport.bind('http://tests.python-zeep.org/a.xsd', schema_a) transport.bind('http://tests.python-zeep.org/b.xsd', schema_b) transport.bind('http://tests.python-zeep.org/c.xsd', schema_c) schema = xsd.Schema(schema_a, transport=transport) elm_b = schema.get_element('{http://tests.python-zeep.org/duplicate}elm-in-b') elm_c = schema.get_element('{http://tests.python-zeep.org/duplicate}elm-in-c') assert not isinstance(elm_b.type, UnresolvedType) assert not isinstance(elm_c.type, UnresolvedType)
def test_issue_221(): transport = DummyTransport() transport.bind( 'https://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd', load_xml(io.open('tests/wsdl_files/xmldsig-core-schema.xsd', 'r').read().encode('utf-8'))) schema = xsd.Schema(load_xml(""" <?xml version="1.0"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tests.python-zeep.org/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" targetNamespace="http://tests.python-zeep.org/" elementFormDefault="qualified"> <import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="https://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd"/> <complexType name="BaseType"> <sequence> <element ref="ds:Signature" minOccurs="0"/> </sequence> <attribute name="Id"/> </complexType> <element name="exportOrgRegistryRequest"> <complexType> <complexContent> <extension base="tns:BaseType"> <sequence> <element name="SearchCriteria" maxOccurs="100"> <complexType> <sequence> <choice> <choice> <element ref="tns:OGRNIP"/> <sequence> <element name="OGRN" type="string"/> <element name="KPP" type="string" minOccurs="0"/> </sequence> </choice> <element ref="tns:orgVersionGUID"/> <element ref="tns:orgRootEntityGUID"/> </choice> <element name="isRegistered" type="boolean" fixed="true" minOccurs="0"> </element> </sequence> </complexType> </element> <element name="lastEditingDateFrom" type="date" minOccurs="0"/> </sequence> </extension> </complexContent> </complexType> </element> <simpleType name="OGRNIPType"> <restriction base="string"> <length value="13"/> </restriction> </simpleType> <element name="OGRNIP" type="tns:OGRNIPType"/> <element name="orgVersionGUID" type="tns:GUIDType"/> <element name="orgRootEntityGUID" type="tns:GUIDType"/> <simpleType name="GUIDType"> <restriction base="string"> <pattern value="([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}"/> </restriction> </simpleType>x </schema> """), transport=transport) schema.set_ns_prefix('tns', 'http://tests.python-zeep.org/') elm = schema.get_element('tns:exportOrgRegistryRequest') # Args obj = elm(None, {'OGRN': '123123123123', 'isRegistered': True}) node = etree.Element('document') elm.render(node, obj) expected = """ <document> <ns0:exportOrgRegistryRequest xmlns:ns0="http://tests.python-zeep.org/"> <ns0:SearchCriteria> <ns0:OGRN>123123123123</ns0:OGRN> <ns0:isRegistered>true</ns0:isRegistered> </ns0:SearchCriteria> </ns0:exportOrgRegistryRequest> </document> """ assert_nodes_equal(expected, node) obj = elm(SearchCriteria={'orgVersionGUID': '1234', 'isRegistered': False}) node = etree.Element('document') elm.render(node, obj) expected = """ <document> <ns0:exportOrgRegistryRequest xmlns:ns0="http://tests.python-zeep.org/"> <ns0:SearchCriteria> <ns0:orgVersionGUID>1234</ns0:orgVersionGUID> <ns0:isRegistered>false</ns0:isRegistered> </ns0:SearchCriteria> </ns0:exportOrgRegistryRequest> </document> """ assert_nodes_equal(expected, node) obj = elm(SearchCriteria={'OGRNIP': '123123123123', 'isRegistered': True}) node = etree.Element('document') elm.render(node, obj) expected = """ <document> <ns0:exportOrgRegistryRequest xmlns:ns0="http://tests.python-zeep.org/"> <ns0:SearchCriteria> <ns0:OGRNIP>123123123123</ns0:OGRNIP> <ns0:isRegistered>true</ns0:isRegistered> </ns0:SearchCriteria> </ns0:exportOrgRegistryRequest> </document> """ assert_nodes_equal(expected, node)
def test_soap_array_parse(): transport = DummyTransport() transport.bind( "http://schemas.xmlsoap.org/soap/encoding/", load_xml( io.open("tests/wsdl_files/soap-enc.xsd", "r").read().encode("utf-8")), ) schema = xsd.Schema( load_xml(""" <?xml version="1.0"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tests.python-zeep.org/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="http://tests.python-zeep.org/" elementFormDefault="qualified"> <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> <complexType name="FlagDetailsStruct"> <sequence> <element name="Name"> <simpleType> <restriction base="string"> <maxLength value="512"/> </restriction> </simpleType> </element> <element name="Value" type="string"/> </sequence> </complexType> <complexType name="FlagDetailsList"> <complexContent> <restriction base="soapenc:Array"> <sequence> <element name="FlagDetailsStruct" type="tns:FlagDetailsStruct" minOccurs="0" maxOccurs="unbounded"/> </sequence> <attribute ref="soapenc:arrayType" use="required"/> </restriction> </complexContent> </complexType> <element name="FlagDetailsList" type="tns:FlagDetailsList"/> </schema> """), transport, ) doc = load_xml(""" <FlagDetailsList xmlns="http://tests.python-zeep.org/"> <FlagDetailsStruct> <Name>flag1</Name> <Value>value1</Value> </FlagDetailsStruct> <FlagDetailsStruct> <Name>flag2</Name> <Value>value2</Value> </FlagDetailsStruct> </FlagDetailsList> """) elm = schema.get_element("ns0:FlagDetailsList") data = elm.parse(doc, schema) assert data[0].Name == "flag1" assert data[0].Value == "value1" assert data[1].Name == "flag2" assert data[1].Value == "value2"
def get_transport(): transport = DummyTransport() transport.bind( 'http://schemas.xmlsoap.org/soap/encoding/', load_xml(io.open('tests/wsdl_files/soap-enc.xsd', 'r').read().encode('utf-8'))) return transport
def test_wsdl_array_of_simple_types(): wsdl_content = StringIO(""" <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://tests.python-zeep.org/tns" xmlns:tns="http://tests.python-zeep.org/tns" xmlns:impl="http://tests.python-zeep.org/tns" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"> <types> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://tests.python-zeep.org/tns"> <complexType name="ArrayOfString"> <complexContent> <restriction base="soapenc:Array"> <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:string[]"/> </restriction> </complexContent> </complexType> </schema> </types> <portType name="SimpleTypeArrayPortType"> <operation name="getSimpleArray"> <input message="tns:getSimpleArrayRequest"/> <output message="tns:getSimpleArrayResponse"/> </operation> </portType> <binding name="SimpleTypeArrayBinding" type="tns:SimpleTypeArrayPortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="getSimpleArray"> <soap:operation soapAction=""/> <input> <soap:body use="encoded" namespace="http://tests.python-zeep.org/tns" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </input> <output> <soap:body parts="return" use="encoded" namespace="http://tests.python-zeep.org/tns" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </output> </operation> </binding> <message name="getSimpleArrayRequest"/> <message name="getSimpleArrayResponse"> <part name="return" type="tns:ArrayOfString"/> </message> </definitions> """.strip()) # noqa transport = DummyTransport() transport.bind( 'http://schemas.xmlsoap.org/soap/encoding/', load_xml( io.open('tests/wsdl_files/soap-enc.xsd', 'r').read().encode('utf-8'))) root = wsdl.Document(wsdl_content, transport) binding = root.bindings[ '{http://tests.python-zeep.org/tns}SimpleTypeArrayBinding'] operation = binding.get('getSimpleArray') document = load_xml(""" <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tests.python-zeep.org/tns" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Body> <ns1:getSimpleArrayResponse> <return SOAP-ENC:arrayType="xsd:string[16]" xsi:type="ns1:ArrayOfString"> <item xsi:type="xsd:string">item</item> <item xsi:type="xsd:string">and</item> <item xsi:type="xsd:string">even</item> <item xsi:type="xsd:string">more</item> <item xsi:type="xsd:string">items</item> </return> </ns1:getSimpleArrayResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> """) deserialized = operation.output.deserialize(document) assert deserialized == ['item', 'and', 'even', 'more', 'items']
def test_soap_array_parse(): transport = DummyTransport() transport.bind( 'http://schemas.xmlsoap.org/soap/encoding/', load_xml(io.open('tests/wsdl_files/soap-enc.xsd', 'r').read().encode('utf-8'))) schema = xsd.Schema(load_xml(""" <?xml version="1.0"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tests.python-zeep.org/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="http://tests.python-zeep.org/" elementFormDefault="qualified"> <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> <complexType name="FlagDetailsStruct"> <sequence> <element name="Name"> <simpleType> <restriction base="string"> <maxLength value="512"/> </restriction> </simpleType> </element> <element name="Value" type="string"/> </sequence> </complexType> <complexType name="FlagDetailsList"> <complexContent> <restriction base="soapenc:Array"> <sequence> <element name="FlagDetailsStruct" type="tns:FlagDetailsStruct" minOccurs="0" maxOccurs="unbounded"/> </sequence> <attribute ref="soapenc:arrayType" use="required"/> </restriction> </complexContent> </complexType> <element name="FlagDetailsList" type="tns:FlagDetailsList"/> </schema> """), transport) doc = load_xml(""" <FlagDetailsList xmlns="http://tests.python-zeep.org/"> <FlagDetailsStruct> <Name>flag1</Name> <Value>value1</Value> </FlagDetailsStruct> <FlagDetailsStruct> <Name>flag2</Name> <Value>value2</Value> </FlagDetailsStruct> </FlagDetailsList> """) elm = schema.get_element('ns0:FlagDetailsList') data = elm.parse(doc, schema) assert data[0].Name == 'flag1' assert data[0].Value == 'value1' assert data[1].Name == 'flag2' assert data[1].Value == 'value2'
def test_issue_221(): transport = DummyTransport() transport.bind( 'https://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd', load_xml( io.open('tests/wsdl_files/xmldsig-core-schema.xsd', 'r').read().encode('utf-8'))) schema = xsd.Schema(load_xml(""" <?xml version="1.0"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tests.python-zeep.org/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" targetNamespace="http://tests.python-zeep.org/" elementFormDefault="qualified"> <import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="https://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd"/> <complexType name="BaseType"> <sequence> <element ref="ds:Signature" minOccurs="0"/> </sequence> <attribute name="Id"/> </complexType> <element name="exportOrgRegistryRequest"> <complexType> <complexContent> <extension base="tns:BaseType"> <sequence> <element name="SearchCriteria" maxOccurs="100"> <complexType> <sequence> <choice> <choice> <element ref="tns:OGRNIP"/> <sequence> <element name="OGRN" type="string"/> <element name="KPP" type="string" minOccurs="0"/> </sequence> </choice> <element ref="tns:orgVersionGUID"/> <element ref="tns:orgRootEntityGUID"/> </choice> <element name="isRegistered" type="boolean" fixed="true" minOccurs="0"> </element> </sequence> </complexType> </element> <element name="lastEditingDateFrom" type="date" minOccurs="0"/> </sequence> </extension> </complexContent> </complexType> </element> <simpleType name="OGRNIPType"> <restriction base="string"> <length value="13"/> </restriction> </simpleType> <element name="OGRNIP" type="tns:OGRNIPType"/> <element name="orgVersionGUID" type="tns:GUIDType"/> <element name="orgRootEntityGUID" type="tns:GUIDType"/> <simpleType name="GUIDType"> <restriction base="string"> <pattern value="([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}"/> </restriction> </simpleType>x </schema> """), transport=transport) schema.set_ns_prefix('tns', 'http://tests.python-zeep.org/') elm = schema.get_element('tns:exportOrgRegistryRequest') # Args obj = elm(None, {'OGRN': '123123123123', 'isRegistered': True}) node = etree.Element('document') elm.render(node, obj) expected = """ <document> <ns0:exportOrgRegistryRequest xmlns:ns0="http://tests.python-zeep.org/"> <ns0:SearchCriteria> <ns0:OGRN>123123123123</ns0:OGRN> <ns0:isRegistered>true</ns0:isRegistered> </ns0:SearchCriteria> </ns0:exportOrgRegistryRequest> </document> """ assert_nodes_equal(expected, node) obj = elm(SearchCriteria={'orgVersionGUID': '1234', 'isRegistered': False}) node = etree.Element('document') elm.render(node, obj) expected = """ <document> <ns0:exportOrgRegistryRequest xmlns:ns0="http://tests.python-zeep.org/"> <ns0:SearchCriteria> <ns0:orgVersionGUID>1234</ns0:orgVersionGUID> <ns0:isRegistered>false</ns0:isRegistered> </ns0:SearchCriteria> </ns0:exportOrgRegistryRequest> </document> """ assert_nodes_equal(expected, node) obj = elm(SearchCriteria={'OGRNIP': '123123123123', 'isRegistered': True}) node = etree.Element('document') elm.render(node, obj) expected = """ <document> <ns0:exportOrgRegistryRequest xmlns:ns0="http://tests.python-zeep.org/"> <ns0:SearchCriteria> <ns0:OGRNIP>123123123123</ns0:OGRNIP> <ns0:isRegistered>true</ns0:isRegistered> </ns0:SearchCriteria> </ns0:exportOrgRegistryRequest> </document> """ assert_nodes_equal(expected, node)
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_array_of_simple_types(): wsdl_content = StringIO(""" <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://tests.python-zeep.org/tns" xmlns:tns="http://tests.python-zeep.org/tns" xmlns:impl="http://tests.python-zeep.org/tns" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"> <types> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://tests.python-zeep.org/tns"> <complexType name="ArrayOfString"> <complexContent> <restriction base="soapenc:Array"> <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:string[]"/> </restriction> </complexContent> </complexType> </schema> </types> <portType name="SimpleTypeArrayPortType"> <operation name="getSimpleArray"> <input message="tns:getSimpleArrayRequest"/> <output message="tns:getSimpleArrayResponse"/> </operation> </portType> <binding name="SimpleTypeArrayBinding" type="tns:SimpleTypeArrayPortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="getSimpleArray"> <soap:operation soapAction=""/> <input> <soap:body use="encoded" namespace="http://tests.python-zeep.org/tns" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </input> <output> <soap:body parts="return" use="encoded" namespace="http://tests.python-zeep.org/tns" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> </output> </operation> </binding> <message name="getSimpleArrayRequest"/> <message name="getSimpleArrayResponse"> <part name="return" type="tns:ArrayOfString"/> </message> </definitions> """.strip()) # noqa transport = DummyTransport() transport.bind( 'http://schemas.xmlsoap.org/soap/encoding/', load_xml(io.open('tests/wsdl_files/soap-enc.xsd', 'r').read().encode('utf-8'))) root = wsdl.Document(wsdl_content, transport) binding = root.bindings['{http://tests.python-zeep.org/tns}SimpleTypeArrayBinding'] operation = binding.get('getSimpleArray') document = load_xml(""" <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tests.python-zeep.org/tns" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Body> <ns1:getSimpleArrayResponse> <return SOAP-ENC:arrayType="xsd:string[16]" xsi:type="ns1:ArrayOfString"> <item xsi:type="xsd:string">item</item> <item xsi:type="xsd:string">and</item> <item xsi:type="xsd:string">even</item> <item xsi:type="xsd:string">more</item> <item xsi:type="xsd:string">items</item> </return> </ns1:getSimpleArrayResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> """) deserialized = operation.output.deserialize(document) assert deserialized == ['item', 'and', 'even', 'more', 'items']
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()
def transport(): transport = DummyTransport() transport.bind( 'http://schemas.xmlsoap.org/soap/encoding/', load_xml(io.open('tests/wsdl_files/soap-enc.xsd', 'r').read().encode('utf-8'))) return transport
def test_wsdl_no_schema_namespace(): wsdl_main = StringIO( """ <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Example.org" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://Example.org" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <xsd:schema elementFormDefault="qualified" > <xsd:element name="AddResponse"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="1" ref="demo" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="Add"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="1" name="a" type="xsd:int" /> <xsd:element minOccurs="1" name="b" type="xsd:int" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="AddResponse"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" name="result" type="xsd:int" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> <xsd:schema elementFormDefault="qualified" > <xsd:element name="demo"> </xsd:element> </xsd:schema> </wsdl:types> <wsdl:message name="ICalculator_Add_InputMessage"> <wsdl:part name="parameters" element="Add" /> </wsdl:message> <wsdl:message name="ICalculator_Add_OutputMessage"> <wsdl:part name="parameters" element="AddResponse" /> </wsdl:message> <wsdl:portType name="ICalculator"> <wsdl:operation name="Add"> <wsdl:input message="tns:ICalculator_Add_InputMessage" /> <wsdl:output message="tns:ICalculator_Add_OutputMessage" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="DefaultBinding_ICalculator" type="tns:ICalculator"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="Add"> <soap:operation soapAction="http://Example.org/ICalculator/Add" style="document" /> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="CalculatorService"> <wsdl:port name="ICalculator" binding="tns:DefaultBinding_ICalculator"> <soap:address location="http://Example.org/ICalculator" /> </wsdl:port> </wsdl:service> </wsdl:definitions> """ ) client = stub(settings=Settings(), plugins=[], wsse=None) transport = DummyTransport() document = wsdl.Document(wsdl_main, transport) binding = ( document.services.get("CalculatorService").ports.get("ICalculator").binding ) envelope, headers = binding._create( "Add", args=[3, 4], kwargs={}, client=client, options={"address": "http://tests.python-zeep.org/test"}, ) expected = """ <soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> <soap-env:Body> <Add> <a>3</a> <b>4</b> </Add> </soap-env:Body> </soap-env:Envelope> """ assert_nodes_equal(expected, envelope)
def test_force_wsa(recwarn, monkeypatch): monkeypatch.setattr( uuid, 'uuid4', lambda: uuid.UUID('ada686f9-5995-4088-bea4-239f694b2eaf')) 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: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:element name="input2" type="xsd:string"/> </xsd:schema> </wsdl:types> <wsdl:message name="dummyRequest"> <wsdl:part name="response" element="tns:input"/> </wsdl:message> <wsdl:message name="dummyResponse"> <wsdl:part name="response" element="tns:input2"/> </wsdl:message> <wsdl:portType name="TestPortType"> <wsdl:operation name="TestOperation1"> <wsdl:input message="dummyRequest"/> <wsdl:output message="dummyResponse"/> </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="urn:dummyRequest"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </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()) transport = DummyTransport() client = Client(wsdl_main, transport=transport, plugins=[wsa.WsAddressingPlugin()]) binding = client.wsdl.services.get('TestService').ports.get( 'TestPortType').binding envelope, headers = binding._create( 'TestOperation1', args=['foo'], kwargs={}, client=client, options={'address': 'http://tests.python-zeep.org/test'}) expected = """ <soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> <soap-env:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"> <wsa:Action>urn:dummyRequest</wsa:Action> <wsa:MessageID>urn:uuid:ada686f9-5995-4088-bea4-239f694b2eaf</wsa:MessageID> <wsa:To>http://tests.python-zeep.org/test</wsa:To> </soap-env:Header> <soap-env:Body> <ns0:input xmlns:ns0="http://tests.python-zeep.org/xsd-main">foo</ns0:input> </soap-env:Body> </soap-env:Envelope> """ assert_nodes_equal(expected, envelope)
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_soap_array_parse_remote_ns(): transport = DummyTransport() transport.bind( "http://schemas.xmlsoap.org/soap/encoding/", load_xml( io.open("tests/wsdl_files/soap-enc.xsd", "r").read().encode("utf-8")), ) schema = xsd.Schema( load_xml(""" <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tests.python-zeep.org/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="http://tests.python-zeep.org/" elementFormDefault="qualified"> <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> <xsd:simpleType name="CountryCodeType"> <xsd:restriction base="xsd:string"> <xsd:length value="2"/> <xsd:pattern value="[a-zA-Z]{2}"/> </xsd:restriction> </xsd:simpleType> <xsd:complexType name="CountryItemType"> <xsd:sequence> <xsd:element name="code" type="tns:CountryCodeType"/> <xsd:element name="name" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="CountriesArrayType"> <xsd:complexContent> <xsd:restriction base="soapenc:Array"> <xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="tns:CountryItemType[]"/> </xsd:restriction> </xsd:complexContent> </xsd:complexType> <xsd:element name="countries" type="tns:CountriesArrayType"/> </xsd:schema> """), transport, ) doc = load_xml(""" <countries SOAP-ENC:arrayType="ns1:CountryItemType[1]" xsi:type="ns1:CountriesArrayType" xmlns:ns1="http://tests.python-zeep.org/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <item xsi:type="ns1:CountryItemType"> <code xsi:type="ns1:CountryCodeType">NL</code> <name xsi:type="xsd:string">The Netherlands</name> </item> </countries> """) elm = schema.get_element("ns0:countries") data = elm.parse(doc, schema) assert data[0].code == "NL" assert data[0].name == "The Netherlands"
def test_extra_http_headers(recwarn, monkeypatch): 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/soap12/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap12/" 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:element name="input2" type="xsd:string"/> </xsd:schema> </wsdl:types> <wsdl:message name="dummyRequest"> <wsdl:part name="response" element="tns:input"/> </wsdl:message> <wsdl:message name="dummyResponse"> <wsdl:part name="response" element="tns:input2"/> </wsdl:message> <wsdl:portType name="TestPortType"> <wsdl:operation name="TestOperation1"> <wsdl:input message="dummyRequest"/> <wsdl:output message="dummyResponse"/> </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="urn:dummyRequest"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </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() ) client = stub(settings=Settings(), plugins=[], wsse=None) transport = DummyTransport() doc = wsdl.Document(wsdl_main, transport, settings=client.settings) binding = doc.services.get("TestService").ports.get("TestPortType").binding headers = {"Authorization": "Bearer 1234"} with client.settings(extra_http_headers=headers): envelope, headers = binding._create( "TestOperation1", args=["foo"], kwargs={}, client=client, options={"address": "http://tests.python-zeep.org/test"}, ) expected = """ <soap-env:Envelope xmlns:soap-env="http://www.w3.org/2003/05/soap-envelope"> <soap-env:Body> <ns0:input xmlns:ns0="http://tests.python-zeep.org/xsd-main">foo</ns0:input> </soap-env:Body> </soap-env:Envelope> """ assert_nodes_equal(expected, envelope) assert headers["Authorization"] == "Bearer 1234"
def test_inherit_wsdl_target_namespace(): wsdl_main = StringIO(""" <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://Example.org" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" targetNamespace="http://Example.org" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <xsd:schema elementFormDefault="qualified" > <xsd:element name="AddResponse"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="1" ref="demo" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="Add"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="1" name="a" type="xsd:int" /> <xsd:element minOccurs="1" name="b" type="xsd:int" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="AddResponse"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" name="result" type="xsd:int" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> <xsd:schema elementFormDefault="qualified" > <xsd:element name="demo"> </xsd:element> </xsd:schema> </wsdl:types> <wsdl:message name="ICalculator_Add_InputMessage"> <wsdl:part name="parameters" element="Add" /> </wsdl:message> <wsdl:message name="ICalculator_Add_OutputMessage"> <wsdl:part name="parameters" element="AddResponse" /> </wsdl:message> <wsdl:portType name="ICalculator"> <wsdl:operation name="Add"> <wsdl:input wsaw:Action="http://Example.org/ICalculator/Add" message="tns:ICalculator_Add_InputMessage" /> <wsdl:output wsaw:Action="http://Example.org/ICalculator/AddResponse" message="tns:ICalculator_Add_OutputMessage" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="DefaultBinding_ICalculator" type="tns:ICalculator"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="Add"> <soap:operation soapAction="http://Example.org/ICalculator/Add" style="document" /> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="CalculatorService"> <wsdl:port name="ICalculator" binding="tns:DefaultBinding_ICalculator"> <soap:address location="http://Example.org/ICalculator" /> </wsdl:port> </wsdl:service> </wsdl:definitions> """) transport = DummyTransport() document = wsdl.Document(wsdl_main, transport) document.dump()