solidus_stripe 3.0.0 → 4.1.0
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 +1 -0
- data/.rubocop.yml +5 -0
- data/CHANGELOG.md +55 -0
- data/Gemfile +7 -0
- data/LICENSE +2 -2
- data/README.md +69 -11
- data/Rakefile +1 -1
- data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-cart-page-checkout.js +42 -9
- data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-elements.js +61 -25
- data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-payment-intents.js +4 -2
- data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-payment-request-button-shared.js +56 -19
- data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-payment.js +7 -1
- data/app/controllers/solidus_stripe/intents_controller.rb +42 -28
- data/app/decorators/models/spree/order_update_attributes_decorator.rb +39 -0
- data/app/decorators/models/spree/payment_decorator.rb +11 -0
- data/app/decorators/models/spree/refund_decorator.rb +9 -0
- data/app/models/solidus_stripe/address_from_params_service.rb +5 -2
- data/app/models/solidus_stripe/create_intents_payment_service.rb +113 -0
- data/app/models/spree/payment_method/stripe_credit_card.rb +19 -9
- data/bin/r +13 -0
- data/bin/rake +7 -0
- data/bin/sandbox +84 -0
- data/bin/sandbox_rails +18 -0
- data/bin/setup +1 -1
- data/config/routes.rb +4 -1
- data/lib/generators/solidus_stripe/install/install_generator.rb +7 -3
- data/lib/solidus_stripe/engine.rb +2 -2
- data/lib/solidus_stripe/factories.rb +4 -0
- data/lib/solidus_stripe/version.rb +1 -1
- data/lib/views/frontend/spree/checkout/payment/v3/_form_elements.html.erb +0 -1
- data/solidus_stripe.gemspec +34 -37
- data/spec/features/stripe_checkout_spec.rb +159 -64
- data/spec/models/solidus_stripe/address_from_params_service_spec.rb +19 -5
- data/spec/models/solidus_stripe/create_intents_payment_service_spec.rb +127 -0
- data/spec/models/spree/payment_method/stripe_credit_card_spec.rb +44 -1
- data/spec/spec_helper.rb +4 -1
- metadata +22 -12
- data/LICENSE.md +0 -26
data/bin/r
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# This command will automatically be run when you run "rails" with Rails gems
|
3
|
+
# installed from the root of your application.
|
4
|
+
|
5
|
+
ENGINE_ROOT = File.expand_path('..', __dir__)
|
6
|
+
ENGINE_PATH = File.expand_path('../lib/solidus_stripe/engine', __dir__)
|
7
|
+
|
8
|
+
# Set up gems listed in the Gemfile.
|
9
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
|
10
|
+
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
|
11
|
+
|
12
|
+
require 'rails/all'
|
13
|
+
require 'rails/engine/commands'
|
data/bin/rake
ADDED
data/bin/sandbox
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
set -e
|
4
|
+
|
5
|
+
case "$DB" in
|
6
|
+
postgres|postgresql)
|
7
|
+
RAILSDB="postgresql"
|
8
|
+
;;
|
9
|
+
mysql)
|
10
|
+
RAILSDB="mysql"
|
11
|
+
;;
|
12
|
+
sqlite|'')
|
13
|
+
RAILSDB="sqlite3"
|
14
|
+
;;
|
15
|
+
*)
|
16
|
+
echo "Invalid DB specified: $DB"
|
17
|
+
exit 1
|
18
|
+
;;
|
19
|
+
esac
|
20
|
+
|
21
|
+
if [ ! -z $SOLIDUS_BRANCH ]
|
22
|
+
then
|
23
|
+
BRANCH=$SOLIDUS_BRANCH
|
24
|
+
else
|
25
|
+
BRANCH="master"
|
26
|
+
fi
|
27
|
+
|
28
|
+
extension_name="solidus_stripe"
|
29
|
+
|
30
|
+
# Stay away from the bundler env of the containing extension.
|
31
|
+
function unbundled {
|
32
|
+
ruby -rbundler -e'b = proc {system *ARGV}; Bundler.respond_to?(:with_unbundled_env) ? Bundler.with_unbundled_env(&b) : Bundler.with_clean_env(&b)' -- $@
|
33
|
+
}
|
34
|
+
|
35
|
+
rm -rf ./sandbox
|
36
|
+
unbundled bundle exec rails new sandbox --database="$RAILSDB" \
|
37
|
+
--skip-bundle \
|
38
|
+
--skip-git \
|
39
|
+
--skip-keeps \
|
40
|
+
--skip-rc \
|
41
|
+
--skip-spring \
|
42
|
+
--skip-test \
|
43
|
+
--skip-javascript
|
44
|
+
|
45
|
+
if [ ! -d "sandbox" ]; then
|
46
|
+
echo 'sandbox rails application failed'
|
47
|
+
exit 1
|
48
|
+
fi
|
49
|
+
|
50
|
+
cd ./sandbox
|
51
|
+
cat <<RUBY >> Gemfile
|
52
|
+
gem 'solidus', github: 'solidusio/solidus', branch: '$BRANCH'
|
53
|
+
gem 'solidus_auth_devise', '>= 2.1.0'
|
54
|
+
gem 'rails-i18n'
|
55
|
+
gem 'solidus_i18n'
|
56
|
+
|
57
|
+
gem '$extension_name', path: '..'
|
58
|
+
|
59
|
+
group :test, :development do
|
60
|
+
platforms :mri do
|
61
|
+
gem 'pry-byebug'
|
62
|
+
end
|
63
|
+
end
|
64
|
+
RUBY
|
65
|
+
|
66
|
+
unbundled bundle install --gemfile Gemfile
|
67
|
+
|
68
|
+
unbundled bundle exec rake db:drop db:create
|
69
|
+
|
70
|
+
unbundled bundle exec rails generate spree:install \
|
71
|
+
--auto-accept \
|
72
|
+
--user_class=Spree::User \
|
73
|
+
--enforce_available_locales=true \
|
74
|
+
--with-authentication=false \
|
75
|
+
$@
|
76
|
+
|
77
|
+
unbundled bundle exec rails generate solidus:auth:install
|
78
|
+
|
79
|
+
echo
|
80
|
+
echo "🚀 Sandbox app successfully created for $extension_name!"
|
81
|
+
echo "🚀 Using $RAILSDB and Solidus $BRANCH"
|
82
|
+
echo "🚀 Use 'export DB=[postgres|mysql|sqlite]' to control the DB adapter"
|
83
|
+
echo "🚀 Use 'export SOLIDUS_BRANCH=<BRANCH-NAME>' to control the Solidus version"
|
84
|
+
echo "🚀 This app is intended for test purposes."
|
data/bin/sandbox_rails
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
app_root = 'sandbox'
|
6
|
+
|
7
|
+
unless File.exist? "#{app_root}/bin/rails"
|
8
|
+
warn 'Creating the sandbox app...'
|
9
|
+
Dir.chdir "#{__dir__}/.." do
|
10
|
+
system "#{__dir__}/sandbox" or begin # rubocop:disable Style/AndOr
|
11
|
+
warn 'Automatic creation of the sandbox app failed'
|
12
|
+
exit 1
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
Dir.chdir app_root
|
18
|
+
exec 'bin/rails', *ARGV
|
data/bin/setup
CHANGED
data/config/routes.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
Spree::Core::Engine.routes.draw do
|
2
4
|
# route to a deprecated controller, will be removed in the future:
|
3
5
|
post '/stripe/confirm_payment', to: 'stripe#confirm_payment'
|
4
6
|
|
5
7
|
# payment intents routes:
|
6
|
-
post '/stripe/
|
8
|
+
post '/stripe/create_intent', to: '/solidus_stripe/intents#create_intent'
|
9
|
+
post '/stripe/create_payment', to: '/solidus_stripe/intents#create_payment'
|
7
10
|
|
8
11
|
# payment request routes:
|
9
12
|
post '/stripe/shipping_rates', to: '/solidus_stripe/payment_request#shipping_rates'
|
@@ -13,12 +13,16 @@ module SolidusStripe
|
|
13
13
|
run 'bundle exec rake railties:install:migrations FROM=solidus_stripe'
|
14
14
|
end
|
15
15
|
|
16
|
+
def add_migrations
|
17
|
+
run 'bin/rails railties:install:migrations FROM=solidus_stripe'
|
18
|
+
end
|
19
|
+
|
16
20
|
def run_migrations
|
17
|
-
run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask('Would you like to run the migrations now? [Y/n]'))
|
21
|
+
run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask('Would you like to run the migrations now? [Y/n]')) # rubocop:disable Metrics/LineLength
|
18
22
|
if run_migrations
|
19
|
-
run '
|
23
|
+
run 'bin/rails db:migrate'
|
20
24
|
else
|
21
|
-
puts 'Skipping
|
25
|
+
puts 'Skipping bin/rails db:migrate, don\'t forget to run it!' # rubocop:disable Rails/Output
|
22
26
|
end
|
23
27
|
end
|
24
28
|
|
@@ -4,9 +4,9 @@ require 'spree/core'
|
|
4
4
|
|
5
5
|
module SolidusStripe
|
6
6
|
class Engine < Rails::Engine
|
7
|
-
include SolidusSupport::EngineExtensions
|
7
|
+
include SolidusSupport::EngineExtensions
|
8
8
|
|
9
|
-
isolate_namespace Spree
|
9
|
+
isolate_namespace ::Spree
|
10
10
|
|
11
11
|
engine_name 'solidus_stripe'
|
12
12
|
|
@@ -1,6 +1,5 @@
|
|
1
1
|
<div id="payment-request-button" data-stripe-config="<%= payment_method.stripe_config(current_order).to_json %>" data-v3-api="<%= stripe_v3_api %>"></div>
|
2
2
|
|
3
|
-
<%= image_tag 'credit_cards/credit_card.gif', id: 'credit-card-image' %>
|
4
3
|
<% param_prefix = "payment_source[#{payment_method.id}]" %>
|
5
4
|
|
6
5
|
<div class="field field-required">
|
data/solidus_stripe.gemspec
CHANGED
@@ -1,40 +1,37 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
s.add_dependency "activemerchant", ">= 1.100" # includes "Stripe Payment Intents: Fix fallback for Store"
|
38
|
-
|
39
|
-
s.add_development_dependency 'solidus_dev_support'
|
3
|
+
require_relative 'lib/solidus_stripe/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'solidus_stripe'
|
7
|
+
spec.version = SolidusStripe::VERSION
|
8
|
+
spec.authors = ['Solidus Team']
|
9
|
+
spec.email = 'contact@solidus.io'
|
10
|
+
|
11
|
+
spec.summary = 'Stripe Payment Method for Solidus'
|
12
|
+
spec.description = 'Stripe Payment Method for Solidus'
|
13
|
+
spec.homepage = 'https://github.com/solidusio/solidus_stripe#readme'
|
14
|
+
spec.license = 'BSD-3'
|
15
|
+
|
16
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
17
|
+
spec.metadata['source_code_uri'] = 'https://github.com/solidusio/solidus_stripe'
|
18
|
+
spec.metadata['changelog_uri'] = 'https://github.com/solidusio/solidus_stripe/blob/master/CHANGELOG.md'
|
19
|
+
|
20
|
+
spec.required_ruby_version = Gem::Requirement.new('~> 2.4')
|
21
|
+
|
22
|
+
# Specify which files should be added to the gem when it is released.
|
23
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
24
|
+
files = Dir.chdir(__dir__) { `git ls-files -z`.split("\x0") }
|
25
|
+
|
26
|
+
spec.files = files.grep_v(%r{^(test|spec|features)/})
|
27
|
+
spec.test_files = files.grep(%r{^(test|spec|features)/})
|
28
|
+
spec.bindir = "exe"
|
29
|
+
spec.executables = files.grep(%r{^exe/}) { |f| File.basename(f) }
|
30
|
+
spec.require_paths = ["lib"]
|
31
|
+
|
32
|
+
spec.add_dependency 'solidus_core', ['>= 2.3', '< 3']
|
33
|
+
spec.add_dependency 'solidus_support', '~> 0.5'
|
34
|
+
spec.add_dependency 'activemerchant', '>= 1.100'
|
35
|
+
|
36
|
+
spec.add_development_dependency 'solidus_dev_support'
|
40
37
|
end
|
@@ -6,6 +6,8 @@ RSpec.describe "Stripe checkout", type: :feature do
|
|
6
6
|
let(:zone) { FactoryBot.create(:zone) }
|
7
7
|
let(:country) { FactoryBot.create(:country) }
|
8
8
|
|
9
|
+
let(:card_3d_secure) { "4000 0025 0000 3155" }
|
10
|
+
|
9
11
|
before do
|
10
12
|
FactoryBot.create(:store)
|
11
13
|
zone.members << Spree::ZoneMember.create!(zoneable: country)
|
@@ -215,7 +217,7 @@ RSpec.describe "Stripe checkout", type: :feature do
|
|
215
217
|
end
|
216
218
|
end
|
217
219
|
|
218
|
-
context 'when using Stripe V3 API
|
220
|
+
context 'when using Stripe V3 API library with Elements', :js do
|
219
221
|
let(:preferred_v3_elements) { true }
|
220
222
|
let(:preferred_v3_intents) { false }
|
221
223
|
|
@@ -291,7 +293,7 @@ RSpec.describe "Stripe checkout", type: :feature do
|
|
291
293
|
it_behaves_like "Stripe Elements invalid payments"
|
292
294
|
end
|
293
295
|
|
294
|
-
context "when using Stripe V3 API
|
296
|
+
context "when using Stripe V3 API library with Intents", :js do
|
295
297
|
let(:preferred_v3_elements) { false }
|
296
298
|
let(:preferred_v3_intents) { true }
|
297
299
|
|
@@ -301,24 +303,8 @@ RSpec.describe "Stripe checkout", type: :feature do
|
|
301
303
|
end
|
302
304
|
|
303
305
|
context "when using a valid 3D Secure card" do
|
304
|
-
let(:card_number) { "4000 0027 6000 3184" }
|
305
|
-
|
306
306
|
it "successfully completes the checkout" do
|
307
|
-
|
308
|
-
card_number.split('').each { |n| find_field('cardnumber').native.send_keys(n) }
|
309
|
-
end
|
310
|
-
within_frame(find '#card_cvc iframe') { fill_in 'cvc', with: '123' }
|
311
|
-
within_frame(find '#card_expiry iframe') do
|
312
|
-
'0132'.split('').each { |n| find_field('exp-date').native.send_keys(n) }
|
313
|
-
end
|
314
|
-
|
315
|
-
click_button "Save and Continue"
|
316
|
-
|
317
|
-
within_3d_secure_modal do
|
318
|
-
expect(page).to have_content '$19.99 using 3D Secure'
|
319
|
-
|
320
|
-
click_button 'Complete authentication'
|
321
|
-
end
|
307
|
+
authenticate_3d_secure_card(card_3d_secure)
|
322
308
|
|
323
309
|
expect(page).to have_current_path("/checkout/confirm")
|
324
310
|
|
@@ -368,69 +354,178 @@ RSpec.describe "Stripe checkout", type: :feature do
|
|
368
354
|
end
|
369
355
|
end
|
370
356
|
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
357
|
+
context "when reusing a card" do
|
358
|
+
stub_authorization!
|
359
|
+
|
360
|
+
it "succesfully creates a second payment that can be captured in the backend" do
|
361
|
+
authenticate_3d_secure_card(card_3d_secure)
|
362
|
+
|
363
|
+
expect(page).to have_current_path("/checkout/confirm")
|
364
|
+
click_button "Place Order"
|
365
|
+
expect(page).to have_content("Your order has been processed successfully")
|
366
|
+
|
367
|
+
visit spree.root_path
|
368
|
+
click_link "DL-44"
|
369
|
+
click_button "Add To Cart"
|
370
|
+
|
371
|
+
expect(page).to have_current_path("/cart")
|
372
|
+
click_button "Checkout"
|
373
|
+
|
374
|
+
# Address
|
375
|
+
expect(page).to have_current_path("/checkout/address")
|
376
|
+
|
377
|
+
within("#billing") do
|
378
|
+
fill_in_name
|
379
|
+
fill_in "Street Address", with: "YT-1300"
|
380
|
+
fill_in "City", with: "Mos Eisley"
|
381
|
+
select "United States of America", from: "Country"
|
382
|
+
select country.states.first.name, from: "order_bill_address_attributes_state_id"
|
383
|
+
fill_in "Zip", with: "12010"
|
384
|
+
fill_in "Phone", with: "(555) 555-5555"
|
385
|
+
end
|
386
|
+
click_on "Save and Continue"
|
387
|
+
|
388
|
+
# Delivery
|
389
|
+
expect(page).to have_current_path("/checkout/delivery")
|
390
|
+
expect(page).to have_content("UPS Ground")
|
391
|
+
click_on "Save and Continue"
|
392
|
+
|
393
|
+
# Payment
|
394
|
+
expect(page).to have_current_path("/checkout/payment")
|
395
|
+
choose "Use an existing card on file"
|
396
|
+
click_button "Save and Continue"
|
397
|
+
|
398
|
+
# Confirm
|
399
|
+
expect(page).to have_current_path("/checkout/confirm")
|
400
|
+
click_button "Place Order"
|
401
|
+
expect(page).to have_content("Your order has been processed successfully")
|
402
|
+
|
403
|
+
Spree::Order.complete.each do |order|
|
404
|
+
# Capture in backend
|
405
|
+
|
406
|
+
visit spree.admin_path
|
407
|
+
|
408
|
+
expect(page).to have_selector("#listing_orders tbody tr", count: 2)
|
409
|
+
|
410
|
+
click_link order.number
|
411
|
+
|
412
|
+
click_link "Payments"
|
413
|
+
find(".fa-capture").click
|
380
414
|
|
381
|
-
|
382
|
-
|
415
|
+
expect(page).to have_content "Payment Updated"
|
416
|
+
expect(find("table#payments")).to have_content "Completed"
|
417
|
+
|
418
|
+
# Order cancel, after capture
|
419
|
+
click_link "Cart"
|
420
|
+
|
421
|
+
within "#sidebar" do
|
422
|
+
expect(page).to have_content "Completed"
|
423
|
+
end
|
424
|
+
|
425
|
+
find('input[value="Cancel"]').click
|
426
|
+
|
427
|
+
expect(page).to have_content "Order canceled"
|
428
|
+
|
429
|
+
within "#sidebar" do
|
430
|
+
expect(page).to have_content "Canceled"
|
431
|
+
end
|
432
|
+
end
|
383
433
|
end
|
434
|
+
end
|
384
435
|
|
385
|
-
|
386
|
-
|
387
|
-
expect(page).to have_content("Your order has been processed successfully")
|
436
|
+
context "when paying with multiple payment methods" do
|
437
|
+
stub_authorization!
|
388
438
|
|
389
|
-
|
390
|
-
|
391
|
-
click_button "Add To Cart"
|
439
|
+
context "when paying first with regular card, then with 3D-Secure card" do
|
440
|
+
let(:regular_card) { "4242 4242 4242 4242"}
|
392
441
|
|
393
|
-
|
394
|
-
|
442
|
+
it "voids the first stripe payment and successfully pays with 3DS card" do
|
443
|
+
within_frame find('#card_number iframe') do
|
444
|
+
regular_card.split('').each { |n| find_field('cardnumber').native.send_keys(n) }
|
445
|
+
end
|
446
|
+
within_frame(find '#card_cvc iframe') { fill_in 'cvc', with: '123' }
|
447
|
+
within_frame(find '#card_expiry iframe') do
|
448
|
+
'0132'.split('').each { |n| find_field('exp-date').native.send_keys(n) }
|
449
|
+
end
|
450
|
+
click_button "Save and Continue"
|
395
451
|
|
396
|
-
|
397
|
-
expect(page).to have_current_path("/checkout/address")
|
452
|
+
expect(page).to have_content "Ending in 4242"
|
398
453
|
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
454
|
+
click_link "Payment"
|
455
|
+
|
456
|
+
authenticate_3d_secure_card(card_3d_secure)
|
457
|
+
click_button "Place Order"
|
458
|
+
expect(page).to have_content "Your order has been processed successfully"
|
459
|
+
|
460
|
+
visit spree.admin_path
|
461
|
+
click_link Spree::Order.complete.first.number
|
462
|
+
click_link "Payments"
|
463
|
+
|
464
|
+
payments = all('table#payments tbody tr')
|
465
|
+
|
466
|
+
expect(payments.first).to have_content "Stripe"
|
467
|
+
expect(payments.first).to have_content "Void"
|
468
|
+
|
469
|
+
expect(payments.last).to have_content "Stripe"
|
470
|
+
expect(payments.last).to have_content "Pending"
|
471
|
+
end
|
407
472
|
end
|
408
|
-
click_on "Save and Continue"
|
409
473
|
|
410
|
-
|
411
|
-
|
412
|
-
expect(page).to have_content("UPS Ground")
|
413
|
-
click_on "Save and Continue"
|
474
|
+
context "when paying first with 3D-Secure card, then with check" do
|
475
|
+
before { create :check_payment_method }
|
414
476
|
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
click_button "Save and Continue"
|
477
|
+
it "voids the stripe payment and successfully pays with check" do
|
478
|
+
authenticate_3d_secure_card(card_3d_secure)
|
479
|
+
expect(page).to have_current_path("/checkout/confirm")
|
419
480
|
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
481
|
+
click_link "Payment"
|
482
|
+
choose "Check"
|
483
|
+
click_button "Save and Continue"
|
484
|
+
expect(find(".payment-info")).to have_content "Check"
|
485
|
+
expect(page).to have_content "Your order has been processed successfully"
|
486
|
+
|
487
|
+
visit spree.admin_path
|
488
|
+
click_link Spree::Order.complete.first.number
|
489
|
+
click_link "Payments"
|
490
|
+
payments = all('table#payments tbody tr')
|
491
|
+
|
492
|
+
stripe_payment = payments.first
|
493
|
+
expect(stripe_payment).to have_content "Stripe"
|
494
|
+
expect(stripe_payment).to have_content "Void"
|
495
|
+
|
496
|
+
check_payment = payments.last
|
497
|
+
expect(check_payment).to have_content "Check"
|
498
|
+
end
|
499
|
+
end
|
424
500
|
end
|
425
501
|
|
426
502
|
it_behaves_like "Stripe Elements invalid payments"
|
427
503
|
end
|
428
504
|
|
429
505
|
def within_3d_secure_modal
|
430
|
-
within_frame "
|
431
|
-
within_frame "
|
432
|
-
|
506
|
+
within_frame "__privateStripeFrame11" do
|
507
|
+
within_frame "__stripeJSChallengeFrame" do
|
508
|
+
within_frame "acsFrame" do
|
509
|
+
yield
|
510
|
+
end
|
433
511
|
end
|
434
512
|
end
|
435
513
|
end
|
514
|
+
|
515
|
+
def authenticate_3d_secure_card(card_number)
|
516
|
+
within_frame find('#card_number iframe') do
|
517
|
+
card_number.split('').each { |n| find_field('cardnumber').native.send_keys(n) }
|
518
|
+
end
|
519
|
+
within_frame(find '#card_cvc iframe') { fill_in 'cvc', with: '123' }
|
520
|
+
within_frame(find '#card_expiry iframe') do
|
521
|
+
'0132'.split('').each { |n| find_field('exp-date').native.send_keys(n) }
|
522
|
+
end
|
523
|
+
click_button "Save and Continue"
|
524
|
+
|
525
|
+
within_3d_secure_modal do
|
526
|
+
expect(page).to have_content '$19.99 using 3D Secure'
|
527
|
+
|
528
|
+
click_button 'Complete authentication'
|
529
|
+
end
|
530
|
+
end
|
436
531
|
end
|