require "spec_helper" require "integration/support/server" describe Savon::Client do before :all do @server = IntegrationServer.run end after :all do @server.stop end describe ".new" do it "supports a block without arguments to create a client with global options" do client = Savon.client do wsdl Fixture.wsdl(:authentication) end expect(client.globals[:wsdl]).to eq(Fixture.wsdl(:authentication)) end it "supports a block with one argument to create a client with global options" do client = Savon.client do |globals| globals.wsdl Fixture.wsdl(:authentication) end expect(client.globals[:wsdl]).to eq(Fixture.wsdl(:authentication)) end it "builds an HTTPI request for Wasabi" do http_request = mock wsdl_request = mock(:build => http_request) Savon::WSDLRequest.expects(:new).with(instance_of(Savon::GlobalOptions)).returns(wsdl_request) Wasabi::Document.any_instance.expects(:request=).with(http_request) Savon.client(:wsdl => "http://example.com") end it "raises if initialized with anything other than a Hash" do expect { Savon.client("http://example.com") }. to raise_error(Savon::InitializationError, /Some code tries to initialize Savon with the "http:\/\/example\.com" \(String\)/) end it "raises if not initialized with either a :wsdl or both :endpoint and :namespace options" do expect { Savon.client(:endpoint => "http://example.com") }. to raise_error(Savon::InitializationError, /Expected either a WSDL document or the SOAP endpoint and target namespace options/) end end describe "#globals" do it "returns the current set of global options" do expect(new_client.globals).to be_an_instance_of(Savon::GlobalOptions) end end describe "#operations" do it "returns all operation names" do operations = new_client.operations expect(operations).to eq([:authenticate]) end it "raises when there is no WSDL document" do expect { new_client_without_wsdl.operations }.to raise_error("Unable to inspect the service without a WSDL document.") end end describe "#operation" do it "returns a new SOAP operation" do operation = new_client.operation(:authenticate) expect(operation).to be_a(Savon::Operation) end it "raises if there's no such SOAP operation" do expect { new_client.operation(:does_not_exist) }. to raise_error(ArgumentError) end it "does not raise when there is no WSDL document" do new_client_without_wsdl.operation(:does_not_exist) end end describe "#call" do it "calls a new SOAP operation" do locals = { :message => { :symbol => "AAPL" } } soap_response = new_soap_response wsdl = Wasabi::Document.new('http://example.com') operation = Savon::Operation.new(:authenticate, wsdl, Savon::GlobalOptions.new) operation.expects(:call).with(locals).returns(soap_response) Savon::Operation.expects(:create).with( :authenticate, instance_of(Wasabi::Document), instance_of(Savon::GlobalOptions) ).returns(operation) response = new_client.call(:authenticate, locals) expect(response).to eq(soap_response) end it "supports a block without arguments to call an operation with local options" do client = new_client(:endpoint => @server.url(:repeat)) response = client.call(:authenticate) do message(:symbol => "AAPL" ) end expect(response.http.body).to include("AAPL") end it "supports a block with one argument to call an operation with local options" do client = new_client(:endpoint => @server.url(:repeat)) # supports instance variables! @instance_variable = { :symbol => "AAPL" } response = client.call(:authenticate) do |locals| locals.message(@instance_variable) end expect(response.http.body).to include("AAPL") end it "accepts arguments for the message tag" do client = new_client(:endpoint => @server.url(:repeat)) response = client.call(:authenticate, :attributes => { "ID" => "ABC321"}) expect(response.http.body).to include('') end it "raises when the operation name is not a symbol" do expect { new_client.call("not a symbol") }.to raise_error( ArgumentError, "Expected the first parameter (the name of the operation to call) to be a symbol\n" \ "Actual: \"not a symbol\" (String)" ) end end def new_http_response(options = {}) defaults = { :code => 200, :headers => {}, :body => Fixture.response(:authentication) } response = defaults.merge options HTTPI::Response.new response[:code], response[:headers], response[:body] end def new_soap_response(options = {}) http = new_http_response(options) globals = Savon::GlobalOptions.new locals = Savon::LocalOptions.new Savon::Response.new(http, globals, locals) end def new_client(globals = {}) globals = { :wsdl => Fixture.wsdl(:authentication), :log => false }.merge(globals) Savon.client(globals) end def new_client_without_wsdl(globals = {}) globals = { :endpoint => "http://example.co", :namespace => "http://v1.example.com", :log => false }.merge(globals) Savon.client(globals) end end