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,225 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe 'Stripe Elements 3ds checkout', type: :feature, js: true do
6
+ let!(:product) { create(:product, name: 'RoR Mug') }
7
+ let!(:stripe_payment_method) do
8
+ Spree::Gateway::StripeElementsGateway.create!(
9
+ name: 'Stripe',
10
+ preferred_secret_key: 'sk_test_VCZnDv3GLU15TRvn8i2EsaAN',
11
+ preferred_publishable_key: 'pk_test_Cuf0PNtiAkkMpTVC2gwYDMIg',
12
+ preferred_intents: preferred_intents,
13
+ stores: [::Spree::Store.default]
14
+ )
15
+ end
16
+
17
+ before do
18
+ user = create(:user)
19
+ order = OrderWalkthrough.up_to(:confirm)
20
+ expect(order).to receive(:confirmation_required?).and_return(true).at_least(:once)
21
+
22
+ order.reload
23
+ order.user = user
24
+ payment = order.payments.first
25
+ payment.source = create(:credit_card, number: card_number)
26
+ payment.save!
27
+
28
+ allow_any_instance_of(Spree::CheckoutController).to receive_messages(current_order: order)
29
+ allow_any_instance_of(Spree::CheckoutController).to receive_messages(try_spree_current_user: user)
30
+ allow_any_instance_of(Spree::CheckoutController).to receive_messages(skip_state_validation?: true)
31
+ allow_any_instance_of(Spree::OrdersController).to receive_messages(try_spree_current_user: user)
32
+
33
+ add_to_cart(product)
34
+
35
+ if Spree.version.to_f >= 3.7 and Spree.version.to_f < 4.1
36
+ find("#checkout-link").click
37
+ else
38
+ click_link 'checkout'
39
+ click_button 'Place Order'
40
+ end
41
+ end
42
+
43
+ describe 'when intents are disabled' do
44
+ let(:preferred_intents) { false }
45
+
46
+ context 'and credit card does not require 3ds authentication' do
47
+ let(:card_number) { '4242424242424242' }
48
+
49
+ if Spree.version.to_f >= 3.7 and Spree.version.to_f < 4.1
50
+ it 'should place order without 3ds authentication', driver: :selenium_chrome_headless do
51
+ click_button 'Save and Continue'
52
+ click_button 'Save and Continue'
53
+
54
+ within_frame 0 do
55
+ fill_in 'cardnumber', with: card_number
56
+ fill_in 'exp-date', with: "01 / #{Time.current.strftime('%y').to_i + 3}"
57
+ fill_in 'cvc', with: "222"
58
+ end
59
+
60
+ click_button 'Save and Continue'
61
+ click_button 'Place Order'
62
+
63
+ expect(page).to have_content('Your order has been processed successfully')
64
+ order = Spree::Order.complete.last
65
+ expect(page.current_url).to include("/orders/#{order.number}")
66
+ expect(page).to have_content(order.number)
67
+ end
68
+ else
69
+ it 'should place order without 3ds authentication' do
70
+ expect(page).to have_content('Order placed successfully')
71
+ order = Spree::Order.complete.last
72
+ expect(page.current_url).to include("/orders/#{order.number}")
73
+ expect(page).to have_content(order.number)
74
+ end
75
+ end
76
+ end
77
+
78
+ context 'and credit card does require 3ds authentication' do
79
+ let(:card_number) { '4000000000003220' }
80
+
81
+ if Spree.version.to_f >= 3.7 and Spree.version.to_f < 4.1
82
+ it 'should not place the order', driver: :selenium_chrome_headless do
83
+ click_button 'Save and Continue'
84
+ click_button 'Save and Continue'
85
+
86
+ within_frame 0 do
87
+ fill_in 'cardnumber', with: card_number
88
+ fill_in 'exp-date', with: "01 / #{Time.current.strftime('%y').to_i + 3}"
89
+ fill_in 'cvc', with: "222"
90
+ end
91
+
92
+ click_button 'Save and Continue'
93
+ click_button 'Place Order'
94
+
95
+ expect(page).to have_content('Your card was declined. This transaction requires authentication.')
96
+ expect(Spree::Order.complete.last).to be_nil
97
+ end
98
+
99
+ else
100
+ it 'should not place the order' do
101
+ expect(page).to have_content('Your card was declined. This transaction requires authentication.')
102
+ expect(Spree::Order.complete.last).to be_nil
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ describe 'when intents are enabled' do
109
+ let(:preferred_intents) { true }
110
+
111
+ context 'and credit card does not require 3ds authentication' do
112
+ let(:card_number) { '4242424242424242' }
113
+
114
+ if Spree.version.to_f >= 3.7 and Spree.version.to_f < 4.1
115
+ it 'should successfully place order without 3ds authentication', driver: :selenium_chrome_headless do
116
+ click_button 'Save and Continue'
117
+ click_button 'Save and Continue'
118
+
119
+ within_frame 0 do
120
+ fill_in 'cardnumber', with: card_number
121
+ fill_in 'exp-date', with: "01 / #{Time.current.strftime('%y').to_i + 3}"
122
+ fill_in 'cvc', with: "222"
123
+ end
124
+
125
+ click_button 'Save and Continue'
126
+ click_button 'Place Order'
127
+
128
+ expect(page).to have_content('Your order has been processed successfully')
129
+ order = Spree::Order.complete.last
130
+ expect(page.current_url).to include("/orders/#{order.number}")
131
+ expect(page).to have_content(order.number)
132
+ end
133
+ else
134
+ it 'should successfully place order without 3ds authentication' do
135
+ expect(page).to have_content('Order placed successfully')
136
+ order = Spree::Order.complete.last
137
+ expect(page.current_url).to include("/orders/#{order.number}")
138
+ expect(page).to have_content(order.number)
139
+ end
140
+ end
141
+ end
142
+
143
+ context 'when credit card does require 3ds authentication' do
144
+ let(:card_number) { '4000000000003220' }
145
+
146
+ context 'and authentication is successful' do
147
+ if Spree.version.to_f >= 3.7 and Spree.version.to_f < 4.1
148
+ it 'should place order after 3ds authentication', driver: :selenium_chrome_headless do
149
+ click_button 'Save and Continue'
150
+ click_button 'Save and Continue'
151
+
152
+ within_frame 0 do
153
+ fill_in 'cardnumber', with: card_number
154
+ fill_in 'exp-date', with: "01 / #{Time.current.strftime('%y').to_i + 3}"
155
+ fill_in 'cvc', with: "222"
156
+ end
157
+
158
+ click_button 'Save and Continue'
159
+ click_button 'Place Order'
160
+
161
+ within_stripe_3ds_popup do
162
+ click_button('Complete')
163
+ end
164
+
165
+ expect(page).to have_content('Your order has been processed successfully')
166
+ order = Spree::Order.complete.last
167
+ expect(page.current_url).to include("/orders/#{order.number}")
168
+ expect(page).to have_content(order.number)
169
+ end
170
+
171
+ else
172
+ it 'should place order after 3ds authentication' do
173
+ within_stripe_3ds_popup do
174
+ click_button('Complete')
175
+ end
176
+
177
+ expect(page).to have_content('Order placed successfully')
178
+ order = Spree::Order.complete.last
179
+ expect(page.current_url).to include("/orders/#{order.number}")
180
+ expect(page).to have_content(order.number)
181
+ end
182
+ end
183
+ end
184
+
185
+ context 'and authentication is unsuccessful' do
186
+
187
+ if Spree.version.to_f >= 3.7 and Spree.version.to_f < 4.1
188
+ it 'should not place order after 3ds authentication', driver: :selenium_chrome_headless do
189
+ click_button 'Save and Continue'
190
+ click_button 'Save and Continue'
191
+
192
+ within_frame 0 do
193
+ fill_in 'cardnumber', with: card_number
194
+ fill_in 'exp-date', with: "01 / #{Time.current.strftime('%y').to_i + 3}"
195
+ fill_in 'cvc', with: "222"
196
+ end
197
+
198
+ click_button 'Save and Continue'
199
+ click_button 'Place Order'
200
+
201
+ within_stripe_3ds_popup do
202
+ click_button('Fail')
203
+ end
204
+
205
+ expect(page).to_not have_content('Order placed successfully')
206
+ expect(page).to have_content('We are unable to authenticate your payment method.')
207
+ expect(page).to have_content('Please choose a different payment method and try again.')
208
+ expect(Spree::Order.complete.last).to be_nil
209
+ end
210
+ else
211
+ it 'should not place order after 3ds authentication' do
212
+ within_stripe_3ds_popup do
213
+ click_button('Fail')
214
+ end
215
+
216
+ expect(page).to_not have_content('Order placed successfully')
217
+ expect(page).to have_content('We are unable to authenticate your payment method.')
218
+ expect(page).to have_content('Please choose a different payment method and try again.')
219
+ expect(Spree::Order.complete.last).to be_nil
220
+ end
221
+ end
222
+ end
223
+ end
224
+ end
225
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::AuthorizeNetCim do
4
+ let (:gateway) { described_class.new }
5
+
6
+ context '.provider_class' do
7
+ it 'is a AuthorizeNetCim gateway' do
8
+ expect(gateway.provider_class).to eq ::Spree::Gateway::AuthorizeNetCim
9
+ end
10
+ end
11
+
12
+ context '.payment_profiles_supported?' do
13
+ it 'return true' do
14
+ expect(subject.payment_profiles_supported?).to be true
15
+ end
16
+ end
17
+
18
+ describe 'options' do
19
+ it 'include :test => true when test server is "test"' do
20
+ gateway.preferred_server = "test"
21
+ expect(gateway.options[:test]).to be true
22
+ end
23
+
24
+ it 'does not include :test when test server is "live"' do
25
+ gateway.preferred_server = "live"
26
+ expect(gateway.options[:test]).to be_nil
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::AuthorizeNet do
4
+ let (:gateway) { described_class.create!(name: 'Authorize.net', stores: [::Spree::Store.default]) }
5
+
6
+ context '.provider_class' do
7
+ it 'is a AuthorizeNet gateway' do
8
+ expect(gateway.provider_class).to eq ::ActiveMerchant::Billing::AuthorizeNetGateway
9
+ end
10
+ end
11
+
12
+ describe 'options' do
13
+ it 'include :test => true when server is "test"' do
14
+ gateway.preferred_server = "test"
15
+ expect(gateway.options[:test]).to be true
16
+ end
17
+
18
+ it 'does not include :test when server is "live"' do
19
+ gateway.preferred_server = "live"
20
+ expect(gateway.options[:test]).to be false
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::BalancedGateway do
4
+ let(:gateway) { described_class.create!(name: 'Balanced', stores: [::Spree::Store.default]) }
5
+
6
+ context '.provider_class' do
7
+ it 'is a Balanced gateway' do
8
+ expect(gateway.provider_class).to eq ::ActiveMerchant::Billing::BalancedGateway
9
+ end
10
+ end
11
+
12
+ context '.payment_profiles_supported?' do
13
+ it 'return true' do
14
+ expect(gateway.payment_profiles_supported?).to be true
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::Banwire do
4
+ let(:gateway) { described_class.create!(name: 'Banwire', stores: [::Spree::Store.default]) }
5
+
6
+ context '.provider_class' do
7
+ it 'is a Banwire gateway' do
8
+ expect(gateway.provider_class).to eq ::ActiveMerchant::Billing::BanwireGateway
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::Beanstream do
4
+ let(:gateway) { described_class.create!(name: 'Beanstream', stores: [::Spree::Store.default]) }
5
+
6
+ context '.provider_class' do
7
+ it 'is a Beanstream gateway' do
8
+ expect(gateway.provider_class).to eq ::ActiveMerchant::Billing::BeanstreamGateway
9
+ end
10
+ end
11
+
12
+ context '.payment_profiles_supported?' do
13
+ it 'return true' do
14
+ expect(gateway.payment_profiles_supported?).to be true
15
+ end
16
+ end
17
+ end