# encoding: UTF-8
require 'api/spec_helper'
module APISpecHelper
class SOAPClient < Adyen::API::SimpleSOAPClient
ENDPOINT_URI = 'https://%s.example.com/soap/Action'
end
end
describe Adyen::API::SimpleSOAPClient do
include APISpecHelper
before do
@client = APISpecHelper::SOAPClient.new(:reference => 'order-id')
end
it "returns the endpoint, for the current environment, from the ENDPOINT_URI constant" do
uri = APISpecHelper::SOAPClient.endpoint
uri.scheme.should == 'https'
uri.host.should == 'test.example.com'
uri.path.should == '/soap/Action'
end
it "initializes with the given parameters" do
@client.params[:reference].should == 'order-id'
end
it "merges the default parameters with the given ones" do
@client.params[:merchant_account].should == 'SuperShopper'
end
describe "call_webservice_action" do
before do
stub_net_http(AUTHORISE_RESPONSE)
@response = @client.call_webservice_action('Action', 'Yes, please', Adyen::API::Response)
@request, @post = Net::HTTP.posted
end
after do
Net::HTTP.stubbing_enabled = false
end
it "posts to the class's endpoint" do
endpoint = APISpecHelper::SOAPClient.endpoint
@request.host.should == endpoint.host
@request.port.should == endpoint.port
@post.path.should == endpoint.path
end
it "makes a request over SSL" do
@request.use_ssl?.should be_true
end
it "verifies certificates" do
File.should exist(Adyen::API::SimpleSOAPClient::CACERT)
@request.ca_file.should == Adyen::API::SimpleSOAPClient::CACERT
@request.verify_mode.should == OpenSSL::SSL::VERIFY_PEER
end
it "uses basic-authentication with the credentials set on the Adyen::API module" do
username, password = @post.assigned_basic_auth
username.should == 'SuperShopper'
password.should == 'secret'
end
it "sends the proper headers" do
@post.header.should include(
'accept' => ['text/xml'],
'content-type' => ['text/xml; charset=utf-8'],
'soapaction' => ['Action']
)
end
it "returns an Adyen::API::Response instance" do
@response.should be_instance_of(Adyen::API::Response)
@response.xml_querier.to_s.should == AUTHORISE_RESPONSE
end
[
[
"[401 Bad request] A client",
Net::HTTPBadRequest.new('1.1', '401', 'Bad request'),
Adyen::API::SimpleSOAPClient::ClientError
]
].each do |label, response, expected_exception|
it "raises when the HTTP response is a subclass of #{response.class.name}" do
response.stub(:body).and_return(%{soap:ServerIllegal argument. For input string: "100.0"})
Net::HTTP.stubbed_response = response
exception = nil
begin
@client.call_webservice_action('Action', 'Yes, please', Adyen::API::Response)
rescue expected_exception => e
exception = e
end
exception.message.should == %{#{label} error occurred while calling SOAP action `Action' on endpoint `https://test.example.com/soap/Action'. Fault message: Illegal argument. For input string: "100.0".}
end
end
describe 'server error' do
[
["[500 Internal Server Error] A server", Net::HTTPBadGateway.new('1.1', '500', 'Internal Server Error')],
["[501 Not Implemented] A server", Net::HTTPBadGateway.new('1.1', '501', 'Not Implemented')],
["[502 Bad Gateway] A server", Net::HTTPBadGateway.new('1.1', '502', 'Bad Gateway')],
["[503 Service Unavailable] A server", Net::HTTPBadGateway.new('1.1', '503', 'Service Unavailable')],
["[504 Gateway Timeout] A server", Net::HTTPBadGateway.new('1.1', '504', 'Gateway Timeout')],
["[505 HTTP Version Not Supported] A server", Net::HTTPBadGateway.new('1.1', '505', 'HTTP Version Not Supported')],
].each do |label, response|
it "is raised when the HTTP response is a `real` server error by status code" do
response.stub(:body).and_return(%{})
Net::HTTP.stubbed_response = response
exception = nil
begin
@client.call_webservice_action('Action', 'Yes, please', Adyen::API::Response)
rescue Adyen::API::SimpleSOAPClient::ServerError => e
exception = e
end
exception.message.should == %{#{label} error occurred while calling SOAP action `Action' on endpoint `https://test.example.com/soap/Action'.}
end
end
it "is not raised when the HTTP response has a 500 status code with a fault message" do
response = Net::HTTPServerError.new('1.1', '500', 'Internal Server Error')
response.stub(:body).and_return(%{soap:ServerIllegal argument. For input string: "100.0"})
lambda do
@client.call_webservice_action('Action', 'Yes, please', Adyen::API::Response)
end.should_not raise_error
end
end
end
end