From fce134c3ba05d7e6f7e1a2954c775e6a0805878c Mon Sep 17 00:00:00 2001 From: Dominic Breuker Date: Mon, 24 Aug 2015 11:46:26 +0200 Subject: [PATCH 1/8] check for suspicious parameter values --- lib/wirecard/callback.rb | 7 ++++++- spec/unit_tests/callback_spec.rb | 31 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/lib/wirecard/callback.rb b/lib/wirecard/callback.rb index 78d41e0..9d3614d 100644 --- a/lib/wirecard/callback.rb +++ b/lib/wirecard/callback.rb @@ -12,7 +12,7 @@ def to_hash end def fingerprint_valid? - !!response_fingerprint && !!response_fingerprint_order && !unfingerprinted_params? && (computed_fingerprint == response_fingerprint) + !suspicious_values? && !!response_fingerprint && !!response_fingerprint_order && !unfingerprinted_params? && (computed_fingerprint == response_fingerprint) end private @@ -37,6 +37,11 @@ def unfingerprinted_params? unfingerprinted_params.size > 0 end + # scans all parameter values for bit sequence "10000000" (\x80), which indicates a length extension attack on the fingerprint + def suspicious_values? + params.values.select{ |value| value.bytes.include?(128) }.compact.any? + end + def underscore(s) s.gsub(/([A-Z])/) { |e| '_' + $1.downcase } end diff --git a/spec/unit_tests/callback_spec.rb b/spec/unit_tests/callback_spec.rb index 44ec76c..cd7a2b0 100644 --- a/spec/unit_tests/callback_spec.rb +++ b/spec/unit_tests/callback_spec.rb @@ -65,6 +65,37 @@ it { is_expected.to eq(parsed_response_params) } end + describe 'length extension attack' do + let(:callback) { Wirecard::Callback.new(forged_params) } + subject { callback.fingerprint_valid? } + + # these parameters have been created based on existing parameters and using length extension to fake a new fingerprint + # the callback class should scan for inidcators of such an attack and should classify fingerprints as invalid in these cases + let(:forged_params) { { + "part1" => CGI.parse("D200001qmoreenUSDhttp%3A%2F%2Flocalhost.success.urlhttp%3A%2F%2Flocalhost.failure.urlhttp%3A%2F%2Flocalhost.cancel.urlhttp%3A%2F%2Flocalhost.service.urlhttp%3A%2F%2Flocalhost.confirm.urlCCARDb2737b746627482e0b024097cadb1b411000description127.0.0.1agent").first.first, + "part2" => CGI.parse("customerId%2CshopId%2Clanguage%2Ccurrency%2CsuccessUrl%2CfailureUrl%2CcancelUrl%2CserviceUrl%2CconfirmUrl%2CpaymentType%2CstorageId%2Camount%2CorderDescription%2CconsumerIpAddress%2CconsumerUserAgent%2Csecret%2CrequestFingerprintOrder%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%0E0").first.first, + "customerId" => "D200001", + "paymentType" => "CCARD", + "storageId" => "b2737b746627482e0b024097cadb1b41", + "amount" => "1000", + "currency" => "USD", + "orderDescription" => "description", + "consumerIpAddress" => "127.0.0.1", + "consumerUserAgent" => "agent", + "language" => "en", + "successUrl" => CGI.parse("http%3A%2F%2Flocalhost.url%2Fsuccess").first.first, + "failureUrl" => CGI.parse("http%3A%2F%2Flocalhost.url%2Ffailure").first.first, + "cancelUrl" => CGI.parse("http%3A%2F%2Flocalhost.url%2Fcancel").first.first, + "serviceUrl" => CGI.parse("http%3A%2F%2Flocalhost.url%2Fservice").first.first, + "confirmUrl" => CGI.parse("http%3A%2F%2Flocalhost.url%2Fconfirm").first.first, + "orderIdent" => "order123", + "responseFingerprintOrder" => CGI.parse("part1%2Csecret%2Cpart2%2CcustomerId%2CpaymentType%2CstorageId%2Camount%2Ccurrency%2CorderDescription%2CconsumerIpAddress%2CconsumerUserAgent%2Clanguage%2CsuccessUrl%2CfailureUrl%2CcancelUrl%2CserviceUrl%2CconfirmUrl%2CorderIdent%2CresponseFingerprintOrder").first.first, + "responseFingerprint" => "7528cfc8fb0b0ed009d634af624939ab60e268d39b848de72c85380719eb36e8903c7ffeb2646427da5482900c7b6df13aac726ee9fc0e475bae691d30efe9d9" + } } + + it { is_expected.to be false } + end + describe '#fingerprint_valid?' do subject { callback.fingerprint_valid? } From 5ad7465a27f18026cfc5228a0634563e45976daa Mon Sep 17 00:00:00 2001 From: itschn Date: Tue, 3 Nov 2015 14:38:25 +0100 Subject: [PATCH 2/8] Fix callbacks to hash --- lib/wirecard/callback.rb | 2 +- lib/wirecard/gem_version.rb | 14 ++++++++++++++ lib/wirecard/version.rb | 6 +++++- wirecard.gemspec | 2 +- 4 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 lib/wirecard/gem_version.rb diff --git a/lib/wirecard/callback.rb b/lib/wirecard/callback.rb index 78d41e0..3d5301e 100644 --- a/lib/wirecard/callback.rb +++ b/lib/wirecard/callback.rb @@ -8,7 +8,7 @@ def initialize(params) end def to_hash - fingerprint_valid? ? params_to_ruby : nil + fingerprint_valid? ? params_to_ruby : {} end def fingerprint_valid? diff --git a/lib/wirecard/gem_version.rb b/lib/wirecard/gem_version.rb new file mode 100644 index 0000000..6320482 --- /dev/null +++ b/lib/wirecard/gem_version.rb @@ -0,0 +1,14 @@ +module Wirecard + def self.gem_version + Gem::Version.new VERSION::STRING + end + + module VERSION + MAJOR = 0 + MINOR = 0 + TINY = 3 + PRE = nil + + STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".") + end +end \ No newline at end of file diff --git a/lib/wirecard/version.rb b/lib/wirecard/version.rb index cd1ed61..587d9c9 100644 --- a/lib/wirecard/version.rb +++ b/lib/wirecard/version.rb @@ -1,3 +1,7 @@ +require_relative 'gem_version' + module Wirecard - VERSION = "0.0.2" + def self.version + gem_version + end end diff --git a/wirecard.gemspec b/wirecard.gemspec index d9c39f8..f46bd8b 100644 --- a/wirecard.gemspec +++ b/wirecard.gemspec @@ -5,7 +5,7 @@ require 'wirecard/version' Gem::Specification.new do |spec| spec.name = "wirecard" - spec.version = Wirecard::VERSION + spec.version = Wirecard.version spec.authors = ["Dominic Breuker", "Michael Rüffer"] spec.email = ["dominic.breuker@gmail.com", "mr@hitfoxgroup.com"] spec.summary = "Wirecard API wrapper" From 7957ed1f25c29ef80a87341c48cbeb872c9e23e9 Mon Sep 17 00:00:00 2001 From: Dominic Breuker Date: Tue, 3 Nov 2015 15:00:27 +0100 Subject: [PATCH 3/8] fix specs --- lib/wirecard/callback.rb | 30 +++++++++++++++--------------- spec/unit_tests/callback_spec.rb | 32 ++++++++++++++++---------------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/lib/wirecard/callback.rb b/lib/wirecard/callback.rb index c84a4af..4339010 100644 --- a/lib/wirecard/callback.rb +++ b/lib/wirecard/callback.rb @@ -1,55 +1,55 @@ module Wirecard class Callback - + attr_reader :params - + def initialize(params) @params = params end - + def to_hash fingerprint_valid? ? params_to_ruby : {} end - + def fingerprint_valid? !suspicious_values? && !!response_fingerprint && !!response_fingerprint_order && !unfingerprinted_params? && (computed_fingerprint == response_fingerprint) end - + private - + def response_fingerprint @response_fingerprint ||= params['responseFingerprint'] end - + def response_fingerprint_order @response_fingerprint_order ||= params['responseFingerprintOrder'] end - + def fingerprinted_params @fingerprinted_params ||= response_fingerprint_order.split(',') end - + def unfingerprinted_params @unfingerprinted_params ||= params.keys - fingerprinted_params - ['responseFingerprint'] end - + def unfingerprinted_params? unfingerprinted_params.size > 0 end - + # scans all parameter values for bit sequence "10000000" (\x80), which indicates a length extension attack on the fingerprint def suspicious_values? - params.values.select{ |value| value.bytes.include?(128) }.compact.any? + params.values.select{ |value| !value.nil? && value.bytes.include?(128) }.compact.any? end - + def underscore(s) s.gsub(/([A-Z])/) { |e| '_' + $1.downcase } end - + def params_to_ruby @ruby_params ||= Hash[params.map{ |key, value| [underscore(key).to_sym, value] }] end - + def computed_fingerprint @computed_fingerprint ||= Wirecard::Fingerprint::Sha512.new(params).fingerprint end diff --git a/spec/unit_tests/callback_spec.rb b/spec/unit_tests/callback_spec.rb index cd7a2b0..f005468 100644 --- a/spec/unit_tests/callback_spec.rb +++ b/spec/unit_tests/callback_spec.rb @@ -3,11 +3,11 @@ RSpec.describe Wirecard::Callback do let(:callback) { Wirecard::Callback.new(response_params.merge(additional_params)) } let(:additional_params) { Hash.new } - + it { expect(true).to eq(true) } - + include_examples 'configuration' - + let(:response_params) do { "amount" => "1000", @@ -33,7 +33,7 @@ } end let(:response_fingerprint) { "42c937f7712b69210839c8d149bb17a352e04761eb08d67d28b2319b4a254c923b55cd6270c5d03f32cc9613dc53924c52e7a0dd7ad2139a5334a15cb4763e97" } - + describe '#to_hash' do subject { callback.to_hash } @@ -64,11 +64,11 @@ it { is_expected.to eq(parsed_response_params) } end - + describe 'length extension attack' do let(:callback) { Wirecard::Callback.new(forged_params) } subject { callback.fingerprint_valid? } - + # these parameters have been created based on existing parameters and using length extension to fake a new fingerprint # the callback class should scan for inidcators of such an attack and should classify fingerprints as invalid in these cases let(:forged_params) { { @@ -90,39 +90,39 @@ "confirmUrl" => CGI.parse("http%3A%2F%2Flocalhost.url%2Fconfirm").first.first, "orderIdent" => "order123", "responseFingerprintOrder" => CGI.parse("part1%2Csecret%2Cpart2%2CcustomerId%2CpaymentType%2CstorageId%2Camount%2Ccurrency%2CorderDescription%2CconsumerIpAddress%2CconsumerUserAgent%2Clanguage%2CsuccessUrl%2CfailureUrl%2CcancelUrl%2CserviceUrl%2CconfirmUrl%2CorderIdent%2CresponseFingerprintOrder").first.first, - "responseFingerprint" => "7528cfc8fb0b0ed009d634af624939ab60e268d39b848de72c85380719eb36e8903c7ffeb2646427da5482900c7b6df13aac726ee9fc0e475bae691d30efe9d9" + "responseFingerprint" => "7528cfc8fb0b0ed009d634af624939ab60e268d39b848de72c85380719eb36e8903c7ffeb2646427da5482900c7b6df13aac726ee9fc0e475bae691d30efe9d9" } } - + it { is_expected.to be false } end - + describe '#fingerprint_valid?' do subject { callback.fingerprint_valid? } - + context 'when fingerprint is valid' do let(:response_fingerprint) { "42c937f7712b69210839c8d149bb17a352e04761eb08d67d28b2319b4a254c923b55cd6270c5d03f32cc9613dc53924c52e7a0dd7ad2139a5334a15cb4763e97" } - + it { is_expected.to be true } - + context 'when response contains unfingerprinted params' do let(:additional_params) { { "parameter_key" => "parameter_value" } } it { is_expected.to be false } end end - + context 'when fingerprint is invalid' do let(:response_fingerprint) { "invalid fingerprint" } - + it { is_expected.to be false } end - + context 'when response contains no fingerprint' do let(:additional_params) { { "responseFingerprint" => nil } } it { is_expected.to be false } end - + context 'when response contains no fingerprint order' do let(:additional_params) { { "responseFingerprintOrder" => nil } } From d2e3e8a63f70614b75bca54805527bcf2db5ec67 Mon Sep 17 00:00:00 2001 From: Dominic Breuker Date: Tue, 3 Nov 2015 15:16:15 +0100 Subject: [PATCH 4/8] try fixing specs on circleci - working locally --- spec/unit_tests/payment_process/init_spec.rb | 21 ++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/spec/unit_tests/payment_process/init_spec.rb b/spec/unit_tests/payment_process/init_spec.rb index 1e4b964..b65a276 100644 --- a/spec/unit_tests/payment_process/init_spec.rb +++ b/spec/unit_tests/payment_process/init_spec.rb @@ -1,18 +1,18 @@ require 'spec_helper' RSpec.describe Wirecard::PaymentProcess::Init do - + let(:init) { Wirecard::PaymentProcess::Init.new(options) } let(:options) { Hash.new.merge(payment_type_data).merge(payment_data).merge(consumer_data) } let(:payment_type_data) { { payment_type: 'CCARD', storage_id: 'b2737b746627482e0b024097cadb1b41' } } let(:payment_data) { { amount: '1000', currency: 'USD', order_description: 'some description' } } let(:consumer_data) { { consumer_ip_address: '127.0.0.1', consumer_user_agent: 'some agent', language: 'en'} } - + include_context 'configuration' include_context 'stub requests' - + it { is_expected.to be_a_kind_of(Wirecard::PaymentProcess::Init) } - + describe '#implicit_fingerprint_order' do subject { init.implicit_fingerprint_order } @@ -32,22 +32,22 @@ it { expect(subject[:service_url]).to eq(config[:service_url]) } it { expect(subject[:confirm_url]).to eq(config[:confirm_url]) } end - + describe '#url' do subject { init.url } - + it { is_expected.to eq('https://checkout.wirecard.com/seamless/frontend/init') } end - + describe '#post' do subject { init.post.response } context 'when credit card payment' do let(:payment_type_data) { { payment_type: 'CCARD', storage_id: 'b2737b746627482e0b024097cadb1b41' } } - + it { is_expected.to eq ({redirect_url: "https://checkout.wirecard.com/seamless/frontend/D200001qmore_DESKTOP/select.php?SID=ttkbc64otkqk067oca49ft0cr5" } ) } end - + context 'when Sofortüberweisung payment' do let(:payment_type_data) { { payment_type: 'SOFORTUEBERWEISUNG' } } @@ -67,7 +67,8 @@ end context 'when options are invalid' do - let(:options) { Hash.new } + subject { Wirecard::PaymentProcess::Init.new(Hash.new).post.response } + #let(:options) { Hash.new } it { is_expected.to eq ({ :"error.1.consumer_message" => "PAYMENTTYPE is missing.", From 86444e9ab2709a5d1543d40eff8e43c922d83dc7 Mon Sep 17 00:00:00 2001 From: Dominic Breuker Date: Wed, 4 Nov 2015 12:45:09 +0100 Subject: [PATCH 5/8] refactor specs and fix error on circleci --- lib/wirecard/base.rb | 30 ++--- lib/wirecard/payment_process/init.rb | 8 +- lib/wirecard/request.rb | 26 ++-- spec/unit_tests/data_storage/init_spec.rb | 56 +++++++-- spec/unit_tests/data_storage/read_spec.rb | 46 +++++-- spec/unit_tests/payment_process/init_spec.rb | 120 +++++++++++++++++- spec/unit_tests/support/shared_context.rb | 124 ++++++------------- 7 files changed, 274 insertions(+), 136 deletions(-) diff --git a/lib/wirecard/base.rb b/lib/wirecard/base.rb index 1419d6f..b4ed232 100644 --- a/lib/wirecard/base.rb +++ b/lib/wirecard/base.rb @@ -1,17 +1,17 @@ module Wirecard class Base - + attr_reader :request - + attr_accessor :response, :params - + def defaults @defaults ||= { customer_id: Wirecard.config.customer_id, shop_id: Wirecard.config.shop_id } end - + def initialize(params = {}) @request = Wirecard::Request.new( params: defaults.merge(params), @@ -19,17 +19,17 @@ def initialize(params = {}) uri: uri ) end - + def post http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true - + self.response = Wirecard::Response.new(http.request(request.to_post)).to_hash self end - + alias_method :save, :post - + def method_missing(method_name, *args, &block) if response && (response.key?(method_name.to_sym) || response.key?(method_name)) response[method_name.to_sym] || response[method_name] @@ -37,30 +37,30 @@ def method_missing(method_name, *args, &block) super end end - + def respond_to_missing?(method_name, include_private = false) response && (response.key?(method_name.to_sym) || response.key?(method_name)) || super end - + def implicit_fingerprint_order nil end - + def self.create(attributes = {}) object = new(attributes) object.save object end - + private - + def uri @uri ||= URI.parse(url) end - + def url raise NotImplementedError, 'A URL must be given to make a call' end - + end end \ No newline at end of file diff --git a/lib/wirecard/payment_process/init.rb b/lib/wirecard/payment_process/init.rb index 4e80a14..b5677d0 100644 --- a/lib/wirecard/payment_process/init.rb +++ b/lib/wirecard/payment_process/init.rb @@ -1,19 +1,19 @@ module Wirecard module PaymentProcess class Init < Wirecard::Base - + def order_number @order_number ||= Wirecard::Backend::GenerateOrderNumber.create end - + def url @url ||= [Wirecard.config.endpoint, :frontend, :init].join('/') end - + def redirect_url response[:redirect_url] end - + def defaults super.merge( order_number: order_number, diff --git a/lib/wirecard/request.rb b/lib/wirecard/request.rb index 0dcfbb2..77e67cf 100644 --- a/lib/wirecard/request.rb +++ b/lib/wirecard/request.rb @@ -1,7 +1,7 @@ module Wirecard class Request attr_reader :params, :implicit_fingerprint_order, :uri - + def defaults @defaults ||= { params: nil, @@ -9,45 +9,45 @@ def defaults uri: nil } end - + def initialize(options) options = defaults.merge(options) raise ArgumentError 'Options must contain params: ' unless options[:params] raise ArgumentError 'Options must contain uri: ' unless options[:uri] - + @params = params_to_wirecard(options[:params]) @implicit_fingerprint_order = keys_to_wirecard(options[:implicit_fingerprint_order]) @uri = options[:uri] end - + def to_post post = Net::HTTP::Post.new(uri.request_uri) - + post.set_form_data(fingerprinted_params) - + post["Host"] = Wirecard.config.host post["User-Agent"] = Wirecard.config.user_agent post["Content-Type"] = 'application/x-www-form-urlencoded' post["Content-Length"] = post.body.bytesize.to_s post["Connection"] = 'close' - + post end - + private - + def params_to_wirecard(params) - Hash[params.keys.map{ |key| [camelize(key), params[key]] }] + Hash[params.keys.reject{ |key| !params[key] }.map{ |key| [camelize(key), params[key]] }] end - + def keys_to_wirecard(keys) keys.map{ |key| camelize(key) } if keys end - + def camelize(key) key.to_s.gsub(/_(.)/) { |e| $1.upcase } end - + def fingerprinted_params @fingerprinted_params ||= Wirecard::Fingerprint::Sha512.new(params, implicit_fingerprint_order).fingerprinted_params end diff --git a/spec/unit_tests/data_storage/init_spec.rb b/spec/unit_tests/data_storage/init_spec.rb index a4a0c2c..8c1112b 100644 --- a/spec/unit_tests/data_storage/init_spec.rb +++ b/spec/unit_tests/data_storage/init_spec.rb @@ -1,14 +1,14 @@ require 'spec_helper' RSpec.describe Wirecard::DataStorage::Init do - + let(:init) { Wirecard::DataStorage::Init.new(options) } let(:options) { { order_ident: 'order123' } } - + include_context 'configuration' - + it { is_expected.to be_a_kind_of(Wirecard::DataStorage::Init) } - + describe '#implicit_fingerprint_order' do subject { init.implicit_fingerprint_order } @@ -23,25 +23,59 @@ it { expect(subject[:language]).to eq(config[:language]) } it { expect(subject[:return_url]).to eq(config[:return_url]) } end - + describe '#url' do subject { init.url } - + it { is_expected.to eq('https://checkout.wirecard.com/seamless/dataStorage/init') } end - + describe '#post' do subject { init.post.response } - include_context 'stub requests' - + context 'when order_ident is given' do + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/dataStorage/init"). + with(body: default_request_hash.merge( + { + "javascriptScriptVersion" => "pci3", + "language" => config[:language], + "orderIdent" => "order123", + "requestFingerprint" => "855b5ac85144d35c4b32d35ddfbdbbd34770cb33b4d5271a1566c3892e43eb2507253e17e840fd6f2ddcc49d49c79580ba96e239bfe5d4df90bf02ea0484e1b2", + "returnUrl" => "http://localhost.return.url", + } + )). + to_return( + status: 200, + body: "storageId=b2737b746627482e0b024097cadb1b41&javascriptUrl=https%3A%2F%2Fcheckout.wirecard.com%2Fseamless%2FdataStorage%2Fjs%2FD200001%2Fqmore%2Fb2737b746627482e0b024097cadb1b41%2FdataStorage.js", + headers: {} + ) + end + it { is_expected.to eq ({javascript_url: "https://checkout.wirecard.com/seamless/dataStorage/js/D200001/qmore/b2737b746627482e0b024097cadb1b41/dataStorage.js", storage_id: "b2737b746627482e0b024097cadb1b41"}) } end - + context 'when order_ident is missing' do let(:options) { Hash.new } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/dataStorage/init"). + with(body: default_request_hash.merge( + { + "javascriptScriptVersion" => "pci3", + "language" => config[:language], + "requestFingerprint" => "6ebcaa502c04de25dbdca74e6eaa44a7cb3cd0adb2b171433099726848ea40cee3adac2f9c89b6102e02bd2a19106a1012fe0fe72f68b75cc7432adf973cdc18", + "returnUrl" => "http://localhost.return.url", + } + )). + to_return( + status: 200, + body: "error.1.errorCode=15300&error.1.message=ORDERIDENT+has+an+invalid+length.&error.1.consumerMessage=ORDERIDENT+has+an+invalid+length.&errors=1", + headers: {} + ) + end + it { is_expected.to eq ({:"error.1.consumer_message" => "ORDERIDENT has an invalid length.", :"error.1.error_code" => "15300", :"error.1.message" => "ORDERIDENT has an invalid length.", diff --git a/spec/unit_tests/data_storage/read_spec.rb b/spec/unit_tests/data_storage/read_spec.rb index 6a4d19d..83c3f3c 100644 --- a/spec/unit_tests/data_storage/read_spec.rb +++ b/spec/unit_tests/data_storage/read_spec.rb @@ -1,14 +1,14 @@ require 'spec_helper' RSpec.describe Wirecard::DataStorage::Read do - + let(:read) { Wirecard::DataStorage::Read.new(options) } let(:options) { { storage_id: 'b2737b746627482e0b024097cadb1b41' } } - + include_context 'configuration' - + it { is_expected.to be_a_kind_of(Wirecard::DataStorage::Read) } - + describe '#implicit_fingerprint_order' do subject { read.implicit_fingerprint_order } @@ -20,18 +20,34 @@ include_examples 'Wirecard::Base#defaults' end - + describe '#url' do subject { read.url } - + it { is_expected.to eq('https://checkout.wirecard.com/seamless/dataStorage/read') } end - + describe '#post' do subject { read.post.response } - include_context 'stub requests' + + #include_context 'stub requests' context 'when storage_id is given' do + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/dataStorage/read"). + with(body: default_request_hash.merge( + { + "requestFingerprint"=>"eb6a688db153b6f215c12d98c9cccaf8d60dec0e64bab967e2cae0b868fa30a3edf91ef8a17ee40d3984b0a4742aecf049446fea696740470e45121ccdfe6cbd", + "storageId"=>"b2737b746627482e0b024097cadb1b41" + } + )). + to_return( + status: 200, + body: "storageId=b2737b746627482e0b024097cadb1b41&paymentInformations=0", + headers: {} + ) + end + it { is_expected.to eq ({payment_informations: '0', storage_id: "b2737b746627482e0b024097cadb1b41"}) } end @@ -39,6 +55,20 @@ context 'when storage_id is missing' do let(:options) { Hash.new } + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/dataStorage/read"). + with(body: default_request_hash.merge( + { + "requestFingerprint"=>"7378bce0cab7ef7edb08f178c23146332ecce459409393b4d97e4e0e2da0bf86489f0d1c28a3cb8d549b56879e8b42a42a61a59c184d4f2335a1531b97b5bc27" + } + )). + to_return( + status: 200, + body: "error.1.errorCode=11302&error.1.message=STORAGEID+is+missing.&errors=1", + :headers => {} + ) + end + it { is_expected.to eq ({:"error.1.error_code" => "11302", :"error.1.message" => "STORAGEID is missing.", errors: '1'}) } diff --git a/spec/unit_tests/payment_process/init_spec.rb b/spec/unit_tests/payment_process/init_spec.rb index b65a276..06e4bdb 100644 --- a/spec/unit_tests/payment_process/init_spec.rb +++ b/spec/unit_tests/payment_process/init_spec.rb @@ -8,9 +8,46 @@ let(:payment_data) { { amount: '1000', currency: 'USD', order_description: 'some description' } } let(:consumer_data) { { consumer_ip_address: '127.0.0.1', consumer_user_agent: 'some agent', language: 'en'} } + before do + ### stub request to generate order number for this payment process: will return 1113051 + stub_request(:post, "https://checkout.wirecard.com/seamless/frontend/init"). + with(body: default_request_hash.merge( + { + "language"=>"en", + "password"=>"jcv45z", + "requestFingerprint"=>"dfd315b6687aa1f213450008cb3932b29c23601097a0f1a120377938149c3be84e54dafd36e7cf75385e6f356cff79f1a084712d099bedeb2735e63df861b2c5", + "shopId"=>"qmore" + } + )). + to_return( + status: 200, + body: "status=0&orderNumber=1113051", + headers: {} + ) + end + include_context 'configuration' include_context 'stub requests' + let(:default_payment_process_request_hash) do + default_request_hash.merge( + { + "amount"=>"1000", + "currency"=>"USD", + "orderDescription"=>"some description", + "consumerIpAddress"=>"127.0.0.1", + "consumerUserAgent"=>"some agent", + "language"=>"en", + "failureUrl"=>"http://localhost.failure.url", + "orderNumber"=>"1113051", + "cancelUrl"=>"http://localhost.cancel.url", + "confirmUrl"=>"http://localhost.confirm.url", + "serviceUrl"=>"http://localhost.service.url", + "successUrl"=>"http://localhost.success.url" + } + ) + end + it { is_expected.to be_a_kind_of(Wirecard::PaymentProcess::Init) } describe '#implicit_fingerprint_order' do @@ -45,30 +82,109 @@ context 'when credit card payment' do let(:payment_type_data) { { payment_type: 'CCARD', storage_id: 'b2737b746627482e0b024097cadb1b41' } } + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/frontend/init"). + with(body: default_payment_process_request_hash.merge( + { + "paymentType"=>"CCARD", + "storageId"=>"b2737b746627482e0b024097cadb1b41", + "requestFingerprint"=>"db79d074ea5a1572425d54877097cde8fd72ae32a7587cc5d77103e9ff0d807ee64f7b4010ad06b3a2e13be605f87ea35895cf541a9790d15e46f1008e8e638d", + "requestFingerprintOrder"=>"customerId,shopId,orderNumber,language,currency,successUrl,failureUrl,cancelUrl,serviceUrl,confirmUrl,paymentType,storageId,amount,orderDescription,consumerIpAddress,consumerUserAgent,requestFingerprintOrder,secret", + } + )). + to_return( + status: 200, + body: "redirectUrl=https%3A%2F%2Fcheckout.wirecard.com%2Fseamless%2Ffrontend%2FD200001qmore_DESKTOP%2Fselect.php%3FSID%3Dttkbc64otkqk067oca49ft0cr5", + headers: {} + ) + end + it { is_expected.to eq ({redirect_url: "https://checkout.wirecard.com/seamless/frontend/D200001qmore_DESKTOP/select.php?SID=ttkbc64otkqk067oca49ft0cr5" } ) } end context 'when Sofortüberweisung payment' do let(:payment_type_data) { { payment_type: 'SOFORTUEBERWEISUNG' } } + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/frontend/init"). + with(body: default_payment_process_request_hash.merge( + { + "paymentType"=>"SOFORTUEBERWEISUNG", + "requestFingerprint"=>"4c03194780d2383617ac360af521b9cfb2a201cec496e7f205b1ffc276b7de586fb354ad39546d9561ad99f8df5edf0bc3cf8ebeed490212da289e1d90c1db4b", + "requestFingerprintOrder"=>"customerId,shopId,orderNumber,language,currency,successUrl,failureUrl,cancelUrl,serviceUrl,confirmUrl,paymentType,amount,orderDescription,consumerIpAddress,consumerUserAgent,requestFingerprintOrder,secret", + } + )). + to_return( + status: 200, + body: "redirectUrl=https%3A%2F%2Fcheckout.wirecard.com%2Fseamless%2Ffrontend%2FD200001qmore_DESKTOP%2Fselect.php%3FSID%3Dckovh2titpm7kagm48e532ifc6", + headers: {} + ) + end + it { is_expected.to eq ({redirect_url: "https://checkout.wirecard.com/seamless/frontend/D200001qmore_DESKTOP/select.php?SID=ckovh2titpm7kagm48e532ifc6" } ) } end context 'when SEPA payment' do let(:payment_type_data) { { payment_type: 'SEPA-DD' } } + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/frontend/init"). + with(body: default_payment_process_request_hash.merge( + { + "paymentType"=>"SEPA-DD", + "requestFingerprint"=>"b1fbcb93f59b5e1a90d1525a5eb889bea2a6fa5ebac5b1956999d09a6cc0707ca0bb02dc4cb13c4ecda8533175f5be9275680328a00f70976b06d0ef410699f9", + "requestFingerprintOrder"=>"customerId,shopId,orderNumber,language,currency,successUrl,failureUrl,cancelUrl,serviceUrl,confirmUrl,paymentType,amount,orderDescription,consumerIpAddress,consumerUserAgent,requestFingerprintOrder,secret", + } + )). + to_return( + status: 200, + body: "redirectUrl=https%3A%2F%2Fcheckout.wirecard.com%2Fseamless%2Ffrontend%2FD200001qmore_DESKTOP%2Fselect.php%3FSID%3Dj5bk04off945jg6qv25imb1en4", + headers: {} + ) + end + it { is_expected.to eq ({redirect_url: "https://checkout.wirecard.com/seamless/frontend/D200001qmore_DESKTOP/select.php?SID=j5bk04off945jg6qv25imb1en4" } ) } end context 'when PayPal payment' do let(:payment_type_data) { { payment_type: 'PAYPAL' } } + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/frontend/init"). + with(body: default_payment_process_request_hash.merge( + { + "paymentType"=>"PAYPAL", + "requestFingerprint"=>"96ba6c823b9d4a4f18cdd4b6eff062b951a91e70df0a61805a821dcd4640a84ff582ed79810887d0e96953d7d1ef7fd08844d9b9780e2ae8af0653a9a77c12b6", + "requestFingerprintOrder"=>"customerId,shopId,orderNumber,language,currency,successUrl,failureUrl,cancelUrl,serviceUrl,confirmUrl,paymentType,amount,orderDescription,consumerIpAddress,consumerUserAgent,requestFingerprintOrder,secret", + } + )). + to_return( + status: 200, + body: "redirectUrl=https%3A%2F%2Fcheckout.wirecard.com%2Fseamless%2Ffrontend%2FD200001qmore_DESKTOP%2Fselect.php%3FSID%3D1ccoq6lf3euji7dk018sulomg6", + headers: {} + ) + end + it { is_expected.to eq ({redirect_url: "https://checkout.wirecard.com/seamless/frontend/D200001qmore_DESKTOP/select.php?SID=1ccoq6lf3euji7dk018sulomg6" } ) } end context 'when options are invalid' do - subject { Wirecard::PaymentProcess::Init.new(Hash.new).post.response } - #let(:options) { Hash.new } + let(:options) { Hash.new } + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/frontend/init"). + with(body: default_payment_process_request_hash.reject{|key,value| ['amount', 'currency', 'orderDescription', 'consumerIpAddress', 'consumerUserAgent'].include?(key) }.merge( + { + "requestFingerprint"=>"e830fb6a2fcd7ae6f00d3163fb8b9aef5bf2bbfc2ce0b203e51cd3e66925f266e1babc7715f7c93047b78bbf0b4bd0787b20589bdbab03efdeb00f011ddc5c30", + "requestFingerprintOrder"=>"customerId,shopId,orderNumber,language,successUrl,failureUrl,cancelUrl,serviceUrl,confirmUrl,requestFingerprintOrder,secret", + } + )). + to_return( + status: 200, + body: "error.1.message=PAYMENTTYPE+is+missing.&error.1.consumerMessage=PAYMENTTYPE+is+missing.&error.1.errorCode=11051&error.2.message=Currency+is+missing.&error.2.consumerMessage=Currency+is+missing.&error.2.errorCode=11019&error.3.message=Order+description+is+missing.&error.3.consumerMessage=Order+description+is+missing.&error.3.errorCode=11020&error.4.message=Amount+is+missing.&error.4.consumerMessage=Amount+is+missing.&error.4.errorCode=11017&error.5.message=IP-Address+is+missing.&error.5.consumerMessage=IP-Address+is+missing.&error.5.errorCode=11146&error.6.message=USER_AGENT+is+missing.&error.6.consumerMessage=USER_AGENT+is+missing.&error.6.errorCode=11130&errors=6", + headers: {} + ) + end it { is_expected.to eq ({ :"error.1.consumer_message" => "PAYMENTTYPE is missing.", diff --git a/spec/unit_tests/support/shared_context.rb b/spec/unit_tests/support/shared_context.rb index a84234c..fca8dac 100644 --- a/spec/unit_tests/support/shared_context.rb +++ b/spec/unit_tests/support/shared_context.rb @@ -14,13 +14,14 @@ return_url: 'http://localhost.return.url', language: 'en' } } - + before do Wirecard.configure do |configuration| configuration.host = config[:host] configuration.endpoint = config[:endpoint] configuration.customer_id = config[:customer_id] configuration.shop_id = config[:shop_id] + configuration.currency = nil configuration.password = config[:password] configuration.secret = config[:secret] configuration.success_url = config[:success_url] @@ -32,201 +33,158 @@ configuration.language = config[:language] end end + + let(:default_request_hash) do + { + "customerId" => config[:customer_id], + "shopId" => config[:shop_id] + } + end end RSpec.shared_context 'stub requests' do - + before do - ##### Wirecard::DataStorage::Init ##### - stub_request(:post, "https://checkout.wirecard.com/seamless/dataStorage/init"). - with(body: {"customerId"=>"D200001", "javascriptScriptVersion"=>"pci3", "language"=>"en", "orderIdent"=>"order123", "requestFingerprint"=>"855b5ac85144d35c4b32d35ddfbdbbd34770cb33b4d5271a1566c3892e43eb2507253e17e840fd6f2ddcc49d49c79580ba96e239bfe5d4df90bf02ea0484e1b2", "returnUrl"=>"http://localhost.return.url", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'284', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "storageId=b2737b746627482e0b024097cadb1b41&javascriptUrl=https%3A%2F%2Fcheckout.wirecard.com%2Fseamless%2FdataStorage%2Fjs%2FD200001%2Fqmore%2Fb2737b746627482e0b024097cadb1b41%2FdataStorage.js", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/dataStorage/init"). - with(body: {"customerId"=>"D200001", "javascriptScriptVersion"=>"pci3", "language"=>"en", "requestFingerprint"=>"6ebcaa502c04de25dbdca74e6eaa44a7cb3cd0adb2b171433099726848ea40cee3adac2f9c89b6102e02bd2a19106a1012fe0fe72f68b75cc7432adf973cdc18", "returnUrl"=>"http://localhost.return.url", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'264', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "error.1.errorCode=15300&error.1.message=ORDERIDENT+has+an+invalid+length.&error.1.consumerMessage=ORDERIDENT+has+an+invalid+length.&errors=1", headers: {}) - - - ##### Wirecard::DataStorage::Read ##### - stub_request(:post, "https://checkout.wirecard.com/seamless/dataStorage/read"). - with(body: {"customerId"=>"D200001", "requestFingerprint"=>"eb6a688db153b6f215c12d98c9cccaf8d60dec0e64bab967e2cae0b868fa30a3edf91ef8a17ee40d3984b0a4742aecf049446fea696740470e45121ccdfe6cbd", "shopId"=>"qmore", "storageId"=>"b2737b746627482e0b024097cadb1b41"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'222', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "storageId=b2737b746627482e0b024097cadb1b41&paymentInformations=0", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/dataStorage/read"). - with(body: {"customerId"=>"D200001", "requestFingerprint"=>"7378bce0cab7ef7edb08f178c23146332ecce459409393b4d97e4e0e2da0bf86489f0d1c28a3cb8d549b56879e8b42a42a61a59c184d4f2335a1531b97b5bc27", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'179', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "error.1.errorCode=11302&error.1.message=STORAGEID+is+missing.&errors=1", :headers => {}) - - - ##### Wirecard::PaymentProcess::Init ##### - - stub_request(:post, "https://checkout.wirecard.com/seamless/frontend/init"). - with(body: {"amount"=>"1000", "cancelUrl"=>"http://localhost.cancel.url", "confirmUrl"=>"http://localhost.confirm.url", "consumerIpAddress"=>"127.0.0.1", "consumerUserAgent"=>"some agent", "currency"=>"USD", "customerId"=>"D200001", "failureUrl"=>"http://localhost.failure.url", "language"=>"en", "orderDescription"=>"some description", "orderNumber"=>"1113051", "paymentType"=>"CCARD", "requestFingerprint"=>"db79d074ea5a1572425d54877097cde8fd72ae32a7587cc5d77103e9ff0d807ee64f7b4010ad06b3a2e13be605f87ea35895cf541a9790d15e46f1008e8e638d", "requestFingerprintOrder"=>"customerId,shopId,orderNumber,language,currency,successUrl,failureUrl,cancelUrl,serviceUrl,confirmUrl,paymentType,storageId,amount,orderDescription,consumerIpAddress,consumerUserAgent,requestFingerprintOrder,secret", "serviceUrl"=>"http://localhost.service.url", "shopId"=>"qmore", "storageId"=>"b2737b746627482e0b024097cadb1b41", "successUrl"=>"http://localhost.success.url"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'889', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "redirectUrl=https%3A%2F%2Fcheckout.wirecard.com%2Fseamless%2Ffrontend%2FD200001qmore_DESKTOP%2Fselect.php%3FSID%3Dttkbc64otkqk067oca49ft0cr5", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/frontend/init"). - with(body: {"amount"=>"1000", "cancelUrl"=>"http://localhost.cancel.url", "confirmUrl"=>"http://localhost.confirm.url", "consumerIpAddress"=>"127.0.0.1", "consumerUserAgent"=>"some agent", "currency"=>"USD", "customerId"=>"D200001", "failureUrl"=>"http://localhost.failure.url", "language"=>"en", "orderDescription"=>"some description", "orderNumber"=>"1113051", "paymentType"=>"SOFORTUEBERWEISUNG", "requestFingerprint"=>"4c03194780d2383617ac360af521b9cfb2a201cec496e7f205b1ffc276b7de586fb354ad39546d9561ad99f8df5edf0bc3cf8ebeed490212da289e1d90c1db4b", "requestFingerprintOrder"=>"customerId,shopId,orderNumber,language,currency,successUrl,failureUrl,cancelUrl,serviceUrl,confirmUrl,paymentType,amount,orderDescription,consumerIpAddress,consumerUserAgent,requestFingerprintOrder,secret", "serviceUrl"=>"http://localhost.service.url", "shopId"=>"qmore", "successUrl"=>"http://localhost.success.url"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'847', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "redirectUrl=https%3A%2F%2Fcheckout.wirecard.com%2Fseamless%2Ffrontend%2FD200001qmore_DESKTOP%2Fselect.php%3FSID%3Dckovh2titpm7kagm48e532ifc6", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/frontend/init"). - with(body: {"amount"=>"1000", "cancelUrl"=>"http://localhost.cancel.url", "confirmUrl"=>"http://localhost.confirm.url", "consumerIpAddress"=>"127.0.0.1", "consumerUserAgent"=>"some agent", "currency"=>"USD", "customerId"=>"D200001", "failureUrl"=>"http://localhost.failure.url", "language"=>"en", "orderDescription"=>"some description", "orderNumber"=>"1113051", "paymentType"=>"SEPA-DD", "requestFingerprint"=>"b1fbcb93f59b5e1a90d1525a5eb889bea2a6fa5ebac5b1956999d09a6cc0707ca0bb02dc4cb13c4ecda8533175f5be9275680328a00f70976b06d0ef410699f9", "requestFingerprintOrder"=>"customerId,shopId,orderNumber,language,currency,successUrl,failureUrl,cancelUrl,serviceUrl,confirmUrl,paymentType,amount,orderDescription,consumerIpAddress,consumerUserAgent,requestFingerprintOrder,secret", "serviceUrl"=>"http://localhost.service.url", "shopId"=>"qmore", "successUrl"=>"http://localhost.success.url"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'836', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "redirectUrl=https%3A%2F%2Fcheckout.wirecard.com%2Fseamless%2Ffrontend%2FD200001qmore_DESKTOP%2Fselect.php%3FSID%3Dj5bk04off945jg6qv25imb1en4", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/frontend/init"). - with(body: {"amount"=>"1000", "cancelUrl"=>"http://localhost.cancel.url", "confirmUrl"=>"http://localhost.confirm.url", "consumerIpAddress"=>"127.0.0.1", "consumerUserAgent"=>"some agent", "currency"=>"USD", "customerId"=>"D200001", "failureUrl"=>"http://localhost.failure.url", "language"=>"en", "orderDescription"=>"some description", "orderNumber"=>"1113051", "paymentType"=>"PAYPAL", "requestFingerprint"=>"96ba6c823b9d4a4f18cdd4b6eff062b951a91e70df0a61805a821dcd4640a84ff582ed79810887d0e96953d7d1ef7fd08844d9b9780e2ae8af0653a9a77c12b6", "requestFingerprintOrder"=>"customerId,shopId,orderNumber,language,currency,successUrl,failureUrl,cancelUrl,serviceUrl,confirmUrl,paymentType,amount,orderDescription,consumerIpAddress,consumerUserAgent,requestFingerprintOrder,secret", "serviceUrl"=>"http://localhost.service.url", "shopId"=>"qmore", "successUrl"=>"http://localhost.success.url"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'835', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "redirectUrl=https%3A%2F%2Fcheckout.wirecard.com%2Fseamless%2Ffrontend%2FD200001qmore_DESKTOP%2Fselect.php%3FSID%3D1ccoq6lf3euji7dk018sulomg6", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/frontend/init"). - with(body: {"cancelUrl"=>"http://localhost.cancel.url", "confirmUrl"=>"http://localhost.confirm.url", "currency"=>true, "customerId"=>"D200001", "failureUrl"=>"http://localhost.failure.url", "language"=>"en", "orderNumber"=>"1113051", "requestFingerprint"=>"e830fb6a2fcd7ae6f00d3163fb8b9aef5bf2bbfc2ce0b203e51cd3e66925f266e1babc7715f7c93047b78bbf0b4bd0787b20589bdbab03efdeb00f011ddc5c30", "requestFingerprintOrder"=>"customerId,shopId,orderNumber,language,successUrl,failureUrl,cancelUrl,serviceUrl,confirmUrl,requestFingerprintOrder,secret", "serviceUrl"=>"http://localhost.service.url", "shopId"=>"qmore", "successUrl"=>"http://localhost.success.url"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'616', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "error.1.message=PAYMENTTYPE+is+missing.&error.1.consumerMessage=PAYMENTTYPE+is+missing.&error.1.errorCode=11051&error.2.message=Currency+is+missing.&error.2.consumerMessage=Currency+is+missing.&error.2.errorCode=11019&error.3.message=Order+description+is+missing.&error.3.consumerMessage=Order+description+is+missing.&error.3.errorCode=11020&error.4.message=Amount+is+missing.&error.4.consumerMessage=Amount+is+missing.&error.4.errorCode=11017&error.5.message=IP-Address+is+missing.&error.5.consumerMessage=IP-Address+is+missing.&error.5.errorCode=11146&error.6.message=USER_AGENT+is+missing.&error.6.consumerMessage=USER_AGENT+is+missing.&error.6.errorCode=11130&errors=6", headers: {}) - + ##### Wirecard::Backend::GetOrderDetails ##### stub_request(:post, "https://checkout.wirecard.com/seamless/backend/getorderdetails"). with(body: {"customerId"=>"D200001", "language"=>"en", "orderNumber"=>"23473341", "password"=>"jcv45z", "requestFingerprint"=>"4b5b4733bf2ec86456f180a75ed08eb7c0d3abbe8b3f834f313a5f35b8fe85fdf9568765f08cf8921be864764585d85a12357b9826e0f197255d69afc4155a45", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'228', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "payment.1.1.currency=EUR&payment.1.1.state=payment_approved&payment.1.1.orderNumber=23473341&payment.1.1.timeModified=30.07.2015+10%3A52%3A53&payment.1.1.merchantNumber=1&payment.1.1.timeCreated=30.07.2015+10%3A52%3A53&payment.1.1.depositAmount=0.00&payment.1.1.paymentType=VPG&payment.1.1.approvalCode=123456&payment.1.1.paymentNumber=23473341&payment.1.1.approveAmount=1.00&payment.1.1.operationsAllowed=DEPOSIT%2CAPPROVEREVERSAL&order.1.orderNumber=23473341&order.1.paymentType=VPG&order.1.brand=VISA&order.1.depositAmount=0&order.1.state=ORDERED&order.1.timeModified=30.07.2015+10%3A52%3A53&order.1.currency=EUR&order.1.contractNumber=0815DemoContract&order.1.orderDescription=Lisa+Kaufrausch%2C+K-Nr%3A+54435&order.1.payments=1&order.1.timeCreated=30.07.2015+10%3A52%3A53&order.1.orderReference=OR-23473341&order.1.refundAmount=0&order.1.acquirer=card+complete&order.1.customerStatement=Danke+f%C3%BCr+den+Einkauf%21&order.1.amount=1.00&order.1.credits=0&order.1.approveAmount=1.00&order.1.merchantNumber=1&objectsTotal=1&status=0&orders=1", headers: {}) - + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/getorderdetails"). with(body: {"customerId"=>"D200001", "language"=>"en", "orderNumber"=>"56453412", "password"=>"jcv45z", "requestFingerprint"=>"512954a4d75c781d02c36504fe51f170470af50e1438bd61e757ed21d262072d1e292a3df96c5c4a5fcce7fdb24b25be211346692175ec6ebe09f574f2e7d478", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'228', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(:status => 200, :body => "payment.1.1.currency=EUR&payment.1.1.state=payment_approved&payment.1.1.orderNumber=56453412&payment.1.1.timeModified=30.07.2015+11%3A20%3A53&payment.1.1.merchantNumber=1&payment.1.1.timeCreated=30.07.2015+11%3A20%3A53&payment.1.1.depositAmount=0.00&payment.1.1.paymentType=APG&payment.1.1.approvalCode=123456&payment.1.1.paymentNumber=56453412&payment.1.1.approveAmount=1.00&payment.1.1.operationsAllowed=DEPOSIT%2CAPPROVEREVERSAL&order.1.orderNumber=56453412&order.1.paymentType=APG&order.1.brand=MasterCard&order.1.depositAmount=0&order.1.state=ORDERED&order.1.timeModified=30.07.2015+11%3A20%3A53&order.1.currency=EUR&order.1.contractNumber=0815DemoContract&order.1.orderDescription=Max+Mustermann%2C+K-Nr%3A+12345&order.1.payments=1&order.1.timeCreated=30.07.2015+11%3A20%3A53&order.1.orderReference=OR-56453412&order.1.refundAmount=0&order.1.acquirer=PayLife&order.1.customerStatement=Danke+f%C3%BCr+den+Einkauf%21&order.1.amount=1.00&order.1.credits=0&order.1.approveAmount=1.00&order.1.merchantNumber=1&objectsTotal=1&status=0&orders=1", :headers => {}) - + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/getorderdetails"). with(body: {"customerId"=>"D200001", "language"=>"en", "orderNumber"=>"543132154", "password"=>"jcv45z", "requestFingerprint"=>"865d590cfa0b89587893ce64fb510977b1c49e81d47c6591c887a7470cc85828022034f262dbfcc8aadad6a2e269e4f85eb836427ece3699cf4d898364502dbb", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'229', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "payment.1.1.currency=EUR&payment.1.1.state=payment_deposited&payment.1.1.senderAccountOwner=Test+Consumer&payment.1.1.timeModified=30.07.2015+11%3A32%3A49&payment.1.1.merchantNumber=1&payment.1.1.timeCreated=30.07.2015+11%3A32%3A49&payment.1.1.senderIBAN=DE0000000000000000&payment.1.1.depositAmount=1.00&payment.1.1.senderBIC=PNAGDE00000&payment.1.1.senderBankName=Test+Bank&payment.1.1.senderBankNumber=1234578&payment.1.1.approvalCode=00000-00000-AAAAAAAA-BBBB&payment.1.1.senderCountry=DE&payment.1.1.orderNumber=543132154&payment.1.1.paymentType=SUE&payment.1.1.securityCriteria=1&payment.1.1.paymentNumber=543132154&payment.1.1.approveAmount=1.00&payment.1.1.senderAccountNumber=1234567890&payment.1.1.batchNumber=131&order.1.brand=sofortueberweisung&order.1.paymentType=SUE&order.1.state=ORDERED&order.1.currency=EUR&order.1.orderDescription=F.+Realtime%2C+K-Nr%3A+12111&order.1.orderReference=OR-543132154&order.1.refundAmount=0&order.1.customerStatement=Danke+f%C3%BCr+den+Einkauf%21&order.1.orderNumber=543132154&order.1.depositAmount=1.00&order.1.timeModified=30.07.2015+11%3A32%3A49&order.1.contractNumber=1234%2F1234&order.1.payments=1&order.1.timeCreated=30.07.2015+11%3A32%3A49&order.1.amount=1.00&order.1.credits=0&order.1.approveAmount=0&order.1.merchantNumber=1&objectsTotal=1&status=0&orders=1", headers: {}) - + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/getorderdetails"). with(body: {"customerId"=>"D200001", "language"=>"en", "orderNumber"=>"3485464", "password"=>"jcv45z", "requestFingerprint"=>"c057221a6a402100f70f2ab519b71f047fe15d0e3b20d3777c0a6620682efde52c0902c321dca0185bd72f461acfc5634ecd6ab14c1791e316883a31d8560f42", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'227', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "payment.1.1.currency=EUR&payment.1.1.state=payment_deposited&payment.1.1.timeModified=30.07.2015+11%3A41%3A37&payment.1.1.paypalPayerAddressStatus=unverified&payment.1.1.merchantNumber=1&payment.1.1.timeCreated=30.07.2015+11%3A41%3A37&payment.1.1.paypalPayerAddressState=Musterland&payment.1.1.depositAmount=1.00&payment.1.1.approvalCode=4PW61566G53703003&payment.1.1.paypalPayerAddressCountry=AT&payment.1.1.paypalPayerFirstName=Test&payment.1.1.orderNumber=3485464&payment.1.1.paypalPayerEmail=buyer%40paypal.com&payment.1.1.paypalPayerLastName=Consumer&payment.1.1.paymentType=PPL&payment.1.1.paypalPayerAddressCity=Musterstadt&payment.1.1.paypalPayerAddressZIP=1234&payment.1.1.paypalProtectionEligibility=ExtendedCustomerProtection&payment.1.1.paymentNumber=3485464&payment.1.1.approveAmount=1.00&payment.1.1.paypalPayerID=PAYER123456ID&payment.1.1.batchNumber=129&order.1.brand=PayPal&order.1.paymentType=PPL&order.1.state=ORDERED&order.1.currency=EUR&order.1.orderDescription=E.+Bay%2C+K-Nr%3A+55266&order.1.orderReference=OR-3485464&order.1.refundAmount=0&order.1.customerStatement=Danke+f%C3%BCr+den+Einkauf%21&order.1.orderNumber=3485464&order.1.depositAmount=1.00&order.1.timeModified=30.07.2015+11%3A41%3A37&order.1.contractNumber=mail%40shop.com&order.1.payments=1&order.1.timeCreated=30.07.2015+11%3A41%3A37&order.1.amount=1.00&order.1.credits=0&order.1.approveAmount=0&order.1.merchantNumber=1&objectsTotal=1&status=0&orders=1", headers: {}) - + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/getorderdetails"). with(body: {"customerId"=>"D200001", "language"=>"en", "orderNumber"=>"123456789", "password"=>"jcv45z", "requestFingerprint"=>"05590300ee16cd890e900bb45923b9f950d4d1743ec9b335f20da86f8c9ec9838882f49736fef09a47560a8462d0833c05d0aa978c32fe9adcc4086f95c4751f", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'229', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "status=0&objectsTotal=0&orders=0", headers: {}) - + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/getorderdetails"). with(body: {"customerId"=>"D200001", "language"=>"en", "password"=>"jcv45z", "requestFingerprint"=>"dfd315b6687aa1f213450008cb3932b29c23601097a0f1a120377938149c3be84e54dafd36e7cf75385e6f356cff79f1a084712d099bedeb2735e63df861b2c5", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'207', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "error.1.consumer_message=Order+number+is+missing.&error.1.error_code=11011&error.1.message=Order+number+is+missing.&errors=1&status=1", headers: {}) - ##### Wirecard::Backend::Deposit ##### + ##### Wirecard::Backend::Deposit ##### stub_request(:post, "https://checkout.wirecard.com/seamless/backend/deposit"). with(body: {"amount"=>"1000", "currency"=>"EUR", "customerId"=>"D200001", "language"=>"en", "orderNumber"=>"23473341", "password"=>"jcv45z", "requestFingerprint"=>"db96723ef9e69e323a63d65f634c03badaa7e373f8ca65f1e764162464e28414e476072aca98b7ae2aee7dd045b52abd102b3f74b3a6d72223ca51f105368792", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'253', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "paymentNumber=23473341&status=0", headers: {}) - + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/deposit"). with(body: {"currency"=>"EUR", "customerId"=>"D200001", "language"=>"en", "orderNumber"=>"23473341", "password"=>"jcv45z", "requestFingerprint"=>"8f998a36a3060d88970dd90b648aafec16ecc11db82c60f84dd636e1bb0a976b11a93b5f204d84e426356c6c0bdad8514c954e56ad351fcbcb12c5484cc6002f", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'241', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "error.1.errorCode=11017&error.1.message=Amount+is+missing.&error.1.consumerMessage=Amount+is+missing.&errors=1&status=1", headers: {}) - + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/deposit"). with(body: {"amount"=>"1000", "customerId"=>"D200001", "language"=>"en", "orderNumber"=>"23473341", "password"=>"jcv45z", "requestFingerprint"=>"fbd960f2ed92db219ee1c85790bda0b7c591e0d7b004d8cf1a4a554f112b33a02ee13203e62d53395f80dbc10c6b98f070dbb5b03084387deacc3689f8143753", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'240', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "error.1.errorCode=11019&error.1.message=Currency+is+missing.&error.1.consumerMessage=Currency+is+missing.&errors=1&status=1", headers: {}) - + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/deposit"). with(body: {"amount"=>"1000", "currency"=>"EUR", "customerId"=>"D200001", "language"=>"en", "password"=>"jcv45z", "requestFingerprint"=>"85482e191e98ba78be9699348a51a0b848efafe60d7afc3cb091ad33cf0fb487838096540bbf3c7201b4c9bd0a1a897a5d9e3b440243cc2ee5a22114d585ddf5", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'232', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "error.1.errorCode=11011&error.1.message=Order+number+is+missing.&error.1.consumerMessage=Order+number+is+missing.&errors=1&status=1", headers: {}) - - ##### Wirecard::Backend::DepositReversal ##### + + ##### Wirecard::Backend::DepositReversal ##### stub_request(:post, "https://checkout.wirecard.com/seamless/backend/depositreversal"). with(body: {"customerId"=>"D200001", "language"=>"en", "orderNumber"=>"23473341", "password"=>"jcv45z", "paymentNumber"=>"23473341", "requestFingerprint"=>"51b6ba02b404a79a3ae20b60d8f37c8756be90940e6b7ee5f1399eb541ad26839b06a880959a6837cad9c694b8f44974a8855e5cbdc04cd95337352f2cd53f12", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'251', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "status=0", headers: {}) - + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/depositreversal"). with(body: {"customerId"=>"D200001", "language"=>"en", "orderNumber"=>"23473341", "password"=>"jcv45z", "requestFingerprint"=>"4b5b4733bf2ec86456f180a75ed08eb7c0d3abbe8b3f834f313a5f35b8fe85fdf9568765f08cf8921be864764585d85a12357b9826e0f197255d69afc4155a45", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'228', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "error.1.errorCode=11012&error.1.message=Payment+number+is+missing.&error.1.consumerMessage=Payment+number+is+missing.&errors=1&status=1", headers: {}) - + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/depositreversal"). with(body: {"customerId"=>"D200001", "language"=>"en", "password"=>"jcv45z", "paymentNumber"=>"23473341", "requestFingerprint"=>"4b5b4733bf2ec86456f180a75ed08eb7c0d3abbe8b3f834f313a5f35b8fe85fdf9568765f08cf8921be864764585d85a12357b9826e0f197255d69afc4155a45", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'230', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "error.1.errorCode=11011&error.1.message=Order+number+is+missing.&error.1.consumerMessage=Order+number+is+missing.&errors=1&status=1", headers: {}) - + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/depositreversal"). with(body: {"customerId"=>"D200001", "language"=>"en", "password"=>"jcv45z", "requestFingerprint"=>"dfd315b6687aa1f213450008cb3932b29c23601097a0f1a120377938149c3be84e54dafd36e7cf75385e6f356cff79f1a084712d099bedeb2735e63df861b2c5", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'207', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "error.1.errorCode=11011&error.1.message=Order+number+is+missing.&error.1.consumerMessage=Order+number+is+missing.&error.2.errorCode=11012&error.2.message=Payment+number+is+missing.&error.2.consumerMessage=Payment+number+is+missing.&errors=2&status=1", headers: {}) - + ##### Wirecard::Backend::GenerateOrderNumber ##### stub_request(:post, "https://checkout.wirecard.com/seamless/backend/generateordernumber"). with(body: {"customerId"=>"D200001", "language"=>"en", "password"=>"jcv45z", "requestFingerprint"=>"dfd315b6687aa1f213450008cb3932b29c23601097a0f1a120377938149c3be84e54dafd36e7cf75385e6f356cff79f1a084712d099bedeb2735e63df861b2c5", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'207', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "status=0&orderNumber=1113051", headers: {}) - + ##### Wirecard::Backend::ApproveReversal ##### stub_request(:post, "https://checkout.wirecard.com/seamless/backend/approvereversal"). with(body: {"customerId"=>"D200001", "language"=>"en", "orderNumber"=>"23473341", "password"=>"jcv45z", "requestFingerprint"=>"4b5b4733bf2ec86456f180a75ed08eb7c0d3abbe8b3f834f313a5f35b8fe85fdf9568765f08cf8921be864764585d85a12357b9826e0f197255d69afc4155a45", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'228', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "status=0", headers: {}) - + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/approvereversal"). with(body: {"customerId"=>"D200001", "language"=>"en", "password"=>"jcv45z", "requestFingerprint"=>"dfd315b6687aa1f213450008cb3932b29c23601097a0f1a120377938149c3be84e54dafd36e7cf75385e6f356cff79f1a084712d099bedeb2735e63df861b2c5", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'207', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "error.1.errorCode=11011&error.1.message=Order+number+is+missing.&error.1.consumerMessage=Order+number+is+missing.&errors=1&status=1", headers: {}) - + ##### Wirecard::Backend::RecurPayment ##### stub_request(:post, "https://checkout.wirecard.com/seamless/backend/recurpayment"). with(body: {"amount"=>"1000", "autoDeposit"=>"Yes", "currency"=>"EUR", "customerId"=>"D200001", "customerStatement"=>"some statement", "language"=>"en", "orderDescription"=>"some description", "orderNumber"=>"23473341", "orderReference"=>"MercantID_X345456", "password"=>"jcv45z", "requestFingerprint"=>"aceb23e9015a4b84fbafd0e0498d526c7e92ca4e7a96fe4ca7c042852271d46e8c54dd217eb1ddaf3a343f9f170fb52629e4a91b8fabd9f13e6c4b2df0077b6f", "shopId"=>"qmore", "sourceOrderNumber"=>"23473341"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'396', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "status=0&orderNumber=23473341", headers: {}) - + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/recurpayment"). with(body: {"autoDeposit"=>"Yes", "customerId"=>"D200001", "customerStatement"=>"some statement", "language"=>"en", "orderNumber"=>"23473341", "orderReference"=>"MercantID_X345456", "password"=>"jcv45z", "requestFingerprint"=>"a2170fe58a24491b64e57fe08c18f9711faa819051cdae13cabb85c46a93d6fc844abb9fa85857d02d806caf6a54e4b74ab89487b35564deafce432a30de9609", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'310', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "error.1.errorCode=11159&error.1.message=Source+ORDERNUMBER+is+missing.&error.1.consumerMessage=Source+ORDERNUMBER+is+missing.&error.2.errorCode=11020&error.2.message=Order+description+is+missing.&error.2.consumerMessage=Order+description+is+missing.&error.3.errorCode=11017&error.3.message=Amount+is+missing.&error.3.consumerMessage=Amount+is+missing.&error.4.errorCode=11019&error.4.message=Currency+is+missing.&error.4.consumerMessage=Currency+is+missing.&errors=4&status=1", headers: {}) - + to_return(status: 200, body: "error.1.errorCode=11159&error.1.message=Source+ORDERNUMBER+is+missing.&error.1.consumerMessage=Source+ORDERNUMBER+is+missing.&error.2.errorCode=11020&error.2.message=Order+description+is+missing.&error.2.consumerMessage=Order+description+is+missing.&error.3.errorCode=11017&error.3.message=Amount+is+missing.&error.3.consumerMessage=Amount+is+missing.&error.4.errorCode=11019&error.4.message=Currency+is+missing.&error.4.consumerMessage=Currency+is+missing.&errors=4&status=1", headers: {}) + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/recurpayment"). with(body: {"amount"=>"1000", "currency"=>"EUR", "customerId"=>"D200001", "language"=>"en", "orderDescription"=>"some description", "password"=>"jcv45z", "requestFingerprint"=>"aa3ea63cc812e30d1b2a412e8e24dbc26d3379dbe1b7c5ca672cc67d42aa45e0dc8454e5de07635aa3514449ff3bb7792d40ecc086a0a7c252119380cc738f40", "shopId"=>"qmore", "sourceOrderNumber"=>"23473341"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'293', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "status=0&orderNumber=23473341", headers: {}) - + ##### Wirecard::Backend::Refund ##### stub_request(:post, "https://checkout.wirecard.com/seamless/backend/refund"). with(body: {"amount"=>"1000", "currency"=>"EUR", "customerId"=>"D200001", "language"=>"en", "orderNumber"=>"23473341", "password"=>"jcv45z", "requestFingerprint"=>"db96723ef9e69e323a63d65f634c03badaa7e373f8ca65f1e764162464e28414e476072aca98b7ae2aee7dd045b52abd102b3f74b3a6d72223ca51f105368792", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'253', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). + headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'253', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "creditNumber=14949449&status=0", headers: {}) - + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/refund"). with(body: {"customerId"=>"D200001", "language"=>"en", "password"=>"jcv45z", "requestFingerprint"=>"dfd315b6687aa1f213450008cb3932b29c23601097a0f1a120377938149c3be84e54dafd36e7cf75385e6f356cff79f1a084712d099bedeb2735e63df861b2c5", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'207', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "error.1.errorCode=11011&error.1.message=Order+number+is+missing.&error.1.consumerMessage=Order+number+is+missing.&error.2.errorCode=11019&error.2.message=Currency+is+missing.&error.2.consumerMessage=Currency+is+missing.&error.3.errorCode=11017&error.3.message=Amount+is+missing.&error.3.consumerMessage=Amount+is+missing.&errors=3&status=1", headers: {}) - - + + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/refundreversal"). with(body: {"creditNumber"=>"14949449", "customerId"=>"D200001", "language"=>"en", "orderNumber"=>"23473341", "password"=>"jcv45z", "requestFingerprint"=>"4f92a11fb765e115e9c7e2e89ff1b08692fb61f7cce1aac88ab5afec4dc61d9d76ff1e72ccd18b836232177df29c03f5e4416c61c7954275e5a8fe9026545e5c", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'250', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "status=0", headers: {}) - + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/refundreversal"). with(body: {"customerId"=>"D200001", "language"=>"en", "password"=>"jcv45z", "requestFingerprint"=>"dfd315b6687aa1f213450008cb3932b29c23601097a0f1a120377938149c3be84e54dafd36e7cf75385e6f356cff79f1a084712d099bedeb2735e63df861b2c5", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'207', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "error.1.errorCode=11011&error.1.message=Order+number+is+missing.&error.1.consumerMessage=Order+number+is+missing.&error.2.errorCode=11013&error.2.message=Credit+number+is+missing.&error.2.consumerMessage=Credit+number+is+missing.&errors=2&status=1", headers: {}) - + ##### Wirecard::Backend::TransferFund::ExistingOrder ##### stub_request(:post, "https://checkout.wirecard.com/seamless/backend/transferfund"). with(body: {"amount"=>"1000", "creditNumber"=>"14949449", "currency"=>"EUR", "customerId"=>"D200001", "customerStatement"=>"invoice text", "fundTransferType"=>"EXISTINGORDER", "language"=>"en", "orderDescription"=>"some description", "orderNumber"=>"56453412", "orderReference"=>"MercantID F34545", "password"=>"jcv45z", "requestFingerprint"=>"9514833a4bc44c6c13c320a04ae55d4ae1dabf6c99645f01658dd6f6370f49f8806de59e7dbdb1f8b75994e57e011c347d7908650164955b43f28a7a8d11127b", "shopId"=>"qmore", "sourceOrderNumber"=>"23473341"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'430', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "status=0&creditNumber=14949449", headers: {}) - + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/transferfund"). with(body: {"amount"=>"1000", "currency"=>"EUR", "customerId"=>"D200001", "fundTransferType"=>"EXISTINGORDER", "language"=>"en", "orderDescription"=>"some description", "password"=>"jcv45z", "requestFingerprint"=>"403782c9e852642fd0dbdbf21ca741c92f1c7df7ab18aece4cec68171d5d9cc59647a56aa539714228413e582973a9c7e31f79036d02bcf77ae2af289d4d662d", "shopId"=>"qmore", "sourceOrderNumber"=>"23473341"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'324', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). to_return(status: 200, body: "status=0&creditNumber=14949449", headers: {}) - + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/transferfund"). with(body: {"creditNumber"=>"14949449", "customerId"=>"D200001", "customerStatement"=>"invoice text", "language"=>"en", "orderNumber"=>"56453412", "orderReference"=>"MercantID F34545", "password"=>"jcv45z", "requestFingerprint"=>"8e12d164fd45310ba0772e9c81c0362fb133ee9a137a2071acba359f1608c687e046604e8f58988c84c6d1bed1949c3ef437cad13599287b5801529445838b83", "shopId"=>"qmore"}, headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'313', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). From 131c3a24e4caec6b887e120bee01d148e4b26d10 Mon Sep 17 00:00:00 2001 From: Dominic Breuker Date: Fri, 6 Nov 2015 14:42:32 +0100 Subject: [PATCH 6/8] finish refactoring specs --- .../backend/approve_reversal_spec.rb | 44 +++++- .../backend/deposit_reversal_spec.rb | 97 ++++++++++--- spec/unit_tests/backend/deposit_spec.rb | 96 ++++++++++-- .../backend/generate_order_number_spec.rb | 31 ++-- .../backend/get_order_details_spec.rb | 118 +++++++++++++-- spec/unit_tests/backend/recur_payment_spec.rb | 87 +++++++++-- ...nd_reversal.rb => refund_reversal_spec.rb} | 53 +++++-- spec/unit_tests/backend/refund_spec.rb | 54 +++++-- .../transfer_fund/existing_order_spec.rb | 87 +++++++++-- spec/unit_tests/data_storage/read_spec.rb | 2 - spec/unit_tests/payment_process/init_spec.rb | 3 +- spec/unit_tests/support/shared_context.rb | 137 ++---------------- 12 files changed, 557 insertions(+), 252 deletions(-) rename spec/unit_tests/backend/{refund_reversal.rb => refund_reversal_spec.rb} (58%) diff --git a/spec/unit_tests/backend/approve_reversal_spec.rb b/spec/unit_tests/backend/approve_reversal_spec.rb index adc808d..f0344bb 100644 --- a/spec/unit_tests/backend/approve_reversal_spec.rb +++ b/spec/unit_tests/backend/approve_reversal_spec.rb @@ -1,15 +1,15 @@ require 'spec_helper' RSpec.describe Wirecard::Backend::ApproveReversal do - + let(:approve_reversal) { Wirecard::Backend::ApproveReversal.new(options) } let(:options) { Hash.new.merge(order_number) } let(:order_number) { { order_number: '23473341' } } - + include_context 'configuration' - + it { is_expected.to be_a_kind_of(Wirecard::Backend::ApproveReversal) } - + describe '#implicit_fingerprint_order' do subject { approve_reversal.implicit_fingerprint_order } @@ -31,17 +31,45 @@ describe '#post' do subject { approve_reversal.post.response } - include_context 'stub requests' - + context 'when order number is 23473341' do let(:order_number) { { order_number: '23473341' } } - #it { is_expected.to eq({ status: '0' }) } + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/approvereversal"). + with(body: default_backend_request_hash.merge( + { + "orderNumber"=>'23473341', + "requestFingerprint"=>"4b5b4733bf2ec86456f180a75ed08eb7c0d3abbe8b3f834f313a5f35b8fe85fdf9568765f08cf8921be864764585d85a12357b9826e0f197255d69afc4155a45" + } + )). + to_return( + status: 200, + body: "status=0", + headers: {} + ) + end + + it { is_expected.to eq({ status: '0' }) } end context 'when order number is not given' do let(:order_number) { { } } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/approvereversal"). + with(body: default_backend_request_hash.merge( + { + "requestFingerprint"=>"dfd315b6687aa1f213450008cb3932b29c23601097a0f1a120377938149c3be84e54dafd36e7cf75385e6f356cff79f1a084712d099bedeb2735e63df861b2c5" + } + )). + to_return( + status: 200, + body: "error.1.errorCode=11011&error.1.message=Order+number+is+missing.&error.1.consumerMessage=Order+number+is+missing.&errors=1&status=1", + headers: {} + ) + end + it { is_expected.to eq({ :"error.1.consumer_message" => "Order number is missing.", :"error.1.error_code" => "11011", diff --git a/spec/unit_tests/backend/deposit_reversal_spec.rb b/spec/unit_tests/backend/deposit_reversal_spec.rb index b21c988..1d75c33 100644 --- a/spec/unit_tests/backend/deposit_reversal_spec.rb +++ b/spec/unit_tests/backend/deposit_reversal_spec.rb @@ -1,16 +1,16 @@ require 'spec_helper' RSpec.describe Wirecard::Backend::DepositReversal do - + let(:deposit_reversal) { Wirecard::Backend::DepositReversal.new(options) } let(:options) { Hash.new.merge(order_number).merge(payment_number) } let(:order_number) { { order_number: '23473341' } } let(:payment_number) { { payment_number: '23473341'} } - + include_context 'configuration' - + it { is_expected.to be_a_kind_of(Wirecard::Backend::DepositReversal) } - + describe '#implicit_fingerprint_order' do subject { deposit_reversal.implicit_fingerprint_order } @@ -23,29 +23,59 @@ include_examples 'Wirecard::Base#defaults' include_examples 'Wirecard::Backend::Base#defaults' end - + describe '#url' do subject { deposit_reversal.url } - + it { is_expected.to eq('https://checkout.wirecard.com/seamless/backend/depositreversal') } end - + describe '#post' do subject { deposit_reversal.post.response } - include_context 'stub requests' - + context 'when order number is 23473341' do let(:order_number) { { order_number: '23473341' } } - + context 'when payment_number is given' do let(:payment_number) { { payment_number: '23473341'} } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/depositreversal"). + with(body: default_backend_request_hash.merge( + { + "orderNumber"=>"23473341", + "paymentNumber"=>'23473341', + "requestFingerprint"=>"51b6ba02b404a79a3ae20b60d8f37c8756be90940e6b7ee5f1399eb541ad26839b06a880959a6837cad9c694b8f44974a8855e5cbdc04cd95337352f2cd53f12" + } + )). + to_return( + status: 200, + body: "status=0", + headers: {} + ) + end + it { is_expected.to eq({ status: '0' }) } end - + context 'when payment_number is not given' do let(:payment_number) { { } } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/depositreversal"). + with(body: default_backend_request_hash.merge( + { + "orderNumber"=>"23473341", + "requestFingerprint"=>"4b5b4733bf2ec86456f180a75ed08eb7c0d3abbe8b3f834f313a5f35b8fe85fdf9568765f08cf8921be864764585d85a12357b9826e0f197255d69afc4155a45" + } + )). + to_return( + status: 200, + body: "error.1.errorCode=11012&error.1.message=Payment+number+is+missing.&error.1.consumerMessage=Payment+number+is+missing.&errors=1&status=1", + headers: {} + ) + end + it { is_expected.to eq({ :"error.1.consumer_message" => "Payment number is missing.", :"error.1.error_code" => "11012", @@ -55,14 +85,29 @@ }) } end end - + context 'when order number is not given' do let(:order_number) { { } } - - + + context 'when payment_number is given' do let(:payment_number) { { payment_number: '23473341'} } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/depositreversal"). + with(body: default_backend_request_hash.merge( + { + "paymentNumber"=>'23473341', + "requestFingerprint"=>"4b5b4733bf2ec86456f180a75ed08eb7c0d3abbe8b3f834f313a5f35b8fe85fdf9568765f08cf8921be864764585d85a12357b9826e0f197255d69afc4155a45" + } + )). + to_return( + status: 200, + body: "error.1.errorCode=11011&error.1.message=Order+number+is+missing.&error.1.consumerMessage=Order+number+is+missing.&errors=1&status=1", + headers: {} + ) + end + it { is_expected.to eq({ :"error.1.consumer_message" => "Order number is missing.", :"error.1.error_code" => "11011", @@ -71,10 +116,24 @@ status: "1" }) } end - + context 'when payment_number is not given' do let(:payment_number) { { } } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/depositreversal"). + with(body: default_backend_request_hash.merge( + { + "requestFingerprint"=>"dfd315b6687aa1f213450008cb3932b29c23601097a0f1a120377938149c3be84e54dafd36e7cf75385e6f356cff79f1a084712d099bedeb2735e63df861b2c5" + } + )). + to_return( + status: 200, + body: "error.1.errorCode=11011&error.1.message=Order+number+is+missing.&error.1.consumerMessage=Order+number+is+missing.&error.2.errorCode=11012&error.2.message=Payment+number+is+missing.&error.2.consumerMessage=Payment+number+is+missing.&errors=2&status=1", + headers: {} + ) + end + it { is_expected.to eq({ :"error.1.consumer_message" => "Order number is missing.", :"error.1.error_code" => "11011", diff --git a/spec/unit_tests/backend/deposit_spec.rb b/spec/unit_tests/backend/deposit_spec.rb index 02b5fbb..a955a93 100644 --- a/spec/unit_tests/backend/deposit_spec.rb +++ b/spec/unit_tests/backend/deposit_spec.rb @@ -1,17 +1,17 @@ require 'spec_helper' RSpec.describe Wirecard::Backend::Deposit do - + let(:deposit) { Wirecard::Backend::Deposit.new(options) } let(:options) { Hash.new.merge(order_number).merge(amount).merge(currency) } let(:order_number) { { order_number: '23473341' } } let(:amount) { { amount: '1000'} } let(:currency) { { currency: 'EUR' } } - + include_context 'configuration' - + it { is_expected.to be_a_kind_of(Wirecard::Backend::Deposit) } - + describe '#implicit_fingerprint_order' do subject { deposit.implicit_fingerprint_order } @@ -24,25 +24,57 @@ include_examples 'Wirecard::Base#defaults' include_examples 'Wirecard::Backend::Base#defaults' end - + describe '#url' do subject { deposit.url } - + it { is_expected.to eq('https://checkout.wirecard.com/seamless/backend/deposit') } end - + describe '#post' do subject { deposit.post.response } - include_context 'stub requests' - + context 'when order number is 23473341' do let(:order_number) { { order_number: '23473341' } } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/deposit"). + with(body: default_backend_request_hash.merge( + { + "amount"=>'1000', + "currency"=>'EUR', + "orderNumber"=>"23473341", + "requestFingerprint"=>"db96723ef9e69e323a63d65f634c03badaa7e373f8ca65f1e764162464e28414e476072aca98b7ae2aee7dd045b52abd102b3f74b3a6d72223ca51f105368792" + } + )). + to_return( + status: 200, + body: "paymentNumber=23473341&status=0", + headers: {} + ) + end + it { is_expected.to eq({ payment_number: "23473341", status: "0" }) } - + context 'when amount is not given' do let(:amount) { {} } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/deposit"). + with(body: default_backend_request_hash.merge( + { + "currency"=>'EUR', + "orderNumber"=>"23473341", + "requestFingerprint"=>"8f998a36a3060d88970dd90b648aafec16ecc11db82c60f84dd636e1bb0a976b11a93b5f204d84e426356c6c0bdad8514c954e56ad351fcbcb12c5484cc6002f" + } + )). + to_return( + status: 200, + body: "error.1.errorCode=11017&error.1.message=Amount+is+missing.&error.1.consumerMessage=Amount+is+missing.&errors=1&status=1", + headers: {} + ) + end + it { is_expected.to eq({ :"error.1.consumer_message" => "Amount is missing.", :"error.1.error_code" => "11017", @@ -51,10 +83,26 @@ status: "1" }) } end - + context 'when currency is not given' do let(:currency) { {} } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/deposit"). + with(body: default_backend_request_hash.merge( + { + "amount"=>'1000', + "orderNumber"=>"23473341", + "requestFingerprint"=>"fbd960f2ed92db219ee1c85790bda0b7c591e0d7b004d8cf1a4a554f112b33a02ee13203e62d53395f80dbc10c6b98f070dbb5b03084387deacc3689f8143753" + } + )). + to_return( + status: 200, + body: "error.1.errorCode=11019&error.1.message=Currency+is+missing.&error.1.consumerMessage=Currency+is+missing.&errors=1&status=1", + headers: {} + ) + end + it { is_expected.to eq({ :"error.1.consumer_message" => "Currency is missing.", :"error.1.error_code" => "11019", @@ -66,8 +114,24 @@ end context 'when order number is not given' do let(:order_number) { {} } - - it { is_expected.to eq({ + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/deposit"). + with(body: default_backend_request_hash.merge( + { + "amount"=>'1000', + "currency"=>'EUR', + "requestFingerprint"=>"85482e191e98ba78be9699348a51a0b848efafe60d7afc3cb091ad33cf0fb487838096540bbf3c7201b4c9bd0a1a897a5d9e3b440243cc2ee5a22114d585ddf5" + } + )). + to_return( + status: 200, + body: "error.1.errorCode=11011&error.1.message=Order+number+is+missing.&error.1.consumerMessage=Order+number+is+missing.&errors=1&status=1", + headers: {} + ) + end + + it { is_expected.to eq({ :"error.1.consumer_message" => "Order number is missing.", :"error.1.error_code" => "11011", :"error.1.message" => "Order number is missing.", diff --git a/spec/unit_tests/backend/generate_order_number_spec.rb b/spec/unit_tests/backend/generate_order_number_spec.rb index 8147035..b5016e6 100644 --- a/spec/unit_tests/backend/generate_order_number_spec.rb +++ b/spec/unit_tests/backend/generate_order_number_spec.rb @@ -1,14 +1,14 @@ require 'spec_helper' RSpec.describe Wirecard::Backend::GenerateOrderNumber do - + let(:generate_order_number) { Wirecard::Backend::GenerateOrderNumber.new(options) } let(:options) { Hash.new } - + include_context 'configuration' - + it { is_expected.to be_a_kind_of(Wirecard::Backend::GenerateOrderNumber) } - + describe '#implicit_fingerprint_order' do subject { generate_order_number.implicit_fingerprint_order } @@ -21,17 +21,30 @@ include_examples 'Wirecard::Base#defaults' include_examples 'Wirecard::Backend::Base#defaults' end - + describe '#url' do subject { generate_order_number.url } - + it { is_expected.to eq('https://checkout.wirecard.com/seamless/backend/generateordernumber') } end - + describe '#post' do subject { generate_order_number.post.response } - include_context 'stub requests' - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/generateordernumber"). + with(body: default_backend_request_hash.merge( + { + "requestFingerprint"=>"dfd315b6687aa1f213450008cb3932b29c23601097a0f1a120377938149c3be84e54dafd36e7cf75385e6f356cff79f1a084712d099bedeb2735e63df861b2c5" + } + )). + to_return( + status: 200, + body: "status=0&orderNumber=1113051", + headers: {} + ) + end + it { is_expected.to eq({ order_number: '1113051', status: '0' }) } end end \ No newline at end of file diff --git a/spec/unit_tests/backend/get_order_details_spec.rb b/spec/unit_tests/backend/get_order_details_spec.rb index 209afc1..eea3e51 100644 --- a/spec/unit_tests/backend/get_order_details_spec.rb +++ b/spec/unit_tests/backend/get_order_details_spec.rb @@ -1,14 +1,14 @@ require 'spec_helper' RSpec.describe Wirecard::Backend::GetOrderDetails do - + let(:get_order_details) { Wirecard::Backend::GetOrderDetails.new(options) } let(:options) { { order_number: '23473341' } } - + include_context 'configuration' - + it { is_expected.to be_a_kind_of(Wirecard::Backend::GetOrderDetails) } - + describe '#implicit_fingerprint_order' do subject { get_order_details.implicit_fingerprint_order } @@ -21,21 +21,35 @@ include_examples 'Wirecard::Base#defaults' include_examples 'Wirecard::Backend::Base#defaults' end - + describe '#url' do subject { get_order_details.url } - + it { is_expected.to eq('https://checkout.wirecard.com/seamless/backend/getorderdetails') } end - + describe '#post' do subject { get_order_details.post.response } - include_context 'stub requests' context 'when order_number is given' do context 'when order number refers is 23473341 (VISA)' do let(:options) { { order_number: '23473341' } } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/getorderdetails"). + with(body: default_backend_request_hash.merge( + { + "orderNumber"=>"23473341", + "requestFingerprint"=>"4b5b4733bf2ec86456f180a75ed08eb7c0d3abbe8b3f834f313a5f35b8fe85fdf9568765f08cf8921be864764585d85a12357b9826e0f197255d69afc4155a45" + } + )). + to_return( + status: 200, + body: "payment.1.1.currency=EUR&payment.1.1.state=payment_approved&payment.1.1.orderNumber=23473341&payment.1.1.timeModified=30.07.2015+10%3A52%3A53&payment.1.1.merchantNumber=1&payment.1.1.timeCreated=30.07.2015+10%3A52%3A53&payment.1.1.depositAmount=0.00&payment.1.1.paymentType=VPG&payment.1.1.approvalCode=123456&payment.1.1.paymentNumber=23473341&payment.1.1.approveAmount=1.00&payment.1.1.operationsAllowed=DEPOSIT%2CAPPROVEREVERSAL&order.1.orderNumber=23473341&order.1.paymentType=VPG&order.1.brand=VISA&order.1.depositAmount=0&order.1.state=ORDERED&order.1.timeModified=30.07.2015+10%3A52%3A53&order.1.currency=EUR&order.1.contractNumber=0815DemoContract&order.1.orderDescription=Lisa+Kaufrausch%2C+K-Nr%3A+54435&order.1.payments=1&order.1.timeCreated=30.07.2015+10%3A52%3A53&order.1.orderReference=OR-23473341&order.1.refundAmount=0&order.1.acquirer=card+complete&order.1.customerStatement=Danke+f%C3%BCr+den+Einkauf%21&order.1.amount=1.00&order.1.credits=0&order.1.approveAmount=1.00&order.1.merchantNumber=1&objectsTotal=1&status=0&orders=1", + headers: {} + ) + end + it { is_expected.to eq ( { objects_total: "1", :"order.1.acquirer" => "card complete", @@ -77,6 +91,21 @@ context 'when order number refers is 56453412 (Mastercard)' do let(:options) { { order_number: '56453412' } } + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/getorderdetails"). + with(body: default_backend_request_hash.merge( + { + "orderNumber"=>"56453412", + "requestFingerprint"=>"512954a4d75c781d02c36504fe51f170470af50e1438bd61e757ed21d262072d1e292a3df96c5c4a5fcce7fdb24b25be211346692175ec6ebe09f574f2e7d478" + } + )). + to_return( + status: 200, + body: "payment.1.1.currency=EUR&payment.1.1.state=payment_approved&payment.1.1.orderNumber=56453412&payment.1.1.timeModified=30.07.2015+11%3A20%3A53&payment.1.1.merchantNumber=1&payment.1.1.timeCreated=30.07.2015+11%3A20%3A53&payment.1.1.depositAmount=0.00&payment.1.1.paymentType=APG&payment.1.1.approvalCode=123456&payment.1.1.paymentNumber=56453412&payment.1.1.approveAmount=1.00&payment.1.1.operationsAllowed=DEPOSIT%2CAPPROVEREVERSAL&order.1.orderNumber=56453412&order.1.paymentType=APG&order.1.brand=MasterCard&order.1.depositAmount=0&order.1.state=ORDERED&order.1.timeModified=30.07.2015+11%3A20%3A53&order.1.currency=EUR&order.1.contractNumber=0815DemoContract&order.1.orderDescription=Max+Mustermann%2C+K-Nr%3A+12345&order.1.payments=1&order.1.timeCreated=30.07.2015+11%3A20%3A53&order.1.orderReference=OR-56453412&order.1.refundAmount=0&order.1.acquirer=PayLife&order.1.customerStatement=Danke+f%C3%BCr+den+Einkauf%21&order.1.amount=1.00&order.1.credits=0&order.1.approveAmount=1.00&order.1.merchantNumber=1&objectsTotal=1&status=0&orders=1", + headers: {} + ) + end + it { is_expected.to eq ( { objects_total: "1", :"order.1.acquirer" => "PayLife", @@ -114,10 +143,25 @@ status: "0" }) } end - + context 'when order number is 543132154 (Sofortüberweisung)' do let(:options) { { order_number: '543132154' } } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/getorderdetails"). + with(body: default_backend_request_hash.merge( + { + "orderNumber"=>"543132154", + "requestFingerprint"=>"865d590cfa0b89587893ce64fb510977b1c49e81d47c6591c887a7470cc85828022034f262dbfcc8aadad6a2e269e4f85eb836427ece3699cf4d898364502dbb" + } + )). + to_return( + status: 200, + body: "payment.1.1.currency=EUR&payment.1.1.state=payment_deposited&payment.1.1.senderAccountOwner=Test+Consumer&payment.1.1.timeModified=30.07.2015+11%3A32%3A49&payment.1.1.merchantNumber=1&payment.1.1.timeCreated=30.07.2015+11%3A32%3A49&payment.1.1.senderIBAN=DE0000000000000000&payment.1.1.depositAmount=1.00&payment.1.1.senderBIC=PNAGDE00000&payment.1.1.senderBankName=Test+Bank&payment.1.1.senderBankNumber=1234578&payment.1.1.approvalCode=00000-00000-AAAAAAAA-BBBB&payment.1.1.senderCountry=DE&payment.1.1.orderNumber=543132154&payment.1.1.paymentType=SUE&payment.1.1.securityCriteria=1&payment.1.1.paymentNumber=543132154&payment.1.1.approveAmount=1.00&payment.1.1.senderAccountNumber=1234567890&payment.1.1.batchNumber=131&order.1.brand=sofortueberweisung&order.1.paymentType=SUE&order.1.state=ORDERED&order.1.currency=EUR&order.1.orderDescription=F.+Realtime%2C+K-Nr%3A+12111&order.1.orderReference=OR-543132154&order.1.refundAmount=0&order.1.customerStatement=Danke+f%C3%BCr+den+Einkauf%21&order.1.orderNumber=543132154&order.1.depositAmount=1.00&order.1.timeModified=30.07.2015+11%3A32%3A49&order.1.contractNumber=1234%2F1234&order.1.payments=1&order.1.timeCreated=30.07.2015+11%3A32%3A49&order.1.amount=1.00&order.1.credits=0&order.1.approveAmount=0&order.1.merchantNumber=1&objectsTotal=1&status=0&orders=1", + headers: {} + ) + end + it { is_expected.to eq ( { objects_total: "1", :"order.1.amount" => "1.00", @@ -162,10 +206,25 @@ status: "0" }) } end - + context 'when order number is 3485464 (PayPal)' do let(:options) { { order_number: '3485464' } } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/getorderdetails"). + with(body: default_backend_request_hash.merge( + { + "orderNumber"=>"3485464", + "requestFingerprint"=>"c057221a6a402100f70f2ab519b71f047fe15d0e3b20d3777c0a6620682efde52c0902c321dca0185bd72f461acfc5634ecd6ab14c1791e316883a31d8560f42" + } + )). + to_return( + status: 200, + body: "payment.1.1.currency=EUR&payment.1.1.state=payment_deposited&payment.1.1.timeModified=30.07.2015+11%3A41%3A37&payment.1.1.paypalPayerAddressStatus=unverified&payment.1.1.merchantNumber=1&payment.1.1.timeCreated=30.07.2015+11%3A41%3A37&payment.1.1.paypalPayerAddressState=Musterland&payment.1.1.depositAmount=1.00&payment.1.1.approvalCode=4PW61566G53703003&payment.1.1.paypalPayerAddressCountry=AT&payment.1.1.paypalPayerFirstName=Test&payment.1.1.orderNumber=3485464&payment.1.1.paypalPayerEmail=buyer%40paypal.com&payment.1.1.paypalPayerLastName=Consumer&payment.1.1.paymentType=PPL&payment.1.1.paypalPayerAddressCity=Musterstadt&payment.1.1.paypalPayerAddressZIP=1234&payment.1.1.paypalProtectionEligibility=ExtendedCustomerProtection&payment.1.1.paymentNumber=3485464&payment.1.1.approveAmount=1.00&payment.1.1.paypalPayerID=PAYER123456ID&payment.1.1.batchNumber=129&order.1.brand=PayPal&order.1.paymentType=PPL&order.1.state=ORDERED&order.1.currency=EUR&order.1.orderDescription=E.+Bay%2C+K-Nr%3A+55266&order.1.orderReference=OR-3485464&order.1.refundAmount=0&order.1.customerStatement=Danke+f%C3%BCr+den+Einkauf%21&order.1.orderNumber=3485464&order.1.depositAmount=1.00&order.1.timeModified=30.07.2015+11%3A41%3A37&order.1.contractNumber=mail%40shop.com&order.1.payments=1&order.1.timeCreated=30.07.2015+11%3A41%3A37&order.1.amount=1.00&order.1.credits=0&order.1.approveAmount=0&order.1.merchantNumber=1&objectsTotal=1&status=0&orders=1", + headers: {} + ) + end + it { is_expected.to eq({ objects_total: "1", :"order.1.amount" => "1.00", @@ -212,10 +271,25 @@ status: "0" }) } end - + context 'when order number is 123456789 (non-existing order)' do let(:options) { { order_number: '123456789' } } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/getorderdetails"). + with(body: default_backend_request_hash.merge( + { + "orderNumber"=>"123456789", + "requestFingerprint"=>"05590300ee16cd890e900bb45923b9f950d4d1743ec9b335f20da86f8c9ec9838882f49736fef09a47560a8462d0833c05d0aa978c32fe9adcc4086f95c4751f" + } + )). + to_return( + status: 200, + body: "status=0&objectsTotal=0&orders=0", + headers: {} + ) + end + it { is_expected.to eq ({ objects_total: "0", orders: "0", status: "0" }) } end end @@ -223,6 +297,20 @@ context 'when order_number is missing' do let(:options) { Hash.new } + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/getorderdetails"). + with(body: default_backend_request_hash.merge( + { + "requestFingerprint"=>"dfd315b6687aa1f213450008cb3932b29c23601097a0f1a120377938149c3be84e54dafd36e7cf75385e6f356cff79f1a084712d099bedeb2735e63df861b2c5" + } + )). + to_return( + status: 200, + body: "error.1.consumer_message=Order+number+is+missing.&error.1.error_code=11011&error.1.message=Order+number+is+missing.&errors=1&status=1", + headers: {} + ) + end + it { is_expected.to eq ({:"error.1.consumer_message" => "Order number is missing.", :"error.1.error_code" => "11011", :"error.1.message" => "Order number is missing.", diff --git a/spec/unit_tests/backend/recur_payment_spec.rb b/spec/unit_tests/backend/recur_payment_spec.rb index 65b76a9..0c877b9 100644 --- a/spec/unit_tests/backend/recur_payment_spec.rb +++ b/spec/unit_tests/backend/recur_payment_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' RSpec.describe Wirecard::Backend::RecurPayment do - + let(:recur_payment) { Wirecard::Backend::RecurPayment.new(options) } let(:options) { Hash.new.merge(amount).merge(currency).merge(order_description).merge(source_order_number).merge(auto_deposit).merge(customer_statement).merge(order_number).merge(order_reference) } let(:amount) { { amount: '1000'} } @@ -12,11 +12,11 @@ let(:customer_statement) { { customer_statement: 'some statement' } } let(:order_number) { { order_number: '23473341' } } let(:order_reference) { { order_reference: 'MercantID_X345456' } } - + include_context 'configuration' - + it { is_expected.to be_a_kind_of(Wirecard::Backend::RecurPayment) } - + describe '#implicit_fingerprint_order' do subject { recur_payment.implicit_fingerprint_order } @@ -29,31 +29,70 @@ include_examples 'Wirecard::Base#defaults' include_examples 'Wirecard::Backend::Base#defaults' end - + describe '#url' do subject { recur_payment.url } - + it { is_expected.to eq('https://checkout.wirecard.com/seamless/backend/recurpayment') } end - + describe '#post' do subject { recur_payment.post.response } - include_context 'stub requests' - + context 'when required parameters are given' do let(:amount) { { amount: '1000'} } let(:currency) { { currency: 'EUR' } } let(:order_description) { { order_description: 'some description'} } let(:source_order_number) { { source_order_number: '23473341'} } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/recurpayment"). + with(body: default_backend_request_hash.merge( + { + "amount"=>"1000", + "currency"=>"EUR", + "customerStatement"=>"some statement", + "orderDescription"=>"some description", + "orderNumber"=>"23473341", + "sourceOrderNumber"=>"23473341", + "autoDeposit"=>"Yes", + "orderReference"=>"MercantID_X345456", + "requestFingerprint"=>"aceb23e9015a4b84fbafd0e0498d526c7e92ca4e7a96fe4ca7c042852271d46e8c54dd217eb1ddaf3a343f9f170fb52629e4a91b8fabd9f13e6c4b2df0077b6f" + } + )). + to_return( + status: 200, + body: "status=0&orderNumber=23473341", + headers: {} + ) + end + it { is_expected.to eq({ order_number: "23473341", status: "0" }) } - + context 'when required parameters are not given' do let(:amount) { Hash.new } let(:currency) { Hash.new } let(:order_description) { Hash.new } let(:source_order_number) { Hash.new } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/recurpayment"). + with(body: default_backend_request_hash.merge( + { + "customerStatement"=>"some statement", + "orderNumber"=>"23473341", + "autoDeposit"=>"Yes", + "orderReference"=>"MercantID_X345456", + "requestFingerprint"=>"a2170fe58a24491b64e57fe08c18f9711faa819051cdae13cabb85c46a93d6fc844abb9fa85857d02d806caf6a54e4b74ab89487b35564deafce432a30de9609" + } + )). + to_return( + status: 200, + body: "error.1.errorCode=11159&error.1.message=Source+ORDERNUMBER+is+missing.&error.1.consumerMessage=Source+ORDERNUMBER+is+missing.&error.2.errorCode=11020&error.2.message=Order+description+is+missing.&error.2.consumerMessage=Order+description+is+missing.&error.3.errorCode=11017&error.3.message=Amount+is+missing.&error.3.consumerMessage=Amount+is+missing.&error.4.errorCode=11019&error.4.message=Currency+is+missing.&error.4.consumerMessage=Currency+is+missing.&errors=4&status=1", + headers: {} + ) + end + it { is_expected.to eq({ :"error.1.consumer_message" => "Source ORDERNUMBER is missing.", :"error.1.error_code" => "11159", @@ -71,16 +110,34 @@ status: "1" }) } end - + context 'when optional parameters are not given' do let(:auto_deposit) { Hash.new } let(:customer_statement) { Hash.new } let(:order_number) { Hash.new } let(:order_reference) { Hash.new } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/recurpayment"). + with(body: default_backend_request_hash.merge( + { + "amount"=>"1000", + "currency"=>"EUR", + "orderDescription"=>"some description", + "sourceOrderNumber"=>"23473341", + "requestFingerprint"=>"aa3ea63cc812e30d1b2a412e8e24dbc26d3379dbe1b7c5ca672cc67d42aa45e0dc8454e5de07635aa3514449ff3bb7792d40ecc086a0a7c252119380cc738f40" + } + )). + to_return( + status: 200, + body: "status=0&orderNumber=23473341", + headers: {} + ) + end + it { is_expected.to eq({ order_number: "23473341", status: "0" }) } end - + end end end \ No newline at end of file diff --git a/spec/unit_tests/backend/refund_reversal.rb b/spec/unit_tests/backend/refund_reversal_spec.rb similarity index 58% rename from spec/unit_tests/backend/refund_reversal.rb rename to spec/unit_tests/backend/refund_reversal_spec.rb index dda9a85..a296400 100644 --- a/spec/unit_tests/backend/refund_reversal.rb +++ b/spec/unit_tests/backend/refund_reversal_spec.rb @@ -1,16 +1,16 @@ require 'spec_helper' RSpec.describe Wirecard::Backend::RefundReversal do - + let(:refund_reversal) { Wirecard::Backend::RefundReversal.new(options) } let(:options) { Hash.new.merge(order_number).merge(credit_number) } let(:order_number) { { order_number: '23473341' } } let(:credit_number) { { credit_number: '14949449'} } - + include_context 'configuration' - + it { is_expected.to be_a_kind_of(Wirecard::Backend::RefundReversal) } - + describe '#implicit_fingerprint_order' do subject { refund_reversal.implicit_fingerprint_order } @@ -23,27 +23,56 @@ include_examples 'Wirecard::Base#defaults' include_examples 'Wirecard::Backend::Base#defaults' end - + describe '#url' do subject { refund_reversal.url } - + it { is_expected.to eq('https://checkout.wirecard.com/seamless/backend/refundreversal') } end - + describe '#post' do subject { refund_reversal.post.response } - include_context 'stub requests' - + context 'when required parameters are given' do let(:order_number) { { order_number: '23473341' } } let(:credit_number) { { credit_number: '14949449'} } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/refundreversal"). + with(body: default_backend_request_hash.merge( + { + "creditNumber"=>"14949449", + "orderNumber"=>"23473341", + "requestFingerprint"=>"4f92a11fb765e115e9c7e2e89ff1b08692fb61f7cce1aac88ab5afec4dc61d9d76ff1e72ccd18b836232177df29c03f5e4416c61c7954275e5a8fe9026545e5c" + } + )). + to_return( + status: 200, + body: "status=0", + headers: {} + ) + end + it { is_expected.to eq({ status: "0" }) } - + context 'when required parameters are not given' do let(:order_number) { Hash.new } let(:credit_number) { Hash.new } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/refundreversal"). + with(body: default_backend_request_hash.merge( + { + "requestFingerprint"=>"dfd315b6687aa1f213450008cb3932b29c23601097a0f1a120377938149c3be84e54dafd36e7cf75385e6f356cff79f1a084712d099bedeb2735e63df861b2c5" + } + )). + to_return( + status: 200, + body: "error.1.errorCode=11011&error.1.message=Order+number+is+missing.&error.1.consumerMessage=Order+number+is+missing.&error.2.errorCode=11013&error.2.message=Credit+number+is+missing.&error.2.consumerMessage=Credit+number+is+missing.&errors=2&status=1", + headers: {} + ) + end + it { is_expected.to eq({ :"error.1.consumer_message" => "Order number is missing.", :"error.1.error_code" => "11011", diff --git a/spec/unit_tests/backend/refund_spec.rb b/spec/unit_tests/backend/refund_spec.rb index 180a4f2..5444adc 100644 --- a/spec/unit_tests/backend/refund_spec.rb +++ b/spec/unit_tests/backend/refund_spec.rb @@ -1,17 +1,17 @@ require 'spec_helper' RSpec.describe Wirecard::Backend::Refund do - + let(:refund) { Wirecard::Backend::Refund.new(options) } let(:options) { Hash.new.merge(order_number).merge(amount).merge(currency) } let(:order_number) { { order_number: '23473341' } } let(:amount) { { amount: '1000'} } let(:currency) { { currency: 'EUR' } } - + include_context 'configuration' - + it { is_expected.to be_a_kind_of(Wirecard::Backend::Refund) } - + describe '#implicit_fingerprint_order' do subject { refund.implicit_fingerprint_order } @@ -24,29 +24,59 @@ include_examples 'Wirecard::Base#defaults' include_examples 'Wirecard::Backend::Base#defaults' end - + describe '#url' do subject { refund.url } - + it { is_expected.to eq('https://checkout.wirecard.com/seamless/backend/refund') } end - + describe '#post' do subject { refund.post.response } - include_context 'stub requests' - + context 'when required parameters are given' do let(:order_number) { { order_number: '23473341' } } let(:amount) { { amount: '1000'} } let(:currency) { { currency: 'EUR' } } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/refund"). + with(body: default_backend_request_hash.merge( + { + "amount"=>"1000", + "currency"=>"EUR", + "orderNumber"=>"23473341", + "requestFingerprint"=>"db96723ef9e69e323a63d65f634c03badaa7e373f8ca65f1e764162464e28414e476072aca98b7ae2aee7dd045b52abd102b3f74b3a6d72223ca51f105368792" + } + )). + to_return( + status: 200, + body: "creditNumber=14949449&status=0", + headers: {} + ) + end + it { is_expected.to eq({ credit_number: "14949449", status: "0" }) } - + context 'when required parameters are not given' do let(:order_number) { Hash.new } let(:amount) { Hash.new } let(:currency) { Hash.new } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/refund"). + with(body: default_backend_request_hash.merge( + { + "requestFingerprint"=>"dfd315b6687aa1f213450008cb3932b29c23601097a0f1a120377938149c3be84e54dafd36e7cf75385e6f356cff79f1a084712d099bedeb2735e63df861b2c5" + } + )). + to_return( + status: 200, + body: "error.1.errorCode=11011&error.1.message=Order+number+is+missing.&error.1.consumerMessage=Order+number+is+missing.&error.2.errorCode=11019&error.2.message=Currency+is+missing.&error.2.consumerMessage=Currency+is+missing.&error.3.errorCode=11017&error.3.message=Amount+is+missing.&error.3.consumerMessage=Amount+is+missing.&errors=3&status=1", + headers: {} + ) + end + it { is_expected.to eq({ :"error.1.consumer_message" => "Order number is missing.", :"error.1.error_code" => "11011", diff --git a/spec/unit_tests/backend/transfer_fund/existing_order_spec.rb b/spec/unit_tests/backend/transfer_fund/existing_order_spec.rb index 673093c..8d9170f 100644 --- a/spec/unit_tests/backend/transfer_fund/existing_order_spec.rb +++ b/spec/unit_tests/backend/transfer_fund/existing_order_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' RSpec.describe Wirecard::Backend::TransferFund::ExistingOrder do - + let(:transfer_fund_existing_order) { Wirecard::Backend::TransferFund::ExistingOrder.new(options) } let(:options) { Hash.new.merge(amount).merge(currency).merge(fund_transfer_type).merge(order_description).merge(source_order_number).merge(credit_number).merge(customer_statement).merge(order_number).merge(order_reference) } let(:amount) { { amount: '1000' } } @@ -13,11 +13,11 @@ let(:customer_statement) { { customer_statement: 'invoice text'} } let(:order_number) { { order_number: '56453412'} } let(:order_reference) { { order_reference: 'MercantID F34545'} } - + include_context 'configuration' - + it { is_expected.to be_a_kind_of(Wirecard::Backend::TransferFund::ExistingOrder) } - + describe '#implicit_fingerprint_order' do subject { transfer_fund_existing_order.implicit_fingerprint_order } @@ -30,43 +30,102 @@ include_examples 'Wirecard::Base#defaults' include_examples 'Wirecard::Backend::Base#defaults' end - + describe '#url' do subject { transfer_fund_existing_order.url } - + it { is_expected.to eq('https://checkout.wirecard.com/seamless/backend/transferfund') } end - + describe '#post' do subject { transfer_fund_existing_order.post.response } - include_context 'stub requests' - + context 'when required parameters are given' do let(:amount) { { amount: '1000' } } let(:currency) { { currency: 'EUR'} } let(:fund_transfer_type) { { fund_transfer_type: 'EXISTINGORDER'} } let(:order_description) { { order_description: 'some description'} } let(:source_order_number) { { source_order_number: '23473341'} } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/transferfund"). + with(body: default_backend_request_hash.merge( + { + "amount"=>"1000", + "creditNumber"=>"14949449", + "currency"=>"EUR", + "customerStatement"=>"invoice text", + "fundTransferType"=>"EXISTINGORDER", + "orderDescription"=>"some description", + "orderNumber"=>"56453412", + "orderReference"=>"MercantID F34545", + "requestFingerprint"=>"9514833a4bc44c6c13c320a04ae55d4ae1dabf6c99645f01658dd6f6370f49f8806de59e7dbdb1f8b75994e57e011c347d7908650164955b43f28a7a8d11127b", + "sourceOrderNumber"=>"23473341" + } + )). + to_return( + status: 200, + body: "status=0&creditNumber=14949449", + headers: {} + ) + end + it { is_expected.to eq({ credit_number: '14949449', status: '0' }) } - + context 'when optional parameters not are given' do let(:credit_number) { Hash.new } let(:customer_statement) { Hash.new } let(:order_number) { Hash.new } let(:order_reference) { Hash.new } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/transferfund"). + with(body: default_backend_request_hash.merge( + { + "amount"=>"1000", + "currency"=>"EUR", + "fundTransferType"=>"EXISTINGORDER", + "orderDescription"=>"some description", + "requestFingerprint"=>"403782c9e852642fd0dbdbf21ca741c92f1c7df7ab18aece4cec68171d5d9cc59647a56aa539714228413e582973a9c7e31f79036d02bcf77ae2af289d4d662d", + "sourceOrderNumber"=>"23473341" + } + )). + to_return( + status: 200, + body: "status=0&creditNumber=14949449", + headers: {} + ) + end + it { is_expected.to eq({ credit_number: '14949449', status: '0' }) } end end - + context 'required parameters are not given' do let(:amount) { Hash.new } let(:currency) { Hash.new } let(:fund_transfer_type) { Hash.new } let(:order_description) { Hash.new } let(:source_order_number) { Hash.new } - + + before do + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/transferfund"). + with(body: default_backend_request_hash.merge( + { + "creditNumber"=>"14949449", + "customerStatement"=>"invoice text", + "orderNumber"=>"56453412", + "orderReference"=>"MercantID F34545", + "requestFingerprint"=>"8e12d164fd45310ba0772e9c81c0362fb133ee9a137a2071acba359f1608c687e046604e8f58988c84c6d1bed1949c3ef437cad13599287b5801529445838b83" + } + )). + to_return( + status: 200, + body: "error.1.errorCode=11017&error.1.message=Amount+is+missing.&error.1.consumerMessage=Amount+is+missing.&error.2.errorCode=11019&error.2.message=Currency+is+missing.&error.2.consumerMessage=Currency+is+missing.&error.3.errorCode=11020&error.3.message=Order+description+is+missing.&error.3.consumerMessage=Order+description+is+missing.&error.4.errorCode=11216&error.4.message=FUNDTRANSFERTYPE+is+missing.&error.4.consumerMessage=FUNDTRANSFERTYPE+is+missing.&errors=4&status=1", + headers: {} + ) + end + it { is_expected.to eq({ :"error.1.consumer_message" => "Amount is missing.", :"error.1.error_code" => "11017", diff --git a/spec/unit_tests/data_storage/read_spec.rb b/spec/unit_tests/data_storage/read_spec.rb index 83c3f3c..4f00eb9 100644 --- a/spec/unit_tests/data_storage/read_spec.rb +++ b/spec/unit_tests/data_storage/read_spec.rb @@ -30,8 +30,6 @@ describe '#post' do subject { read.post.response } - #include_context 'stub requests' - context 'when storage_id is given' do before do stub_request(:post, "https://checkout.wirecard.com/seamless/dataStorage/read"). diff --git a/spec/unit_tests/payment_process/init_spec.rb b/spec/unit_tests/payment_process/init_spec.rb index 06e4bdb..da5a485 100644 --- a/spec/unit_tests/payment_process/init_spec.rb +++ b/spec/unit_tests/payment_process/init_spec.rb @@ -10,7 +10,7 @@ before do ### stub request to generate order number for this payment process: will return 1113051 - stub_request(:post, "https://checkout.wirecard.com/seamless/frontend/init"). + stub_request(:post, "https://checkout.wirecard.com/seamless/backend/generateordernumber"). with(body: default_request_hash.merge( { "language"=>"en", @@ -27,7 +27,6 @@ end include_context 'configuration' - include_context 'stub requests' let(:default_payment_process_request_hash) do default_request_hash.merge( diff --git a/spec/unit_tests/support/shared_context.rb b/spec/unit_tests/support/shared_context.rb index fca8dac..c7e3885 100644 --- a/spec/unit_tests/support/shared_context.rb +++ b/spec/unit_tests/support/shared_context.rb @@ -40,140 +40,21 @@ "shopId" => config[:shop_id] } end + + let(:default_backend_request_hash) do + default_request_hash.merge( + { + "language"=>"en", + "password"=>"jcv45z" + } + ) + end end RSpec.shared_context 'stub requests' do before do - ##### Wirecard::Backend::GetOrderDetails ##### - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/getorderdetails"). - with(body: {"customerId"=>"D200001", "language"=>"en", "orderNumber"=>"23473341", "password"=>"jcv45z", "requestFingerprint"=>"4b5b4733bf2ec86456f180a75ed08eb7c0d3abbe8b3f834f313a5f35b8fe85fdf9568765f08cf8921be864764585d85a12357b9826e0f197255d69afc4155a45", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'228', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "payment.1.1.currency=EUR&payment.1.1.state=payment_approved&payment.1.1.orderNumber=23473341&payment.1.1.timeModified=30.07.2015+10%3A52%3A53&payment.1.1.merchantNumber=1&payment.1.1.timeCreated=30.07.2015+10%3A52%3A53&payment.1.1.depositAmount=0.00&payment.1.1.paymentType=VPG&payment.1.1.approvalCode=123456&payment.1.1.paymentNumber=23473341&payment.1.1.approveAmount=1.00&payment.1.1.operationsAllowed=DEPOSIT%2CAPPROVEREVERSAL&order.1.orderNumber=23473341&order.1.paymentType=VPG&order.1.brand=VISA&order.1.depositAmount=0&order.1.state=ORDERED&order.1.timeModified=30.07.2015+10%3A52%3A53&order.1.currency=EUR&order.1.contractNumber=0815DemoContract&order.1.orderDescription=Lisa+Kaufrausch%2C+K-Nr%3A+54435&order.1.payments=1&order.1.timeCreated=30.07.2015+10%3A52%3A53&order.1.orderReference=OR-23473341&order.1.refundAmount=0&order.1.acquirer=card+complete&order.1.customerStatement=Danke+f%C3%BCr+den+Einkauf%21&order.1.amount=1.00&order.1.credits=0&order.1.approveAmount=1.00&order.1.merchantNumber=1&objectsTotal=1&status=0&orders=1", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/getorderdetails"). - with(body: {"customerId"=>"D200001", "language"=>"en", "orderNumber"=>"56453412", "password"=>"jcv45z", "requestFingerprint"=>"512954a4d75c781d02c36504fe51f170470af50e1438bd61e757ed21d262072d1e292a3df96c5c4a5fcce7fdb24b25be211346692175ec6ebe09f574f2e7d478", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'228', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(:status => 200, :body => "payment.1.1.currency=EUR&payment.1.1.state=payment_approved&payment.1.1.orderNumber=56453412&payment.1.1.timeModified=30.07.2015+11%3A20%3A53&payment.1.1.merchantNumber=1&payment.1.1.timeCreated=30.07.2015+11%3A20%3A53&payment.1.1.depositAmount=0.00&payment.1.1.paymentType=APG&payment.1.1.approvalCode=123456&payment.1.1.paymentNumber=56453412&payment.1.1.approveAmount=1.00&payment.1.1.operationsAllowed=DEPOSIT%2CAPPROVEREVERSAL&order.1.orderNumber=56453412&order.1.paymentType=APG&order.1.brand=MasterCard&order.1.depositAmount=0&order.1.state=ORDERED&order.1.timeModified=30.07.2015+11%3A20%3A53&order.1.currency=EUR&order.1.contractNumber=0815DemoContract&order.1.orderDescription=Max+Mustermann%2C+K-Nr%3A+12345&order.1.payments=1&order.1.timeCreated=30.07.2015+11%3A20%3A53&order.1.orderReference=OR-56453412&order.1.refundAmount=0&order.1.acquirer=PayLife&order.1.customerStatement=Danke+f%C3%BCr+den+Einkauf%21&order.1.amount=1.00&order.1.credits=0&order.1.approveAmount=1.00&order.1.merchantNumber=1&objectsTotal=1&status=0&orders=1", :headers => {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/getorderdetails"). - with(body: {"customerId"=>"D200001", "language"=>"en", "orderNumber"=>"543132154", "password"=>"jcv45z", "requestFingerprint"=>"865d590cfa0b89587893ce64fb510977b1c49e81d47c6591c887a7470cc85828022034f262dbfcc8aadad6a2e269e4f85eb836427ece3699cf4d898364502dbb", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'229', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "payment.1.1.currency=EUR&payment.1.1.state=payment_deposited&payment.1.1.senderAccountOwner=Test+Consumer&payment.1.1.timeModified=30.07.2015+11%3A32%3A49&payment.1.1.merchantNumber=1&payment.1.1.timeCreated=30.07.2015+11%3A32%3A49&payment.1.1.senderIBAN=DE0000000000000000&payment.1.1.depositAmount=1.00&payment.1.1.senderBIC=PNAGDE00000&payment.1.1.senderBankName=Test+Bank&payment.1.1.senderBankNumber=1234578&payment.1.1.approvalCode=00000-00000-AAAAAAAA-BBBB&payment.1.1.senderCountry=DE&payment.1.1.orderNumber=543132154&payment.1.1.paymentType=SUE&payment.1.1.securityCriteria=1&payment.1.1.paymentNumber=543132154&payment.1.1.approveAmount=1.00&payment.1.1.senderAccountNumber=1234567890&payment.1.1.batchNumber=131&order.1.brand=sofortueberweisung&order.1.paymentType=SUE&order.1.state=ORDERED&order.1.currency=EUR&order.1.orderDescription=F.+Realtime%2C+K-Nr%3A+12111&order.1.orderReference=OR-543132154&order.1.refundAmount=0&order.1.customerStatement=Danke+f%C3%BCr+den+Einkauf%21&order.1.orderNumber=543132154&order.1.depositAmount=1.00&order.1.timeModified=30.07.2015+11%3A32%3A49&order.1.contractNumber=1234%2F1234&order.1.payments=1&order.1.timeCreated=30.07.2015+11%3A32%3A49&order.1.amount=1.00&order.1.credits=0&order.1.approveAmount=0&order.1.merchantNumber=1&objectsTotal=1&status=0&orders=1", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/getorderdetails"). - with(body: {"customerId"=>"D200001", "language"=>"en", "orderNumber"=>"3485464", "password"=>"jcv45z", "requestFingerprint"=>"c057221a6a402100f70f2ab519b71f047fe15d0e3b20d3777c0a6620682efde52c0902c321dca0185bd72f461acfc5634ecd6ab14c1791e316883a31d8560f42", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'227', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "payment.1.1.currency=EUR&payment.1.1.state=payment_deposited&payment.1.1.timeModified=30.07.2015+11%3A41%3A37&payment.1.1.paypalPayerAddressStatus=unverified&payment.1.1.merchantNumber=1&payment.1.1.timeCreated=30.07.2015+11%3A41%3A37&payment.1.1.paypalPayerAddressState=Musterland&payment.1.1.depositAmount=1.00&payment.1.1.approvalCode=4PW61566G53703003&payment.1.1.paypalPayerAddressCountry=AT&payment.1.1.paypalPayerFirstName=Test&payment.1.1.orderNumber=3485464&payment.1.1.paypalPayerEmail=buyer%40paypal.com&payment.1.1.paypalPayerLastName=Consumer&payment.1.1.paymentType=PPL&payment.1.1.paypalPayerAddressCity=Musterstadt&payment.1.1.paypalPayerAddressZIP=1234&payment.1.1.paypalProtectionEligibility=ExtendedCustomerProtection&payment.1.1.paymentNumber=3485464&payment.1.1.approveAmount=1.00&payment.1.1.paypalPayerID=PAYER123456ID&payment.1.1.batchNumber=129&order.1.brand=PayPal&order.1.paymentType=PPL&order.1.state=ORDERED&order.1.currency=EUR&order.1.orderDescription=E.+Bay%2C+K-Nr%3A+55266&order.1.orderReference=OR-3485464&order.1.refundAmount=0&order.1.customerStatement=Danke+f%C3%BCr+den+Einkauf%21&order.1.orderNumber=3485464&order.1.depositAmount=1.00&order.1.timeModified=30.07.2015+11%3A41%3A37&order.1.contractNumber=mail%40shop.com&order.1.payments=1&order.1.timeCreated=30.07.2015+11%3A41%3A37&order.1.amount=1.00&order.1.credits=0&order.1.approveAmount=0&order.1.merchantNumber=1&objectsTotal=1&status=0&orders=1", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/getorderdetails"). - with(body: {"customerId"=>"D200001", "language"=>"en", "orderNumber"=>"123456789", "password"=>"jcv45z", "requestFingerprint"=>"05590300ee16cd890e900bb45923b9f950d4d1743ec9b335f20da86f8c9ec9838882f49736fef09a47560a8462d0833c05d0aa978c32fe9adcc4086f95c4751f", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'229', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "status=0&objectsTotal=0&orders=0", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/getorderdetails"). - with(body: {"customerId"=>"D200001", "language"=>"en", "password"=>"jcv45z", "requestFingerprint"=>"dfd315b6687aa1f213450008cb3932b29c23601097a0f1a120377938149c3be84e54dafd36e7cf75385e6f356cff79f1a084712d099bedeb2735e63df861b2c5", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'207', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "error.1.consumer_message=Order+number+is+missing.&error.1.error_code=11011&error.1.message=Order+number+is+missing.&errors=1&status=1", headers: {}) - - ##### Wirecard::Backend::Deposit ##### - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/deposit"). - with(body: {"amount"=>"1000", "currency"=>"EUR", "customerId"=>"D200001", "language"=>"en", "orderNumber"=>"23473341", "password"=>"jcv45z", "requestFingerprint"=>"db96723ef9e69e323a63d65f634c03badaa7e373f8ca65f1e764162464e28414e476072aca98b7ae2aee7dd045b52abd102b3f74b3a6d72223ca51f105368792", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'253', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "paymentNumber=23473341&status=0", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/deposit"). - with(body: {"currency"=>"EUR", "customerId"=>"D200001", "language"=>"en", "orderNumber"=>"23473341", "password"=>"jcv45z", "requestFingerprint"=>"8f998a36a3060d88970dd90b648aafec16ecc11db82c60f84dd636e1bb0a976b11a93b5f204d84e426356c6c0bdad8514c954e56ad351fcbcb12c5484cc6002f", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'241', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "error.1.errorCode=11017&error.1.message=Amount+is+missing.&error.1.consumerMessage=Amount+is+missing.&errors=1&status=1", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/deposit"). - with(body: {"amount"=>"1000", "customerId"=>"D200001", "language"=>"en", "orderNumber"=>"23473341", "password"=>"jcv45z", "requestFingerprint"=>"fbd960f2ed92db219ee1c85790bda0b7c591e0d7b004d8cf1a4a554f112b33a02ee13203e62d53395f80dbc10c6b98f070dbb5b03084387deacc3689f8143753", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'240', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "error.1.errorCode=11019&error.1.message=Currency+is+missing.&error.1.consumerMessage=Currency+is+missing.&errors=1&status=1", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/deposit"). - with(body: {"amount"=>"1000", "currency"=>"EUR", "customerId"=>"D200001", "language"=>"en", "password"=>"jcv45z", "requestFingerprint"=>"85482e191e98ba78be9699348a51a0b848efafe60d7afc3cb091ad33cf0fb487838096540bbf3c7201b4c9bd0a1a897a5d9e3b440243cc2ee5a22114d585ddf5", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'232', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "error.1.errorCode=11011&error.1.message=Order+number+is+missing.&error.1.consumerMessage=Order+number+is+missing.&errors=1&status=1", headers: {}) - - ##### Wirecard::Backend::DepositReversal ##### - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/depositreversal"). - with(body: {"customerId"=>"D200001", "language"=>"en", "orderNumber"=>"23473341", "password"=>"jcv45z", "paymentNumber"=>"23473341", "requestFingerprint"=>"51b6ba02b404a79a3ae20b60d8f37c8756be90940e6b7ee5f1399eb541ad26839b06a880959a6837cad9c694b8f44974a8855e5cbdc04cd95337352f2cd53f12", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'251', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "status=0", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/depositreversal"). - with(body: {"customerId"=>"D200001", "language"=>"en", "orderNumber"=>"23473341", "password"=>"jcv45z", "requestFingerprint"=>"4b5b4733bf2ec86456f180a75ed08eb7c0d3abbe8b3f834f313a5f35b8fe85fdf9568765f08cf8921be864764585d85a12357b9826e0f197255d69afc4155a45", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'228', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "error.1.errorCode=11012&error.1.message=Payment+number+is+missing.&error.1.consumerMessage=Payment+number+is+missing.&errors=1&status=1", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/depositreversal"). - with(body: {"customerId"=>"D200001", "language"=>"en", "password"=>"jcv45z", "paymentNumber"=>"23473341", "requestFingerprint"=>"4b5b4733bf2ec86456f180a75ed08eb7c0d3abbe8b3f834f313a5f35b8fe85fdf9568765f08cf8921be864764585d85a12357b9826e0f197255d69afc4155a45", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'230', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "error.1.errorCode=11011&error.1.message=Order+number+is+missing.&error.1.consumerMessage=Order+number+is+missing.&errors=1&status=1", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/depositreversal"). - with(body: {"customerId"=>"D200001", "language"=>"en", "password"=>"jcv45z", "requestFingerprint"=>"dfd315b6687aa1f213450008cb3932b29c23601097a0f1a120377938149c3be84e54dafd36e7cf75385e6f356cff79f1a084712d099bedeb2735e63df861b2c5", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'207', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "error.1.errorCode=11011&error.1.message=Order+number+is+missing.&error.1.consumerMessage=Order+number+is+missing.&error.2.errorCode=11012&error.2.message=Payment+number+is+missing.&error.2.consumerMessage=Payment+number+is+missing.&errors=2&status=1", headers: {}) - - ##### Wirecard::Backend::GenerateOrderNumber ##### - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/generateordernumber"). - with(body: {"customerId"=>"D200001", "language"=>"en", "password"=>"jcv45z", "requestFingerprint"=>"dfd315b6687aa1f213450008cb3932b29c23601097a0f1a120377938149c3be84e54dafd36e7cf75385e6f356cff79f1a084712d099bedeb2735e63df861b2c5", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'207', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "status=0&orderNumber=1113051", headers: {}) - - ##### Wirecard::Backend::ApproveReversal ##### - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/approvereversal"). - with(body: {"customerId"=>"D200001", "language"=>"en", "orderNumber"=>"23473341", "password"=>"jcv45z", "requestFingerprint"=>"4b5b4733bf2ec86456f180a75ed08eb7c0d3abbe8b3f834f313a5f35b8fe85fdf9568765f08cf8921be864764585d85a12357b9826e0f197255d69afc4155a45", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'228', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "status=0", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/approvereversal"). - with(body: {"customerId"=>"D200001", "language"=>"en", "password"=>"jcv45z", "requestFingerprint"=>"dfd315b6687aa1f213450008cb3932b29c23601097a0f1a120377938149c3be84e54dafd36e7cf75385e6f356cff79f1a084712d099bedeb2735e63df861b2c5", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'207', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "error.1.errorCode=11011&error.1.message=Order+number+is+missing.&error.1.consumerMessage=Order+number+is+missing.&errors=1&status=1", headers: {}) - - ##### Wirecard::Backend::RecurPayment ##### - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/recurpayment"). - with(body: {"amount"=>"1000", "autoDeposit"=>"Yes", "currency"=>"EUR", "customerId"=>"D200001", "customerStatement"=>"some statement", "language"=>"en", "orderDescription"=>"some description", "orderNumber"=>"23473341", "orderReference"=>"MercantID_X345456", "password"=>"jcv45z", "requestFingerprint"=>"aceb23e9015a4b84fbafd0e0498d526c7e92ca4e7a96fe4ca7c042852271d46e8c54dd217eb1ddaf3a343f9f170fb52629e4a91b8fabd9f13e6c4b2df0077b6f", "shopId"=>"qmore", "sourceOrderNumber"=>"23473341"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'396', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "status=0&orderNumber=23473341", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/recurpayment"). - with(body: {"autoDeposit"=>"Yes", "customerId"=>"D200001", "customerStatement"=>"some statement", "language"=>"en", "orderNumber"=>"23473341", "orderReference"=>"MercantID_X345456", "password"=>"jcv45z", "requestFingerprint"=>"a2170fe58a24491b64e57fe08c18f9711faa819051cdae13cabb85c46a93d6fc844abb9fa85857d02d806caf6a54e4b74ab89487b35564deafce432a30de9609", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'310', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "error.1.errorCode=11159&error.1.message=Source+ORDERNUMBER+is+missing.&error.1.consumerMessage=Source+ORDERNUMBER+is+missing.&error.2.errorCode=11020&error.2.message=Order+description+is+missing.&error.2.consumerMessage=Order+description+is+missing.&error.3.errorCode=11017&error.3.message=Amount+is+missing.&error.3.consumerMessage=Amount+is+missing.&error.4.errorCode=11019&error.4.message=Currency+is+missing.&error.4.consumerMessage=Currency+is+missing.&errors=4&status=1", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/recurpayment"). - with(body: {"amount"=>"1000", "currency"=>"EUR", "customerId"=>"D200001", "language"=>"en", "orderDescription"=>"some description", "password"=>"jcv45z", "requestFingerprint"=>"aa3ea63cc812e30d1b2a412e8e24dbc26d3379dbe1b7c5ca672cc67d42aa45e0dc8454e5de07635aa3514449ff3bb7792d40ecc086a0a7c252119380cc738f40", "shopId"=>"qmore", "sourceOrderNumber"=>"23473341"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'293', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "status=0&orderNumber=23473341", headers: {}) - - ##### Wirecard::Backend::Refund ##### - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/refund"). - with(body: {"amount"=>"1000", "currency"=>"EUR", "customerId"=>"D200001", "language"=>"en", "orderNumber"=>"23473341", "password"=>"jcv45z", "requestFingerprint"=>"db96723ef9e69e323a63d65f634c03badaa7e373f8ca65f1e764162464e28414e476072aca98b7ae2aee7dd045b52abd102b3f74b3a6d72223ca51f105368792", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'253', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "creditNumber=14949449&status=0", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/refund"). - with(body: {"customerId"=>"D200001", "language"=>"en", "password"=>"jcv45z", "requestFingerprint"=>"dfd315b6687aa1f213450008cb3932b29c23601097a0f1a120377938149c3be84e54dafd36e7cf75385e6f356cff79f1a084712d099bedeb2735e63df861b2c5", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'207', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "error.1.errorCode=11011&error.1.message=Order+number+is+missing.&error.1.consumerMessage=Order+number+is+missing.&error.2.errorCode=11019&error.2.message=Currency+is+missing.&error.2.consumerMessage=Currency+is+missing.&error.3.errorCode=11017&error.3.message=Amount+is+missing.&error.3.consumerMessage=Amount+is+missing.&errors=3&status=1", headers: {}) - - - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/refundreversal"). - with(body: {"creditNumber"=>"14949449", "customerId"=>"D200001", "language"=>"en", "orderNumber"=>"23473341", "password"=>"jcv45z", "requestFingerprint"=>"4f92a11fb765e115e9c7e2e89ff1b08692fb61f7cce1aac88ab5afec4dc61d9d76ff1e72ccd18b836232177df29c03f5e4416c61c7954275e5a8fe9026545e5c", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'250', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "status=0", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/refundreversal"). - with(body: {"customerId"=>"D200001", "language"=>"en", "password"=>"jcv45z", "requestFingerprint"=>"dfd315b6687aa1f213450008cb3932b29c23601097a0f1a120377938149c3be84e54dafd36e7cf75385e6f356cff79f1a084712d099bedeb2735e63df861b2c5", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'207', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "error.1.errorCode=11011&error.1.message=Order+number+is+missing.&error.1.consumerMessage=Order+number+is+missing.&error.2.errorCode=11013&error.2.message=Credit+number+is+missing.&error.2.consumerMessage=Credit+number+is+missing.&errors=2&status=1", headers: {}) - ##### Wirecard::Backend::TransferFund::ExistingOrder ##### stub_request(:post, "https://checkout.wirecard.com/seamless/backend/transferfund"). with(body: {"amount"=>"1000", "creditNumber"=>"14949449", "currency"=>"EUR", "customerId"=>"D200001", "customerStatement"=>"invoice text", "fundTransferType"=>"EXISTINGORDER", "language"=>"en", "orderDescription"=>"some description", "orderNumber"=>"56453412", "orderReference"=>"MercantID F34545", "password"=>"jcv45z", "requestFingerprint"=>"9514833a4bc44c6c13c320a04ae55d4ae1dabf6c99645f01658dd6f6370f49f8806de59e7dbdb1f8b75994e57e011c347d7908650164955b43f28a7a8d11127b", "shopId"=>"qmore", "sourceOrderNumber"=>"23473341"}, From 39969497afd91cdf4f71f5e3da85147df1fa781e Mon Sep 17 00:00:00 2001 From: Dominic Breuker Date: Fri, 6 Nov 2015 16:42:16 +0100 Subject: [PATCH 7/8] remove unnecessary code --- spec/unit_tests/support/shared_context.rb | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/spec/unit_tests/support/shared_context.rb b/spec/unit_tests/support/shared_context.rb index c7e3885..ad802b9 100644 --- a/spec/unit_tests/support/shared_context.rb +++ b/spec/unit_tests/support/shared_context.rb @@ -49,26 +49,4 @@ } ) end -end - -RSpec.shared_context 'stub requests' do - - before do - - ##### Wirecard::Backend::TransferFund::ExistingOrder ##### - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/transferfund"). - with(body: {"amount"=>"1000", "creditNumber"=>"14949449", "currency"=>"EUR", "customerId"=>"D200001", "customerStatement"=>"invoice text", "fundTransferType"=>"EXISTINGORDER", "language"=>"en", "orderDescription"=>"some description", "orderNumber"=>"56453412", "orderReference"=>"MercantID F34545", "password"=>"jcv45z", "requestFingerprint"=>"9514833a4bc44c6c13c320a04ae55d4ae1dabf6c99645f01658dd6f6370f49f8806de59e7dbdb1f8b75994e57e011c347d7908650164955b43f28a7a8d11127b", "shopId"=>"qmore", "sourceOrderNumber"=>"23473341"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'430', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "status=0&creditNumber=14949449", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/transferfund"). - with(body: {"amount"=>"1000", "currency"=>"EUR", "customerId"=>"D200001", "fundTransferType"=>"EXISTINGORDER", "language"=>"en", "orderDescription"=>"some description", "password"=>"jcv45z", "requestFingerprint"=>"403782c9e852642fd0dbdbf21ca741c92f1c7df7ab18aece4cec68171d5d9cc59647a56aa539714228413e582973a9c7e31f79036d02bcf77ae2af289d4d662d", "shopId"=>"qmore", "sourceOrderNumber"=>"23473341"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'324', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "status=0&creditNumber=14949449", headers: {}) - - stub_request(:post, "https://checkout.wirecard.com/seamless/backend/transferfund"). - with(body: {"creditNumber"=>"14949449", "customerId"=>"D200001", "customerStatement"=>"invoice text", "language"=>"en", "orderNumber"=>"56453412", "orderReference"=>"MercantID F34545", "password"=>"jcv45z", "requestFingerprint"=>"8e12d164fd45310ba0772e9c81c0362fb133ee9a137a2071acba359f1608c687e046604e8f58988c84c6d1bed1949c3ef437cad13599287b5801529445838b83", "shopId"=>"qmore"}, - headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'close', 'Content-Length'=>'313', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'checkout.wirecard.com', 'User-Agent'=>'### User Agent ###'}). - to_return(status: 200, body: "error.1.errorCode=11017&error.1.message=Amount+is+missing.&error.1.consumerMessage=Amount+is+missing.&error.2.errorCode=11019&error.2.message=Currency+is+missing.&error.2.consumerMessage=Currency+is+missing.&error.3.errorCode=11020&error.3.message=Order+description+is+missing.&error.3.consumerMessage=Order+description+is+missing.&error.4.errorCode=11216&error.4.message=FUNDTRANSFERTYPE+is+missing.&error.4.consumerMessage=FUNDTRANSFERTYPE+is+missing.&errors=4&status=1", headers: {}) - end end \ No newline at end of file From 4c92d9cccb14bff1c3812dee5b8940f3c9f4397e Mon Sep 17 00:00:00 2001 From: Dominic Breuker Date: Fri, 6 Nov 2015 16:42:42 +0100 Subject: [PATCH 8/8] remove more code --- spec/wirecard_spec.rb | 133 ------------------------------------------ 1 file changed, 133 deletions(-) delete mode 100644 spec/wirecard_spec.rb diff --git a/spec/wirecard_spec.rb b/spec/wirecard_spec.rb deleted file mode 100644 index d9bcf08..0000000 --- a/spec/wirecard_spec.rb +++ /dev/null @@ -1,133 +0,0 @@ -# require 'spec_helper' -# -# describe Wirecard do -# -# before do -# Wirecard.configure do |config| -# config.host = 'checkout.wirecard.com' -# config.endpoint = 'https://checkout.wirecard.com/seamless' -# config.customer_id = 'D200001' -# config.shop_id = 'qmore' -# config.secret = 'B8AKTPWBRMNBV455FG6M2DANE99WU2' -# config.success_url = 'http://localhost.success.url' -# config.failure_url = 'http://localhost.failure.url' -# config.cancel_url = 'http://localhost.cancel.url' -# config.service_url = 'http://localhost.service.url' -# config.confirm_url = 'http://localhost.confirm.url' -# config.return_url = 'http://localhost.return.url' -# config.language = 'en' -# end -# end -# -# describe 'data storage' do -# let(:storage_id) { 'd738d62b67ea9719f80530e5097beada' } -# -# describe 'init' do -# subject { Wirecard::DataStorage::Init.new(order_ident: '123').post } -# -# #it { is_expected.to eq(storage_id: storage_id, javascript_url: 'https://checkout.wirecard.com/seamless/dataStorage/js/D200001/qmore/d738d62b67ea9719f80530e5097beada/dataStorage.js') } -# end -# -# describe 'read' do -# subject { Wirecard::DataStorage::Read.new(storage_id: storage_id).post } -# -# #it { is_expected.to eq({storage_id: storage_id, payment_informations: '0' }) } -# end -# end -# -# describe 'payment process' do -# let(:params) { { -# payment_type: 'CCARD', -# amount: '1000', -# consumer_ip_address: '127.0.0.1', -# consumer_user_agent: 'some agent', -# currency: 'EUR', -# language: 'de', -# order_description: 'sdfdg' -# } } -# -# describe 'init' do -# subject { Wirecard::PaymentProcess::Init.new(params).post } -# -# #it { expect(subject.keys).to include(:redirect_url) } -# end -# -# describe 'callback' do -# subject { Wirecard::Callback.new(response_params).to_hash } -# -# let(:response_params) do -# { -# "amount" => "1000", -# "currency" => "EUR", -# "paymentType" => "CCARD", -# "financialInstitution" => "Visa", -# "language" => "de", -# "orderNumber" => "5028575", -# "paymentState" => "SUCCESS", -# "authenticated" => "No", -# "anonymousPan" => "0004", -# "expiry" => "03/2018", -# "cardholder" => "sdg", -# "maskedPan" => "940000******0004", -# "gatewayReferenceNumber" => "DGW_5028575_RN", -# "gatewayContractNumber" => "DemoContractNumber123", -# "avsResponseCode" => "X", -# "avsResponseMessage" => "Demo AVS ResultMessage", -# "avsProviderResultCode" => "X", -# "avsProviderResultMessage" => "Demo AVS ProviderResultMessage", -# "responseFingerprintOrder" => "amount,currency,paymentType,financialInstitution,language,orderNumber,paymentState,authenticated,anonymousPan,expiry,cardholder,maskedPan,gatewayReferenceNumber,gatewayContractNumber,avsResponseCode,avsResponseMessage,avsProviderResultCode,avsProviderResultMessage,secret,responseFingerprintOrder", -# "responseFingerprint" => response_fingerprint -# } -# end -# -# context 'when response fingerprint is valid' do -# let(:response_fingerprint) { "42c937f7712b69210839c8d149bb17a352e04761eb08d67d28b2319b4a254c923b55cd6270c5d03f32cc9613dc53924c52e7a0dd7ad2139a5334a15cb4763e97" } -# -# context 'when response contains only fingerprinted params' do -# let(:parsed_response_params) do -# { -# amount: "1000", -# currency: "EUR", -# payment_type: "CCARD", -# financial_institution: "Visa", -# language: "de", -# order_number: "5028575", -# payment_state: "SUCCESS", -# authenticated: "No", -# anonymous_pan: "0004", -# expiry: "03/2018", -# cardholder: "sdg", -# masked_pan: "940000******0004", -# gateway_reference_number: "DGW_5028575_RN", -# gateway_contract_number: "DemoContractNumber123", -# avs_response_code: "X", -# avs_response_message: "Demo AVS ResultMessage", -# avs_provider_result_code: "X", -# avs_provider_result_message: "Demo AVS ProviderResultMessage", -# response_fingerprint_order: "amount,currency,paymentType,financialInstitution,language,orderNumber,paymentState,authenticated,anonymousPan,expiry,cardholder,maskedPan,gatewayReferenceNumber,gatewayContractNumber,avsResponseCode,avsResponseMessage,avsProviderResultCode,avsProviderResultMessage,secret,responseFingerprintOrder", -# response_fingerprint: response_fingerprint -# } -# end -# -# #it { is_expected.to eq(parsed_response_params) } -# end -# -# context 'when response contains unfingerprinted params' do -# subject { Wirecard::Callback.new(response_params.merge(other_params)).to_hash } -# let(:other_params) { { -# "parameter_key" => "parameter_value" -# } } -# -# #it { is_expected.to raise_error(ArgumentError) } TODO: get this to work... -# end -# end -# -# context 'when response fingerprint is invalid' do -# let(:response_fingerprint) { "invalid fingerprint" } -# -# #it { is_expected.to be nil } -# end -# -# end -# end -# end \ No newline at end of file