archetype_spree_gateway 3.9.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +21 -0
- data/.rspec +3 -0
- data/.travis.yml +39 -0
- data/Gemfile +9 -0
- data/Guardfile +9 -0
- data/LICENSE.md +26 -0
- data/README.md +105 -0
- data/Rakefile +15 -0
- data/app/models/spree/billing_integration.rb +21 -0
- data/app/models/spree/check.rb +41 -0
- data/app/models/spree/gateway/authorize_net.rb +45 -0
- data/app/models/spree/gateway/authorize_net_cim.rb +213 -0
- data/app/models/spree/gateway/balanced_gateway.rb +64 -0
- data/app/models/spree/gateway/banwire.rb +15 -0
- data/app/models/spree/gateway/beanstream.rb +193 -0
- data/app/models/spree/gateway/braintree_gateway.rb +184 -0
- data/app/models/spree/gateway/card_save.rb +10 -0
- data/app/models/spree/gateway/cyber_source.rb +10 -0
- data/app/models/spree/gateway/data_cash.rb +10 -0
- data/app/models/spree/gateway/epay.rb +10 -0
- data/app/models/spree/gateway/eway.rb +18 -0
- data/app/models/spree/gateway/eway_rapid.rb +14 -0
- data/app/models/spree/gateway/maxipago.rb +14 -0
- data/app/models/spree/gateway/migs.rb +11 -0
- data/app/models/spree/gateway/moneris.rb +10 -0
- data/app/models/spree/gateway/pay_junction.rb +14 -0
- data/app/models/spree/gateway/pay_pal_gateway.rb +12 -0
- data/app/models/spree/gateway/payflow_pro.rb +15 -0
- data/app/models/spree/gateway/paymill.rb +12 -0
- data/app/models/spree/gateway/payu_polska_gateway.rb +24 -0
- data/app/models/spree/gateway/pin_gateway.rb +60 -0
- data/app/models/spree/gateway/quickpay.rb +9 -0
- data/app/models/spree/gateway/sage_pay.rb +11 -0
- data/app/models/spree/gateway/secure_pay_au.rb +10 -0
- data/app/models/spree/gateway/spreedly_core_gateway.rb +11 -0
- data/app/models/spree/gateway/stripe_ach_gateway.rb +60 -0
- data/app/models/spree/gateway/stripe_apple_pay_gateway.rb +10 -0
- data/app/models/spree/gateway/stripe_elements_gateway.rb +61 -0
- data/app/models/spree/gateway/stripe_gateway.rb +151 -0
- data/app/models/spree/gateway/usa_epay_transaction.rb +9 -0
- data/app/models/spree/gateway/worldpay.rb +91 -0
- data/app/models/spree/payu_polska.rb +41 -0
- data/app/models/spree_gateway/apple_pay_order_decorator.rb +20 -0
- data/app/models/spree_gateway/apple_pay_payment_decorator.rb +9 -0
- data/app/models/spree_gateway/credit_card_decorator.rb +10 -0
- data/app/models/spree_gateway/order_decorator.rb +28 -0
- data/app/models/spree_gateway/payment_decorator.rb +36 -0
- data/app/views/spree/checkout/_payment_confirm.html.erb +39 -0
- data/app/views/spree/checkout/_payu.html +12 -0
- data/config/initializers/inflections.rb +3 -0
- data/config/initializers/spree_permitted_attributes.rb +5 -0
- data/config/locales/bg.yml +4 -0
- data/config/locales/de.yml +4 -0
- data/config/locales/en.yml +47 -0
- data/config/locales/sv.yml +4 -0
- data/config/routes.rb +19 -0
- data/db/migrate/20200317135551_add_spree_check_payment_source.rb +22 -0
- data/db/migrate/20200422114908_add_intent_key_to_payment.rb +5 -0
- data/lib/active_merchant/billing/stripe_gateway_decorator.rb +33 -0
- data/lib/controllers/spree/api/v2/storefront/intents_controller.rb +45 -0
- data/lib/controllers/spree/apple_pay_domain_verification_controller.rb +11 -0
- data/lib/generators/spree_gateway/install/install_generator.rb +19 -0
- data/lib/spree_frontend/controllers/spree/checkout_controller_decorator.rb +19 -0
- data/lib/spree_gateway/engine.rb +80 -0
- data/lib/spree_gateway/version.rb +5 -0
- data/lib/spree_gateway.rb +4 -0
- data/lib/views/backend/spree/admin/log_entries/_braintree.html.erb +31 -0
- data/lib/views/backend/spree/admin/log_entries/_stripe.html.erb +28 -0
- data/lib/views/backend/spree/admin/payments/source_forms/_quickcheckout.html.erb +8 -0
- data/lib/views/backend/spree/admin/payments/source_forms/_stripe.html.erb +79 -0
- data/lib/views/backend/spree/admin/payments/source_forms/_stripe_ach.html.erb +86 -0
- data/lib/views/backend/spree/admin/payments/source_forms/_stripe_apple_pay.html.erb +0 -0
- data/lib/views/backend/spree/admin/payments/source_forms/_stripe_elements.html.erb +79 -0
- data/lib/views/backend/spree/admin/payments/source_views/_stripe.html.erb +1 -0
- data/lib/views/backend/spree/admin/payments/source_views/_stripe_ach.html.erb +21 -0
- data/lib/views/backend/spree/admin/payments/source_views/_stripe_apple_pay.html.erb +1 -0
- data/lib/views/backend/spree/admin/payments/source_views/_stripe_elements.html.erb +1 -0
- data/lib/views/frontend/spree/checkout/payment/_stripe.html.erb +86 -0
- data/lib/views/frontend/spree/checkout/payment/_stripe_ach.html.erb +81 -0
- data/lib/views/frontend/spree/checkout/payment/_stripe_ach_verify.html.erb +16 -0
- data/lib/views/frontend/spree/checkout/payment/_stripe_additional_info.html.erb +16 -0
- data/lib/views/frontend/spree/checkout/payment/_stripe_apple_pay.html.erb +109 -0
- data/lib/views/frontend/spree/checkout/payment/_stripe_elements.html.erb +110 -0
- data/script/rails +7 -0
- data/spec/factories/check_factory.rb +10 -0
- data/spec/features/admin/stripe_elements_payment_spec.rb +100 -0
- data/spec/features/stripe_checkout_spec.rb +130 -0
- data/spec/features/stripe_elements_3ds_checkout_spec.rb +225 -0
- data/spec/models/gateway/authorize_net_cim_spec.rb +29 -0
- data/spec/models/gateway/authorize_net_spec.rb +23 -0
- data/spec/models/gateway/balanced_gateway_spec.rb +17 -0
- data/spec/models/gateway/banwire_spec.rb +11 -0
- data/spec/models/gateway/beanstream_spec.rb +17 -0
- data/spec/models/gateway/braintree_gateway_spec.rb +420 -0
- data/spec/models/gateway/card_save_spec.rb +11 -0
- data/spec/models/gateway/cyber_source_spec.rb +11 -0
- data/spec/models/gateway/data_cash_spec.rb +11 -0
- data/spec/models/gateway/epay_spec.rb +11 -0
- data/spec/models/gateway/eway_rapid_spec.rb +23 -0
- data/spec/models/gateway/eway_spec.rb +29 -0
- data/spec/models/gateway/maxipago_spec.rb +17 -0
- data/spec/models/gateway/moneris_spec.rb +11 -0
- data/spec/models/gateway/pay_junction_spec.rb +23 -0
- data/spec/models/gateway/pay_pal_spec.rb +11 -0
- data/spec/models/gateway/payflow_pro_spec.rb +23 -0
- data/spec/models/gateway/paymill_spec.rb +11 -0
- data/spec/models/gateway/pin_gateway_spec.rb +54 -0
- data/spec/models/gateway/quickpay_spec.rb +11 -0
- data/spec/models/gateway/sage_pay_spec.rb +11 -0
- data/spec/models/gateway/secure_pay_au_spec.rb +11 -0
- data/spec/models/gateway/stripe_ach_gateway_spec.rb +186 -0
- data/spec/models/gateway/stripe_gateway_spec.rb +199 -0
- data/spec/models/gateway/usa_epay_transaction_spec.rb +49 -0
- data/spec/models/gateway/worldpay_spec.rb +11 -0
- data/spec/models/spree/order_spec.rb +79 -0
- data/spec/requests/apple_pay_domain_verification.rb +45 -0
- data/spec/requests/spree/api/v2/storefront/intents_controller_spec.rb +198 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/support/order_walktrough.rb +73 -0
- data/spec/support/wait_for_stripe.rb +27 -0
- data/spec/support/within_stripe_3ds_popup.rb +10 -0
- data/spree_gateway.gemspec +37 -0
- metadata +277 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Gateway::Quickpay do
|
|
4
|
+
let(:gateway) { described_class.create!(name: 'QuickpayGateway', stores: [::Spree::Store.default]) }
|
|
5
|
+
|
|
6
|
+
context '.provider_class' do
|
|
7
|
+
it 'is a Quickpay gateway' do
|
|
8
|
+
expect(gateway.provider_class).to eq ::ActiveMerchant::Billing::QuickpayV10Gateway
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Gateway::SagePay do
|
|
4
|
+
let(:gateway) { described_class.create!(name: 'SagePay', stores: [::Spree::Store.default]) }
|
|
5
|
+
|
|
6
|
+
context '.provider_class' do
|
|
7
|
+
it 'is a SagePay gateway' do
|
|
8
|
+
expect(gateway.provider_class).to eq ::ActiveMerchant::Billing::SagePayGateway
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Gateway::SecurePayAU do
|
|
4
|
+
let(:gateway) { described_class.create!(name: 'SecurePayAU', stores: [::Spree::Store.default]) }
|
|
5
|
+
|
|
6
|
+
context '.provider_class' do
|
|
7
|
+
it 'is a SecurePayAU gateway' do
|
|
8
|
+
expect(gateway.provider_class).to eq ::ActiveMerchant::Billing::SecurePayAuGateway
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Gateway::StripeAchGateway do
|
|
4
|
+
let(:secret_key) { 'key' }
|
|
5
|
+
let(:email) { 'customer@example.com' }
|
|
6
|
+
let(:source) { Spree::Check.new }
|
|
7
|
+
let(:payment) {
|
|
8
|
+
double('Spree::Payment',
|
|
9
|
+
source: source,
|
|
10
|
+
order: double('Spree::Order',
|
|
11
|
+
email: email,
|
|
12
|
+
bill_address: bill_address,
|
|
13
|
+
user: double('Spree::User',
|
|
14
|
+
email: email)
|
|
15
|
+
)
|
|
16
|
+
)
|
|
17
|
+
}
|
|
18
|
+
let(:provider) do
|
|
19
|
+
double('provider').tap do |p|
|
|
20
|
+
p.stub(:purchase)
|
|
21
|
+
p.stub(:authorize)
|
|
22
|
+
p.stub(:capture)
|
|
23
|
+
p.stub(:verify)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
before do
|
|
28
|
+
subject.preferences = { secret_key: secret_key }
|
|
29
|
+
subject.stub(:options_for_purchase_or_auth).and_return(['money','check','opts'])
|
|
30
|
+
subject.stub(:provider).and_return provider
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
describe '#create_profile' do
|
|
34
|
+
before do
|
|
35
|
+
payment.source.stub(:update!)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
context 'with an order that has a bill address' do
|
|
39
|
+
let(:bill_address) {
|
|
40
|
+
double('Spree::Address',
|
|
41
|
+
address1: '123 Happy Road',
|
|
42
|
+
address2: 'Apt 303',
|
|
43
|
+
city: 'Suzarac',
|
|
44
|
+
zipcode: '95671',
|
|
45
|
+
state: double('Spree::State', name: 'Oregon'),
|
|
46
|
+
country: double('Spree::Country', name: 'United States')
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
it 'stores the bill address with the provider' do
|
|
51
|
+
subject.provider.should_receive(:store).with(payment.source, {
|
|
52
|
+
email: email,
|
|
53
|
+
login: secret_key,
|
|
54
|
+
|
|
55
|
+
address: {
|
|
56
|
+
address1: '123 Happy Road',
|
|
57
|
+
address2: 'Apt 303',
|
|
58
|
+
city: 'Suzarac',
|
|
59
|
+
zip: '95671',
|
|
60
|
+
state: 'Oregon',
|
|
61
|
+
country: 'United States'
|
|
62
|
+
}
|
|
63
|
+
}).and_return double.as_null_object
|
|
64
|
+
|
|
65
|
+
subject.create_profile payment
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
context 'with an order that does not have a bill address' do
|
|
70
|
+
let(:bill_address) { nil }
|
|
71
|
+
|
|
72
|
+
it 'does not store a bill address with the provider' do
|
|
73
|
+
subject.provider.should_receive(:store).with(payment.source, {
|
|
74
|
+
email: email,
|
|
75
|
+
login: secret_key
|
|
76
|
+
}).and_return double.as_null_object
|
|
77
|
+
|
|
78
|
+
subject.create_profile payment
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
context 'with a check represents payment_profile' do
|
|
84
|
+
let(:source) { Spree::Check.new(gateway_payment_profile_id: 'tok_profileid') }
|
|
85
|
+
let(:bill_address) { nil }
|
|
86
|
+
|
|
87
|
+
it 'stores the profile_id as a check' do
|
|
88
|
+
subject.provider.should_receive(:store).with(source.gateway_payment_profile_id, anything).and_return double.as_null_object
|
|
89
|
+
|
|
90
|
+
subject.create_profile payment
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
context 'purchasing' do
|
|
96
|
+
after do
|
|
97
|
+
subject.purchase(19.99, 'check', {})
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it 'send the payment to the provider' do
|
|
101
|
+
provider.should_receive(:purchase).with('money', 'check', 'opts')
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
context 'authorizing' do
|
|
106
|
+
after do
|
|
107
|
+
subject.authorize(19.99, 'check', {})
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it 'send the authorization to the provider' do
|
|
111
|
+
provider.should_receive(:authorize).with('money', 'check', 'opts')
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
context 'verifying' do
|
|
116
|
+
after do
|
|
117
|
+
subject.verify(source, {})
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
it 'send the verify to the provider' do
|
|
121
|
+
provider.should_receive(:verify).with(source, anything)
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
context 'capturing' do
|
|
126
|
+
|
|
127
|
+
after do
|
|
128
|
+
subject.capture(1234, 'response_code', {})
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it 'convert the amount to cents' do
|
|
132
|
+
provider.should_receive(:capture).with(1234, anything, anything)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
it 'use the response code as the authorization' do
|
|
136
|
+
provider.should_receive(:capture).with(anything, 'response_code', anything)
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
context 'capture with payment class' do
|
|
141
|
+
let(:gateway) do
|
|
142
|
+
gateway = described_class.new(active: true)
|
|
143
|
+
gateway.set_preference :secret_key, secret_key
|
|
144
|
+
gateway.stub(:options_for_purchase_or_auth).and_return(['money', 'check', 'opts'])
|
|
145
|
+
gateway.stub(:provider).and_return provider
|
|
146
|
+
gateway.stub source_required: true
|
|
147
|
+
gateway
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
let(:order) { Spree::Order.create }
|
|
151
|
+
|
|
152
|
+
let(:check) do
|
|
153
|
+
# mock_model(Spree::Check, :gateway_customer_profile_id => 'cus_abcde',
|
|
154
|
+
# :imported => false)
|
|
155
|
+
create :check, gateway_customer_profile_id: 'cus_abcde', imported: false
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
let(:payment) do
|
|
159
|
+
payment = Spree::Payment.new
|
|
160
|
+
payment.source = check
|
|
161
|
+
payment.order = order
|
|
162
|
+
payment.payment_method = gateway
|
|
163
|
+
payment.amount = 98.55
|
|
164
|
+
payment.state = 'pending'
|
|
165
|
+
payment.response_code = '12345'
|
|
166
|
+
payment
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
after do
|
|
170
|
+
payment.capture!
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
let!(:success_response) do
|
|
174
|
+
double('success_response',
|
|
175
|
+
success?: true,
|
|
176
|
+
authorization: '123',
|
|
177
|
+
avs_result: { 'code' => 'avs-code' },
|
|
178
|
+
cvv_result: { 'code' => 'cvv-code', 'message' => 'CVV Result' },
|
|
179
|
+
params: {})
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
it 'gets correct amount' do
|
|
183
|
+
provider.should_receive(:capture).with(9855, '12345', anything).and_return(success_response)
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
end
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Gateway::StripeGateway do
|
|
4
|
+
let(:secret_key) { 'key' }
|
|
5
|
+
let(:email) { 'customer@example.com' }
|
|
6
|
+
let(:source) { Spree::CreditCard.new }
|
|
7
|
+
|
|
8
|
+
let(:payment) {
|
|
9
|
+
double('Spree::Payment',
|
|
10
|
+
source: source,
|
|
11
|
+
order: double('Spree::Order',
|
|
12
|
+
email: email,
|
|
13
|
+
bill_address: bill_address
|
|
14
|
+
)
|
|
15
|
+
)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let(:provider) do
|
|
19
|
+
double('provider').tap do |p|
|
|
20
|
+
p.stub(:purchase)
|
|
21
|
+
p.stub(:authorize)
|
|
22
|
+
p.stub(:capture)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
before do
|
|
27
|
+
subject.preferences = { secret_key: secret_key }
|
|
28
|
+
subject.stub(:options_for_purchase_or_auth).and_return(['money','cc','opts'])
|
|
29
|
+
subject.stub(:provider).and_return provider
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
describe '#create_profile' do
|
|
33
|
+
before do
|
|
34
|
+
payment.source.stub(:update!)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context 'with an order that has a bill address' do
|
|
38
|
+
let(:bill_address) {
|
|
39
|
+
double('Spree::Address',
|
|
40
|
+
address1: '123 Happy Road',
|
|
41
|
+
address2: 'Apt 303',
|
|
42
|
+
city: 'Suzarac',
|
|
43
|
+
zipcode: '95671',
|
|
44
|
+
state: double('Spree::State', name: 'Oregon'),
|
|
45
|
+
country: double('Spree::Country', name: 'United States')
|
|
46
|
+
)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
it 'stores the bill address with the provider' do
|
|
50
|
+
subject.provider.should_receive(:store).with(payment.source, {
|
|
51
|
+
email: email,
|
|
52
|
+
login: secret_key,
|
|
53
|
+
|
|
54
|
+
address: {
|
|
55
|
+
address1: '123 Happy Road',
|
|
56
|
+
address2: 'Apt 303',
|
|
57
|
+
city: 'Suzarac',
|
|
58
|
+
zip: '95671',
|
|
59
|
+
state: 'Oregon',
|
|
60
|
+
country: 'United States'
|
|
61
|
+
}
|
|
62
|
+
}).and_return double.as_null_object
|
|
63
|
+
|
|
64
|
+
subject.create_profile payment
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
context 'with an order that does not have a bill address' do
|
|
69
|
+
let(:bill_address) { nil }
|
|
70
|
+
|
|
71
|
+
it 'does not store a bill address with the provider' do
|
|
72
|
+
subject.provider.should_receive(:store).with(payment.source, {
|
|
73
|
+
email: email,
|
|
74
|
+
login: secret_key,
|
|
75
|
+
}).and_return double.as_null_object
|
|
76
|
+
|
|
77
|
+
subject.create_profile payment
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Regression test for #141
|
|
81
|
+
context "correcting the card type" do
|
|
82
|
+
before do
|
|
83
|
+
# We don't care about this method for these tests
|
|
84
|
+
subject.provider.stub(:store).and_return(double.as_null_object)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it "converts 'American Express' to 'american_express'" do
|
|
88
|
+
payment.source.cc_type = 'American Express'
|
|
89
|
+
subject.create_profile(payment)
|
|
90
|
+
expect(payment.source.cc_type).to eq('american_express')
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "converts 'Diners Club' to 'diners_club'" do
|
|
94
|
+
payment.source.cc_type = 'Diners Club'
|
|
95
|
+
subject.create_profile(payment)
|
|
96
|
+
expect(payment.source.cc_type).to eq('diners_club')
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it "converts 'Visa' to 'visa'" do
|
|
100
|
+
payment.source.cc_type = 'Visa'
|
|
101
|
+
subject.create_profile(payment)
|
|
102
|
+
expect(payment.source.cc_type).to eq('visa')
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
context 'with a card represents payment_profile' do
|
|
108
|
+
let(:source) { Spree::CreditCard.new(gateway_payment_profile_id: 'tok_profileid') }
|
|
109
|
+
let(:bill_address) { nil }
|
|
110
|
+
|
|
111
|
+
it 'stores the profile_id as a card' do
|
|
112
|
+
subject.provider.should_receive(:store).with(source.gateway_payment_profile_id, anything).and_return double.as_null_object
|
|
113
|
+
|
|
114
|
+
subject.create_profile payment
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
context 'purchasing' do
|
|
120
|
+
after do
|
|
121
|
+
subject.purchase(19.99, 'credit card', {})
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it 'send the payment to the provider' do
|
|
125
|
+
provider.should_receive(:purchase).with('money','cc','opts')
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
context 'authorizing' do
|
|
130
|
+
after do
|
|
131
|
+
subject.authorize(19.99, 'credit card', {})
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
it 'send the authorization to the provider' do
|
|
135
|
+
provider.should_receive(:authorize).with('money','cc','opts')
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
context 'capturing' do
|
|
140
|
+
|
|
141
|
+
after do
|
|
142
|
+
subject.capture(1234, 'response_code', {})
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
it 'convert the amount to cents' do
|
|
146
|
+
provider.should_receive(:capture).with(1234,anything,anything)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
it 'use the response code as the authorization' do
|
|
150
|
+
provider.should_receive(:capture).with(anything,'response_code',anything)
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
context 'capture with payment class' do
|
|
155
|
+
let(:gateway) do
|
|
156
|
+
gateway = described_class.new(active: true)
|
|
157
|
+
gateway.set_preference :secret_key, secret_key
|
|
158
|
+
gateway.stub(:options_for_purchase_or_auth).and_return(['money','cc','opts'])
|
|
159
|
+
gateway.stub(:provider).and_return provider
|
|
160
|
+
gateway.stub :source_required => true
|
|
161
|
+
gateway
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
let(:order) { Spree::Order.create }
|
|
165
|
+
|
|
166
|
+
let(:card) do
|
|
167
|
+
# mock_model(Spree::CreditCard, :gateway_customer_profile_id => 'cus_abcde',
|
|
168
|
+
# :imported => false)
|
|
169
|
+
create :credit_card, gateway_customer_profile_id: 'cus_abcde', imported: false
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
let(:payment) do
|
|
173
|
+
payment = Spree::Payment.new
|
|
174
|
+
payment.source = card
|
|
175
|
+
payment.order = order
|
|
176
|
+
payment.payment_method = gateway
|
|
177
|
+
payment.amount = 98.55
|
|
178
|
+
payment.state = 'pending'
|
|
179
|
+
payment.response_code = '12345'
|
|
180
|
+
payment
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
let!(:success_response) do
|
|
184
|
+
double('success_response', :success? => true,
|
|
185
|
+
:params => {},
|
|
186
|
+
:authorization => '123',
|
|
187
|
+
:avs_result => { 'code' => 'avs-code' },
|
|
188
|
+
:cvv_result => { 'code' => 'cvv-code', 'message' => "CVV Result"})
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
after do
|
|
192
|
+
payment.capture!
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
it 'gets correct amount' do
|
|
196
|
+
provider.should_receive(:capture).with(9855,'12345',anything).and_return(success_response)
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Gateway::UsaEpayTransaction do
|
|
4
|
+
before do
|
|
5
|
+
Spree::Gateway.update_all(active: false)
|
|
6
|
+
@gateway = Spree::Gateway::UsaEpayTransaction.create!(name: 'USA EPay Gateway', active: true, stores: [::Spree::Store.default])
|
|
7
|
+
@gateway.set_preference(:login, '0r19zQBdp5nS8i3t4hFxz0di13yf56q1')
|
|
8
|
+
@gateway.save!
|
|
9
|
+
|
|
10
|
+
country = Spree::Country.find_by(name: 'United States of America')
|
|
11
|
+
state = create(:state, name: 'Maryland', abbr: 'MD', country: country)
|
|
12
|
+
address = create(:address,
|
|
13
|
+
firstname: 'John',
|
|
14
|
+
lastname: 'Doe',
|
|
15
|
+
address1: '1234 My Street',
|
|
16
|
+
address2: 'Apt 1',
|
|
17
|
+
city: 'Washington DC',
|
|
18
|
+
zipcode: '20123',
|
|
19
|
+
phone: '(555)555-5555',
|
|
20
|
+
state: state,
|
|
21
|
+
country: country)
|
|
22
|
+
|
|
23
|
+
order = create(:order_with_totals, bill_address: address, ship_address: address)
|
|
24
|
+
order.update_with_updater!
|
|
25
|
+
|
|
26
|
+
credit_card = create(:credit_card,
|
|
27
|
+
verification_value: '123',
|
|
28
|
+
number: '4111111111111111',
|
|
29
|
+
month: 9,
|
|
30
|
+
year: Time.now.year + 1,
|
|
31
|
+
name: 'John Doe',
|
|
32
|
+
cc_type: '')
|
|
33
|
+
|
|
34
|
+
@payment = create(:payment, source: credit_card, order: order, payment_method: @gateway, amount: 10.00)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context 'purchasing' do
|
|
38
|
+
it 'can purchase a payment' do
|
|
39
|
+
skip 'login key is no longer valid'
|
|
40
|
+
expect(@payment.purchase!).to be_truthy
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
context '.provider_class' do
|
|
45
|
+
it 'is a UsaEpayTransaction gateway' do
|
|
46
|
+
expect(@gateway.provider_class).to eq ::ActiveMerchant::Billing::UsaEpayTransactionGateway
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Gateway::Worldpay do
|
|
4
|
+
let(:gateway) { described_class.create!(name: 'Worldpay', stores: [::Spree::Store.default]) }
|
|
5
|
+
|
|
6
|
+
context '.provider_class' do
|
|
7
|
+
it 'is a Worldpay gateway' do
|
|
8
|
+
expect(gateway.provider_class).to eq ::ActiveMerchant::Billing::WorldpayGateway
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Order do
|
|
4
|
+
let(:order_one) { OrderWalkthrough.up_to(:payment) }
|
|
5
|
+
let(:order_two) { OrderWalkthrough.up_to(:payment) }
|
|
6
|
+
let(:stripe_apple_pay_payment_method) do
|
|
7
|
+
Spree::Gateway::StripeApplePayGateway.create!(
|
|
8
|
+
name: 'ApplePay',
|
|
9
|
+
preferred_domain_verification_certificate: FFaker::Lorem.characters(20),
|
|
10
|
+
stores: [::Spree::Store.default]
|
|
11
|
+
)
|
|
12
|
+
end
|
|
13
|
+
let(:stripe_credit_card_payment_method) do
|
|
14
|
+
Spree::Gateway::StripeGateway.create!(
|
|
15
|
+
name: 'CreditCard',
|
|
16
|
+
preferred_secret_key: FFaker::Lorem.characters(20),
|
|
17
|
+
preferred_publishable_key: FFaker::Lorem.characters(20),
|
|
18
|
+
stores: [::Spree::Store.default]
|
|
19
|
+
)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
before do
|
|
23
|
+
Spree::Config[:always_include_confirm_step] = true
|
|
24
|
+
allow_any_instance_of(Spree::PaymentMethod).to receive(:source_required?).and_return(false)
|
|
25
|
+
|
|
26
|
+
order_one.payments.create(payment_method_id: stripe_apple_pay_payment_method.id,
|
|
27
|
+
amount: 29.99,
|
|
28
|
+
state: 'completed')
|
|
29
|
+
order_two.payments.create(payment_method_id: stripe_credit_card_payment_method.id,
|
|
30
|
+
amount: 29.99,
|
|
31
|
+
state: 'completed')
|
|
32
|
+
order_one.update_totals
|
|
33
|
+
order_two.update_totals
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
describe '#paid_with_apple_pay?' do
|
|
37
|
+
context 'when an order was paid with Apply Pay' do
|
|
38
|
+
it 'returns true' do
|
|
39
|
+
expect(order_one.paid_with_apple_pay?).to eq true
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
context 'when an order was paid with Credit Card' do
|
|
44
|
+
it 'returns false' do
|
|
45
|
+
expect(order_two.paid_with_apple_pay?).to eq false
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
describe '#confirmation_required?' do
|
|
51
|
+
context 'when an order was paid with Apply Pay' do
|
|
52
|
+
it 'returns false' do
|
|
53
|
+
expect(order_one.confirmation_required?).to eq false
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
context 'when an order was paid with Credit Card' do
|
|
58
|
+
it 'returns true' do
|
|
59
|
+
expect(order_two.confirmation_required?).to eq true
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
context 'when an order was paid with Apply Pay' do
|
|
65
|
+
it 'proceeds to Complete order state' do
|
|
66
|
+
order_one.next
|
|
67
|
+
|
|
68
|
+
expect(order_one.state).to eq 'complete'
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
context 'when an order was paid with Credit Card' do
|
|
73
|
+
it 'proceeds to Confirm order state' do
|
|
74
|
+
order_two.next
|
|
75
|
+
|
|
76
|
+
expect(order_two.state).to eq 'confirm'
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe 'Apple Pay Domain Verification', type: :request do
|
|
4
|
+
let(:domain_verification_certificate) { FFaker::Lorem.characters(20) }
|
|
5
|
+
let(:stripe_apple_pay_payment_method) do
|
|
6
|
+
Spree::Gateway::StripeApplePayGateway.create!(
|
|
7
|
+
name: 'ApplePay',
|
|
8
|
+
preferred_domain_verification_certificate: domain_verification_certificate
|
|
9
|
+
)
|
|
10
|
+
end
|
|
11
|
+
let(:execute) { get '/.well-known/apple-developer-merchantid-domain-association' }
|
|
12
|
+
|
|
13
|
+
shared_examples 'returns 404' do
|
|
14
|
+
it 'returns RecordNotFound exception' do
|
|
15
|
+
expect { execute }.to raise_exception(ActiveRecord::RecordNotFound)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context 'apple pay gateway exists' do
|
|
20
|
+
before do
|
|
21
|
+
stripe_apple_pay_payment_method
|
|
22
|
+
execute
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it 'returns 200 HTTP status' do
|
|
26
|
+
expect(response.status).to eq(200)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it 'renders domain verification certificate' do
|
|
30
|
+
expect(response.body).to eq domain_verification_certificate
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
context 'apple pay gateway doesnt exist' do
|
|
35
|
+
it_behaves_like 'returns 404'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
context 'apple pay gateway not active' do
|
|
39
|
+
before do
|
|
40
|
+
stripe_apple_pay_payment_method.update_column(:active, false)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it_behaves_like 'returns 404'
|
|
44
|
+
end
|
|
45
|
+
end
|