require "spec_helper"
require "integration/support/server"
describe Savon::Request do
subject(:request) { Savon::Request.new(:authenticate, wsdl, globals, locals) }
let(:globals) { Savon::GlobalOptions.new(:endpoint => @server.url, :log => false) }
let(:locals) { Savon::LocalOptions.new }
let(:wsdl) { Wasabi::Document.new Fixture.wsdl(:authentication) }
let(:no_wsdl) { Wasabi::Document.new }
before :all do
@server = IntegrationServer.run
end
after :all do
@server.stop
end
describe "#call" do
it "expects the XML to POST" do
response = request.call("")
expect(request.http.url).to eq(URI(globals[:endpoint]))
expect(request.http.body).to eq("")
expect(request.http.headers["Content-Length"]).to eq("".bytesize.to_s)
expect(response).to be_a(HTTPI::Response)
end
it "falls back to use the WSDL's endpoint if the global :endpoint option was not set" do
wsdl.endpoint = @server.url
globals_without_endpoint = Savon::GlobalOptions.new(:log => false)
request = Savon::Request.new(:authenticate, wsdl, globals_without_endpoint, locals)
response = request.call("")
expect(request.http.url).to eq(URI(wsdl.endpoint))
end
it "sets the global :proxy option if it's available" do
globals[:proxy] = "http://proxy.example.com"
expect(request.http.proxy).to eq(URI(globals[:proxy]))
end
it "does not set the global :proxy option when it's not available" do
expect(request.http.proxy).to be_nil
end
it "sets the request cookies using the global :last_response option if it's available" do
http = HTTPI::Response.new(200, {}, [""])
globals[:last_response] = Savon::Response.new(http, globals, locals)
HTTPI::Request.any_instance.expects(:set_cookies).with(globals[:last_response]).once
request
end
it "does not set the cookies using the global :last_response option when it's not available" do
expect(request.http.open_timeout).to be_nil
end
it "sets the global :open_timeout option if it's available" do
globals[:open_timeout] = 33
expect(request.http.open_timeout).to eq(globals[:open_timeout])
end
it "does not set the global :open_timeout option when it's not available" do
request.call("")
expect(request.http.open_timeout).to be_nil
end
it "sets the global :read_timeout option if it's available" do
globals[:read_timeout] = 44
expect(request.http.read_timeout).to eq(globals[:read_timeout])
end
it "does not set the global :read_timeout option when it's not available" do
expect(request.http.read_timeout).to be_nil
end
it "sets the global :headers option if it's available" do
globals[:headers] = { "X-Authorize" => "secret" }
expect(request.http.headers["X-Authorize"]).to eq("secret")
end
it "sets the SOAPAction header using the local :soap_action option if it's available" do
locals[:soap_action] = "urn://authenticate"
expect(request.http.headers["SOAPAction"]).to eq(%{"#{locals[:soap_action]}"})
end
it "sets the SOAPAction header using the WSDL if it's available" do
expect(request.http.headers["SOAPAction"]).to eq(%{"authenticate"})
end
it "sets the SOAPAction header using Gyoku if both option and WSDL were not set" do
request = Savon::Request.new(:authenticate, no_wsdl, globals, locals)
expect(request.http.headers["SOAPAction"]).to eq(%{"authenticate"})
end
it "does not set the SOAPAction header if it's already set" do
locals[:soap_action] = "urn://authenticate"
globals[:headers] = { "SOAPAction" => %{"doAuthenticate"} }
expect(request.http.headers["SOAPAction"]).to eq(%{"doAuthenticate"})
end
it "does not set the SOAPAction header if the local :soap_action was set to nil" do
locals[:soap_action] = nil
expect(request.http.headers).to_not include("SOAPAction")
end
it "sets the SOAP 1.2 Content-Type header using the global :soap_version and :encoding options if available" do
globals[:soap_version] = 2
globals[:encoding] = "UTF-16"
expect(request.http.headers["Content-Type"]).to eq("application/soap+xml;charset=UTF-16")
end
it "sets the SOAP 1.1 Content-Type header using the global :soap_version and :encoding options if available" do
globals[:soap_version] = 1
globals[:encoding] = "UTF-8"
expect(request.http.headers["Content-Type"]).to eq("text/xml;charset=UTF-8")
end
it "sets the global :basic_auth option if it's available" do
globals[:basic_auth] = [:luke, "secret"]
expect(request.http.auth.basic).to eq(globals[:basic_auth])
end
it "does not set the global :basic_auth option when it's not available" do
expect(request.http.auth.basic).to be_nil
end
it "sets the global :digest_auth option if it's available" do
globals[:digest_auth] = [:lea, "top-secret"]
expect(request.http.auth.digest).to eq(globals[:digest_auth])
end
it "does not set the global :digest_auth option when it's not available" do
expect(request.http.auth.digest).to be_nil
end
end
end