solidus_gateway 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +23 -0
  5. data/Gemfile +9 -0
  6. data/LICENSE.md +26 -0
  7. data/README.md +38 -0
  8. data/Rakefile +21 -0
  9. data/app/models/spree/billing_integration/skrill/quick_checkout.rb +48 -0
  10. data/app/models/spree/gateway/authorize_net.rb +31 -0
  11. data/app/models/spree/gateway/authorize_net_cim.rb +201 -0
  12. data/app/models/spree/gateway/balanced_gateway.rb +65 -0
  13. data/app/models/spree/gateway/banwire.rb +15 -0
  14. data/app/models/spree/gateway/beanstream.rb +193 -0
  15. data/app/models/spree/gateway/braintree_gateway.rb +184 -0
  16. data/app/models/spree/gateway/card_save.rb +10 -0
  17. data/app/models/spree/gateway/data_cash.rb +10 -0
  18. data/app/models/spree/gateway/eway.rb +20 -0
  19. data/app/models/spree/gateway/linkpoint.rb +28 -0
  20. data/app/models/spree/gateway/maxipago.rb +14 -0
  21. data/app/models/spree/gateway/migs.rb +11 -0
  22. data/app/models/spree/gateway/moneris.rb +10 -0
  23. data/app/models/spree/gateway/pay_junction.rb +16 -0
  24. data/app/models/spree/gateway/pay_pal_gateway.rb +12 -0
  25. data/app/models/spree/gateway/payflow_pro.rb +18 -0
  26. data/app/models/spree/gateway/paymill.rb +12 -0
  27. data/app/models/spree/gateway/pin_gateway.rb +60 -0
  28. data/app/models/spree/gateway/sage_pay.rb +11 -0
  29. data/app/models/spree/gateway/secure_pay_au.rb +10 -0
  30. data/app/models/spree/gateway/spreedly_core_gateway.rb +10 -0
  31. data/app/models/spree/gateway/stripe_gateway.rb +126 -0
  32. data/app/models/spree/gateway/usa_epay.rb +9 -0
  33. data/app/models/spree/gateway/worldpay.rb +91 -0
  34. data/app/models/spree/skrill_transaction.rb +19 -0
  35. data/bin/rails +7 -0
  36. data/circle.yml +6 -0
  37. data/config/locales/bg.yml +11 -0
  38. data/config/locales/de.yml +11 -0
  39. data/config/locales/en.yml +30 -0
  40. data/config/locales/sv.yml +11 -0
  41. data/config/routes.rb +12 -0
  42. data/db/migrate/20111118164631_create_skrill_transactions.rb +14 -0
  43. data/db/migrate/20121017004102_update_braintree_payment_method_type.rb +9 -0
  44. data/db/migrate/20130213222555_update_stripe_payment_method_type.rb +9 -0
  45. data/db/migrate/20130415222802_update_balanced_payment_method_type.rb +9 -0
  46. data/db/migrate/20131008221012_update_paypal_payment_method_type.rb +9 -0
  47. data/db/migrate/20131112133401_migrate_stripe_preferences.rb +8 -0
  48. data/lib/active_merchant/billing/skrill.rb +18 -0
  49. data/lib/assets/javascripts/spree/frontend/solidus_gateway.js +1 -0
  50. data/lib/assets/stylesheets/spree/frontend/solidus_gateway.css +3 -0
  51. data/lib/controllers/frontend/spree/checkout_controller_decorator.rb +51 -0
  52. data/lib/controllers/frontend/spree/skrill_status_controller.rb +39 -0
  53. data/lib/generators/solidus_gateway/install/install_generator.rb +28 -0
  54. data/lib/solidus_gateway.rb +4 -0
  55. data/lib/spree_gateway/engine.rb +67 -0
  56. data/lib/views/backend/spree/admin/log_entries/_braintree.html.erb +31 -0
  57. data/lib/views/backend/spree/admin/log_entries/_stripe.html.erb +28 -0
  58. data/lib/views/backend/spree/admin/payments/source_forms/_quickcheckout.html.erb +8 -0
  59. data/lib/views/backend/spree/admin/payments/source_forms/_stripe.html.erb +1 -0
  60. data/lib/views/backend/spree/admin/payments/source_views/_quickcheckout.html.erb +39 -0
  61. data/lib/views/backend/spree/admin/payments/source_views/_stripe.html.erb +1 -0
  62. data/lib/views/frontend/spree/checkout/payment/_quickcheckout.html.erb +26 -0
  63. data/lib/views/frontend/spree/checkout/payment/_stripe.html.erb +80 -0
  64. data/solidus_gateway.gemspec +33 -0
  65. data/spec/factories/skrill_factory.rb +6 -0
  66. data/spec/features/stripe_checkout_spec.rb +78 -0
  67. data/spec/lib/active_merchant/billing_skrill_spec.rb +18 -0
  68. data/spec/models/billing_integration/skrill_quick_checkout_spec.rb +11 -0
  69. data/spec/models/gateway/authorize_net_cim_spec.rb +29 -0
  70. data/spec/models/gateway/authorize_net_spec.rb +23 -0
  71. data/spec/models/gateway/balanced_gateway_spec.rb +17 -0
  72. data/spec/models/gateway/banwire_spec.rb +11 -0
  73. data/spec/models/gateway/beanstream_spec.rb +17 -0
  74. data/spec/models/gateway/braintree_gateway_spec.rb +437 -0
  75. data/spec/models/gateway/card_save_spec.rb +11 -0
  76. data/spec/models/gateway/data_cache_spec.rb +11 -0
  77. data/spec/models/gateway/eway_spec.rb +29 -0
  78. data/spec/models/gateway/linkpoint_spec.rb +62 -0
  79. data/spec/models/gateway/maxipago_spec.rb +17 -0
  80. data/spec/models/gateway/moneris_spec.rb +11 -0
  81. data/spec/models/gateway/pay_junction_spec.rb +23 -0
  82. data/spec/models/gateway/pay_pal_spec.rb +11 -0
  83. data/spec/models/gateway/payflow_pro_spec.rb +23 -0
  84. data/spec/models/gateway/paymill_spec.rb +11 -0
  85. data/spec/models/gateway/pin_gateway_spec.rb +55 -0
  86. data/spec/models/gateway/sage_pay_spec.rb +11 -0
  87. data/spec/models/gateway/secure_pay_au_spec.rb +11 -0
  88. data/spec/models/gateway/stripe_gateway_spec.rb +200 -0
  89. data/spec/models/gateway/usa_epay_spec.rb +49 -0
  90. data/spec/models/gateway/worldpay_spec.rb +11 -0
  91. data/spec/models/skrill_transaction_spec.rb +9 -0
  92. data/spec/spec_helper.rb +50 -0
  93. metadata +317 -0
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::CardSave do
4
+ let(:gateway) { described_class.create!(name: 'CardSave') }
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::DataCash do
4
+ let(:gateway) { described_class.create!(name: 'DataCash') }
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,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::Eway do
4
+ let(:gateway) { described_class.create!(name: 'Eway') }
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,62 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::Linkpoint do
4
+ let(:gateway) { described_class.create!(name: 'Linkpoint') }
5
+ let(:provider) { double('provider') }
6
+ let(:money) { double('money') }
7
+ let(:credit_card) { double('credit_card') }
8
+ let(:identification) { double('identification') }
9
+ let(:options) { { subtotal: 3, discount: -1 } }
10
+
11
+ before do
12
+ allow(gateway.provider_class).to receive_messages(new: provider)
13
+ end
14
+
15
+ context '.provider_class' do
16
+ it 'is a Linkpoint gateway' do
17
+ expect(gateway.provider_class).to eq ::ActiveMerchant::Billing::LinkpointGateway
18
+ end
19
+ end
20
+
21
+ context '#authorize' do
22
+ it 'adds the discount to the subtotal' do
23
+ expect(provider).to receive(:authorize)
24
+ .with(money, credit_card, subtotal: 2, discount: 0)
25
+ gateway.authorize(money, credit_card, options)
26
+ end
27
+ end
28
+
29
+ context '#purchase' do
30
+ it 'adds the discount to the subtotal' do
31
+ expect(provider).to receive(:purchase)
32
+ .with(money, credit_card, subtotal: 2, discount: 0)
33
+ gateway.purchase(money, credit_card, options)
34
+ end
35
+ end
36
+
37
+ context '#capture' do
38
+ let(:authorization) { double('authorization') }
39
+
40
+ it 'adds the discount to the subtotal' do
41
+ expect(provider).to receive(:capture)
42
+ .with(money, authorization, subtotal: 2, discount: 0)
43
+ gateway.capture(money, authorization, options)
44
+ end
45
+ end
46
+
47
+ context '#void' do
48
+ it 'adds the discount to the subtotal' do
49
+ expect(provider).to receive(:void)
50
+ .with(identification, subtotal: 2, discount: 0)
51
+ gateway.void(identification, options)
52
+ end
53
+ end
54
+
55
+ context '#credit' do
56
+ it 'adds the discount to the subtotal' do
57
+ expect(provider).to receive(:credit)
58
+ .with(money, identification, subtotal: 2, discount: 0)
59
+ gateway.credit(money, identification, options)
60
+ end
61
+ end
62
+ 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') }
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') }
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') }
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') }
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') }
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,55 @@
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', environment: 'sandbox', active: true)
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!
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
+ @payment.payment_method.environment = 'test'
39
+ end
40
+
41
+ it 'can purchase' do
42
+ @payment.purchase!
43
+ expect(@payment.state).to eq 'completed'
44
+ end
45
+
46
+ # Regression test for #106
47
+ it 'uses auto capturing' do
48
+ expect(@gateway.auto_capture?).to be true
49
+ end
50
+
51
+ it 'always uses purchase' do
52
+ expect(@payment).to receive(:purchase!)
53
+ @payment.process!
54
+ end
55
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Gateway::SagePay do
4
+ let(:gateway) { described_class.create!(name: 'SagePay') }
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') }
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,200 @@
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
+ allow(p).to receive(:purchase)
21
+ allow(p).to receive(:authorize)
22
+ allow(p).to receive(:capture)
23
+ end
24
+ end
25
+
26
+ before do
27
+ subject.preferences = { secret_key: secret_key }
28
+ allow(subject).to receive(:options_for_purchase_or_auth).and_return(['money','cc','opts'])
29
+ allow(subject).to receive(:provider).and_return provider
30
+ end
31
+
32
+ describe '#create_profile' do
33
+ before do
34
+ allow(payment.source).to receive(:update_attributes!)
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
+ expect(subject.provider).to 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
+ expect(subject.provider).to 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
+ allow(subject.provider).to receive(: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
+ expect(subject.provider).to 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
+ expect(provider).to 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
+ expect(provider).to 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
+ expect(provider).to receive(:capture).with(1234,anything,anything)
147
+ end
148
+
149
+ it 'use the response code as the authorization' do
150
+ expect(provider).to 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(:environment => 'test', :active => true)
157
+ gateway.set_preference :secret_key, secret_key
158
+ allow(gateway).to receive(:options_for_purchase_or_auth).and_return(['money','cc','opts'])
159
+ allow(gateway).to receive(:provider).and_return provider
160
+ allow(gateway).to receive_messages :source_required => true
161
+ gateway
162
+ end
163
+
164
+ let(:order) { Spree::Order.create }
165
+
166
+ let(:card) do
167
+ FactoryGirl.create(
168
+ :credit_card,
169
+ gateway_customer_profile_id: 'cus_abcde',
170
+ imported: false
171
+ )
172
+ end
173
+
174
+ let(:payment) do
175
+ payment = Spree::Payment.new
176
+ payment.source = card
177
+ payment.order = order
178
+ payment.payment_method = gateway
179
+ payment.amount = 98.55
180
+ payment.state = 'pending'
181
+ payment.response_code = '12345'
182
+ payment
183
+ end
184
+
185
+ let!(:success_response) do
186
+ double('success_response', :success? => true,
187
+ :authorization => '123',
188
+ :avs_result => { 'code' => 'avs-code' },
189
+ :cvv_result => { 'code' => 'cvv-code', 'message' => "CVV Result"})
190
+ end
191
+
192
+ after do
193
+ payment.capture!
194
+ end
195
+
196
+ it 'gets correct amount' do
197
+ expect(provider).to receive(:capture).with(9855,'12345',anything).and_return(success_response)
198
+ end
199
+ end
200
+ end