s-savon 0.8.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +9 -0
- data/.rspec +1 -0
- data/.yardopts +2 -0
- data/CHANGELOG.md +461 -0
- data/Gemfile +4 -0
- data/LICENSE +20 -0
- data/README.md +37 -0
- data/Rakefile +40 -0
- data/lib/savon.rb +14 -0
- data/lib/savon/client.rb +157 -0
- data/lib/savon/core_ext/hash.rb +70 -0
- data/lib/savon/core_ext/object.rb +14 -0
- data/lib/savon/core_ext/string.rb +51 -0
- data/lib/savon/core_ext/time.rb +14 -0
- data/lib/savon/error.rb +6 -0
- data/lib/savon/global.rb +75 -0
- data/lib/savon/http/error.rb +42 -0
- data/lib/savon/soap.rb +24 -0
- data/lib/savon/soap/fault.rb +59 -0
- data/lib/savon/soap/request.rb +61 -0
- data/lib/savon/soap/response.rb +80 -0
- data/lib/savon/soap/xml.rb +187 -0
- data/lib/savon/version.rb +5 -0
- data/lib/savon/wsdl/document.rb +112 -0
- data/lib/savon/wsdl/parser.rb +102 -0
- data/lib/savon/wsdl/request.rb +35 -0
- data/lib/savon/wsse.rb +150 -0
- data/savon.gemspec +29 -0
- data/spec/fixtures/gzip/message.gz +0 -0
- data/spec/fixtures/response/another_soap_fault.xml +14 -0
- data/spec/fixtures/response/authentication.xml +14 -0
- data/spec/fixtures/response/header.xml +13 -0
- data/spec/fixtures/response/list.xml +18 -0
- data/spec/fixtures/response/multi_ref.xml +39 -0
- data/spec/fixtures/response/soap_fault.xml +8 -0
- data/spec/fixtures/response/soap_fault12.xml +18 -0
- data/spec/fixtures/wsdl/authentication.xml +63 -0
- data/spec/fixtures/wsdl/geotrust.xml +156 -0
- data/spec/fixtures/wsdl/namespaced_actions.xml +307 -0
- data/spec/fixtures/wsdl/no_namespace.xml +115 -0
- data/spec/fixtures/wsdl/two_bindings.xml +25 -0
- data/spec/savon/client_spec.rb +346 -0
- data/spec/savon/core_ext/hash_spec.rb +121 -0
- data/spec/savon/core_ext/object_spec.rb +19 -0
- data/spec/savon/core_ext/string_spec.rb +57 -0
- data/spec/savon/core_ext/time_spec.rb +13 -0
- data/spec/savon/http/error_spec.rb +52 -0
- data/spec/savon/savon_spec.rb +85 -0
- data/spec/savon/soap/fault_spec.rb +89 -0
- data/spec/savon/soap/request_spec.rb +45 -0
- data/spec/savon/soap/response_spec.rb +174 -0
- data/spec/savon/soap/xml_spec.rb +335 -0
- data/spec/savon/soap_spec.rb +21 -0
- data/spec/savon/wsdl/document_spec.rb +132 -0
- data/spec/savon/wsdl/parser_spec.rb +99 -0
- data/spec/savon/wsdl/request_spec.rb +15 -0
- data/spec/savon/wsse_spec.rb +213 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/support/endpoint.rb +25 -0
- data/spec/support/fixture.rb +37 -0
- metadata +251 -0
@@ -0,0 +1,115 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<definitions name="Api" xmlns:typens="urn:ActionWebService" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" targetNamespace="urn:ActionWebService" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns="http://schemas.xmlsoap.org/wsdl/">
|
3
|
+
<types>
|
4
|
+
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:ActionWebService">
|
5
|
+
<xsd:complexType name="MpUser">
|
6
|
+
<xsd:all>
|
7
|
+
<xsd:element name="avatar_thumb_url" type="xsd:string"/>
|
8
|
+
<xsd:element name="speciality" type="xsd:string"/>
|
9
|
+
<xsd:element name="avatar_icon_url" type="xsd:string"/>
|
10
|
+
<xsd:element name="firstname" type="xsd:string"/>
|
11
|
+
<xsd:element name="city" type="xsd:string"/>
|
12
|
+
<xsd:element name="mp_id" type="xsd:int"/>
|
13
|
+
<xsd:element name="lastname" type="xsd:string"/>
|
14
|
+
<xsd:element name="login" type="xsd:string"/>
|
15
|
+
</xsd:all>
|
16
|
+
</xsd:complexType>
|
17
|
+
<xsd:complexType name="MpUserArray">
|
18
|
+
<xsd:complexContent>
|
19
|
+
<xsd:restriction base="soapenc:Array">
|
20
|
+
<xsd:attribute wsdl:arrayType="typens:MpUser[]" ref="soapenc:arrayType"/>
|
21
|
+
</xsd:restriction>
|
22
|
+
</xsd:complexContent>
|
23
|
+
</xsd:complexType>
|
24
|
+
<xsd:complexType name="McContact">
|
25
|
+
<xsd:all>
|
26
|
+
<xsd:element name="last_name" type="xsd:string"/>
|
27
|
+
<xsd:element name="email" type="xsd:string"/>
|
28
|
+
<xsd:element name="mp_id" type="xsd:int"/>
|
29
|
+
<xsd:element name="role" type="xsd:int"/>
|
30
|
+
<xsd:element name="login" type="xsd:string"/>
|
31
|
+
<xsd:element name="first_name" type="xsd:string"/>
|
32
|
+
</xsd:all>
|
33
|
+
</xsd:complexType>
|
34
|
+
<xsd:complexType name="McContactArray">
|
35
|
+
<xsd:complexContent>
|
36
|
+
<xsd:restriction base="soapenc:Array">
|
37
|
+
<xsd:attribute wsdl:arrayType="typens:McContact[]" ref="soapenc:arrayType"/>
|
38
|
+
</xsd:restriction>
|
39
|
+
</xsd:complexContent>
|
40
|
+
</xsd:complexType>
|
41
|
+
</xsd:schema>
|
42
|
+
</types>
|
43
|
+
<message name="GetUserLoginById">
|
44
|
+
<part name="api_key" type="xsd:string"/>
|
45
|
+
<part name="id" type="xsd:int"/>
|
46
|
+
</message>
|
47
|
+
<message name="GetUserLoginByIdResponse">
|
48
|
+
<part name="return" type="xsd:string"/>
|
49
|
+
</message>
|
50
|
+
<message name="GetAllContacts">
|
51
|
+
<part name="api_key" type="xsd:string"/>
|
52
|
+
<part name="login" type="xsd:string"/>
|
53
|
+
</message>
|
54
|
+
<message name="GetAllContactsResponse">
|
55
|
+
<part name="return" type="typens:McContactArray"/>
|
56
|
+
</message>
|
57
|
+
<message name="SearchUser">
|
58
|
+
<part name="api_key" type="xsd:string"/>
|
59
|
+
<part name="phrase" type="xsd:string"/>
|
60
|
+
<part name="page" type="xsd:string"/>
|
61
|
+
<part name="per_page" type="xsd:string"/>
|
62
|
+
</message>
|
63
|
+
<message name="SearchUserResponse">
|
64
|
+
<part name="return" type="typens:MpUserArray"/>
|
65
|
+
</message>
|
66
|
+
<portType name="ApiApiPort">
|
67
|
+
<operation name="GetUserLoginById">
|
68
|
+
<input message="typens:GetUserLoginById"/>
|
69
|
+
<output message="typens:GetUserLoginByIdResponse"/>
|
70
|
+
</operation>
|
71
|
+
<operation name="GetAllContacts">
|
72
|
+
<input message="typens:GetAllContacts"/>
|
73
|
+
<output message="typens:GetAllContactsResponse"/>
|
74
|
+
</operation>
|
75
|
+
<operation name="SearchUser">
|
76
|
+
<input message="typens:SearchUser"/>
|
77
|
+
<output message="typens:SearchUserResponse"/>
|
78
|
+
</operation>
|
79
|
+
</portType>
|
80
|
+
<binding name="ApiApiBinding" type="typens:ApiApiPort">
|
81
|
+
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/>
|
82
|
+
<operation name="GetUserLoginById">
|
83
|
+
<soap:operation soapAction="/api/api/GetUserLoginById"/>
|
84
|
+
<input>
|
85
|
+
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:ActionWebService" use="encoded"/>
|
86
|
+
</input>
|
87
|
+
<output>
|
88
|
+
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:ActionWebService" use="encoded"/>
|
89
|
+
</output>
|
90
|
+
</operation>
|
91
|
+
<operation name="GetAllContacts">
|
92
|
+
<soap:operation soapAction="/api/api/GetAllContacts"/>
|
93
|
+
<input>
|
94
|
+
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:ActionWebService" use="encoded"/>
|
95
|
+
</input>
|
96
|
+
<output>
|
97
|
+
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:ActionWebService" use="encoded"/>
|
98
|
+
</output>
|
99
|
+
</operation>
|
100
|
+
<operation name="SearchUser">
|
101
|
+
<soap:operation soapAction="/api/api/SearchUser"/>
|
102
|
+
<input>
|
103
|
+
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:ActionWebService" use="encoded"/>
|
104
|
+
</input>
|
105
|
+
<output>
|
106
|
+
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:ActionWebService" use="encoded"/>
|
107
|
+
</output>
|
108
|
+
</operation>
|
109
|
+
</binding>
|
110
|
+
<service name="ApiService">
|
111
|
+
<port name="ApiApiPort" binding="typens:ApiApiBinding">
|
112
|
+
<soap:address location="http://example.com/api/api"/>
|
113
|
+
</port>
|
114
|
+
</service>
|
115
|
+
</definitions>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!-- Example of a WSDL with two <binding> tags ("sections" in Savon
|
3
|
+
parlance).
|
4
|
+
|
5
|
+
This is stripped down from a real example found in the wild, although
|
6
|
+
having different operations for the SOAP 1.1 and SOAP 1.2 bindings
|
7
|
+
is hypothetical (the real-world example I saw had the same operations
|
8
|
+
in each binding section). -->
|
9
|
+
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
10
|
+
<types>
|
11
|
+
</types>
|
12
|
+
<portType name="BlogSoap">
|
13
|
+
</portType>
|
14
|
+
<binding name="BlogSoap">
|
15
|
+
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
|
16
|
+
<operation name="Post" />
|
17
|
+
<operation name="Post11only" />
|
18
|
+
</binding>
|
19
|
+
<binding name="BlogSoap12">
|
20
|
+
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
|
21
|
+
<operation name="Post" />
|
22
|
+
<operation name="Post12only" />
|
23
|
+
</binding>
|
24
|
+
</definitions>
|
25
|
+
|
@@ -0,0 +1,346 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Savon::Client do
|
4
|
+
let(:client) { Savon::Client.new { wsdl.document = Endpoint.wsdl } }
|
5
|
+
|
6
|
+
describe ".new" do
|
7
|
+
context "with a block expecting one argument" do
|
8
|
+
it "should yield the WSDL object" do
|
9
|
+
Savon::Client.new { |wsdl| wsdl.should be_a(Savon::WSDL::Document) }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
context "with a block expecting two arguments" do
|
14
|
+
it "should yield the WSDL and HTTP objects" do
|
15
|
+
Savon::Client.new do |wsdl, http|
|
16
|
+
wsdl.should be_an(Savon::WSDL::Document)
|
17
|
+
http.should be_an(HTTPI::Request)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "with a block expecting three arguments" do
|
23
|
+
it "should yield the WSDL, HTTP and WSSE objects" do
|
24
|
+
Savon::Client.new do |wsdl, http, wsse|
|
25
|
+
wsdl.should be_an(Savon::WSDL::Document)
|
26
|
+
http.should be_an(HTTPI::Request)
|
27
|
+
wsse.should be_an(Savon::WSSE)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "with a block expecting no arguments" do
|
33
|
+
it "should let you access the WSDL object" do
|
34
|
+
Savon::Client.new { wsdl.should be_a(Savon::WSDL::Document) }
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should let you access the HTTP object" do
|
38
|
+
Savon::Client.new { http.should be_an(HTTPI::Request) }
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should let you access the WSSE object" do
|
42
|
+
Savon::Client.new { wsse.should be_a(Savon::WSSE) }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "#wsdl" do
|
48
|
+
it "should return the Savon::WSDL::Document" do
|
49
|
+
client.wsdl.should be_a(Savon::WSDL::Document)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "#http" do
|
54
|
+
it "should return the HTTPI::Request" do
|
55
|
+
client.http.should be_an(HTTPI::Request)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "#wsse" do
|
60
|
+
it "should return the Savon::WSSE object" do
|
61
|
+
client.wsse.should be_a(Savon::WSSE)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "#request" do
|
66
|
+
before do
|
67
|
+
HTTPI.stubs(:get).returns(new_response(:body => Fixture.wsdl(:authentication)))
|
68
|
+
HTTPI.stubs(:post).returns(new_response)
|
69
|
+
end
|
70
|
+
|
71
|
+
context "without any arguments" do
|
72
|
+
it "should raise an ArgumentError" do
|
73
|
+
lambda { client.request }.should raise_error(ArgumentError)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "with a single argument (Symbol)" do
|
78
|
+
it "should set the input tag to result in <getUser>" do
|
79
|
+
client.request(:get_user) { soap.input.should == [:getUser, {}] }
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should set the target namespace with the default identifier" do
|
83
|
+
namespace = 'xmlns:wsdl="http://v1_0.ws.auth.order.example.com/"'
|
84
|
+
HTTPI::Request.any_instance.expects(:body=).with { |value| value.include? namespace }
|
85
|
+
|
86
|
+
client.request :get_user
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should not set the target namespace if soap.namespace was set to nil" do
|
90
|
+
namespace = "http://v1_0.ws.auth.order.example.com/"
|
91
|
+
HTTPI::Request.any_instance.expects(:body=).with { |value| !value.include?(namespace) }
|
92
|
+
|
93
|
+
client.request(:get_user) { soap.namespace = nil }
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context "with a single argument (String)" do
|
98
|
+
it "should set the input tag to result in <get_user>" do
|
99
|
+
client.request("get_user") { soap.input.should == [:get_user, {}] }
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context "with a Symbol and a Hash" do
|
104
|
+
it "should set the input tag to result in <getUser active='true'>" do
|
105
|
+
client.request(:get_user, :active => true) { soap.input.should == [:getUser, { :active => true }] }
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context "with two Symbols" do
|
110
|
+
it "should set the input tag to result in <wsdl:getUser>" do
|
111
|
+
client.request(:v1, :get_user) { soap.input.should == [:v1, :getUser, {}] }
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should set the target namespace with the given identifier" do
|
115
|
+
namespace = 'xmlns:v1="http://v1_0.ws.auth.order.example.com/"'
|
116
|
+
HTTPI::Request.any_instance.expects(:body=).with { |value| value.include? namespace }
|
117
|
+
|
118
|
+
client.request :v1, :get_user
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should not set the target namespace if soap.namespace was set to nil" do
|
122
|
+
namespace = "http://v1_0.ws.auth.order.example.com/"
|
123
|
+
HTTPI::Request.any_instance.expects(:body=).with { |value| !value.include?(namespace) }
|
124
|
+
|
125
|
+
client.request(:v1, :get_user) { soap.namespace = nil }
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
context "with two Symbols and a Hash" do
|
130
|
+
it "should set the input tag to result in <wsdl:getUser active='true'>" do
|
131
|
+
client.request(:wsdl, :get_user, :active => true) { soap.input.should == [:wsdl, :getUser, { :active => true }] }
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
context "with a block expecting one argument" do
|
136
|
+
it "should yield the SOAP object" do
|
137
|
+
client.request(:authenticate) { |soap| soap.should be_a(Savon::SOAP::XML) }
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
context "with a block expecting two arguments" do
|
142
|
+
it "should yield the SOAP and WSDL objects" do
|
143
|
+
client.request(:authenticate) do |soap, wsdl|
|
144
|
+
soap.should be_a(Savon::SOAP::XML)
|
145
|
+
wsdl.should be_an(Savon::WSDL::Document)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
context "with a block expecting three arguments" do
|
151
|
+
it "should yield the SOAP, WSDL and HTTP objects" do
|
152
|
+
client.request(:authenticate) do |soap, wsdl, http|
|
153
|
+
soap.should be_a(Savon::SOAP::XML)
|
154
|
+
wsdl.should be_an(Savon::WSDL::Document)
|
155
|
+
http.should be_an(HTTPI::Request)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
context "with a block expecting four arguments" do
|
161
|
+
it "should yield the SOAP, WSDL, HTTP and WSSE objects" do
|
162
|
+
client.request(:authenticate) do |soap, wsdl, http, wsse|
|
163
|
+
soap.should be_a(Savon::SOAP::XML)
|
164
|
+
wsdl.should be_a(Savon::WSDL::Document)
|
165
|
+
http.should be_an(HTTPI::Request)
|
166
|
+
wsse.should be_a(Savon::WSSE)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
context "with a block expecting no arguments" do
|
172
|
+
it "should let you access the SOAP object" do
|
173
|
+
client.request(:authenticate) { soap.should be_a(Savon::SOAP::XML) }
|
174
|
+
end
|
175
|
+
|
176
|
+
it "should let you access the HTTP object" do
|
177
|
+
client.request(:authenticate) { http.should be_an(HTTPI::Request) }
|
178
|
+
end
|
179
|
+
|
180
|
+
it "should let you access the WSSE object" do
|
181
|
+
client.request(:authenticate) { wsse.should be_a(Savon::WSSE) }
|
182
|
+
end
|
183
|
+
|
184
|
+
it "should let you access the WSDL object" do
|
185
|
+
client.request(:authenticate) { wsdl.should be_a(Savon::WSDL::Document) }
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
it "should not set the Cookie header for the next request" do
|
190
|
+
client.http.headers.expects(:[]=).with("Cookie", anything).never
|
191
|
+
client.http.headers.stubs(:[]=).with("SOAPAction", '"authenticate"')
|
192
|
+
client.http.headers.stubs(:[]=).with("Content-Type", "text/xml;charset=UTF-8")
|
193
|
+
|
194
|
+
client.request :authenticate
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
context "#request with a Set-Cookie response header" do
|
199
|
+
before do
|
200
|
+
HTTPI.stubs(:get).returns(new_response(:body => Fixture.wsdl(:authentication)))
|
201
|
+
HTTPI.stubs(:post).returns(new_response(:headers => { "Set-Cookie" => "some-cookie" }))
|
202
|
+
end
|
203
|
+
|
204
|
+
it "should set the Cookie header for the next request" do
|
205
|
+
client.http.headers.expects(:[]=).with("Cookie", "some-cookie")
|
206
|
+
client.http.headers.stubs(:[]=).with("SOAPAction", '"authenticate"')
|
207
|
+
client.http.headers.stubs(:[]=).with("Content-Type", "text/xml;charset=UTF-8")
|
208
|
+
|
209
|
+
client.request :authenticate
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
context "with a remote WSDL document" do
|
214
|
+
let(:client) { Savon::Client.new { wsdl.document = Endpoint.wsdl } }
|
215
|
+
before { HTTPI.expects(:get).returns(new_response(:body => Fixture.wsdl(:authentication))) }
|
216
|
+
|
217
|
+
it "should return a list of available SOAP actions" do
|
218
|
+
client.wsdl.soap_actions.should == [:authenticate]
|
219
|
+
end
|
220
|
+
|
221
|
+
it "adds a SOAPAction header containing the SOAP action name" do
|
222
|
+
HTTPI.stubs(:post).returns(new_response)
|
223
|
+
|
224
|
+
client.request :authenticate do
|
225
|
+
http.headers["SOAPAction"].should == %{"authenticate"}
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
it "should execute SOAP requests and return the response" do
|
230
|
+
HTTPI.expects(:post).returns(new_response)
|
231
|
+
response = client.request(:authenticate)
|
232
|
+
|
233
|
+
response.should be_a(Savon::SOAP::Response)
|
234
|
+
response.to_xml.should == Fixture.response(:authentication)
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
context "with a local WSDL document" do
|
239
|
+
let(:client) { Savon::Client.new { wsdl.document = "spec/fixtures/wsdl/authentication.xml" } }
|
240
|
+
|
241
|
+
before { HTTPI.expects(:get).never }
|
242
|
+
|
243
|
+
it "should return a list of available SOAP actions" do
|
244
|
+
client.wsdl.soap_actions.should == [:authenticate]
|
245
|
+
end
|
246
|
+
|
247
|
+
it "adds a SOAPAction header containing the SOAP action name" do
|
248
|
+
HTTPI.stubs(:post).returns(new_response)
|
249
|
+
|
250
|
+
client.request :authenticate do
|
251
|
+
http.headers["SOAPAction"].should == %{"authenticate"}
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
it "should get #element_form_default from the WSDL" do
|
256
|
+
HTTPI.stubs(:post).returns(new_response)
|
257
|
+
Savon::WSDL::Document.any_instance.expects(:element_form_default).returns(:qualified)
|
258
|
+
|
259
|
+
client.request :authenticate
|
260
|
+
end
|
261
|
+
|
262
|
+
it "should execute SOAP requests and return the response" do
|
263
|
+
HTTPI.expects(:post).returns(new_response)
|
264
|
+
response = client.request(:authenticate)
|
265
|
+
|
266
|
+
response.should be_a(Savon::SOAP::Response)
|
267
|
+
response.to_xml.should == Fixture.response(:authentication)
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
context "without a WSDL document" do
|
272
|
+
let(:client) do
|
273
|
+
Savon::Client.new do
|
274
|
+
wsdl.endpoint = Endpoint.soap
|
275
|
+
wsdl.namespace = "http://v1_0.ws.auth.order.example.com/"
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
before { HTTPI.expects(:get).never }
|
280
|
+
|
281
|
+
it "raise an ArgumentError when trying to access the WSDL" do
|
282
|
+
lambda { client.wsdl.soap_actions }.should raise_error(ArgumentError)
|
283
|
+
end
|
284
|
+
|
285
|
+
it "adds a SOAPAction header containing the SOAP action name" do
|
286
|
+
HTTPI.stubs(:post).returns(new_response)
|
287
|
+
|
288
|
+
client.request :authenticate do
|
289
|
+
http.headers["SOAPAction"].should == %{"authenticate"}
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
it "should not get #element_form_default from the WSDL" do
|
294
|
+
HTTPI.stubs(:post).returns(new_response)
|
295
|
+
Savon::WSDL::Document.any_instance.expects(:element_form_default).never
|
296
|
+
|
297
|
+
client.request :authenticate
|
298
|
+
end
|
299
|
+
|
300
|
+
it "should execute SOAP requests and return the response" do
|
301
|
+
HTTPI.expects(:post).returns(new_response)
|
302
|
+
response = client.request(:authenticate)
|
303
|
+
|
304
|
+
response.should be_a(Savon::SOAP::Response)
|
305
|
+
response.to_xml.should == Fixture.response(:authentication)
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
context "when encountering a SOAP fault" do
|
310
|
+
let(:client) do
|
311
|
+
Savon::Client.new do
|
312
|
+
wsdl.endpoint = Endpoint.soap
|
313
|
+
wsdl.namespace = "http://v1_0.ws.auth.order.example.com/"
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
before { HTTPI::expects(:post).returns(new_response(:code => 500, :body => Fixture.response(:soap_fault))) }
|
318
|
+
|
319
|
+
it "should raise a Savon::SOAP::Fault" do
|
320
|
+
lambda { client.request :authenticate }.should raise_error(Savon::SOAP::Fault)
|
321
|
+
end
|
322
|
+
end
|
323
|
+
|
324
|
+
context "when encountering an HTTP error" do
|
325
|
+
let(:client) do
|
326
|
+
Savon::Client.new do
|
327
|
+
wsdl.endpoint = Endpoint.soap
|
328
|
+
wsdl.namespace = "http://v1_0.ws.auth.order.example.com/"
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
before { HTTPI::expects(:post).returns(new_response(:code => 500)) }
|
333
|
+
|
334
|
+
it "should raise a Savon::HTTP::Error" do
|
335
|
+
lambda { client.request :authenticate }.should raise_error(Savon::HTTP::Error)
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
339
|
+
def new_response(options = {})
|
340
|
+
defaults = { :code => 200, :headers => {}, :body => Fixture.response(:authentication) }
|
341
|
+
response = defaults.merge options
|
342
|
+
|
343
|
+
HTTPI::Response.new response[:code], response[:headers], response[:body]
|
344
|
+
end
|
345
|
+
|
346
|
+
end
|