buckaruby 1.1.1 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -1
- data/.rubocop.yml +44 -3
- data/.travis.yml +5 -5
- data/CHANGELOG.md +29 -5
- data/Gemfile +5 -1
- data/Gemfile.lock +71 -0
- data/README.md +53 -0
- data/buckaruby.gemspec +3 -3
- data/lib/buckaruby.rb +1 -2
- data/lib/buckaruby/field_mapper.rb +52 -0
- data/lib/buckaruby/gateway.rb +31 -5
- data/lib/buckaruby/iban.rb +4 -2
- data/lib/buckaruby/operation.rb +1 -0
- data/lib/buckaruby/payment_method.rb +2 -0
- data/lib/buckaruby/request.rb +36 -2
- data/lib/buckaruby/response.rb +50 -35
- data/lib/buckaruby/signature.rb +22 -4
- data/lib/buckaruby/transaction_status.rb +19 -0
- data/lib/buckaruby/transaction_type.rb +79 -0
- data/lib/buckaruby/version.rb +1 -1
- data/spec/buckaruby/configuration_spec.rb +1 -1
- data/spec/buckaruby/field_mapper_spec.rb +69 -0
- data/spec/buckaruby/gateway_spec.rb +218 -79
- data/spec/buckaruby/iban_spec.rb +13 -13
- data/spec/buckaruby/signature_spec.rb +20 -14
- data/spec/buckaruby/support/case_insensitive_hash_spec.rb +1 -1
- data/spec/fixtures/responses/callback_payment_amex.txt +1 -0
- data/spec/fixtures/responses/callback_payment_sofort.txt +1 -0
- data/spec/fixtures/responses/callback_payment_visa.txt +1 -0
- data/spec/fixtures/responses/callback_refund_amex.txt +1 -0
- data/spec/fixtures/responses/setup_transaction_success.txt +1 -1
- data/spec/fixtures/responses/specify_transaction_success.txt +1 -0
- data/spec/spec_helper.rb +2 -0
- metadata +24 -23
@@ -2,10 +2,10 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
describe Buckaruby::Gateway do
|
5
|
+
RSpec.describe Buckaruby::Gateway do
|
6
6
|
describe 'initialization' do
|
7
7
|
describe 'bad parameters' do
|
8
|
-
it '
|
8
|
+
it 'raises an exception when creating a new instance with invalid parameters' do
|
9
9
|
expect {
|
10
10
|
Buckaruby::Gateway.new
|
11
11
|
}.to raise_error(ArgumentError)
|
@@ -29,9 +29,20 @@ describe Buckaruby::Gateway do
|
|
29
29
|
|
30
30
|
it { expect(subject).to be_an_instance_of(Buckaruby::Gateway) }
|
31
31
|
|
32
|
+
describe '#payment_methods' do
|
33
|
+
before do
|
34
|
+
stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=TransactionRequestSpecification").to_return(body: File.read("spec/fixtures/responses/specify_transaction_success.txt"))
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'returns the payment methods enabled by Buckaroo and supported by this library' do
|
38
|
+
payment_methods = subject.payment_methods
|
39
|
+
expect(payment_methods).to eq([Buckaruby::PaymentMethod::IDEAL, Buckaruby::PaymentMethod::VISA])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
32
43
|
describe '#issuers' do
|
33
44
|
context 'when no or false parameters are passed' do
|
34
|
-
it '
|
45
|
+
it 'raises an ArgumentError' do
|
35
46
|
expect { subject.issuers }.to raise_error(ArgumentError)
|
36
47
|
expect { subject.issuers(:wrong) }.to raise_error(ArgumentError)
|
37
48
|
end
|
@@ -39,18 +50,20 @@ describe Buckaruby::Gateway do
|
|
39
50
|
|
40
51
|
context 'when ideal is passed' do
|
41
52
|
let(:issuers) { subject.issuers(Buckaruby::PaymentMethod::IDEAL) }
|
53
|
+
|
42
54
|
it { expect(issuers.length).to be > 0 }
|
43
55
|
it { expect(issuers).to include("INGBNL2A" => "ING") }
|
44
56
|
end
|
45
57
|
|
46
58
|
context 'when ideal processing is passed' do
|
47
59
|
let(:issuers) { subject.issuers(Buckaruby::PaymentMethod::IDEAL_PROCESSING) }
|
60
|
+
|
48
61
|
it { expect(issuers.length).to be > 0 }
|
49
62
|
it { expect(issuers).to include("RABONL2U" => "Rabobank") }
|
50
63
|
end
|
51
64
|
|
52
65
|
context 'when visa, mastercard, maestro, bankcontact, sepa direct debit or paypal is passed' do
|
53
|
-
it '
|
66
|
+
it 'raises an ArgumentError' do
|
54
67
|
expect { subject.issuers(Buckaruby::PaymentMethod::VISA) }.to raise_error(ArgumentError)
|
55
68
|
expect { subject.issuers(Buckaruby::PaymentMethod::MASTER_CARD) }.to raise_error(ArgumentError)
|
56
69
|
expect { subject.issuers(Buckaruby::PaymentMethod::MAESTRO) }.to raise_error(ArgumentError)
|
@@ -62,11 +75,11 @@ describe Buckaruby::Gateway do
|
|
62
75
|
end
|
63
76
|
|
64
77
|
describe '#setup_transaction' do
|
65
|
-
before
|
78
|
+
before do
|
66
79
|
stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=TransactionRequest").to_return(body: File.read("spec/fixtures/responses/setup_transaction_success.txt"))
|
67
80
|
end
|
68
81
|
|
69
|
-
it '
|
82
|
+
it 'raises an exception when initiating a transaction with missing parameters' do
|
70
83
|
expect {
|
71
84
|
subject.setup_transaction(amount: 10)
|
72
85
|
}.to raise_error(ArgumentError)
|
@@ -84,7 +97,7 @@ describe Buckaruby::Gateway do
|
|
84
97
|
}.to raise_error(ArgumentError)
|
85
98
|
end
|
86
99
|
|
87
|
-
it '
|
100
|
+
it 'raises an exception when initiating a transaction with invalid amount' do
|
88
101
|
expect {
|
89
102
|
subject.setup_transaction(amount: 0, payment_method: Buckaruby::PaymentMethod::IDEAL, payment_issuer: Buckaruby::Ideal::ISSUERS.keys.first, invoicenumber: "12345", return_url: "http://www.return.url/")
|
90
103
|
}.to raise_error(ArgumentError)
|
@@ -94,19 +107,19 @@ describe Buckaruby::Gateway do
|
|
94
107
|
}.to raise_error(ArgumentError)
|
95
108
|
end
|
96
109
|
|
97
|
-
it '
|
110
|
+
it 'raises an exception when initiating a transaction with invalid payment method' do
|
98
111
|
expect {
|
99
112
|
subject.setup_transaction(amount: 10, payment_method: "abc", payment_issuer: Buckaruby::Ideal::ISSUERS.keys.first, invoicenumber: "12345", return_url: "http://www.return.url/")
|
100
113
|
}.to raise_error(ArgumentError)
|
101
114
|
end
|
102
115
|
|
103
|
-
it '
|
116
|
+
it 'raises an exception when initiating a transaction with invalid payment issuer' do
|
104
117
|
expect {
|
105
118
|
subject.setup_transaction(amount: 10, payment_method: Buckaruby::PaymentMethod::IDEAL, payment_issuer: "abc", invoicenumber: "12345", return_url: "http://www.return.url/")
|
106
119
|
}.to raise_error(ArgumentError)
|
107
120
|
end
|
108
121
|
|
109
|
-
it '
|
122
|
+
it 'raises a ConnectionException when connection the Buckaroo fails' do
|
110
123
|
stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=TransactionRequest").to_raise(Errno::ECONNREFUSED)
|
111
124
|
|
112
125
|
expect {
|
@@ -114,7 +127,7 @@ describe Buckaruby::Gateway do
|
|
114
127
|
}.to raise_error(Buckaruby::ConnectionException)
|
115
128
|
end
|
116
129
|
|
117
|
-
it '
|
130
|
+
it 'raises an InvalidResponseException when Buckaroo returns an invalid response' do
|
118
131
|
stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=TransactionRequest").to_return(status: 500)
|
119
132
|
|
120
133
|
expect {
|
@@ -122,7 +135,7 @@ describe Buckaruby::Gateway do
|
|
122
135
|
}.to raise_error(Buckaruby::InvalidResponseException)
|
123
136
|
end
|
124
137
|
|
125
|
-
it '
|
138
|
+
it 'raises an ApiException when API result Fail is returned' do
|
126
139
|
stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=TransactionRequest").to_return(body: "BRQ_APIRESULT=Fail&BRQ_APIERRORMESSAGE=Invalid+request")
|
127
140
|
|
128
141
|
expect {
|
@@ -130,60 +143,63 @@ describe Buckaruby::Gateway do
|
|
130
143
|
}.to raise_error(Buckaruby::ApiException)
|
131
144
|
end
|
132
145
|
|
133
|
-
describe '
|
146
|
+
describe 'initiates a transaction when amount is integer, decimal or string' do
|
134
147
|
context 'when amount is an integer' do
|
135
148
|
let(:response) { subject.setup_transaction(amount: 10, payment_method: Buckaruby::PaymentMethod::IDEAL, payment_issuer: Buckaruby::Ideal::ISSUERS.keys.first, invoicenumber: "12345", return_url: "http://www.return.url/") }
|
149
|
+
|
136
150
|
it { expect(response).to be_an_instance_of(Buckaruby::SetupTransactionResponse) }
|
137
151
|
it { expect(response.transaction_id).to eq("41C48B55FA9164E123CC73B1157459E840BE5D24") }
|
138
|
-
it { expect(response.redirect_url).
|
152
|
+
it { expect(response.redirect_url).not_to be nil }
|
139
153
|
end
|
140
154
|
|
141
155
|
context 'when amount is a decimal' do
|
142
156
|
let(:response) { subject.setup_transaction(amount: 10.50, payment_method: Buckaruby::PaymentMethod::IDEAL, payment_issuer: Buckaruby::Ideal::ISSUERS.keys.first, invoicenumber: "12345", return_url: "http://www.return.url/") }
|
157
|
+
|
143
158
|
it { expect(response).to be_an_instance_of(Buckaruby::SetupTransactionResponse) }
|
144
159
|
it { expect(response.transaction_id).to eq("41C48B55FA9164E123CC73B1157459E840BE5D24") }
|
145
|
-
it { expect(response.redirect_url).
|
160
|
+
it { expect(response.redirect_url).not_to be nil }
|
146
161
|
end
|
147
162
|
|
148
163
|
context 'when amount is a string' do
|
149
164
|
let(:response) { subject.setup_transaction(amount: '10', payment_method: Buckaruby::PaymentMethod::IDEAL, payment_issuer: Buckaruby::Ideal::ISSUERS.keys.first, invoicenumber: "12345", return_url: "http://www.return.url/") }
|
165
|
+
|
150
166
|
it { expect(response).to be_an_instance_of(Buckaruby::SetupTransactionResponse) }
|
151
167
|
it { expect(response.transaction_id).to eq("41C48B55FA9164E123CC73B1157459E840BE5D24") }
|
152
|
-
it { expect(response.redirect_url).
|
168
|
+
it { expect(response.redirect_url).not_to be nil }
|
153
169
|
end
|
154
170
|
end
|
155
171
|
|
156
|
-
it '
|
172
|
+
it 'initiates a transaction for payment method ideal' do
|
157
173
|
response = subject.setup_transaction(amount: 10, payment_method: Buckaruby::PaymentMethod::IDEAL, payment_issuer: Buckaruby::Ideal::ISSUERS.keys.first, invoicenumber: "12345", return_url: "http://www.return.url/")
|
158
174
|
expect(response).to be_an_instance_of(Buckaruby::SetupTransactionResponse)
|
159
175
|
expect(response.transaction_id).to eq("41C48B55FA9164E123CC73B1157459E840BE5D24")
|
160
176
|
expect(response.transaction_status).to eq(Buckaruby::TransactionStatus::PENDING)
|
161
|
-
expect(response.redirect_url).
|
177
|
+
expect(response.redirect_url).not_to be nil
|
162
178
|
expect(response.timestamp).to be_an_instance_of(Time)
|
163
179
|
expect(response.to_h).to be_an_instance_of(Hash)
|
164
180
|
end
|
165
181
|
|
166
|
-
it '
|
182
|
+
it 'initiates a transaction for payment method visa' do
|
167
183
|
response = subject.setup_transaction(amount: 10, payment_method: Buckaruby::PaymentMethod::VISA, invoicenumber: "12345", return_url: "http://www.return.url/")
|
168
184
|
expect(response).to be_an_instance_of(Buckaruby::SetupTransactionResponse)
|
169
185
|
expect(response.transaction_id).to eq("41C48B55FA9164E123CC73B1157459E840BE5D24")
|
170
186
|
expect(response.transaction_status).to eq(Buckaruby::TransactionStatus::PENDING)
|
171
|
-
expect(response.redirect_url).
|
187
|
+
expect(response.redirect_url).not_to be nil
|
172
188
|
expect(response.timestamp).to be_an_instance_of(Time)
|
173
189
|
expect(response.to_h).to be_an_instance_of(Hash)
|
174
190
|
end
|
175
191
|
|
176
|
-
it '
|
192
|
+
it 'initiates a transaction for payment method mastercard' do
|
177
193
|
response = subject.setup_transaction(amount: 10, payment_method: Buckaruby::PaymentMethod::MASTER_CARD, invoicenumber: "12345", return_url: "http://www.return.url/")
|
178
194
|
expect(response).to be_an_instance_of(Buckaruby::SetupTransactionResponse)
|
179
195
|
expect(response.transaction_id).to eq("41C48B55FA9164E123CC73B1157459E840BE5D24")
|
180
196
|
expect(response.transaction_status).to eq(Buckaruby::TransactionStatus::PENDING)
|
181
|
-
expect(response.redirect_url).
|
197
|
+
expect(response.redirect_url).not_to be nil
|
182
198
|
expect(response.timestamp).to be_an_instance_of(Time)
|
183
199
|
expect(response.to_h).to be_an_instance_of(Hash)
|
184
200
|
end
|
185
201
|
|
186
|
-
it '
|
202
|
+
it 'initiates a transaction for payment method sepa direct debit' do
|
187
203
|
response = subject.setup_transaction(amount: 10, payment_method: Buckaruby::PaymentMethod::SEPA_DIRECT_DEBIT, invoicenumber: "12345", return_url: "http://www.return.url/", account_iban: "NL13TEST0123456789", account_name: "J. Tester", mandate_reference: "00P12345", collect_date: Date.new(2016, 1, 1))
|
188
204
|
expect(response).to be_an_instance_of(Buckaruby::SetupTransactionResponse)
|
189
205
|
expect(response.transaction_id).to eq("41C48B55FA9164E123CC73B1157459E840BE5D24")
|
@@ -192,23 +208,57 @@ describe Buckaruby::Gateway do
|
|
192
208
|
expect(response.to_h).to be_an_instance_of(Hash)
|
193
209
|
end
|
194
210
|
|
195
|
-
it '
|
211
|
+
it 'initiates a transaction for payment method paypal' do
|
196
212
|
response = subject.setup_transaction(amount: 10, payment_method: Buckaruby::PaymentMethod::PAYPAL, invoicenumber: "12345", return_url: "http://www.return.url/")
|
197
213
|
expect(response).to be_an_instance_of(Buckaruby::SetupTransactionResponse)
|
198
214
|
expect(response.transaction_id).to eq("41C48B55FA9164E123CC73B1157459E840BE5D24")
|
199
215
|
expect(response.transaction_status).to eq(Buckaruby::TransactionStatus::PENDING)
|
200
|
-
expect(response.redirect_url).
|
216
|
+
expect(response.redirect_url).not_to be nil
|
201
217
|
expect(response.timestamp).to be_an_instance_of(Time)
|
202
218
|
expect(response.to_h).to be_an_instance_of(Hash)
|
203
219
|
end
|
220
|
+
|
221
|
+
it 'initiates a transaction for payment method sofort' do
|
222
|
+
response = subject.setup_transaction(amount: 10, payment_method: Buckaruby::PaymentMethod::SOFORT, invoicenumber: "12345", return_url: "http://www.return.url/")
|
223
|
+
expect(response).to be_an_instance_of(Buckaruby::SetupTransactionResponse)
|
224
|
+
expect(response.transaction_id).to eq("41C48B55FA9164E123CC73B1157459E840BE5D24")
|
225
|
+
expect(response.transaction_status).to eq(Buckaruby::TransactionStatus::PENDING)
|
226
|
+
expect(response.redirect_url).not_to be nil
|
227
|
+
expect(response.timestamp).to be_an_instance_of(Time)
|
228
|
+
expect(response.to_h).to be_an_instance_of(Hash)
|
229
|
+
end
|
230
|
+
|
231
|
+
context 'with custom variables' do
|
232
|
+
it 'sends the custom variables with the request' do
|
233
|
+
response = subject.setup_transaction(amount: 10, payment_method: Buckaruby::PaymentMethod::IDEAL, payment_issuer: "ABNANL2A", invoicenumber: "12345", return_url: "http://www.return.url/", custom: { foo: :bar, quux: "42" })
|
234
|
+
expect(response).to be_an_instance_of(Buckaruby::SetupTransactionResponse)
|
235
|
+
expect(response.custom[:foo]).to eq("bar")
|
236
|
+
expect(response.custom[:quux]).to eq("42")
|
237
|
+
|
238
|
+
expect(WebMock).to have_requested(:post, "https://testcheckout.buckaroo.nl/nvp/?op=TransactionRequest")
|
239
|
+
.with(body: "brq_websitekey=12345678&brq_payment_method=ideal&brq_culture=nl-NL&brq_currency=EUR&brq_amount=10.0&brq_invoicenumber=12345&brq_service_ideal_action=Pay&brq_service_ideal_issuer=ABNANL2A&brq_service_ideal_version=2&brq_return=http%3A%2F%2Fwww.return.url%2F&cust_foo=bar&cust_quux=42&add_buckaruby=Buckaruby+#{Buckaruby::VERSION}&brq_signature=93952aef5786f00f62e4aa33597672845b2ac8dd")
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
context 'with additional variables' do
|
244
|
+
it 'sends the additional variables with the request' do
|
245
|
+
response = subject.setup_transaction(amount: 10, payment_method: Buckaruby::PaymentMethod::IDEAL, payment_issuer: "ABNANL2A", invoicenumber: "12345", return_url: "http://www.return.url/", additional: { myreference: "12345" })
|
246
|
+
expect(response).to be_an_instance_of(Buckaruby::SetupTransactionResponse)
|
247
|
+
expect(response.additional[:buckaruby]).to eq("1.2.0")
|
248
|
+
expect(response.additional[:myreference]).to eq("12345")
|
249
|
+
|
250
|
+
expect(WebMock).to have_requested(:post, "https://testcheckout.buckaroo.nl/nvp/?op=TransactionRequest")
|
251
|
+
.with(body: "brq_websitekey=12345678&brq_payment_method=ideal&brq_culture=nl-NL&brq_currency=EUR&brq_amount=10.0&brq_invoicenumber=12345&brq_service_ideal_action=Pay&brq_service_ideal_issuer=ABNANL2A&brq_service_ideal_version=2&brq_return=http%3A%2F%2Fwww.return.url%2F&add_myreference=12345&add_buckaruby=Buckaruby+#{Buckaruby::VERSION}&brq_signature=b7332fefcf5a9aeb02b9c242ef52eaad118e2da4")
|
252
|
+
end
|
253
|
+
end
|
204
254
|
end
|
205
255
|
|
206
256
|
describe '#recurrent_transaction' do
|
207
|
-
before
|
257
|
+
before do
|
208
258
|
stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=TransactionRequest").to_return(body: File.read("spec/fixtures/responses/recurrent_transaction_success.txt"))
|
209
259
|
end
|
210
260
|
|
211
|
-
it '
|
261
|
+
it 'raises an exception when initiating a recurrent transaction with missing parameters' do
|
212
262
|
expect {
|
213
263
|
subject.recurrent_transaction(amount: 10)
|
214
264
|
}.to raise_error(ArgumentError)
|
@@ -222,13 +272,13 @@ describe Buckaruby::Gateway do
|
|
222
272
|
}.to raise_error(ArgumentError)
|
223
273
|
end
|
224
274
|
|
225
|
-
it '
|
275
|
+
it 'raises an exception when initiating a transaction with invalid payment method' do
|
226
276
|
expect {
|
227
277
|
subject.recurrent_transaction(amount: 10, payment_method: Buckaruby::PaymentMethod::IDEAL, invoicenumber: "12345", transaction_id: "12345")
|
228
278
|
}.to raise_error(ArgumentError)
|
229
279
|
end
|
230
280
|
|
231
|
-
it '
|
281
|
+
it 'initiates a recurrent transaction for payment method visa' do
|
232
282
|
response = subject.recurrent_transaction(amount: 10, payment_method: Buckaruby::PaymentMethod::VISA, invoicenumber: "12345", transaction_id: "12345")
|
233
283
|
expect(response).to be_an_instance_of(Buckaruby::RecurrentTransactionResponse)
|
234
284
|
expect(response.transaction_id).to eq("41C48B55FA9164E123CC73B1157459E840BE5D24")
|
@@ -241,20 +291,20 @@ describe Buckaruby::Gateway do
|
|
241
291
|
end
|
242
292
|
|
243
293
|
describe '#refundable?' do
|
244
|
-
it '
|
294
|
+
it 'raises an exception when required parameters are missing' do
|
245
295
|
expect {
|
246
296
|
subject.refundable?
|
247
297
|
}.to raise_error(ArgumentError)
|
248
298
|
end
|
249
299
|
|
250
|
-
it '
|
300
|
+
it 'returns true when the transaction is refundable' do
|
251
301
|
stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=RefundInfo").to_return(body: File.read("spec/fixtures/responses/refund_info_success.txt"))
|
252
302
|
|
253
303
|
response = subject.refundable?(transaction_id: "41C48B55FA9164E123CC73B1157459E840BE5D24")
|
254
304
|
expect(response).to be true
|
255
305
|
end
|
256
306
|
|
257
|
-
it '
|
307
|
+
it 'returns false when the transaction was not found' do
|
258
308
|
stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=RefundInfo").to_return(body: File.read("spec/fixtures/responses/refund_info_error.txt"))
|
259
309
|
|
260
310
|
response = subject.refundable?(transaction_id: "41C48B55FA9164E123CC73B1157459E840BE5D24")
|
@@ -263,13 +313,13 @@ describe Buckaruby::Gateway do
|
|
263
313
|
end
|
264
314
|
|
265
315
|
describe '#refund_transaction' do
|
266
|
-
it '
|
316
|
+
it 'raises an exception when required parameters are missing' do
|
267
317
|
expect {
|
268
318
|
subject.refund_transaction
|
269
319
|
}.to raise_error(ArgumentError)
|
270
320
|
end
|
271
321
|
|
272
|
-
it '
|
322
|
+
it 'raises an exception when the transaction is not refundable' do
|
273
323
|
stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=RefundInfo").to_return(body: File.read("spec/fixtures/responses/refund_info_error.txt"))
|
274
324
|
|
275
325
|
expect {
|
@@ -277,7 +327,7 @@ describe Buckaruby::Gateway do
|
|
277
327
|
}.to raise_error(Buckaruby::NonRefundableTransactionException)
|
278
328
|
end
|
279
329
|
|
280
|
-
it '
|
330
|
+
it 'refunds the transaction' do
|
281
331
|
stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=RefundInfo").to_return(body: File.read("spec/fixtures/responses/refund_info_success.txt"))
|
282
332
|
stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=TransactionRequest").to_return(body: File.read("spec/fixtures/responses/refund_transaction_success.txt"))
|
283
333
|
|
@@ -295,11 +345,11 @@ describe Buckaruby::Gateway do
|
|
295
345
|
end
|
296
346
|
|
297
347
|
describe '#status' do
|
298
|
-
before
|
348
|
+
before do
|
299
349
|
stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=TransactionStatus").to_return(body: File.read("spec/fixtures/responses/status_success.txt"))
|
300
350
|
end
|
301
351
|
|
302
|
-
it '
|
352
|
+
it 'raises an exception when required parameters are missing' do
|
303
353
|
expect {
|
304
354
|
subject.status
|
305
355
|
}.to raise_error(ArgumentError)
|
@@ -307,7 +357,7 @@ describe Buckaruby::Gateway do
|
|
307
357
|
|
308
358
|
it { expect(subject.status(transaction_id: "41C48B55FA9164E123CC73B1157459E840BE5D24")).to be_an_instance_of(Buckaruby::StatusResponse) }
|
309
359
|
|
310
|
-
it '
|
360
|
+
it 'returns transaction status' do
|
311
361
|
response = subject.status(transaction_id: "41C48B55FA9164E123CC73B1157459E840BE5D24")
|
312
362
|
expect(response.transaction_status).to eq(Buckaruby::TransactionStatus::SUCCESS)
|
313
363
|
expect(response.transaction_type).to eq(Buckaruby::TransactionType::PAYMENT)
|
@@ -319,7 +369,7 @@ describe Buckaruby::Gateway do
|
|
319
369
|
expect(response.to_h).to be_an_instance_of(Hash)
|
320
370
|
end
|
321
371
|
|
322
|
-
it '
|
372
|
+
it 'includes account iban, bic and name for an ideal response' do
|
323
373
|
response = subject.status(transaction_id: "41C48B55FA9164E123CC73B1157459E840BE5D24")
|
324
374
|
expect(response.account_iban).to eq("NL44RABO0123456789")
|
325
375
|
expect(response.account_bic).to eq("RABONL2U")
|
@@ -328,20 +378,20 @@ describe Buckaruby::Gateway do
|
|
328
378
|
end
|
329
379
|
|
330
380
|
describe '#cancellable?' do
|
331
|
-
it '
|
381
|
+
it 'raises an exception when required parameters are missing' do
|
332
382
|
expect {
|
333
383
|
subject.cancellable?
|
334
384
|
}.to raise_error(ArgumentError)
|
335
385
|
end
|
336
386
|
|
337
|
-
it '
|
387
|
+
it 'returns true when the transaction is cancellable' do
|
338
388
|
stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=TransactionStatus").to_return(body: File.read("spec/fixtures/responses/status_cancellable.txt"))
|
339
389
|
|
340
390
|
response = subject.cancellable?(transaction_id: "41C48B55FA9164E123CC73B1157459E840BE5D24")
|
341
391
|
expect(response).to be true
|
342
392
|
end
|
343
393
|
|
344
|
-
it '
|
394
|
+
it 'returns false when the transaction is not cancellable' do
|
345
395
|
stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=TransactionStatus").to_return(body: File.read("spec/fixtures/responses/status_noncancellable.txt"))
|
346
396
|
|
347
397
|
response = subject.cancellable?(transaction_id: "41C48B55FA9164E123CC73B1157459E840BE5D24")
|
@@ -350,13 +400,13 @@ describe Buckaruby::Gateway do
|
|
350
400
|
end
|
351
401
|
|
352
402
|
describe '#cancel_transaction' do
|
353
|
-
it '
|
403
|
+
it 'raises an exception when required parameters are missing' do
|
354
404
|
expect {
|
355
405
|
subject.cancel_transaction
|
356
406
|
}.to raise_error(ArgumentError)
|
357
407
|
end
|
358
408
|
|
359
|
-
it '
|
409
|
+
it 'raises an exception when the transaction is not cancellable' do
|
360
410
|
stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=TransactionStatus").to_return(body: File.read("spec/fixtures/responses/status_noncancellable.txt"))
|
361
411
|
|
362
412
|
expect {
|
@@ -364,7 +414,7 @@ describe Buckaruby::Gateway do
|
|
364
414
|
}.to raise_error(Buckaruby::NonCancellableTransactionException)
|
365
415
|
end
|
366
416
|
|
367
|
-
it '
|
417
|
+
it 'cancels the transaction' do
|
368
418
|
stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=TransactionStatus").to_return(body: File.read("spec/fixtures/responses/status_cancellable.txt"))
|
369
419
|
stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=CancelTransaction").to_return(body: File.read("spec/fixtures/responses/cancel_success.txt"))
|
370
420
|
|
@@ -373,26 +423,56 @@ describe Buckaruby::Gateway do
|
|
373
423
|
end
|
374
424
|
end
|
375
425
|
|
426
|
+
describe '#specify_transaction' do
|
427
|
+
before do
|
428
|
+
stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=TransactionRequestSpecification").to_return(body: File.read("spec/fixtures/responses/specify_transaction_success.txt"))
|
429
|
+
end
|
430
|
+
|
431
|
+
it 'retrieves the specification for setting up a transaction' do
|
432
|
+
response = subject.specify_transaction
|
433
|
+
expect(response).to be_an_instance_of(Buckaruby::TransactionSpecificationResponse)
|
434
|
+
|
435
|
+
services = response.services
|
436
|
+
expect(services).to be_an_instance_of(Array)
|
437
|
+
expect(services.length).to eq(2)
|
438
|
+
|
439
|
+
service = services.last
|
440
|
+
expect(service).to be_an_instance_of(Buckaruby::Support::CaseInsensitiveHash)
|
441
|
+
expect(service[:name]).to eq(Buckaruby::PaymentMethod::VISA)
|
442
|
+
expect(service[:description]).to eq("Visa")
|
443
|
+
expect(service[:version]).to eq("1")
|
444
|
+
|
445
|
+
currencies = service[:supportedcurrencies]
|
446
|
+
expect(currencies).to be_an_instance_of(Array)
|
447
|
+
expect(currencies.length).to eq(21)
|
448
|
+
|
449
|
+
currency = currencies.last
|
450
|
+
expect(currency).to be_an_instance_of(Buckaruby::Support::CaseInsensitiveHash)
|
451
|
+
expect(currency[:name]).to eq("US Dollar")
|
452
|
+
expect(currency[:code]).to eq(Buckaruby::Currency::US_DOLLAR)
|
453
|
+
end
|
454
|
+
end
|
455
|
+
|
376
456
|
describe '#callback' do
|
377
|
-
it '
|
457
|
+
it 'raises an exception when parameters are missing' do
|
378
458
|
expect {
|
379
459
|
subject.callback
|
380
460
|
}.to raise_error(ArgumentError)
|
381
461
|
end
|
382
462
|
|
383
|
-
it '
|
463
|
+
it 'raises an exception when parameter is an empty Hash' do
|
384
464
|
expect {
|
385
465
|
subject.callback({})
|
386
466
|
}.to raise_error(ArgumentError)
|
387
467
|
end
|
388
468
|
|
389
|
-
it '
|
469
|
+
it 'raises an exception when parameter is an empty String' do
|
390
470
|
expect {
|
391
471
|
subject.callback("")
|
392
472
|
}.to raise_error(ArgumentError)
|
393
473
|
end
|
394
474
|
|
395
|
-
it '
|
475
|
+
it 'raises a SignatureException when the signature is invalid' do
|
396
476
|
params = File.read("spec/fixtures/responses/callback_invalid_signature.txt")
|
397
477
|
|
398
478
|
expect {
|
@@ -400,36 +480,38 @@ describe Buckaruby::Gateway do
|
|
400
480
|
}.to raise_error(Buckaruby::SignatureException, "Sent signature (abcdefgh1234567890abcdefgh1234567890) doesn't match generated signature (0a74bba15fccd8094f33678c001b44851643876d)")
|
401
481
|
end
|
402
482
|
|
403
|
-
it '
|
483
|
+
it 'returns the status when the signature is valid' do
|
404
484
|
params = File.read("spec/fixtures/responses/callback_valid_signature.txt")
|
405
485
|
|
406
486
|
response = subject.callback(params)
|
407
487
|
expect(response).to be_an_instance_of(Buckaruby::CallbackResponse)
|
408
|
-
expect(response.transaction_status).to
|
409
|
-
expect(response.transaction_type).to
|
410
|
-
expect(response.payment_method).to
|
411
|
-
expect(response.
|
412
|
-
expect(response.
|
488
|
+
expect(response.transaction_status).to eq(Buckaruby::TransactionStatus::SUCCESS)
|
489
|
+
expect(response.transaction_type).to eq(Buckaruby::TransactionType::PAYMENT)
|
490
|
+
expect(response.payment_method).to eq(Buckaruby::PaymentMethod::IDEAL)
|
491
|
+
expect(response.transaction_id).to eq("41C48B55FA9164E123CC73B1157459E840BE5D24")
|
492
|
+
expect(response.payment_id).to eq("E86256B2787EE7FF0C33D0D4C6159CD922227B79")
|
493
|
+
expect(response.invoicenumber).to eq("12345")
|
413
494
|
expect(response.timestamp).to be_an_instance_of(Time)
|
414
495
|
expect(response.to_h).to be_an_instance_of(Hash)
|
415
496
|
end
|
416
497
|
|
417
|
-
it '
|
498
|
+
it 'accepts a Hash as parameters' do
|
418
499
|
params = { "brq_amount" => "10.00", "brq_currency" => "EUR", "brq_customer_name" => "J. de Tester", "brq_description" => "Test", "brq_invoicenumber" => "12345", "brq_mutationtype" => "Collecting", "brq_payer_hash" => "e02377112efcd30bb7420bb1b9855a3778864572", "brq_payment" => "E86256B2787EE7FF0C33D0D4C6159CD922227B79", "brq_service_ideal_consumerbic" => "RABONL2U", "brq_service_ideal_consumeriban" => "NL44RABO0123456789", "brq_service_ideal_consumerissuer" => "Rabobank", "brq_service_ideal_consumername" => "J. de Tester", "brq_statuscode" => "190", "brq_statuscode_detail" => "S001", "brq_statusmessage" => "Transaction successfully processed", "brq_test" => "true", "brq_timestamp" => "2014-11-05 13:10:42", "brq_transaction_method" => "ideal", "brq_transaction_type" => "C021", "brq_transactions" => "41C48B55FA9164E123CC73B1157459E840BE5D24", "brq_websitekey" => "12345678", "brq_signature" => "0a74bba15fccd8094f33678c001b44851643876d" }
|
419
500
|
|
420
501
|
response = subject.callback(params)
|
421
502
|
expect(response).to be_an_instance_of(Buckaruby::CallbackResponse)
|
422
|
-
expect(response.transaction_status).to
|
423
|
-
expect(response.transaction_type).to
|
424
|
-
expect(response.payment_method).to
|
425
|
-
expect(response.
|
426
|
-
expect(response.
|
503
|
+
expect(response.transaction_status).to eq(Buckaruby::TransactionStatus::SUCCESS)
|
504
|
+
expect(response.transaction_type).to eq(Buckaruby::TransactionType::PAYMENT)
|
505
|
+
expect(response.payment_method).to eq(Buckaruby::PaymentMethod::IDEAL)
|
506
|
+
expect(response.transaction_id).to eq("41C48B55FA9164E123CC73B1157459E840BE5D24")
|
507
|
+
expect(response.payment_id).to eq("E86256B2787EE7FF0C33D0D4C6159CD922227B79")
|
508
|
+
expect(response.invoicenumber).to eq("12345")
|
427
509
|
expect(response.timestamp).to be_an_instance_of(Time)
|
428
510
|
expect(response.to_h).to be_an_instance_of(Hash)
|
429
511
|
end
|
430
512
|
|
431
|
-
context 'payment response' do
|
432
|
-
it '
|
513
|
+
context 'when callback is a payment response' do
|
514
|
+
it 'sets the success status when payment status is success' do
|
433
515
|
params = File.read("spec/fixtures/responses/callback_payment_success.txt")
|
434
516
|
|
435
517
|
response = subject.callback(params)
|
@@ -443,7 +525,7 @@ describe Buckaruby::Gateway do
|
|
443
525
|
expect(response.to_h).to be_an_instance_of(Hash)
|
444
526
|
end
|
445
527
|
|
446
|
-
it '
|
528
|
+
it 'sets the failed status when payment status is failed' do
|
447
529
|
params = File.read("spec/fixtures/responses/callback_payment_failed.txt")
|
448
530
|
|
449
531
|
response = subject.callback(params)
|
@@ -457,7 +539,7 @@ describe Buckaruby::Gateway do
|
|
457
539
|
expect(response.to_h).to be_an_instance_of(Hash)
|
458
540
|
end
|
459
541
|
|
460
|
-
it '
|
542
|
+
it 'sets the rejected status when payment status is rejected' do
|
461
543
|
params = File.read("spec/fixtures/responses/callback_payment_rejected.txt")
|
462
544
|
|
463
545
|
response = subject.callback(params)
|
@@ -471,7 +553,7 @@ describe Buckaruby::Gateway do
|
|
471
553
|
expect(response.to_h).to be_an_instance_of(Hash)
|
472
554
|
end
|
473
555
|
|
474
|
-
it '
|
556
|
+
it 'sets the cancelled status when payment status is cancelled' do
|
475
557
|
params = File.read("spec/fixtures/responses/callback_payment_cancelled.txt")
|
476
558
|
|
477
559
|
response = subject.callback(params)
|
@@ -485,7 +567,7 @@ describe Buckaruby::Gateway do
|
|
485
567
|
expect(response.to_h).to be_an_instance_of(Hash)
|
486
568
|
end
|
487
569
|
|
488
|
-
it '
|
570
|
+
it 'sets the pending status when payment status is pending' do
|
489
571
|
params = File.read("spec/fixtures/responses/callback_payment_pending.txt")
|
490
572
|
|
491
573
|
response = subject.callback(params)
|
@@ -499,7 +581,7 @@ describe Buckaruby::Gateway do
|
|
499
581
|
expect(response.to_h).to be_an_instance_of(Hash)
|
500
582
|
end
|
501
583
|
|
502
|
-
it '
|
584
|
+
it 'includes account iban, bic and name for an ideal response' do
|
503
585
|
params = File.read("spec/fixtures/responses/callback_payment_success.txt")
|
504
586
|
|
505
587
|
response = subject.callback(params)
|
@@ -513,7 +595,7 @@ describe Buckaruby::Gateway do
|
|
513
595
|
expect(response.to_h).to be_an_instance_of(Hash)
|
514
596
|
end
|
515
597
|
|
516
|
-
it '
|
598
|
+
it 'includes account iban, name, mandate reference and collect date for a sepa direct debit response' do
|
517
599
|
params = File.read("spec/fixtures/responses/callback_payment_sepa.txt")
|
518
600
|
|
519
601
|
response = subject.callback(params)
|
@@ -531,7 +613,7 @@ describe Buckaruby::Gateway do
|
|
531
613
|
expect(response.to_h).to be_an_instance_of(Hash)
|
532
614
|
end
|
533
615
|
|
534
|
-
it '
|
616
|
+
it 'returns transaction type payment when cancelling a visa or mastercard transaction (empty transaction type)' do
|
535
617
|
params = File.read("spec/fixtures/responses/callback_payment_empty_transaction_type.txt")
|
536
618
|
|
537
619
|
response = subject.callback(params)
|
@@ -542,10 +624,52 @@ describe Buckaruby::Gateway do
|
|
542
624
|
expect(response.timestamp).to be_an_instance_of(Time)
|
543
625
|
expect(response.to_h).to be_an_instance_of(Hash)
|
544
626
|
end
|
627
|
+
|
628
|
+
it 'sets the transaction type to payment and payment method to VISA for visa callback' do
|
629
|
+
params = File.read("spec/fixtures/responses/callback_payment_visa.txt")
|
630
|
+
|
631
|
+
response = subject.callback(params)
|
632
|
+
expect(response.transaction_status).to eq(Buckaruby::TransactionStatus::SUCCESS)
|
633
|
+
expect(response.transaction_type).to eq(Buckaruby::TransactionType::PAYMENT)
|
634
|
+
expect(response.payment_method).to eq(Buckaruby::PaymentMethod::VISA)
|
635
|
+
expect(response.transaction_id).to eq("41C48B55FA9164E123CC73B1157459E840BE5D24")
|
636
|
+
expect(response.payment_id).to eq("E86256B2787EE7FF0C33D0D4C6159CD922227B79")
|
637
|
+
expect(response.invoicenumber).to eq("12345")
|
638
|
+
expect(response.timestamp).to be_an_instance_of(Time)
|
639
|
+
expect(response.to_h).to be_an_instance_of(Hash)
|
640
|
+
end
|
641
|
+
|
642
|
+
it 'sets the transaction type to payment and payment method to American Express for amex callback' do
|
643
|
+
params = File.read("spec/fixtures/responses/callback_payment_amex.txt")
|
644
|
+
|
645
|
+
response = subject.callback(params)
|
646
|
+
expect(response.transaction_status).to eq(Buckaruby::TransactionStatus::SUCCESS)
|
647
|
+
expect(response.transaction_type).to eq(Buckaruby::TransactionType::PAYMENT)
|
648
|
+
expect(response.payment_method).to eq(Buckaruby::PaymentMethod::AMERICAN_EXPRESS)
|
649
|
+
expect(response.transaction_id).to eq("41C48B55FA9164E123CC73B1157459E840BE5D24")
|
650
|
+
expect(response.payment_id).to eq("E86256B2787EE7FF0C33D0D4C6159CD922227B79")
|
651
|
+
expect(response.invoicenumber).to eq("12345")
|
652
|
+
expect(response.timestamp).to be_an_instance_of(Time)
|
653
|
+
expect(response.to_h).to be_an_instance_of(Hash)
|
654
|
+
end
|
655
|
+
|
656
|
+
it 'sets the transaction type to payment and payment method to Sofrt for sort callback' do
|
657
|
+
params = File.read("spec/fixtures/responses/callback_payment_sofort.txt")
|
658
|
+
|
659
|
+
response = subject.callback(params)
|
660
|
+
expect(response.transaction_status).to eq(Buckaruby::TransactionStatus::PENDING)
|
661
|
+
expect(response.transaction_type).to eq(Buckaruby::TransactionType::PAYMENT)
|
662
|
+
expect(response.payment_method).to eq(Buckaruby::PaymentMethod::SOFORT)
|
663
|
+
expect(response.transaction_id).to eq("41C48B55FA9164E123CC73B1157459E840BE5D24")
|
664
|
+
expect(response.payment_id).to eq("E86256B2787EE7FF0C33D0D4C6159CD922227B79")
|
665
|
+
expect(response.invoicenumber).to eq("12345")
|
666
|
+
expect(response.timestamp).to be_an_instance_of(Time)
|
667
|
+
expect(response.to_h).to be_an_instance_of(Hash)
|
668
|
+
end
|
545
669
|
end
|
546
670
|
|
547
|
-
context 'payment recurrent response' do
|
548
|
-
it '
|
671
|
+
context 'when callback is a payment recurrent response' do
|
672
|
+
it 'recognizes a visa payment recurrent response' do
|
549
673
|
params = File.read("spec/fixtures/responses/callback_recurrent_visa.txt")
|
550
674
|
|
551
675
|
response = subject.callback(params)
|
@@ -559,7 +683,7 @@ describe Buckaruby::Gateway do
|
|
559
683
|
expect(response.to_h).to be_an_instance_of(Hash)
|
560
684
|
end
|
561
685
|
|
562
|
-
it '
|
686
|
+
it 'recognizes a sepa direct debit payment recurrent response' do
|
563
687
|
params = File.read("spec/fixtures/responses/callback_recurrent_sepa.txt")
|
564
688
|
|
565
689
|
response = subject.callback(params)
|
@@ -574,8 +698,8 @@ describe Buckaruby::Gateway do
|
|
574
698
|
end
|
575
699
|
end
|
576
700
|
|
577
|
-
context 'refund response' do
|
578
|
-
it '
|
701
|
+
context 'when callback is a refund response' do
|
702
|
+
it 'recognizes an ideal refund response' do
|
579
703
|
params = File.read("spec/fixtures/responses/callback_refund_ideal.txt")
|
580
704
|
|
581
705
|
response = subject.callback(params)
|
@@ -590,7 +714,7 @@ describe Buckaruby::Gateway do
|
|
590
714
|
expect(response.to_h).to be_an_instance_of(Hash)
|
591
715
|
end
|
592
716
|
|
593
|
-
it '
|
717
|
+
it 'recognizes a paypal refund response' do
|
594
718
|
params = File.read("spec/fixtures/responses/callback_refund_paypal.txt")
|
595
719
|
|
596
720
|
response = subject.callback(params)
|
@@ -604,10 +728,25 @@ describe Buckaruby::Gateway do
|
|
604
728
|
expect(response.timestamp).to be_an_instance_of(Time)
|
605
729
|
expect(response.to_h).to be_an_instance_of(Hash)
|
606
730
|
end
|
731
|
+
|
732
|
+
it 'recognizes an amex refund response' do
|
733
|
+
params = File.read("spec/fixtures/responses/callback_refund_amex.txt")
|
734
|
+
|
735
|
+
response = subject.callback(params)
|
736
|
+
expect(response.transaction_status).to eq(Buckaruby::TransactionStatus::SUCCESS)
|
737
|
+
expect(response.transaction_type).to eq(Buckaruby::TransactionType::REFUND)
|
738
|
+
expect(response.payment_method).to eq(Buckaruby::PaymentMethod::AMERICAN_EXPRESS)
|
739
|
+
expect(response.transaction_id).to eq("B51118F58785274E117EFE1BF99D4D50CCB96949")
|
740
|
+
expect(response.payment_id).to be nil
|
741
|
+
expect(response.invoicenumber).to eq("12345")
|
742
|
+
expect(response.refund_transaction_id).to eq("41C48B55FA9164E123CC73B1157459E840BE5D24")
|
743
|
+
expect(response.timestamp).to be_an_instance_of(Time)
|
744
|
+
expect(response.to_h).to be_an_instance_of(Hash)
|
745
|
+
end
|
607
746
|
end
|
608
747
|
|
609
|
-
context 'reversal response' do
|
610
|
-
it '
|
748
|
+
context 'when callback is a reversal response' do
|
749
|
+
it 'recognizes a sepa direct debit reversal response' do
|
611
750
|
params = File.read("spec/fixtures/responses/callback_reversal_sepa.txt")
|
612
751
|
|
613
752
|
response = subject.callback(params)
|
@@ -622,7 +761,7 @@ describe Buckaruby::Gateway do
|
|
622
761
|
expect(response.to_h).to be_an_instance_of(Hash)
|
623
762
|
end
|
624
763
|
|
625
|
-
it '
|
764
|
+
it 'recognizes a paypal reversal response' do
|
626
765
|
params = File.read("spec/fixtures/responses/callback_reversal_paypal.txt")
|
627
766
|
|
628
767
|
response = subject.callback(params)
|