spree_gateway 2.2.0 → 2.2.1
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 +4 -4
- data/.gitignore +9 -0
- data/.rspec +1 -0
- data/.travis.yml +23 -0
- data/Gemfile +5 -0
- data/Guardfile +9 -0
- data/LICENSE.md +26 -0
- data/README.md +71 -0
- data/Rakefile +15 -0
- data/Versionfile +7 -0
- data/app/assets/javascripts/spree/frontend/spree_gateway.js +3 -0
- data/app/assets/javascripts/store/gateway/stripe.js.coffee +58 -0
- data/app/assets/javascripts/store/spree_gateway.js +2 -0
- data/app/assets/stylesheets/spree/frontend/spree_gateway.css +3 -0
- data/app/controllers/spree/checkout_controller_decorator.rb +51 -0
- data/app/controllers/spree/skrill_status_controller.rb +39 -0
- data/app/models/spree/billing_integration/skrill/quick_checkout.rb +48 -0
- data/app/models/spree/gateway/authorize_net.rb +16 -0
- data/app/models/spree/gateway/authorize_net_cim.rb +132 -0
- data/app/models/spree/gateway/balanced_gateway.rb +67 -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 +147 -0
- data/app/models/spree/gateway/card_save.rb +10 -0
- data/app/models/spree/gateway/data_cash.rb +10 -0
- data/app/models/spree/gateway/eway.rb +20 -0
- data/app/models/spree/gateway/fatzebra.rb +15 -0
- data/app/models/spree/gateway/linkpoint.rb +28 -0
- data/app/models/spree/gateway/maxipago.rb +14 -0
- data/app/models/spree/gateway/moneris.rb +10 -0
- data/app/models/spree/gateway/pay_junction.rb +16 -0
- data/app/models/spree/gateway/pay_pal_gateway.rb +12 -0
- data/app/models/spree/gateway/payflow_pro.rb +17 -0
- data/app/models/spree/gateway/paymill.rb +12 -0
- data/app/models/spree/gateway/pin_gateway.rb +15 -0
- data/app/models/spree/gateway/sage_pay.rb +11 -0
- data/app/models/spree/gateway/samurai.rb +63 -0
- data/app/models/spree/gateway/secure_pay_au.rb +10 -0
- data/app/models/spree/gateway/stripe_gateway.rb +103 -0
- data/app/models/spree/gateway/usa_epay.rb +9 -0
- data/app/models/spree/gateway/worldpay.rb +91 -0
- data/app/models/spree/skrill_transaction.rb +19 -0
- data/app/views/spree/admin/log_entries/_braintree.html.erb +31 -0
- data/app/views/spree/admin/log_entries/_stripe.html.erb +28 -0
- data/app/views/spree/admin/payments/source_forms/_quickcheckout.html.erb +8 -0
- data/app/views/spree/admin/payments/source_forms/_stripe.html.erb +1 -0
- data/app/views/spree/admin/payments/source_views/_quickcheckout.html.erb +39 -0
- data/app/views/spree/admin/payments/source_views/_stripe.html.erb +1 -0
- data/app/views/spree/checkout/payment/_quickcheckout.html.erb +26 -0
- data/app/views/spree/checkout/payment/_stripe.html.erb +21 -0
- data/config/initializers/savon.rb +3 -0
- data/config/locales/bg.yml +11 -0
- data/config/locales/de.yml +11 -0
- data/config/locales/en.yml +30 -0
- data/config/locales/sv.yml +11 -0
- data/config/routes.rb +13 -0
- data/db/migrate/20111118164631_create_skrill_transactions.rb +14 -0
- data/db/migrate/20121017004102_update_braintree_payment_method_type.rb +9 -0
- data/db/migrate/20130213222555_update_stripe_payment_method_type.rb +9 -0
- data/db/migrate/20130415222802_update_balanced_payment_method_type.rb +9 -0
- data/db/migrate/20131008221012_update_paypal_payment_method_type.rb +9 -0
- data/db/migrate/20131112133401_migrate_stripe_preferences.rb +8 -0
- data/lib/active_merchant/billing/skrill.rb +18 -0
- data/lib/generators/spree_gateway/install/install_generator.rb +28 -0
- data/lib/spree_gateway.rb +4 -0
- data/lib/spree_gateway/engine.rb +35 -0
- data/script/rails +7 -0
- data/spec/controllers/spree/checkout_controller_spec.rb +13 -0
- data/spec/controllers/spree/skrill_status_controller_spec.rb +8 -0
- data/spec/factories/payment_method_factory.rb +6 -0
- data/spec/factories/skrill_transaction_factory.rb +10 -0
- data/spec/features/stripe_checkout_spec.rb +82 -0
- data/spec/lib/active_merchant/billing_skrill_spec.rb +18 -0
- data/spec/models/billing_integration/skrill_quick_checkout_spec.rb +11 -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 +319 -0
- data/spec/models/gateway/card_save_spec.rb +11 -0
- data/spec/models/gateway/data_cache_spec.rb +11 -0
- data/spec/models/gateway/eway_spec.rb +29 -0
- data/spec/models/gateway/fatzebra_spec.rb +51 -0
- data/spec/models/gateway/linkpoint_spec.rb +62 -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 +56 -0
- data/spec/models/gateway/sage_pay_spec.rb +11 -0
- data/spec/models/gateway/samurai_spec.rb +17 -0
- data/spec/models/gateway/secure_pay_au_spec.rb +11 -0
- data/spec/models/gateway/stripe_gateway_spec.rb +117 -0
- data/spec/models/gateway/usa_epay_spec.rb +49 -0
- data/spec/models/gateway/worldpay_spec.rb +11 -0
- data/spec/models/savon_spec.rb +9 -0
- data/spec/models/skrill_transaction_spec.rb +9 -0
- data/spec/spec_helper.rb +49 -0
- data/spree_gateway.gemspec +40 -0
- metadata +140 -5
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "Stripe checkout" do
|
|
4
|
+
let!(:country) { create(:country, :states_required => true) }
|
|
5
|
+
let!(:state) { create(:state, :country => country) }
|
|
6
|
+
let!(:shipping_method) { create(:shipping_method) }
|
|
7
|
+
let!(:stock_location) { create(:stock_location) }
|
|
8
|
+
let!(:mug) { create(:product, :name => "RoR Mug") }
|
|
9
|
+
let!(:stripe_payment_method) do
|
|
10
|
+
Spree::Gateway::StripeGateway.create!(
|
|
11
|
+
:name => "Stripe",
|
|
12
|
+
:preferred_secret_key => "sk_test_VCZnDv3GLU15TRvn8i2EsaAN",
|
|
13
|
+
:preferred_publishable_key => "pk_test_Cuf0PNtiAkkMpTVC2gwYDMIg",
|
|
14
|
+
:environment => "test"
|
|
15
|
+
)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
let!(:zone) { create(:zone) }
|
|
19
|
+
|
|
20
|
+
before do
|
|
21
|
+
user = create(:user)
|
|
22
|
+
|
|
23
|
+
order = OrderWalkthrough.up_to(:delivery)
|
|
24
|
+
order.stub :confirmation_required? => true
|
|
25
|
+
|
|
26
|
+
order.reload
|
|
27
|
+
order.user = user
|
|
28
|
+
order.update!
|
|
29
|
+
|
|
30
|
+
Spree::CheckoutController.any_instance.stub(:current_order => order)
|
|
31
|
+
Spree::CheckoutController.any_instance.stub(:try_spree_current_user => user)
|
|
32
|
+
Spree::CheckoutController.any_instance.stub(:skip_state_validation? => true)
|
|
33
|
+
|
|
34
|
+
visit spree.checkout_state_path(:payment)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# This will pass the CC data to the server and the StripeGateway class handles it
|
|
38
|
+
it "can process a valid payment (without JS)" do
|
|
39
|
+
fill_in "Card Number", :with => "4242 4242 4242 4242"
|
|
40
|
+
fill_in "Card Code", :with => "123"
|
|
41
|
+
fill_in "Expiration", :with => "01 / #{Time.now.year + 1}"
|
|
42
|
+
click_button "Save and Continue"
|
|
43
|
+
page.current_url.should include("/checkout/confirm")
|
|
44
|
+
click_button "Place Order"
|
|
45
|
+
page.should have_content("Your order has been processed successfully")
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# This will fetch a token from Stripe.com and then pass that to the webserver.
|
|
49
|
+
# The server then processes the payment using that token.
|
|
50
|
+
it "can process a valid payment (with JS)", :js => true do
|
|
51
|
+
fill_in "Card Number", :with => "4242 4242 4242 4242"
|
|
52
|
+
# Otherwise ccType field does not get updated correctly
|
|
53
|
+
page.execute_script("$('.cardNumber').trigger('change')")
|
|
54
|
+
fill_in "Card Code", :with => "123"
|
|
55
|
+
fill_in "Expiration", :with => "01 / #{Time.now.year + 1}"
|
|
56
|
+
click_button "Save and Continue"
|
|
57
|
+
sleep(5) # Wait for Stripe API to return + form to submit
|
|
58
|
+
page.current_url.should include("/checkout/confirm")
|
|
59
|
+
click_button "Place Order"
|
|
60
|
+
page.should have_content("Your order has been processed successfully")
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "shows an error with an invalid credit card number", :js => true do
|
|
64
|
+
click_button "Save and Continue"
|
|
65
|
+
page.should have_content("This card number looks invalid")
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it "shows an error with invalid security fields", :js => true do
|
|
69
|
+
fill_in "Card Number", :with => "4242 4242 4242 4242"
|
|
70
|
+
fill_in "Expiration", :with => "01 / #{Time.now.year + 1}"
|
|
71
|
+
click_button "Save and Continue"
|
|
72
|
+
page.should have_content("Your card's security code is invalid.")
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "shows an error with invalid expiry fields", :js => true do
|
|
76
|
+
fill_in "Card Number", :with => "4242 4242 4242 4242"
|
|
77
|
+
fill_in "Expiration", :with => "00 / #{Time.now.year + 1}"
|
|
78
|
+
fill_in "Card Code", :with => "123"
|
|
79
|
+
click_button "Save and Continue"
|
|
80
|
+
page.should have_content("Your card's expiration month is invalid.")
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ActiveMerchant::Billing::Skrill do
|
|
4
|
+
let(:url) { 'https://www.moneybookers.com/app/payment.pl' }
|
|
5
|
+
|
|
6
|
+
context '.service_url' do
|
|
7
|
+
it 'return its url' do
|
|
8
|
+
expect(subject.service_url).to eq url
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
context '.payment_url' do
|
|
13
|
+
it 'prepend options to url' do
|
|
14
|
+
options = { 'hi' => 'you' }
|
|
15
|
+
expect(subject.payment_url(options)).to eq "#{url}?hi=you"
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::BillingIntegration::Skrill::QuickCheckout, focus: true do
|
|
4
|
+
let(:quick_checkout) { create(:skrill_quick_checkout) }
|
|
5
|
+
|
|
6
|
+
context '.provider_class' do
|
|
7
|
+
it 'is a Billing::Skrill class' do
|
|
8
|
+
expect(quick_checkout.provider_class).to eq ::ActiveMerchant::Billing::Skrill
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
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_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_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') }
|
|
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 :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,17 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Gateway::BalancedGateway do
|
|
4
|
+
let(:gateway) { described_class.create!(name: 'Balanced') }
|
|
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') }
|
|
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') }
|
|
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
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::Gateway::BraintreeGateway do
|
|
4
|
+
|
|
5
|
+
before do
|
|
6
|
+
Spree::Gateway.update_all(active: false)
|
|
7
|
+
@gateway = Spree::Gateway::BraintreeGateway.create!(name: 'Braintree Gateway', environment: 'sandbox', active: true)
|
|
8
|
+
@gateway.set_preference(:environment, 'sandbox')
|
|
9
|
+
@gateway.set_preference(:merchant_id, 'zbn5yzq9t7wmwx42')
|
|
10
|
+
@gateway.set_preference(:public_key, 'ym9djwqpkxbv3xzt')
|
|
11
|
+
@gateway.set_preference(:private_key, '4ghghkyp2yy6yqc8')
|
|
12
|
+
@gateway.save!
|
|
13
|
+
|
|
14
|
+
with_payment_profiles_off do
|
|
15
|
+
country = create(:country, name: 'United States', iso_name: 'UNITED STATES', iso3: 'USA', iso: 'US', numcode: 840)
|
|
16
|
+
state = create(:state, name: 'Maryland', abbr: 'MD', country: country)
|
|
17
|
+
address = create(:address,
|
|
18
|
+
firstname: 'John',
|
|
19
|
+
lastname: 'Doe',
|
|
20
|
+
address1: '1234 My Street',
|
|
21
|
+
address2: 'Apt 1',
|
|
22
|
+
city: 'Washington DC',
|
|
23
|
+
zipcode: '20123',
|
|
24
|
+
phone: '(555)555-5555',
|
|
25
|
+
state: state,
|
|
26
|
+
country: country
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
order = create(:order_with_totals, bill_address: address, ship_address: address)
|
|
30
|
+
order.update!
|
|
31
|
+
|
|
32
|
+
@credit_card = create(:credit_card,
|
|
33
|
+
verification_value: '123',
|
|
34
|
+
number: '5105105105105100',
|
|
35
|
+
month: 9,
|
|
36
|
+
year: Time.now.year + 1,
|
|
37
|
+
first_name: 'John',
|
|
38
|
+
last_name: 'Doe',
|
|
39
|
+
cc_type: 'mastercard')
|
|
40
|
+
|
|
41
|
+
@payment = create(:payment, source: @credit_card, order: order, payment_method: @gateway, amount: 10.00)
|
|
42
|
+
@payment.payment_method.environment = 'test'
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
describe 'merchant_account_id' do
|
|
47
|
+
before do
|
|
48
|
+
@gateway.set_preference(:merchant_account_id, merchant_account_id)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
context 'with merchant_account_id empty' do
|
|
52
|
+
let(:merchant_account_id) { '' }
|
|
53
|
+
|
|
54
|
+
it 'does not be present in options' do
|
|
55
|
+
expect(@gateway.options.keys.include?(:merchant_account_id)).to be_false
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
context 'with merchant_account_id set on gateway' do
|
|
60
|
+
let(:merchant_account_id) { 'test' }
|
|
61
|
+
|
|
62
|
+
it 'have a perferred_merchant_account_id' do
|
|
63
|
+
expect(@gateway.preferred_merchant_account_id).to eq merchant_account_id
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it 'have a preferences[:merchant_account_id]' do
|
|
67
|
+
expect(@gateway.preferences.keys.include?(:merchant_account_id)).to be_true
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it 'is present in options' do
|
|
71
|
+
expect(@gateway.options.keys.include?(:merchant_account_id)).to be_true
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
context '.provider_class' do
|
|
77
|
+
it 'is a BraintreeBlue gateway' do
|
|
78
|
+
expect(@gateway.provider_class).to eq ::ActiveMerchant::Billing::BraintreeBlueGateway
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
context '.payment_profiles_supported?' do
|
|
83
|
+
it 'return true' do
|
|
84
|
+
expect(@gateway.payment_profiles_supported?).to be_true
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
context 'preferences' do
|
|
89
|
+
it 'does not include server + test_mode' do
|
|
90
|
+
expect { @gateway.preferences.fetch(:server) }.to raise_error(StandardError)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
describe 'authorize' do
|
|
95
|
+
it 'return a success response with an authorization code' do
|
|
96
|
+
result = @gateway.authorize(500, @credit_card)
|
|
97
|
+
|
|
98
|
+
expect(result.success?).to be_true
|
|
99
|
+
expect(result.authorization).to match /\A\w{6}\z/
|
|
100
|
+
expect(Braintree::Transaction::Status::Authorized).to eq Braintree::Transaction.find(result.authorization).status
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
shared_examples 'a valid credit card' do
|
|
104
|
+
it 'work through the spree payment interface' do
|
|
105
|
+
Spree::Config.set auto_capture: false
|
|
106
|
+
expect(@payment.log_entries.size).to eq(0)
|
|
107
|
+
|
|
108
|
+
@payment.process!
|
|
109
|
+
expect(@payment.log_entries.size).to eq(1)
|
|
110
|
+
expect(@payment.response_code).to match /\A\w{6}\z/
|
|
111
|
+
expect(@payment.state).to eq 'pending'
|
|
112
|
+
|
|
113
|
+
transaction = ::Braintree::Transaction.find(@payment.response_code)
|
|
114
|
+
expect(transaction.status).to eq Braintree::Transaction::Status::Authorized
|
|
115
|
+
|
|
116
|
+
card_number = @credit_card.number[0..5] + '******' + @credit_card.number[-4..-1]
|
|
117
|
+
expect(transaction.credit_card_details.masked_number).to eq card_number
|
|
118
|
+
expect(transaction.credit_card_details.expiration_date).to eq "09/#{Time.now.year + 1}"
|
|
119
|
+
expect(transaction.customer_details.first_name).to eq 'John'
|
|
120
|
+
expect(transaction.customer_details.last_name).to eq 'Doe'
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
context 'when the card is a mastercard' do
|
|
125
|
+
before do
|
|
126
|
+
@credit_card.number = '5105105105105100'
|
|
127
|
+
@credit_card.cc_type = 'mastercard'
|
|
128
|
+
@credit_card.save
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it_behaves_like 'a valid credit card'
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
context 'when the card is a visa' do
|
|
135
|
+
before do
|
|
136
|
+
@credit_card.number = '4111111111111111'
|
|
137
|
+
@credit_card.cc_type = 'visa'
|
|
138
|
+
@credit_card.save
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
it_behaves_like 'a valid credit card'
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
context 'when the card is an amex' do
|
|
145
|
+
before do
|
|
146
|
+
@credit_card.number = '378282246310005'
|
|
147
|
+
@credit_card.verification_value = '1234'
|
|
148
|
+
@credit_card.cc_type = 'amex'
|
|
149
|
+
@credit_card.save
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
it_behaves_like 'a valid credit card'
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
context 'when the card is a JCB' do
|
|
156
|
+
before do
|
|
157
|
+
@credit_card.number = '3530111333300000'
|
|
158
|
+
@credit_card.cc_type = 'jcb'
|
|
159
|
+
@credit_card.save
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
it_behaves_like 'a valid credit card'
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
context 'when the card is a diners club' do
|
|
166
|
+
before do
|
|
167
|
+
@credit_card.number = '36050000000003'
|
|
168
|
+
@credit_card.cc_type = 'dinersclub'
|
|
169
|
+
@credit_card.save
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
it_behaves_like 'a valid credit card'
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
describe 'capture' do
|
|
177
|
+
it 'do capture a previous authorization' do
|
|
178
|
+
@payment.process!
|
|
179
|
+
expect(@payment.log_entries.size).to eq(1)
|
|
180
|
+
expect(@payment.response_code).to match /\A\w{6}\z/
|
|
181
|
+
|
|
182
|
+
transaction = ::Braintree::Transaction.find(@payment.response_code)
|
|
183
|
+
expect(transaction.status).to eq Braintree::Transaction::Status::Authorized
|
|
184
|
+
|
|
185
|
+
capture_result = @gateway.capture(@payment,:ignored_arg_credit_card, :ignored_arg_options)
|
|
186
|
+
expect(capture_result.success?).to be_true
|
|
187
|
+
|
|
188
|
+
transaction = ::Braintree::Transaction.find(@payment.response_code)
|
|
189
|
+
expect(transaction.status).to eq Braintree::Transaction::Status::SubmittedForSettlement
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
it 'raise an error if capture fails using spree interface' do
|
|
193
|
+
Spree::Config.set(auto_capture: false)
|
|
194
|
+
expect(@payment.log_entries.size).to eq(0)
|
|
195
|
+
|
|
196
|
+
@payment.process!
|
|
197
|
+
expect(@payment.log_entries.size).to eq(1)
|
|
198
|
+
|
|
199
|
+
transaction = ::Braintree::Transaction.find(@payment.response_code)
|
|
200
|
+
expect(transaction.status).to eq Braintree::Transaction::Status::Authorized
|
|
201
|
+
|
|
202
|
+
pending 'undefined method reopen for nil:NilClass'
|
|
203
|
+
@payment.payment_source.capture(@payment) # as done in PaymentsController#fire
|
|
204
|
+
transaction = ::Braintree::Transaction.find(@payment.response_code)
|
|
205
|
+
expect(transaction.status).to eq Braintree::Transaction::Status::SubmittedForSettlement
|
|
206
|
+
expect {
|
|
207
|
+
@payment.payment_source.capture(@payment)
|
|
208
|
+
}.to raise_error(Spree::Core::GatewayError, 'Cannot submit for settlement unless status is authorized. (91507)')
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
context 'purchase' do
|
|
213
|
+
it 'return a success response with an authorization code' do
|
|
214
|
+
result = @gateway.purchase(500, @credit_card)
|
|
215
|
+
expect(result.success?).to be_true
|
|
216
|
+
expect(result.authorization).to match /\A\w{6}\z/
|
|
217
|
+
expect(Braintree::Transaction::Status::SubmittedForSettlement).to eq Braintree::Transaction.find(result.authorization).status
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
it 'work through the spree payment interface with payment profiles' do
|
|
221
|
+
purchase_using_spree_interface
|
|
222
|
+
transaction = ::Braintree::Transaction.find(@payment.response_code)
|
|
223
|
+
expect(transaction.credit_card_details.token).not_to be_nil
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
it 'work through the spree payment interface without payment profiles' do
|
|
227
|
+
with_payment_profiles_off do
|
|
228
|
+
purchase_using_spree_interface(false)
|
|
229
|
+
transaction = ::Braintree::Transaction.find(@payment.response_code)
|
|
230
|
+
expect(transaction.credit_card_details.token).to be_nil
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
context 'credit' do
|
|
236
|
+
it 'work through the spree interface' do
|
|
237
|
+
pending 'undefined method credit for #<TestCard:0x007fdba1809ad8>'
|
|
238
|
+
@payment.amount += 100.00
|
|
239
|
+
purchase_using_spree_interface
|
|
240
|
+
credit_using_spree_interface
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
context 'void' do
|
|
245
|
+
it 'work through the spree credit_card / payment interface' do
|
|
246
|
+
expect(@payment.log_entries.size).to eq(0)
|
|
247
|
+
@payment.process!
|
|
248
|
+
|
|
249
|
+
expect(@payment.log_entries.size).to eq(1)
|
|
250
|
+
expect(@payment.response_code).to match /\A\w{6}\z/
|
|
251
|
+
|
|
252
|
+
pending 'expected: submitted_for_settlement got: authorized'
|
|
253
|
+
transaction = Braintree::Transaction.find(@payment.response_code)
|
|
254
|
+
expect(transaction.status).to eq Braintree::Transaction::Status::SubmittedForSettlement
|
|
255
|
+
|
|
256
|
+
@credit_card.void(@payment)
|
|
257
|
+
transaction = Braintree::Transaction.find(transaction.id)
|
|
258
|
+
expect(transaction.status).to eq Braintree::Transaction::Status::Voided
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
context 'update_card_number' do
|
|
263
|
+
it 'passes through gateway_payment_profile_id' do
|
|
264
|
+
credit_card = { 'token' => 'testing', 'last_4' => '1234', 'masked_number' => '5555**5555' }
|
|
265
|
+
@gateway.update_card_number(@payment.source, credit_card)
|
|
266
|
+
expect(@payment.source.gateway_payment_profile_id).to eq 'testing'
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
def credit_using_spree_interface
|
|
271
|
+
expect(@payment.log_entries.size).to eq(1)
|
|
272
|
+
@payment.source.credit(@payment) # as done in PaymentsController#fire
|
|
273
|
+
expect(@payment.log_entries.size).to eq(2)
|
|
274
|
+
|
|
275
|
+
# Let's get the payment record associated with the credit
|
|
276
|
+
@payment = @order.payments.last
|
|
277
|
+
expect(@payment.response_code).to match /\A\w{6}\z/
|
|
278
|
+
|
|
279
|
+
transaction = ::Braintree::Transaction.find(@payment.response_code)
|
|
280
|
+
expect(transaction.type).to eq Braintree::Transaction::Type::Credit
|
|
281
|
+
expect(transaction.status).to eq Braintree::Transaction::Status::SubmittedForSettlement
|
|
282
|
+
expect(transaction.credit_card_details.masked_number).to eq '510510******5100'
|
|
283
|
+
expect(transaction.credit_card_details.expiration_date).to eq "09/#{Time.now.year + 1}"
|
|
284
|
+
expect(transaction.customer_details.first_name).to eq 'John'
|
|
285
|
+
expect(transaction.customer_details.last_name).to eq 'Doe'
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
def purchase_using_spree_interface(profile=true)
|
|
289
|
+
Spree::Config.set(auto_capture: true)
|
|
290
|
+
@payment.send(:create_payment_profile) if profile
|
|
291
|
+
@payment.log_entries.size == 0
|
|
292
|
+
@payment.process! # as done in PaymentsController#create
|
|
293
|
+
@payment.log_entries.size == 1
|
|
294
|
+
expect(@payment.response_code).to match /\A\w{6}\z/
|
|
295
|
+
expect(@payment.state).to eq 'completed'
|
|
296
|
+
|
|
297
|
+
transaction = ::Braintree::Transaction.find(@payment.response_code)
|
|
298
|
+
expect(Braintree::Transaction::Status::SubmittedForSettlement).to eq transaction.status
|
|
299
|
+
expect(transaction.credit_card_details.masked_number).to eq '510510******5100'
|
|
300
|
+
expect(transaction.credit_card_details.expiration_date).to eq "09/#{Time.now.year + 1}"
|
|
301
|
+
expect(transaction.customer_details.first_name).to eq 'John'
|
|
302
|
+
expect(transaction.customer_details.last_name).to eq 'Doe'
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
def with_payment_profiles_off(&block)
|
|
306
|
+
Spree::Gateway::BraintreeGateway.class_eval do
|
|
307
|
+
def payment_profiles_supported?
|
|
308
|
+
false
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
yield
|
|
312
|
+
ensure
|
|
313
|
+
Spree::Gateway::BraintreeGateway.class_eval do
|
|
314
|
+
def payment_profiles_supported?
|
|
315
|
+
true
|
|
316
|
+
end
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
end
|