savon 1.2.0 → 2.0.0
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/CHANGELOG.md +119 -104
- data/README.md +12 -11
- data/Rakefile +0 -6
- data/lib/savon.rb +16 -14
- data/lib/savon/block_interface.rb +26 -0
- data/lib/savon/builder.rb +142 -0
- data/lib/savon/client.rb +36 -135
- data/lib/savon/header.rb +42 -0
- data/lib/savon/http_error.rb +27 -0
- data/lib/savon/log_message.rb +23 -25
- data/lib/savon/message.rb +35 -0
- data/lib/savon/mock.rb +5 -0
- data/lib/savon/mock/expectation.rb +70 -0
- data/lib/savon/mock/spec_helper.rb +62 -0
- data/lib/savon/model.rb +39 -61
- data/lib/savon/operation.rb +62 -0
- data/lib/savon/options.rb +265 -0
- data/lib/savon/qualified_message.rb +49 -0
- data/lib/savon/request.rb +92 -0
- data/lib/savon/response.rb +97 -0
- data/lib/savon/soap_fault.rb +40 -0
- data/lib/savon/version.rb +1 -1
- data/savon.gemspec +10 -8
- data/spec/integration/options_spec.rb +536 -0
- data/spec/integration/request_spec.rb +31 -16
- data/spec/integration/support/application.rb +80 -0
- data/spec/integration/support/server.rb +84 -0
- data/spec/savon/builder_spec.rb +81 -0
- data/spec/savon/client_spec.rb +90 -488
- data/spec/savon/http_error_spec.rb +49 -0
- data/spec/savon/log_message_spec.rb +33 -0
- data/spec/savon/mock_spec.rb +127 -0
- data/spec/savon/model_spec.rb +110 -99
- data/spec/savon/observers_spec.rb +92 -0
- data/spec/savon/operation_spec.rb +49 -0
- data/spec/savon/request_spec.rb +145 -0
- data/spec/savon/{soap/response_spec.rb → response_spec.rb} +22 -59
- data/spec/savon/soap_fault_spec.rb +94 -0
- data/spec/spec_helper.rb +5 -3
- data/spec/support/fixture.rb +5 -1
- metadata +202 -197
- data/lib/savon/config.rb +0 -46
- data/lib/savon/error.rb +0 -6
- data/lib/savon/hooks/group.rb +0 -68
- data/lib/savon/hooks/hook.rb +0 -61
- data/lib/savon/http/error.rb +0 -42
- data/lib/savon/logger.rb +0 -39
- data/lib/savon/null_logger.rb +0 -10
- data/lib/savon/soap.rb +0 -21
- data/lib/savon/soap/fault.rb +0 -59
- data/lib/savon/soap/invalid_response_error.rb +0 -13
- data/lib/savon/soap/request.rb +0 -86
- data/lib/savon/soap/request_builder.rb +0 -205
- data/lib/savon/soap/response.rb +0 -117
- data/lib/savon/soap/xml.rb +0 -257
- data/spec/savon/config_spec.rb +0 -38
- data/spec/savon/hooks/group_spec.rb +0 -71
- data/spec/savon/hooks/hook_spec.rb +0 -16
- data/spec/savon/http/error_spec.rb +0 -52
- data/spec/savon/logger_spec.rb +0 -51
- data/spec/savon/savon_spec.rb +0 -33
- data/spec/savon/soap/fault_spec.rb +0 -89
- data/spec/savon/soap/request_builder_spec.rb +0 -207
- data/spec/savon/soap/request_spec.rb +0 -112
- data/spec/savon/soap/xml_spec.rb +0 -357
- data/spec/savon/soap_spec.rb +0 -16
@@ -0,0 +1,92 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "integration/support/server"
|
3
|
+
|
4
|
+
describe Savon do
|
5
|
+
|
6
|
+
before :all do
|
7
|
+
@server = IntegrationServer.run
|
8
|
+
end
|
9
|
+
|
10
|
+
after :all do
|
11
|
+
@server.stop
|
12
|
+
end
|
13
|
+
|
14
|
+
describe ".observers" do
|
15
|
+
after :each do
|
16
|
+
Savon.observers.clear
|
17
|
+
end
|
18
|
+
|
19
|
+
it "allows to register an observer for every request" do
|
20
|
+
observer = Class.new {
|
21
|
+
|
22
|
+
def notify(operation_name, builder, globals, locals)
|
23
|
+
@operation_name = operation_name
|
24
|
+
|
25
|
+
@builder = builder
|
26
|
+
@globals = globals
|
27
|
+
@locals = locals
|
28
|
+
|
29
|
+
# return nil to execute the request
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
|
33
|
+
attr_reader :operation_name, :builder, :globals, :locals
|
34
|
+
|
35
|
+
}.new
|
36
|
+
|
37
|
+
Savon.observers << observer
|
38
|
+
|
39
|
+
new_client.call(:authenticate)
|
40
|
+
|
41
|
+
expect(observer.operation_name).to eq(:authenticate)
|
42
|
+
|
43
|
+
expect(observer.builder).to be_a(Savon::Builder)
|
44
|
+
expect(observer.globals).to be_a(Savon::GlobalOptions)
|
45
|
+
expect(observer.locals).to be_a(Savon::LocalOptions)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "allows to register an observer which mocks requests" do
|
49
|
+
observer = Class.new {
|
50
|
+
|
51
|
+
def notify(*)
|
52
|
+
# return a response to mock the request
|
53
|
+
HTTPI::Response.new(201, { "X-Result" => "valid" }, "valid!")
|
54
|
+
end
|
55
|
+
|
56
|
+
}.new
|
57
|
+
|
58
|
+
Savon.observers << observer
|
59
|
+
|
60
|
+
response = new_client.call(:authenticate)
|
61
|
+
|
62
|
+
expect(response.http.code).to eq(201)
|
63
|
+
expect(response.http.headers).to eq("X-Result" => "valid")
|
64
|
+
expect(response.http.body).to eq("valid!")
|
65
|
+
end
|
66
|
+
|
67
|
+
it "raises if an observer returns something other than nil or an HTTPI::Response" do
|
68
|
+
observer = Class.new {
|
69
|
+
|
70
|
+
def notify(*)
|
71
|
+
[]
|
72
|
+
end
|
73
|
+
|
74
|
+
}.new
|
75
|
+
|
76
|
+
Savon.observers << observer
|
77
|
+
|
78
|
+
expect { new_client.call(:authenticate) }.
|
79
|
+
to raise_error(Savon::Error, "Observers need to return an HTTPI::Response " \
|
80
|
+
"to mock the request or nil to execute the request.")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def new_client
|
85
|
+
Savon.client(
|
86
|
+
:endpoint => @server.url(:repeat),
|
87
|
+
:namespace => "http://v1.example.com",
|
88
|
+
:log => false
|
89
|
+
)
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "integration/support/server"
|
3
|
+
|
4
|
+
describe Savon::Operation do
|
5
|
+
|
6
|
+
let(:globals) { Savon::GlobalOptions.new(:endpoint => @server.url(:repeat), :log => false) }
|
7
|
+
let(:wsdl) { Wasabi::Document.new Fixture.wsdl(:authentication) }
|
8
|
+
let(:no_wsdl) { Wasabi::Document.new }
|
9
|
+
|
10
|
+
before :all do
|
11
|
+
@server = IntegrationServer.run
|
12
|
+
end
|
13
|
+
|
14
|
+
after :all do
|
15
|
+
@server.stop
|
16
|
+
end
|
17
|
+
|
18
|
+
describe ".create with a WSDL" do
|
19
|
+
it "returns a new operation" do
|
20
|
+
operation = Savon::Operation.create(:authenticate, wsdl, globals)
|
21
|
+
expect(operation).to be_a(Savon::Operation)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "raises if the operation name is not a Symbol" do
|
25
|
+
expect { Savon::Operation.create("not a symbol", wsdl, globals) }.
|
26
|
+
to raise_error(ArgumentError, /Expected the first parameter \(the name of the operation to call\) to be a symbol/)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "raises if the operation is not available for the service" do
|
30
|
+
expect { Savon::Operation.create(:no_such_operation, wsdl, globals) }.
|
31
|
+
to raise_error(ArgumentError, /Unable to find SOAP operation: :no_such_operation/)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe ".create without a WSDL" do
|
36
|
+
it "returns a new operation" do
|
37
|
+
operation = Savon::Operation.create(:authenticate, no_wsdl, globals)
|
38
|
+
expect(operation).to be_a(Savon::Operation)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#call" do
|
43
|
+
it "returns a response object" do
|
44
|
+
operation = Savon::Operation.create(:authenticate, wsdl, globals)
|
45
|
+
expect(operation.call).to be_a(Savon::Response)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "integration/support/server"
|
3
|
+
|
4
|
+
describe Savon::Request do
|
5
|
+
|
6
|
+
subject(:request) { Savon::Request.new(:authenticate, wsdl, globals, locals) }
|
7
|
+
|
8
|
+
let(:globals) { Savon::GlobalOptions.new(:endpoint => @server.url, :log => false) }
|
9
|
+
let(:locals) { Savon::LocalOptions.new }
|
10
|
+
let(:wsdl) { Wasabi::Document.new Fixture.wsdl(:authentication) }
|
11
|
+
let(:no_wsdl) { Wasabi::Document.new }
|
12
|
+
|
13
|
+
before :all do
|
14
|
+
@server = IntegrationServer.run
|
15
|
+
end
|
16
|
+
|
17
|
+
after :all do
|
18
|
+
@server.stop
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "#call" do
|
22
|
+
it "expects the XML to POST" do
|
23
|
+
response = request.call("<xml/>")
|
24
|
+
|
25
|
+
expect(request.http.url).to eq(URI(globals[:endpoint]))
|
26
|
+
expect(request.http.body).to eq("<xml/>")
|
27
|
+
expect(request.http.headers["Content-Length"]).to eq("<xml/>".bytesize.to_s)
|
28
|
+
|
29
|
+
expect(response).to be_a(HTTPI::Response)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "falls back to use the WSDL's endpoint if the global :endpoint option was not set" do
|
33
|
+
wsdl.endpoint = @server.url
|
34
|
+
globals_without_endpoint = Savon::GlobalOptions.new(:log => false)
|
35
|
+
request = Savon::Request.new(:authenticate, wsdl, globals_without_endpoint, locals)
|
36
|
+
response = request.call("<xml/>")
|
37
|
+
|
38
|
+
expect(request.http.url).to eq(URI(wsdl.endpoint))
|
39
|
+
end
|
40
|
+
|
41
|
+
it "sets the global :proxy option if it's available" do
|
42
|
+
globals[:proxy] = "http://proxy.example.com"
|
43
|
+
expect(request.http.proxy).to eq(URI(globals[:proxy]))
|
44
|
+
end
|
45
|
+
|
46
|
+
it "does not set the global :proxy option when it's not available" do
|
47
|
+
expect(request.http.proxy).to be_nil
|
48
|
+
end
|
49
|
+
|
50
|
+
it "sets the request cookies using the global :last_response option if it's available" do
|
51
|
+
http = HTTPI::Response.new(200, {}, ["<success/>"])
|
52
|
+
globals[:last_response] = Savon::Response.new(http, globals, locals)
|
53
|
+
|
54
|
+
HTTPI::Request.any_instance.expects(:set_cookies).with(globals[:last_response]).once
|
55
|
+
request
|
56
|
+
end
|
57
|
+
|
58
|
+
it "does not set the cookies using the global :last_response option when it's not available" do
|
59
|
+
expect(request.http.open_timeout).to be_nil
|
60
|
+
end
|
61
|
+
|
62
|
+
it "sets the global :open_timeout option if it's available" do
|
63
|
+
globals[:open_timeout] = 33
|
64
|
+
expect(request.http.open_timeout).to eq(globals[:open_timeout])
|
65
|
+
end
|
66
|
+
|
67
|
+
it "does not set the global :open_timeout option when it's not available" do
|
68
|
+
request.call("<xml/>")
|
69
|
+
expect(request.http.open_timeout).to be_nil
|
70
|
+
end
|
71
|
+
|
72
|
+
it "sets the global :read_timeout option if it's available" do
|
73
|
+
globals[:read_timeout] = 44
|
74
|
+
expect(request.http.read_timeout).to eq(globals[:read_timeout])
|
75
|
+
end
|
76
|
+
|
77
|
+
it "does not set the global :read_timeout option when it's not available" do
|
78
|
+
expect(request.http.read_timeout).to be_nil
|
79
|
+
end
|
80
|
+
|
81
|
+
it "sets the global :headers option if it's available" do
|
82
|
+
globals[:headers] = { "X-Authorize" => "secret" }
|
83
|
+
expect(request.http.headers["X-Authorize"]).to eq("secret")
|
84
|
+
end
|
85
|
+
|
86
|
+
it "sets the SOAPAction header using the local :soap_action option if it's available" do
|
87
|
+
locals[:soap_action] = "urn://authenticate"
|
88
|
+
expect(request.http.headers["SOAPAction"]).to eq(%{"#{locals[:soap_action]}"})
|
89
|
+
end
|
90
|
+
|
91
|
+
it "sets the SOAPAction header using the WSDL if it's available" do
|
92
|
+
expect(request.http.headers["SOAPAction"]).to eq(%{"authenticate"})
|
93
|
+
end
|
94
|
+
|
95
|
+
it "sets the SOAPAction header using Gyoku if both option and WSDL were not set" do
|
96
|
+
request = Savon::Request.new(:authenticate, no_wsdl, globals, locals)
|
97
|
+
expect(request.http.headers["SOAPAction"]).to eq(%{"authenticate"})
|
98
|
+
end
|
99
|
+
|
100
|
+
it "does not set the SOAPAction header if it's already set" do
|
101
|
+
locals[:soap_action] = "urn://authenticate"
|
102
|
+
globals[:headers] = { "SOAPAction" => %{"doAuthenticate"} }
|
103
|
+
|
104
|
+
expect(request.http.headers["SOAPAction"]).to eq(%{"doAuthenticate"})
|
105
|
+
end
|
106
|
+
|
107
|
+
it "does not set the SOAPAction header if the local :soap_action was set to nil" do
|
108
|
+
locals[:soap_action] = nil
|
109
|
+
expect(request.http.headers).to_not include("SOAPAction")
|
110
|
+
end
|
111
|
+
|
112
|
+
it "sets the SOAP 1.2 Content-Type header using the global :soap_version and :encoding options if available" do
|
113
|
+
globals[:soap_version] = 2
|
114
|
+
globals[:encoding] = "UTF-16"
|
115
|
+
|
116
|
+
expect(request.http.headers["Content-Type"]).to eq("application/soap+xml;charset=UTF-16")
|
117
|
+
end
|
118
|
+
|
119
|
+
it "sets the SOAP 1.1 Content-Type header using the global :soap_version and :encoding options if available" do
|
120
|
+
globals[:soap_version] = 1
|
121
|
+
globals[:encoding] = "UTF-8"
|
122
|
+
|
123
|
+
expect(request.http.headers["Content-Type"]).to eq("text/xml;charset=UTF-8")
|
124
|
+
end
|
125
|
+
|
126
|
+
it "sets the global :basic_auth option if it's available" do
|
127
|
+
globals[:basic_auth] = [:luke, "secret"]
|
128
|
+
expect(request.http.auth.basic).to eq(globals[:basic_auth])
|
129
|
+
end
|
130
|
+
|
131
|
+
it "does not set the global :basic_auth option when it's not available" do
|
132
|
+
expect(request.http.auth.basic).to be_nil
|
133
|
+
end
|
134
|
+
|
135
|
+
it "sets the global :digest_auth option if it's available" do
|
136
|
+
globals[:digest_auth] = [:lea, "top-secret"]
|
137
|
+
expect(request.http.auth.digest).to eq(globals[:digest_auth])
|
138
|
+
end
|
139
|
+
|
140
|
+
it "does not set the global :digest_auth option when it's not available" do
|
141
|
+
expect(request.http.auth.digest).to be_nil
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
@@ -1,31 +1,32 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
-
describe Savon::
|
3
|
+
describe Savon::Response do
|
4
4
|
|
5
|
-
let(:
|
5
|
+
let(:globals) { Savon::GlobalOptions.new }
|
6
|
+
let(:locals) { Savon::LocalOptions.new }
|
6
7
|
|
7
8
|
describe ".new" do
|
8
|
-
it "should raise a Savon::
|
9
|
-
lambda { soap_fault_response }.should raise_error(Savon::
|
9
|
+
it "should raise a Savon::Fault in case of a SOAP fault" do
|
10
|
+
lambda { soap_fault_response }.should raise_error(Savon::SOAPFault)
|
10
11
|
end
|
11
12
|
|
12
|
-
it "should not raise a Savon::
|
13
|
-
|
14
|
-
lambda { soap_fault_response }.should_not raise_error(Savon::
|
13
|
+
it "should not raise a Savon::Fault in case the default is turned off" do
|
14
|
+
globals[:raise_errors] = false
|
15
|
+
lambda { soap_fault_response }.should_not raise_error(Savon::SOAPFault)
|
15
16
|
end
|
16
17
|
|
17
18
|
it "should raise a Savon::HTTP::Error in case of an HTTP error" do
|
18
|
-
lambda { soap_response :code => 500 }.should raise_error(Savon::
|
19
|
+
lambda { soap_response :code => 500 }.should raise_error(Savon::HTTPError)
|
19
20
|
end
|
20
21
|
|
21
22
|
it "should not raise a Savon::HTTP::Error in case the default is turned off" do
|
22
|
-
|
23
|
+
globals[:raise_errors] = false
|
23
24
|
soap_response :code => 500
|
24
25
|
end
|
25
26
|
end
|
26
27
|
|
27
28
|
describe "#success?" do
|
28
|
-
before {
|
29
|
+
before { globals[:raise_errors] = false }
|
29
30
|
|
30
31
|
it "should return true if the request was successful" do
|
31
32
|
soap_response.should be_a_success
|
@@ -41,7 +42,7 @@ describe Savon::SOAP::Response do
|
|
41
42
|
end
|
42
43
|
|
43
44
|
describe "#soap_fault?" do
|
44
|
-
before {
|
45
|
+
before { globals[:raise_errors] = false }
|
45
46
|
|
46
47
|
it "should not return true in case the response seems to be ok" do
|
47
48
|
soap_response.soap_fault?.should be_false
|
@@ -52,24 +53,8 @@ describe Savon::SOAP::Response do
|
|
52
53
|
end
|
53
54
|
end
|
54
55
|
|
55
|
-
describe "#soap_fault" do
|
56
|
-
before { config.raise_errors = false }
|
57
|
-
|
58
|
-
it "should return a Savon::SOAP::Fault" do
|
59
|
-
soap_fault_response.soap_fault.should be_a(Savon::SOAP::Fault)
|
60
|
-
end
|
61
|
-
|
62
|
-
it "should return a Savon::SOAP::Fault containing the HTTPI::Response" do
|
63
|
-
soap_fault_response.soap_fault.http.should be_an(HTTPI::Response)
|
64
|
-
end
|
65
|
-
|
66
|
-
it "should return a Savon::SOAP::Fault even if the SOAP response seems to be ok" do
|
67
|
-
soap_response.soap_fault.should be_a(Savon::SOAP::Fault)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
56
|
describe "#http_error?" do
|
72
|
-
before {
|
57
|
+
before { globals[:raise_errors] = false }
|
73
58
|
|
74
59
|
it "should not return true in case the response seems to be ok" do
|
75
60
|
soap_response.http_error?.should_not be_true
|
@@ -80,33 +65,6 @@ describe Savon::SOAP::Response do
|
|
80
65
|
end
|
81
66
|
end
|
82
67
|
|
83
|
-
describe "#http_error" do
|
84
|
-
before { config.raise_errors = false }
|
85
|
-
|
86
|
-
it "should return a Savon::HTTP::Error" do
|
87
|
-
http_error_response.http_error.should be_a(Savon::HTTP::Error)
|
88
|
-
end
|
89
|
-
|
90
|
-
it "should return a Savon::HTTP::Error containing the HTTPI::Response" do
|
91
|
-
http_error_response.http_error.http.should be_an(HTTPI::Response)
|
92
|
-
end
|
93
|
-
|
94
|
-
it "should return a Savon::HTTP::Error even if the HTTP response seems to be ok" do
|
95
|
-
soap_response.http_error.should be_a(Savon::HTTP::Error)
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
describe "#[]" do
|
100
|
-
it "should return the SOAP response body as a Hash" do
|
101
|
-
soap_response[:authenticate_response][:return].should ==
|
102
|
-
Fixture.response_hash(:authentication)[:authenticate_response][:return]
|
103
|
-
end
|
104
|
-
|
105
|
-
it "should throw an exception when the response body isn't parsable" do
|
106
|
-
lambda { invalid_soap_response.body }.should raise_error Savon::SOAP::InvalidResponseError
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
68
|
describe "#header" do
|
111
69
|
it "should return the SOAP response header as a Hash" do
|
112
70
|
response = soap_response :body => Fixture.response(:header)
|
@@ -114,7 +72,7 @@ describe Savon::SOAP::Response do
|
|
114
72
|
end
|
115
73
|
|
116
74
|
it "should throw an exception when the response header isn't parsable" do
|
117
|
-
lambda { invalid_soap_response.header }.should raise_error Savon::
|
75
|
+
lambda { invalid_soap_response.header }.should raise_error Savon::InvalidResponseError
|
118
76
|
end
|
119
77
|
end
|
120
78
|
|
@@ -147,6 +105,11 @@ describe Savon::SOAP::Response do
|
|
147
105
|
soap_response.to_array(:authenticate_response, :return).should ==
|
148
106
|
[Fixture.response_hash(:authentication)[:authenticate_response][:return]]
|
149
107
|
end
|
108
|
+
|
109
|
+
it "should properly return FalseClass values [#327]" do
|
110
|
+
body = Gyoku.xml(:envelope => { :body => { :return => { :success => false } } })
|
111
|
+
soap_response(:body => body).to_array(:return, :success).should == [false]
|
112
|
+
end
|
150
113
|
end
|
151
114
|
|
152
115
|
context "when the given path returns nil" do
|
@@ -199,7 +162,7 @@ describe Savon::SOAP::Response do
|
|
199
162
|
response = defaults.merge options
|
200
163
|
http_response = HTTPI::Response.new(response[:code], response[:headers], response[:body])
|
201
164
|
|
202
|
-
Savon::
|
165
|
+
Savon::Response.new(http_response, globals, locals)
|
203
166
|
end
|
204
167
|
|
205
168
|
def soap_fault_response
|
@@ -210,12 +173,12 @@ describe Savon::SOAP::Response do
|
|
210
173
|
soap_response :code => 404, :body => "Not found"
|
211
174
|
end
|
212
175
|
|
213
|
-
def invalid_soap_response(options={})
|
176
|
+
def invalid_soap_response(options = {})
|
214
177
|
defaults = { :code => 200, :headers => {}, :body => "I'm not SOAP" }
|
215
178
|
response = defaults.merge options
|
216
179
|
http_response = HTTPI::Response.new(response[:code], response[:headers], response[:body])
|
217
180
|
|
218
|
-
Savon::
|
181
|
+
Savon::Response.new(http_response, globals, locals)
|
219
182
|
end
|
220
183
|
|
221
184
|
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Savon::SOAPFault do
|
4
|
+
let(:soap_fault) { Savon::SOAPFault.new new_response(:body => Fixture.response(:soap_fault)), nori }
|
5
|
+
let(:soap_fault2) { Savon::SOAPFault.new new_response(:body => Fixture.response(:soap_fault12)), nori }
|
6
|
+
let(:another_soap_fault) { Savon::SOAPFault.new new_response(:body => Fixture.response(:another_soap_fault)), nori }
|
7
|
+
let(:no_fault) { Savon::SOAPFault.new new_response, nori }
|
8
|
+
|
9
|
+
let(:nori) { Nori.new(:strip_namespaces => true, :convert_tags_to => lambda { |tag| tag.snakecase.to_sym }) }
|
10
|
+
|
11
|
+
it "inherits from Savon::Error" do
|
12
|
+
expect(Savon::SOAPFault.ancestors).to include(Savon::Error)
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "#http" do
|
16
|
+
it "returns the HTTPI::Response" do
|
17
|
+
expect(soap_fault.http).to be_an(HTTPI::Response)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe ".present?" do
|
22
|
+
it "returns true if the HTTP response contains a SOAP 1.1 fault" do
|
23
|
+
http = new_response(:body => Fixture.response(:soap_fault))
|
24
|
+
expect(Savon::SOAPFault.present? http).to be_true
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returns true if the HTTP response contains a SOAP 1.2 fault" do
|
28
|
+
http = new_response(:body => Fixture.response(:soap_fault12))
|
29
|
+
expect(Savon::SOAPFault.present? http).to be_true
|
30
|
+
end
|
31
|
+
|
32
|
+
it "returns true if the HTTP response contains a SOAP fault with different namespaces" do
|
33
|
+
http = new_response(:body => Fixture.response(:another_soap_fault))
|
34
|
+
expect(Savon::SOAPFault.present? http).to be_true
|
35
|
+
end
|
36
|
+
|
37
|
+
it "returns false unless the HTTP response contains a SOAP fault" do
|
38
|
+
expect(Savon::SOAPFault.present? new_response).to be_false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
[:message, :to_s].each do |method|
|
43
|
+
describe "##{method}" do
|
44
|
+
it "returns a SOAP 1.1 fault message" do
|
45
|
+
expect(soap_fault.send method).to eq("(soap:Server) Fault occurred while processing.")
|
46
|
+
end
|
47
|
+
|
48
|
+
it "returns a SOAP 1.2 fault message" do
|
49
|
+
expect(soap_fault2.send method).to eq("(soap:Sender) Sender Timeout")
|
50
|
+
end
|
51
|
+
|
52
|
+
it "returns a SOAP fault message (with different namespaces)" do
|
53
|
+
expect(another_soap_fault.send method).to eq("(ERR_NO_SESSION) Wrong session message")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "#to_hash" do
|
59
|
+
it "returns the SOAP response as a Hash unless a SOAP fault is present" do
|
60
|
+
expect(no_fault.to_hash[:authenticate_response][:return][:success]).to be_true
|
61
|
+
end
|
62
|
+
|
63
|
+
it "returns a SOAP 1.1 fault as a Hash" do
|
64
|
+
expected = {
|
65
|
+
:fault => {
|
66
|
+
:faultstring => "Fault occurred while processing.",
|
67
|
+
:faultcode => "soap:Server"
|
68
|
+
}
|
69
|
+
}
|
70
|
+
|
71
|
+
expect(soap_fault.to_hash).to eq(expected)
|
72
|
+
end
|
73
|
+
|
74
|
+
it "returns a SOAP 1.2 fault as a Hash" do
|
75
|
+
expected = {
|
76
|
+
:fault => {
|
77
|
+
:detail => { :max_time => "P5M" },
|
78
|
+
:reason => { :text => "Sender Timeout" },
|
79
|
+
:code => { :value => "soap:Sender", :subcode => { :value => "m:MessageTimeout" } }
|
80
|
+
}
|
81
|
+
}
|
82
|
+
|
83
|
+
expect(soap_fault2.to_hash).to eq(expected)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def new_response(options = {})
|
88
|
+
defaults = { :code => 500, :headers => {}, :body => Fixture.response(:authentication) }
|
89
|
+
response = defaults.merge options
|
90
|
+
|
91
|
+
HTTPI::Response.new response[:code], response[:headers], response[:body]
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|