archetype_spree_gateway 3.9.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +39 -0
  5. data/Gemfile +9 -0
  6. data/Guardfile +9 -0
  7. data/LICENSE.md +26 -0
  8. data/README.md +105 -0
  9. data/Rakefile +15 -0
  10. data/app/models/spree/billing_integration.rb +21 -0
  11. data/app/models/spree/check.rb +41 -0
  12. data/app/models/spree/gateway/authorize_net.rb +45 -0
  13. data/app/models/spree/gateway/authorize_net_cim.rb +213 -0
  14. data/app/models/spree/gateway/balanced_gateway.rb +64 -0
  15. data/app/models/spree/gateway/banwire.rb +15 -0
  16. data/app/models/spree/gateway/beanstream.rb +193 -0
  17. data/app/models/spree/gateway/braintree_gateway.rb +184 -0
  18. data/app/models/spree/gateway/card_save.rb +10 -0
  19. data/app/models/spree/gateway/cyber_source.rb +10 -0
  20. data/app/models/spree/gateway/data_cash.rb +10 -0
  21. data/app/models/spree/gateway/epay.rb +10 -0
  22. data/app/models/spree/gateway/eway.rb +18 -0
  23. data/app/models/spree/gateway/eway_rapid.rb +14 -0
  24. data/app/models/spree/gateway/maxipago.rb +14 -0
  25. data/app/models/spree/gateway/migs.rb +11 -0
  26. data/app/models/spree/gateway/moneris.rb +10 -0
  27. data/app/models/spree/gateway/pay_junction.rb +14 -0
  28. data/app/models/spree/gateway/pay_pal_gateway.rb +12 -0
  29. data/app/models/spree/gateway/payflow_pro.rb +15 -0
  30. data/app/models/spree/gateway/paymill.rb +12 -0
  31. data/app/models/spree/gateway/payu_polska_gateway.rb +24 -0
  32. data/app/models/spree/gateway/pin_gateway.rb +60 -0
  33. data/app/models/spree/gateway/quickpay.rb +9 -0
  34. data/app/models/spree/gateway/sage_pay.rb +11 -0
  35. data/app/models/spree/gateway/secure_pay_au.rb +10 -0
  36. data/app/models/spree/gateway/spreedly_core_gateway.rb +11 -0
  37. data/app/models/spree/gateway/stripe_ach_gateway.rb +60 -0
  38. data/app/models/spree/gateway/stripe_apple_pay_gateway.rb +10 -0
  39. data/app/models/spree/gateway/stripe_elements_gateway.rb +61 -0
  40. data/app/models/spree/gateway/stripe_gateway.rb +151 -0
  41. data/app/models/spree/gateway/usa_epay_transaction.rb +9 -0
  42. data/app/models/spree/gateway/worldpay.rb +91 -0
  43. data/app/models/spree/payu_polska.rb +41 -0
  44. data/app/models/spree_gateway/apple_pay_order_decorator.rb +20 -0
  45. data/app/models/spree_gateway/apple_pay_payment_decorator.rb +9 -0
  46. data/app/models/spree_gateway/credit_card_decorator.rb +10 -0
  47. data/app/models/spree_gateway/order_decorator.rb +28 -0
  48. data/app/models/spree_gateway/payment_decorator.rb +36 -0
  49. data/app/views/spree/checkout/_payment_confirm.html.erb +39 -0
  50. data/app/views/spree/checkout/_payu.html +12 -0
  51. data/config/initializers/inflections.rb +3 -0
  52. data/config/initializers/spree_permitted_attributes.rb +5 -0
  53. data/config/locales/bg.yml +4 -0
  54. data/config/locales/de.yml +4 -0
  55. data/config/locales/en.yml +47 -0
  56. data/config/locales/sv.yml +4 -0
  57. data/config/routes.rb +19 -0
  58. data/db/migrate/20200317135551_add_spree_check_payment_source.rb +22 -0
  59. data/db/migrate/20200422114908_add_intent_key_to_payment.rb +5 -0
  60. data/lib/active_merchant/billing/stripe_gateway_decorator.rb +33 -0
  61. data/lib/controllers/spree/api/v2/storefront/intents_controller.rb +45 -0
  62. data/lib/controllers/spree/apple_pay_domain_verification_controller.rb +11 -0
  63. data/lib/generators/spree_gateway/install/install_generator.rb +19 -0
  64. data/lib/spree_frontend/controllers/spree/checkout_controller_decorator.rb +19 -0
  65. data/lib/spree_gateway/engine.rb +80 -0
  66. data/lib/spree_gateway/version.rb +5 -0
  67. data/lib/spree_gateway.rb +4 -0
  68. data/lib/views/backend/spree/admin/log_entries/_braintree.html.erb +31 -0
  69. data/lib/views/backend/spree/admin/log_entries/_stripe.html.erb +28 -0
  70. data/lib/views/backend/spree/admin/payments/source_forms/_quickcheckout.html.erb +8 -0
  71. data/lib/views/backend/spree/admin/payments/source_forms/_stripe.html.erb +79 -0
  72. data/lib/views/backend/spree/admin/payments/source_forms/_stripe_ach.html.erb +86 -0
  73. data/lib/views/backend/spree/admin/payments/source_forms/_stripe_apple_pay.html.erb +0 -0
  74. data/lib/views/backend/spree/admin/payments/source_forms/_stripe_elements.html.erb +79 -0
  75. data/lib/views/backend/spree/admin/payments/source_views/_stripe.html.erb +1 -0
  76. data/lib/views/backend/spree/admin/payments/source_views/_stripe_ach.html.erb +21 -0
  77. data/lib/views/backend/spree/admin/payments/source_views/_stripe_apple_pay.html.erb +1 -0
  78. data/lib/views/backend/spree/admin/payments/source_views/_stripe_elements.html.erb +1 -0
  79. data/lib/views/frontend/spree/checkout/payment/_stripe.html.erb +86 -0
  80. data/lib/views/frontend/spree/checkout/payment/_stripe_ach.html.erb +81 -0
  81. data/lib/views/frontend/spree/checkout/payment/_stripe_ach_verify.html.erb +16 -0
  82. data/lib/views/frontend/spree/checkout/payment/_stripe_additional_info.html.erb +16 -0
  83. data/lib/views/frontend/spree/checkout/payment/_stripe_apple_pay.html.erb +109 -0
  84. data/lib/views/frontend/spree/checkout/payment/_stripe_elements.html.erb +110 -0
  85. data/script/rails +7 -0
  86. data/spec/factories/check_factory.rb +10 -0
  87. data/spec/features/admin/stripe_elements_payment_spec.rb +100 -0
  88. data/spec/features/stripe_checkout_spec.rb +130 -0
  89. data/spec/features/stripe_elements_3ds_checkout_spec.rb +225 -0
  90. data/spec/models/gateway/authorize_net_cim_spec.rb +29 -0
  91. data/spec/models/gateway/authorize_net_spec.rb +23 -0
  92. data/spec/models/gateway/balanced_gateway_spec.rb +17 -0
  93. data/spec/models/gateway/banwire_spec.rb +11 -0
  94. data/spec/models/gateway/beanstream_spec.rb +17 -0
  95. data/spec/models/gateway/braintree_gateway_spec.rb +420 -0
  96. data/spec/models/gateway/card_save_spec.rb +11 -0
  97. data/spec/models/gateway/cyber_source_spec.rb +11 -0
  98. data/spec/models/gateway/data_cash_spec.rb +11 -0
  99. data/spec/models/gateway/epay_spec.rb +11 -0
  100. data/spec/models/gateway/eway_rapid_spec.rb +23 -0
  101. data/spec/models/gateway/eway_spec.rb +29 -0
  102. data/spec/models/gateway/maxipago_spec.rb +17 -0
  103. data/spec/models/gateway/moneris_spec.rb +11 -0
  104. data/spec/models/gateway/pay_junction_spec.rb +23 -0
  105. data/spec/models/gateway/pay_pal_spec.rb +11 -0
  106. data/spec/models/gateway/payflow_pro_spec.rb +23 -0
  107. data/spec/models/gateway/paymill_spec.rb +11 -0
  108. data/spec/models/gateway/pin_gateway_spec.rb +54 -0
  109. data/spec/models/gateway/quickpay_spec.rb +11 -0
  110. data/spec/models/gateway/sage_pay_spec.rb +11 -0
  111. data/spec/models/gateway/secure_pay_au_spec.rb +11 -0
  112. data/spec/models/gateway/stripe_ach_gateway_spec.rb +186 -0
  113. data/spec/models/gateway/stripe_gateway_spec.rb +199 -0
  114. data/spec/models/gateway/usa_epay_transaction_spec.rb +49 -0
  115. data/spec/models/gateway/worldpay_spec.rb +11 -0
  116. data/spec/models/spree/order_spec.rb +79 -0
  117. data/spec/requests/apple_pay_domain_verification.rb +45 -0
  118. data/spec/requests/spree/api/v2/storefront/intents_controller_spec.rb +198 -0
  119. data/spec/spec_helper.rb +10 -0
  120. data/spec/support/order_walktrough.rb +73 -0
  121. data/spec/support/wait_for_stripe.rb +27 -0
  122. data/spec/support/within_stripe_3ds_popup.rb +10 -0
  123. data/spree_gateway.gemspec +37 -0
  124. metadata +277 -0
