458 lines
13 KiB
Smalltalk
458 lines
13 KiB
Smalltalk
|
||
Object subclass: SoapSampleCustomer [
|
||
| name age dateOfBirth |
|
||
|
||
<category: 'SOAP-Example-CustomComplexType'>
|
||
<comment: nil>
|
||
|
||
SoapSampleCustomer class >> customerA [
|
||
<category: 'sample instances'>
|
||
| cust |
|
||
cust := self new.
|
||
cust name: 'Masashi'.
|
||
cust age: 36.
|
||
cust dateOfBirth: (DateTime fromString: '1970-11-22T00:00:00-07:00').
|
||
^cust
|
||
]
|
||
|
||
SoapSampleCustomer class >> customerB [
|
||
<category: 'sample instances'>
|
||
| cust |
|
||
cust := self new.
|
||
cust name: 'Mike'.
|
||
cust age: 26.
|
||
cust dateOfBirth: (DateTime fromString: '1980-10-20T00:00:00-07:00').
|
||
^cust
|
||
]
|
||
|
||
SoapSampleCustomer class >> initialize [
|
||
"SoapSampleCustomer initialize"
|
||
|
||
<category: 'class initialization'>
|
||
SoapEncoder complexTypeDict at: self name put: 'types:Customer'.
|
||
SoapLiteralEncoder complexTypeDict at: self name put: 'types:Customer'.
|
||
SoapDecoder complexTypeDict at: 'types:Customer' put: self
|
||
]
|
||
|
||
age [
|
||
"Answer the value of age"
|
||
|
||
<category: 'accessing'>
|
||
^age
|
||
]
|
||
|
||
age: anObject [
|
||
"Set the value of age"
|
||
|
||
<category: 'accessing'>
|
||
age := anObject
|
||
]
|
||
|
||
dateOfBirth [
|
||
"Answer the value of dateOfBirth"
|
||
|
||
<category: 'accessing'>
|
||
^dateOfBirth
|
||
]
|
||
|
||
dateOfBirth: anObject [
|
||
"Set the value of dateOfBirth"
|
||
|
||
<category: 'accessing'>
|
||
dateOfBirth := anObject
|
||
]
|
||
|
||
name [
|
||
<category: 'accessing'>
|
||
^name
|
||
]
|
||
|
||
name: anObject [
|
||
"Set the value of name"
|
||
|
||
<category: 'accessing'>
|
||
name := anObject
|
||
]
|
||
]
|
||
|
||
|
||
|
||
Object subclass: SoapSampleGroup [
|
||
| name members |
|
||
|
||
<category: 'SOAP-Example-CustomComplexType'>
|
||
<comment: nil>
|
||
|
||
SoapSampleGroup class >> groupA [
|
||
"SoapSampleGroup groupA"
|
||
|
||
<category: 'sample instances'>
|
||
| group |
|
||
group := self new.
|
||
group name: 'Squeak support'.
|
||
group members add: SoapSampleCustomer customerA.
|
||
group members add: SoapSampleCustomer customerB.
|
||
^group
|
||
]
|
||
|
||
SoapSampleGroup class >> initialize [
|
||
"SoapSampleGroup initialize"
|
||
|
||
<category: 'class initialization'>
|
||
SoapEncoder complexTypeDict at: self name put: 'types:Groups'.
|
||
SoapLiteralEncoder complexTypeDict at: self name put: 'types:Groups'.
|
||
SoapDecoder complexTypeDict at: 'types:Groups' put: self
|
||
]
|
||
|
||
members [
|
||
"Answer the value of members"
|
||
|
||
<category: 'accessing'>
|
||
members ifNil: [members := OrderedCollection new].
|
||
^members
|
||
]
|
||
|
||
members: anObject [
|
||
"Set the value of members"
|
||
|
||
<category: 'accessing'>
|
||
members := anObject
|
||
]
|
||
|
||
name [
|
||
<category: 'accessing'>
|
||
^name
|
||
]
|
||
|
||
name: anObject [
|
||
"Set the value of name"
|
||
|
||
<category: 'accessing'>
|
||
name := anObject
|
||
]
|
||
]
|
||
|
||
TestCase subclass: SoapDecoderCustomTestCase [
|
||
|
||
<comment: nil>
|
||
<category: 'SOAP-TestCases'>
|
||
|
||
dotNetSharedValuesEnvelopeXML2 [
|
||
<category: 'fixtures'>
|
||
^'<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||
xmlns:types="http://tempuri.org/" xmlns:tns="http://tempuri.org/"
|
||
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
|
||
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
|
||
<soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
|
||
<types:FindCustomersResponse>
|
||
<FindCustomersResult href="#id1"></FindCustomersResult>
|
||
</types:FindCustomersResponse>
|
||
<soapenc:Array id="id1" soapenc:arrayType="types:Customer[2]">
|
||
<Item href="#id2"></Item>
|
||
<Item href="#id3"></Item>
|
||
</soapenc:Array>
|
||
<types:Customer id="id2" xsi:type="types:Customer">
|
||
<Name xsi:type="xsd:string">Ume</Name>
|
||
<Age xsi:type="xsd:int">36</Age>
|
||
<DateOfBirth
|
||
xsi:type="xsd:dateTime">1970-11-22T00:00:00.0000000-07:00</DateOfBirth>
|
||
</types:Customer>
|
||
<types:Customer id="id3" xsi:type="types:Customer">
|
||
<Name xsi:type="xsd:string">Ramon</Name>
|
||
<Age xsi:type="xsd:int">31</Age>
|
||
<DateOfBirth
|
||
xsi:type="xsd:dateTime">1995-11-22T00:00:00.0000000-07:00</DateOfBirth>
|
||
</types:Customer>
|
||
</soap:Body>
|
||
</soap:Envelope>
|
||
'
|
||
]
|
||
|
||
testDecodeDotNetSharedValuesXMLEnvelope2 [
|
||
"self debug: #testDecodeDotNetSharedValuesXMLEnvelope2"
|
||
|
||
<category: 'testing'>
|
||
| originalUseDotNetStyleSharedValues envelopeBuilder returnEnvelope message resp value |
|
||
SoapSampleCustomer initialize.
|
||
|
||
[originalUseDotNetStyleSharedValues := SoapResponse
|
||
useDotNetStyleSharedValues.
|
||
SoapResponse useDotNetStyleSharedValues: true.
|
||
envelopeBuilder := SoapEnvelopeBuilder new.
|
||
returnEnvelope := envelopeBuilder
|
||
buildSoapEnvelopeFromXmlString: self dotNetSharedValuesEnvelopeXML2.
|
||
message := SoapMessage envelope: returnEnvelope.
|
||
resp := SoapResponse fromSoapMessage: message.
|
||
value := resp returnValue.
|
||
self should: [value size = 2].
|
||
self should: [value first name = 'Ume'].
|
||
self should: [value first age = 36].
|
||
self should:
|
||
[value first dateOfBirth
|
||
= (DateTime fromString: '1970-11-22T00:00:00-07:00')].
|
||
self should: [value second name = 'Ramon'].
|
||
self should: [value second age = 31].
|
||
self should:
|
||
[value second dateOfBirth
|
||
= (DateTime fromString: '1995-11-22T00:00:00-07:00')]]
|
||
ensure:
|
||
[SoapResponse
|
||
useDotNetStyleSharedValues: originalUseDotNetStyleSharedValues]
|
||
]
|
||
|
||
testEncodeCustomStructType [
|
||
"self debug: #testEncodeCustomStructType"
|
||
|
||
<category: 'testing'>
|
||
| enc cust elem elem2 |
|
||
enc := SoapEncoder new.
|
||
enc useSharedValues: false.
|
||
cust := SoapSampleCustomer new.
|
||
cust
|
||
name: 'John';
|
||
age: 25;
|
||
dateOfBirth: (DateTime fromString: '1980-11-22T00:00:00-07:00');
|
||
yourself.
|
||
enc complexTypeDict at: #SoapSampleCustomer put: 'types:Customer'.
|
||
elem := enc
|
||
encodeSoapVariable: (SoapVariable name: 'customer' value: cust).
|
||
self should: [elem name = 'customer'].
|
||
"self should: [elem xsiType isNil]."
|
||
self should: [elem xsiType = 'types:Customer'].
|
||
self should: [(elem findChildNamed: 'name') value = 'John'].
|
||
self should: [(elem findChildNamed: 'age') value = '25'].
|
||
"BUG: FIXME:
|
||
self should:
|
||
[(elem findChildNamed: 'dateOfBirth') value = '1980-11-22T00:00:00-07:00'].
|
||
"
|
||
elem2 := enc encodeSoapVariable: (SoapVariable
|
||
name: 'customer'
|
||
value: cust
|
||
xsdType: (enc complexXsdTypeOf: cust)).
|
||
self should: [elem2 name = 'customer'].
|
||
self should: [elem2 xsiType = 'types:Customer'].
|
||
self should: [(elem2 findChildNamed: 'name') value = 'John'].
|
||
self should: [(elem2 findChildNamed: 'age') value = '25'].
|
||
"BUG: FIXME:
|
||
self should:
|
||
[(elem2 findChildNamed: 'dateOfBirth') value = '1980-11-22T00:00:00-07:00']
|
||
"
|
||
]
|
||
|
||
testEncodeCustomStructTypeHavingCustomStructs [
|
||
"self debug: #testEncodeCustomStructTypeHavingCustomStructs"
|
||
|
||
<category: 'testing'>
|
||
| enc group elem members memA memB |
|
||
enc := SoapEncoder new.
|
||
group := SoapSampleGroup groupA.
|
||
enc complexTypeDict at: #SoapSampleGroup put: 'types:Group'.
|
||
enc complexTypeDict at: #SoapSampleCustomer put: 'types:Customer'.
|
||
enc useSharedValues: true.
|
||
elem := enc encodeSoapVariable: (SoapVariable name: 'group' value: group).
|
||
self should: [elem name = 'group'].
|
||
self should: [(elem findChildNamed: 'name') value = 'Squeak support'].
|
||
members := elem findChildNamed: 'members'.
|
||
self should: [members xsiType isNil].
|
||
self should: [members arrayItemType = 'types:Customer'].
|
||
self should: [members size = 2].
|
||
memA := members children first.
|
||
self should: [memA name = 'item'].
|
||
self should: [memA xsiType = 'types:Customer'].
|
||
self should: [(memA findChildNamed: 'name') value = 'Masashi'].
|
||
self should: [(memA findChildNamed: 'age') value = '36'].
|
||
"BUG: FIXME:
|
||
self should:
|
||
[(memA findChildNamed: 'dateOfBirth') value = '1970-11-22T00:00:00-07:00'].
|
||
"
|
||
memB := members children second.
|
||
self should: [memB name = 'item'].
|
||
self should: [memB xsiType = 'types:Customer'].
|
||
self should: [(memB findChildNamed: 'name') value = 'Mike'].
|
||
self should: [(memB findChildNamed: 'age') value = '26'].
|
||
"BUG: FIXME:
|
||
self should:
|
||
[(memB findChildNamed: 'dateOfBirth') value = '1980-10-20T00:00:00-07:00']
|
||
"
|
||
]
|
||
|
||
testEncodeCustomStructTypeSharedInArray [
|
||
"self debug: #testEncodeCustomStructTypeSharedInArray"
|
||
|
||
<category: 'testing'>
|
||
| enc cust cust2 elems elem first second third |
|
||
enc := SoapEncoder new.
|
||
cust := SoapSampleCustomer new.
|
||
cust
|
||
name: 'John';
|
||
age: 25;
|
||
dateOfBirth: (DateTime fromString: '1980-11-22T00:00:00-07:00');
|
||
yourself.
|
||
enc complexTypeDict at: #SoapSampleCustomer put: 'types:Customer'.
|
||
cust2 := SoapSampleCustomer new.
|
||
cust2
|
||
name: 'Taro';
|
||
age: 35;
|
||
dateOfBirth: (DateTime fromString: '1970-11-22T00:00:00-07:00');
|
||
yourself.
|
||
enc useSharedValues: true.
|
||
elems := (SoapEncArray encoder: enc)
|
||
fromArray: (Array
|
||
with: cust
|
||
with: cust2
|
||
with: cust)
|
||
named: 'resultElements'
|
||
elementType: 'ResultElement'.
|
||
elem := enc
|
||
encodeSoapVariable: (SoapVariable name: 'resultElements' value: elems).
|
||
self should: [elem isArrayType].
|
||
first := elem children first.
|
||
self should: [first id notNil].
|
||
self should: [(first findChildNamed: 'name') value = 'John'].
|
||
self should: [(first findChildNamed: 'age') value = '25'].
|
||
"BUG: FIXME:
|
||
self should:
|
||
[(first findChildNamed: 'dateOfBirth') value = '1980-11-22T00:00:00-07:00'].
|
||
"
|
||
second := elem children second.
|
||
self should: [second id isNil].
|
||
self should: [(second findChildNamed: 'name') value = 'Taro'].
|
||
self should: [(second findChildNamed: 'age') value = '35'].
|
||
"BUG: FIXME:
|
||
self should:
|
||
[(second findChildNamed: 'dateOfBirth') value = '1970-11-22T00:00:00-07:00'].
|
||
"
|
||
third := elem children third.
|
||
self should: [third id isNil].
|
||
self should: [third children isEmpty].
|
||
self should: [first id = (third href copyFrom: 2) asNumber]
|
||
]
|
||
|
||
testEncodeCustomStructTypeSharedInStruct [
|
||
"self debug: #testEncodeCustomStructTypeSharedInStruct"
|
||
|
||
<category: 'testing'>
|
||
| enc cust cust2 elem struct1 a b c |
|
||
enc := SoapEncoder new.
|
||
cust := SoapSampleCustomer new.
|
||
cust
|
||
name: 'John';
|
||
age: 25;
|
||
dateOfBirth: (DateTime fromString: '1980-11-22T00:00:00-07:00');
|
||
yourself.
|
||
enc complexTypeDict at: #SoapSampleCustomer put: 'types:Customer'.
|
||
cust2 := SoapSampleCustomer new.
|
||
cust2
|
||
name: 'Taro';
|
||
age: 35;
|
||
dateOfBirth: (DateTime fromString: '1970-11-22T00:00:00-07:00');
|
||
yourself.
|
||
struct1 := SoapEncStruct fromAssociations:
|
||
{#a -> cust.
|
||
#b -> cust2.
|
||
#c -> cust2}.
|
||
enc useSharedValues: true.
|
||
elem := enc
|
||
encodeSoapVariable: (SoapVariable name: 'resultElements' value: struct1).
|
||
self should: [elem name = 'resultElements'].
|
||
a := elem findChildNamed: 'a'.
|
||
self should: [a id isNil].
|
||
self should: [(a findChildNamed: 'name') value = 'John'].
|
||
self should: [(a findChildNamed: 'age') value = '25'].
|
||
"FIXME: BUG:
|
||
self should:
|
||
[(a findChildNamed: 'dateOfBirth') value = '1980-11-22T00:00:00-07:00'].
|
||
"
|
||
b := elem findChildNamed: 'b'.
|
||
self should: [b id notNil].
|
||
self should: [(b findChildNamed: 'name') value = 'Taro'].
|
||
self should: [(b findChildNamed: 'age') value = '35'].
|
||
"FIXME: BUG:
|
||
self should:
|
||
[(b findChildNamed: 'dateOfBirth') value = '1970-11-22T00:00:00-07:00'].
|
||
"
|
||
c := elem findChildNamed: 'c'.
|
||
self should: [c id isNil].
|
||
self should: [c children isEmpty].
|
||
self should: [b id = (c href copyFrom: 2) asNumber]
|
||
]
|
||
]
|
||
|
||
|
||
TestCase subclass: SoapDecoderCustomTestCase [
|
||
|
||
<comment: nil>
|
||
<category: 'SOAP-TestCases'>
|
||
|
||
dotNetSharedValuesEnvelopeXML2 [
|
||
<category: 'fixtures'>
|
||
^'<soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||
xmlns:types="http://tempuri.org/" xmlns:tns="http://tempuri.org/"
|
||
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
|
||
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
|
||
<soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
|
||
<types:FindCustomersResponse>
|
||
<FindCustomersResult href="#id1"></FindCustomersResult>
|
||
</types:FindCustomersResponse>
|
||
<soapenc:Array id="id1" soapenc:arrayType="types:Customer[2]">
|
||
<Item href="#id2"></Item>
|
||
<Item href="#id3"></Item>
|
||
</soapenc:Array>
|
||
<types:Customer id="id2" xsi:type="types:Customer">
|
||
<Name xsi:type="xsd:string">Ume</Name>
|
||
<Age xsi:type="xsd:int">36</Age>
|
||
<DateOfBirth
|
||
xsi:type="xsd:dateTime">1970-11-22T00:00:00.0000000-07:00</DateOfBirth>
|
||
</types:Customer>
|
||
<types:Customer id="id3" xsi:type="types:Customer">
|
||
<Name xsi:type="xsd:string">Ramon</Name>
|
||
<Age xsi:type="xsd:int">31</Age>
|
||
<DateOfBirth
|
||
xsi:type="xsd:dateTime">1995-11-22T00:00:00.0000000-07:00</DateOfBirth>
|
||
</types:Customer>
|
||
</soap:Body>
|
||
</soap:Envelope>
|
||
'
|
||
]
|
||
|
||
testDecodeDotNetSharedValuesXMLEnvelope2 [
|
||
"self debug: #testDecodeDotNetSharedValuesXMLEnvelope2"
|
||
|
||
<category: 'testing'>
|
||
| originalUseDotNetStyleSharedValues envelopeBuilder returnEnvelope message resp value |
|
||
SoapSampleCustomer initialize.
|
||
|
||
[originalUseDotNetStyleSharedValues := SoapResponse
|
||
useDotNetStyleSharedValues.
|
||
SoapResponse useDotNetStyleSharedValues: true.
|
||
envelopeBuilder := SoapEnvelopeBuilder new.
|
||
returnEnvelope := envelopeBuilder
|
||
buildSoapEnvelopeFromXmlString: self dotNetSharedValuesEnvelopeXML2.
|
||
message := SoapMessage envelope: returnEnvelope.
|
||
resp := SoapResponse fromSoapMessage: message.
|
||
value := resp returnValue.
|
||
self should: [value size = 2].
|
||
self should: [value first name = 'Ume'].
|
||
self should: [value first age = 36].
|
||
|
||
"BUG: broken time classes
|
||
self should:
|
||
[value first dateOfBirth
|
||
= (DateTime fromString: '1970-11-22T00:00:00-07:00')].
|
||
"
|
||
self should: [value second name = 'Ramon'].
|
||
self should: [value second age = 31].
|
||
"BUG: broken time classes in GST
|
||
self should:
|
||
[value second dateOfBirth
|
||
= (DateTime fromString: '1995-11-22T00:00:00-07:00')]
|
||
"
|
||
]
|
||
ensure:
|
||
[SoapResponse
|
||
useDotNetStyleSharedValues: originalUseDotNetStyleSharedValues]
|
||
]
|
||
]
|