@@ -0,0 +1,420 @@
1
+ require 'spec_helper'
2
+ require 'pry'
3
+
4
+ describe Spree::Gateway::BraintreeGateway do
5
+ before do
6
+ country = Spree::Country.find_by(name: 'United States of America')
7
+ country.update(name: 'United States', iso_name: 'UNITED STATES', iso3: 'USA', iso: 'US', numcode: 840)
8
+ state = create(:state, name: 'Maryland', abbr: 'MD', country: country)
9
+ @address = create(:address,
10
+ firstname: 'John',
11
+ lastname: 'Doe',
12
+ address1: '1234 My Street',
13
+ address2: 'Apt 1',
14
+ city: 'Washington DC',
15
+ zipcode: '20123',
16
+ phone: '(555)555-5555',
17
+ state: state,
18
+ country: country)
19
+
20
+
21
+ Spree::Gateway.update_all(active: false)
22
+ @gateway = Spree::Gateway::BraintreeGateway.create!(name: 'Braintree Gateway', active: true, stores: [::Spree::Store.default])
23
+ @gateway.preferences = {
24
+ environment: 'sandbox',
25
+ merchant_id: 'zbn5yzq9t7wmwx42',
26
+ public_key: 'ym9djwqpkxbv3xzt',
27
+ private_key: '4ghghkyp2yy6yqc8'
28
+ }
29
+ @gateway.save!
30
+
31
+ with_payment_profiles_off do
32
+ order = create(:order_with_totals, bill_address: @address, ship_address: @address)
33
+ order.update_with_updater!
34
+
35
+ # Use a valid CC from braintree sandbox: https://www.braintreepayments.com/docs/ruby/reference/sandbox
36
+
37
+ @credit_card = create(:credit_card,
38
+ verification_value: '123',
39
+ number: '5555555555554444',
40
+ month: 9,
41
+ year: Time.now.year + 1,
42
+ name: 'John Doe',
43
+ cc_type: 'mastercard')
44
+
45
+ @payment = create(:payment, source: @credit_card, order: order, payment_method: @gateway, amount: 10.00)
46
+ end
47
+ end
48
+
49
+ describe 'payment profile creation' do
50
+ before do
51
+ order = create(:order_with_totals, bill_address: @address, ship_address: @address)
52
+ order.update_with_updater!
53
+
54
+ @credit_card = create(:credit_card,
55
+ verification_value: '123',
56
+ number: '5555555555554444',
57
+ month: 9,
58
+ year: Time.now.year + 1,
59
+ name: 'John Doe',
60
+ cc_type: 'mastercard')
61
+
62
+ @payment = create(:payment, source: @credit_card, order: order, payment_method: @gateway, amount: 10.00)
63
+ end
64
+
65
+ context 'when a credit card is created' do
66
+ it 'it has the address associated on the remote payment profile' do
67
+ remote_customer = @gateway.provider.instance_variable_get(:@braintree_gateway).customer.find(@credit_card.gateway_customer_profile_id)
68
+ remote_address = remote_customer.addresses.first rescue nil
69
+ expect(remote_address).not_to be_nil
70
+ expect(remote_address.street_address).to eq(@address.address1)
71
+ expect(remote_address.extended_address).to eq(@address.address2)
72
+ expect(remote_address.locality).to eq(@address.city)
73
+ expect(remote_address.region).to eq(@address.state.name)
74
+ expect(remote_address.country_code_alpha2).to eq(@address.country.iso)
75
+ expect(remote_address.postal_code).to eq(@address.zipcode)
76
+ end
77
+ end
78
+
79
+ end
80
+
81
+ describe 'payment profile failure' do
82
+ before do
83
+ country = Spree::Country.default
84
+ state = country.states.first
85
+ address = create(:address,
86
+ firstname: 'John',
87
+ lastname: 'Doe',
88
+ address1: '1234 My Street',
89
+ address2: 'Apt 1',
90
+ city: 'Washington DC',
91
+ zipcode: '20123',
92
+ phone: '(555)555-5555',
93
+ state: state,
94
+ country: country
95
+ )
96
+ @address = address
97
+
98
+ @order = create(:order_with_totals, bill_address: address, ship_address: address)
99
+ @order.update_with_updater!
100
+
101
+ @credit_card = create(:credit_card,
102
+ verification_value: '123',
103
+ number: '5105105105105100',
104
+ month: 9,
105
+ year: Time.now.year + 1,
106
+ name: 'John Doe',
107
+ cc_type: 'mastercard')
108
+ end
109
+
110
+ it 'should fail creation' do
111
+ expect{ create(:payment, source: @credit_card, order: @order, payment_method: @gateway, amount: 10.00) }.to raise_error Spree::Core::GatewayError
112
+ end
113
+
114
+ end
115
+
116
+ describe 'merchant_account_id' do
117
+ before do
118
+ @gateway.preferences[:merchant_account_id] = merchant_account_id
119
+ end
120
+
121
+ context 'with merchant_account_id empty' do
122
+ let(:merchant_account_id) { '' }
123
+
124
+ it 'does not be present in options' do
125
+ expect(@gateway.options.keys.include?(:merchant_account_id)).to be false
126
+ end
127
+ end
128
+
129
+ context 'with merchant_account_id set on gateway' do
130
+ let(:merchant_account_id) { 'test' }
131
+
132
+ it 'have a perferred_merchant_account_id' do
133
+ expect(@gateway.preferred_merchant_account_id).to eq merchant_account_id
134
+ end
135
+
136
+ it 'have a preferences[:merchant_account_id]' do
137
+ expect(@gateway.preferences.keys.include?(:merchant_account_id)).to be true
138
+ end
139
+
140
+ it 'is present in options' do
141
+ expect(@gateway.options.keys.include?(:merchant_account_id)).to be true
142
+ end
143
+ end
144
+ end
145
+
146
+ context '.provider_class' do
147
+ it 'is a BraintreeBlue gateway' do
148
+ expect(@gateway.provider_class).to eq ::ActiveMerchant::Billing::BraintreeBlueGateway
149
+ end
150
+ end
151
+
152
+ context '.payment_profiles_supported?' do
153
+ it 'return true' do
154
+ expect(@gateway.payment_profiles_supported?).to be true
155
+ end
156
+ end
157
+
158
+ context 'preferences' do
159
+ it 'does not include server + test_mode' do
160
+ expect { @gateway.preferences.fetch(:server) }.to raise_error(StandardError)
161
+ end
162
+ end
163
+
164
+ describe 'authorize' do
165
+ context "the credit card has a token" do
166
+ before(:each) do
167
+ @credit_card.update(gateway_payment_profile_id: 'test')
168
+ end
169
+
170
+ it 'calls provider#authorize using the gateway_payment_profile_id' do
171
+ expect(@gateway.provider).to receive(:authorize).with(500, 'test', { payment_method_token: true } )
172
+ @gateway.authorize(500, @credit_card)
173
+ end
174
+ end
175
+
176
+ context "the given credit card does not have a token" do
177
+ context "the credit card has a customer profile id" do
178
+ before(:each) do
179
+ @credit_card.update(gateway_customer_profile_id: '12345')
180
+ end
181
+
182
+ it 'calls provider#authorize using the gateway_customer_profile_id' do
183
+ expect(@gateway.provider).to receive(:authorize).with(500, '12345', {})
184
+ @gateway.authorize(500, @credit_card)
185
+ end
186
+ end
187
+
188
+ context "no customer profile id" do
189
+ it 'calls provider#authorize with the credit card object' do
190
+ expect(@gateway.provider).to receive(:authorize).with(500, @credit_card, {})
191
+ @gateway.authorize(500, @credit_card)
192
+ end
193
+ end
194
+ end
195
+
196
+ it 'return a success response with an authorization code' do
197
+ result = @gateway.authorize(500, @credit_card)
198
+
199
+ expect(result.success?).to be true
200
+ expect(result.authorization).to match /\A\w{6,}\z/
201
+ expect(Braintree::Transaction::Status::Authorized).to eq Braintree::Transaction.find(result.authorization).status
202
+ end
203
+
204
+ shared_examples 'a valid credit card' do
205
+ it 'work through the spree payment interface' do
206
+ Spree::Config.set auto_capture: false
207
+ expect(@payment.log_entries.size).to eq(0)
208
+
209
+ @payment.process!
210
+ expect(@payment.log_entries.size).to eq(1)
211
+ expect(@payment.transaction_id).to match /\A\w{6,}\z/
212
+ expect(@payment.state).to eq 'pending'
213
+
214
+ transaction = ::Braintree::Transaction.find(@payment.transaction_id)
215
+ expect(transaction.status).to eq Braintree::Transaction::Status::Authorized
216
+
217
+ card_number = @credit_card.number[0..5] + '******' + @credit_card.number[-4..-1]
218
+ expect(transaction.credit_card_details.masked_number).to eq card_number
219
+ expect(transaction.credit_card_details.expiration_date).to eq "09/#{Time.now.year + 1}"
220
+ expect(transaction.customer_details.first_name).to eq 'John'
221
+ expect(transaction.customer_details.last_name).to eq 'Doe'
222
+ end
223
+ end
224
+
225
+ context 'when the card is a mastercard' do
226
+ before do
227
+ @credit_card.number = '5555555555554444'
228
+ @credit_card.cc_type = 'mastercard'
229
+ @credit_card.save
230
+ end
231
+
232
+ it_behaves_like 'a valid credit card'
233
+ end
234
+
235
+ context 'when the card is a visa' do
236
+ before do
237
+ @credit_card.number = '4111111111111111'
238
+ @credit_card.cc_type = 'visa'
239
+ @credit_card.save
240
+ end
241
+
242
+ it_behaves_like 'a valid credit card'
243
+ end
244
+
245
+ context 'when the card is an amex' do
246
+ before do
247
+ @credit_card.number = '378282246310005'
248
+ @credit_card.verification_value = '1234'
249
+ @credit_card.cc_type = 'amex'
250
+ @credit_card.save
251
+ end
252
+
253
+ it_behaves_like 'a valid credit card'
254
+ end
255
+
256
+ context 'when the card is a JCB' do
257
+ before do
258
+ @credit_card.number = '3530111333300000'
259
+ @credit_card.cc_type = 'jcb'
260
+ @credit_card.save
261
+ end
262
+
263
+ it_behaves_like 'a valid credit card'
264
+ end
265
+
266
+ context 'when the card is a diners club' do
267
+ before do
268
+ @credit_card.number = '36050000000003'
269
+ @credit_card.cc_type = 'dinersclub'
270
+ @credit_card.save
271
+ end
272
+
273
+ it_behaves_like 'a valid credit card'
274
+ end
275
+ end
276
+
277
+ describe 'capture' do
278
+ it 'do capture a previous authorization' do
279
+ @payment.process!
280
+ expect(@payment.log_entries.size).to eq(1)
281
+ expect(@payment.transaction_id).to match /\A\w{6,}\z/
282
+
283
+ transaction = ::Braintree::Transaction.find(@payment.transaction_id)
284
+ expect(transaction.status).to eq Braintree::Transaction::Status::Authorized
285
+
286
+ capture_result = @gateway.capture(@payment.amount, @payment.transaction_id)
287
+ expect(capture_result.success?).to be true
288
+
289
+ transaction = ::Braintree::Transaction.find(@payment.transaction_id)
290
+ expect(transaction.status).to eq Braintree::Transaction::Status::SubmittedForSettlement
291
+ end
292
+
293
+ it 'raise an error if capture fails using spree interface' do
294
+ Spree::Config.set(auto_capture: false)
295
+ expect(@payment.log_entries.size).to eq(0)
296
+
297
+ @payment.process!
298
+ expect(@payment.log_entries.size).to eq(1)
299
+
300
+ transaction = ::Braintree::Transaction.find(@payment.transaction_id)
301
+ expect(transaction.status).to eq Braintree::Transaction::Status::Authorized
302
+
303
+ @payment.capture! # as done in PaymentsController#fire
304
+ transaction = ::Braintree::Transaction.find(@payment.transaction_id)
305
+ expect(transaction.status).to eq Braintree::Transaction::Status::SubmittedForSettlement
306
+ expect(@payment.completed?).to be true
307
+ end
308
+ end
309
+
310
+ context 'purchase' do
311
+ it 'return a success response with an authorization code' do
312
+ result = @gateway.purchase(500, @credit_card)
313
+ expect(result.success?).to be true
314
+ expect(result.authorization).to match /\A\w{6,}\z/
315
+ expect(Braintree::Transaction::Status::SubmittedForSettlement).to eq Braintree::Transaction.find(result.authorization).status
316
+ end
317
+
318
+ it 'work through the spree payment interface with payment profiles' do
319
+ purchase_using_spree_interface
320
+ transaction = ::Braintree::Transaction.find(@payment.transaction_id)
321
+ expect(transaction.credit_card_details.token).not_to be_nil
322
+ end
323
+
324
+ it 'work through the spree payment interface without payment profiles' do
325
+ with_payment_profiles_off do
326
+ purchase_using_spree_interface(false)
327
+ transaction = ::Braintree::Transaction.find(@payment.transaction_id)
328
+ expect(transaction.credit_card_details.token).to be_nil
329
+ end
330
+ end
331
+ end
332
+
333
+ context 'credit' do
334
+ it 'work through the spree interface' do
335
+ @payment.amount += 100.00
336
+ purchase_using_spree_interface
337
+ skip "Braintree does not provide a way to settle a transaction manually: https://twitter.com/braintree/status/446099537224933376"
338
+ credit_using_spree_interface
339
+ end
340
+ end
341
+
342
+ context 'void' do
343
+ before do
344
+ Spree::Config.set(auto_capture: true)
345
+ end
346
+
347
+ it 'work through the spree credit_card / payment interface' do
348
+ expect(@payment.log_entries.size).to eq(0)
349
+ @payment.process!
350
+
351
+ expect(@payment.log_entries.size).to eq(1)
352
+ expect(@payment.transaction_id).to match /\A\w{6,}\z/
353
+
354
+ transaction = Braintree::Transaction.find(@payment.transaction_id)
355
+ expect(transaction.status).to eq Braintree::Transaction::Status::SubmittedForSettlement
356
+
357
+ @payment.void_transaction!
358
+ transaction = Braintree::Transaction.find(transaction.id)
359
+ expect(transaction.status).to eq Braintree::Transaction::Status::Voided
360
+ end
361
+ end
362
+
363
+ context 'update_card_number' do
364
+ it 'passes through gateway_payment_profile_id' do
365
+ credit_card = { 'token' => 'testing', 'last_4' => '1234', 'masked_number' => '555555******4444' }
366
+ @gateway.update_card_number(@payment.source, credit_card)
367
+ expect(@payment.source.gateway_payment_profile_id).to eq 'testing'
368
+ end
369
+ end
370
+
371
+ def credit_using_spree_interface
372
+ expect(@payment.log_entries.size).to eq(1)
373
+ @payment.credit!
374
+ expect(@payment.log_entries.size).to eq(2)
375
+
376
+ # Let's get the payment record associated with the credit
377
+ @payment = @order.payments.last
378
+ expect(@payment.transaction_id).to match /\A\w{6,}\z/
379
+
380
+ transaction = ::Braintree::Transaction.find(@payment.transaction_id)
381
+ expect(transaction.type).to eq Braintree::Transaction::Type::Credit
382
+ expect(transaction.status).to eq Braintree::Transaction::Status::SubmittedForSettlement
383
+ expect(transaction.credit_card_details.masked_number).to eq '555555******4444'
384
+ expect(transaction.credit_card_details.expiration_date).to eq "09/#{Time.now.year + 1}"
385
+ expect(transaction.customer_details.first_name).to eq 'John'
386
+ expect(transaction.customer_details.last_name).to eq 'Doe'
387
+ end
388
+
389
+ def purchase_using_spree_interface(profile=true)
390
+ Spree::Config.set(auto_capture: true)
391
+ @payment.send(:create_payment_profile) if profile
392
+ @payment.log_entries.size == 0
393
+ @payment.process! # as done in PaymentsController#create
394
+ @payment.log_entries.size == 1
395
+ expect(@payment.transaction_id).to match /\A\w{6,}\z/
396
+ expect(@payment.state).to eq 'completed'
397
+
398
+ transaction = ::Braintree::Transaction.find(@payment.transaction_id)
399
+ expect(Braintree::Transaction::Status::SubmittedForSettlement).to eq transaction.status
400
+ expect(transaction.credit_card_details.masked_number).to eq '555555******4444'
401
+ expect(transaction.credit_card_details.expiration_date).to eq "09/#{Time.now.year + 1}"
402
+ expect(transaction.customer_details.first_name).to eq 'John'
403
+ expect(transaction.customer_details.last_name).to eq 'Doe'
404
+ end
405
+
406
+ def with_payment_profiles_off(&block)
407
+ Spree::Gateway::BraintreeGateway.class_eval do
408
+ def payment_profiles_supported?
409
+ false
410
+ end
411
+ end
412
+ yield
413
+ ensure
414
+ Spree::Gateway::BraintreeGateway.class_eval do
415
+ def payment_profiles_supported?
416
+ true
417
+ end
418
+ end
419
+ end
420
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::CardSave do
4
+ let(:gateway) { described_class.create!(name: 'CardSave', stores: [::Spree::Store.default]) }
5
+
6
+ context '.provider_class' do
7
+ it 'is a CardSave gateway' do
8
+ expect(gateway.provider_class).to eq ::ActiveMerchant::Billing::CardSaveGateway
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::CyberSource do
4
+ let(:gateway) { described_class.create!(name: 'CyberSource') }
5
+
6
+ context '.provider_class' do
7
+ it 'is a CyberSource gateway' do
8
+ expect(subject.provider_class).to eq ::ActiveMerchant::Billing::CyberSourceGateway
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::DataCash do
4
+ let(:gateway) { described_class.create!(name: 'DataCash', stores: [::Spree::Store.default]) }
5
+
6
+ context '.provider_class' do
7
+ it 'is a DataCash gateway' do
8
+ expect(gateway.provider_class).to eq ::ActiveMerchant::Billing::DataCashGateway
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::Epay do
4
+ let(:gateway) { described_class.create!(name: 'Epay', stores: [::Spree::Store.default]) }
5
+
6
+ context '.provider_class' do
7
+ it 'is a Epay gateway' do
8
+ expect(gateway.provider_class).to eq ::ActiveMerchant::Billing::EpayGateway
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::EwayRapid do
4
+ let(:gateway) { described_class.create!(name: 'eWAY Rapid', stores: [::Spree::Store.default]) }
5
+
6
+ describe '#provider_class' do
7
+ it 'should be an eWAY Rapid gateway' do
8
+ expect(gateway.provider_class).to eq ::ActiveMerchant::Billing::EwayRapidGateway
9
+ end
10
+ end
11
+
12
+ describe '#options' do
13
+ it 'should flag test option if preferred_test_mode is true' do
14
+ gateway.preferred_test_mode = true
15
+ expect(gateway.options[:test]).to be true
16
+ end
17
+
18
+ it 'should unflag test option if preferred_test_mode is false' do
19
+ gateway.preferred_test_mode = false
20
+ expect(gateway.options[:test]).to be false
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::Eway do
4
+ let(:gateway) { described_class.create!(name: 'Eway', stores: [::Spree::Store.default]) }
5
+
6
+ context '.provider_class' do
7
+ it 'is a Eway gateway' do
8
+ expect(gateway.provider_class).to eq ::ActiveMerchant::Billing::EwayGateway
9
+ end
10
+ end
11
+
12
+ context '.auto_capture?' do
13
+ it 'supports purchase method only' do
14
+ expect(gateway.auto_capture?).to be true
15
+ end
16
+ end
17
+
18
+ describe 'options' do
19
+ it 'include :test => true in when :test_mode is true' do
20
+ gateway.preferred_test_mode = true
21
+ expect(gateway.options[:test]).to be true
22
+ end
23
+
24
+ it 'does not include :test when test_mode is false' do
25
+ gateway.preferred_test_mode = false
26
+ expect(gateway.options[:test]).to be false
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::Maxipago do
4
+ let(:gateway) { described_class.create!(name: 'Maxipago') }
5
+
6
+ context '.provider_class' do
7
+ it 'is a Maxipago gateway' do
8
+ expect(subject.provider_class).to eq ::ActiveMerchant::Billing::MaxipagoGateway
9
+ end
10
+ end
11
+
12
+ context '.auto_capture?' do
13
+ it 'return true' do
14
+ expect(subject.auto_capture?).to be true
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::Moneris do
4
+ let(:gateway) { described_class.create!(name: 'Moneris', stores: [::Spree::Store.default]) }
5
+
6
+ context '.provider_class' do
7
+ it 'is a Moneris gateway' do
8
+ expect(gateway.provider_class).to eq ::ActiveMerchant::Billing::MonerisGateway
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::PayJunction do
4
+ let(:gateway) { described_class.create!(name: 'PayJunction', stores: [::Spree::Store.default]) }
5
+
6
+ context '.provider_class' do
7
+ it 'is a PayJunction gateway' do
8
+ expect(gateway.provider_class).to eq ::ActiveMerchant::Billing::PayJunctionGateway
9
+ end
10
+ end
11
+
12
+ describe 'options' do
13
+ it 'include :test => true in when :test_mode is true' do
14
+ gateway.preferred_test_mode = true
15
+ expect(gateway.options[:test]).to be true
16
+ end
17
+
18
+ it 'does not include :test when test_mode is false' do
19
+ gateway.preferred_test_mode = false
20
+ expect(gateway.options[:test]).to be false
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::PayPalGateway do
4
+ let(:gateway) { described_class.create!(name: 'PayPal', stores: [::Spree::Store.default]) }
5
+
6
+ context '.provider_class' do
7
+ it 'is a PayPal gateway' do
8
+ expect(gateway.provider_class).to eq ::ActiveMerchant::Billing::PaypalGateway
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::PayflowPro do
4
+ let(:gateway) { described_class.create!(name: 'PayflowPro', stores: [::Spree::Store.default]) }
5
+
6
+ context '.provider_class' do
7
+ it 'is a Payflow gateway' do
8
+ expect(gateway.provider_class).to eq ::ActiveMerchant::Billing::PayflowGateway
9
+ end
10
+ end
11
+
12
+ describe 'options' do
13
+ it 'include :test => true when :test_mode is true' do
14
+ gateway.preferred_test_mode = true
15
+ expect(gateway.options[:test]).to be true
16
+ end
17
+
18
+ it 'does not include :test when test_mode is false' do
19
+ gateway.preferred_test_mode = false
20
+ expect(gateway.options[:test]).to be false
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::Paymill do
4
+ let(:gateway) { described_class.create!(name: 'Paymill', stores: [::Spree::Store.default]) }
5
+
6
+ context '.provider_class' do
7
+ it 'is a Paymill gateway' do
8
+ expect(gateway.provider_class).to eq ::ActiveMerchant::Billing::PaymillGateway
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::PinGateway do
4
+
5
+ before do
6
+ Spree::Gateway.update_all(active: false)
7
+ @gateway = described_class.create!(name: 'Pin Gateway', active: true, stores: [::Spree::Store.default])
8
+ @gateway.set_preference(:api_key, 'W_VzkRCZSILiKWUS-dndUg')
9
+ @gateway.save!
10
+
11
+ country = create(:country, name: 'Australia', iso_name: 'Australia', iso3: 'AUS', iso: 'AU', numcode: 61)
12
+ state = create(:state, name: 'Victoria', abbr: 'VIC', country: country)
13
+ address = create(:address,
14
+ firstname: 'Ronald C',
15
+ lastname: 'Robot',
16
+ address1: '1234 My Street',
17
+ address2: 'Apt 1',
18
+ city: 'Melbourne',
19
+ zipcode: '3000',
20
+ phone: '88888888',
21
+ state: state,
22
+ country: country
23
+ )
24
+
25
+ order = create(:order_with_totals, bill_address: address, ship_address: address)
26
+ order.update_with_updater!
27
+
28
+ credit_card = create(:credit_card,
29
+ verification_value: '123',
30
+ number: '5520000000000000',
31
+ month: 5,
32
+ year: Time.now.year + 1,
33
+ name: 'Ronald C Robot',
34
+ cc_type: 'mastercard'
35
+ )
36
+
37
+ @payment = create(:payment, source: credit_card, order: order, payment_method: @gateway, amount: 10.00)
38
+ end
39
+
40
+ it 'can purchase' do
41
+ @payment.purchase!
42
+ expect(@payment.state).to eq 'completed'
43
+ end
44
+
45
+ # Regression test for #106
46
+ it 'uses auto capturing' do
47
+ expect(@gateway.auto_capture?).to be true
48
+ end
49
+
50
+ it 'always uses purchase' do
51
+ @payment.should_receive(:purchase!)
52
+ @payment.process!
53
+ end
54
+ end