solidus_stripe 4.0.0 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 38e979d7eecd9e20f5d763ad5e2bec33312f0877b2cec287604801b483dcb006
4
- data.tar.gz: 19a4708081571dbba8c34c7d0173c1a1704ff12df54902e488add9572c4a9080
3
+ metadata.gz: c27f15c92bf2fcee8f467f66e8c1c261baf7d0909f86e7df87e8ce9547cc2951
4
+ data.tar.gz: b6ae23186cd51fc4b7938081d26df066a1b45903a3fcbb29db39d83106e520e4
5
5
  SHA512:
6
- metadata.gz: 6cf3fd35258a8e0c300d0b2ca18d131d9ee3e2b74cc8522e911c8fe7a94fa7e987b66c445d52dace4df580ecf3c54eeec14be421f4f06d1e823d7705eb6c5ae3
7
- data.tar.gz: d868652e26e2c4c3813e1f2438c4e2cbedc3f2e4de51a21e7eaafdb1e8fe37d35c4152e1e1ce215ba550be5a1b3d4caa15f4d4dc23f51446708f49c0d21c3f4d
6
+ metadata.gz: 799216217f0bf2353e94c598dc9e49187c44004f9c25dc254d13a3e5805751e8fddabaf45f83c3cc422ed561b12d0e7260cf4367d71dd614086c4d9f2d2521c6
7
+ data.tar.gz: 322e5c0299a3afc1555057cd10685a1f5c6ad3f446dd592326084be7959e93c009cb092f8d9fe688682527653d7078ec58c49506ba593f4b4b688d8fa81a549e
data/.gitignore CHANGED
@@ -16,3 +16,4 @@ pkg
16
16
  *.swp
17
17
  spec/dummy
18
18
  spec/examples.txt
19
+ /sandbox
@@ -1,2 +1,7 @@
1
1
  require:
2
2
  - solidus_dev_support/rubocop
3
+
4
+ AllCops:
5
+ Exclude:
6
+ - sandbox/**/*
7
+ - spec/dummy/**/*
@@ -1,23 +1,27 @@
1
1
  # Changelog
2
2
 
3
- ## [Unreleased](https://github.com/solidusio/solidus_stripe/tree/HEAD)
3
+ ## [v4.0.0](https://github.com/solidusio/solidus_stripe/tree/v4.0.0) (2020-04-29)
4
4
 
5
- [Full Changelog](https://github.com/solidusio/solidus_stripe/compare/v3.0.0...HEAD)
5
+ [Full Changelog](https://github.com/solidusio/solidus_stripe/compare/v3.0.0...v4.0.0)
6
6
 
7
7
  **Fixed bugs:**
8
8
 
9
9
  - Duplicates charges with Payment Intents [\#44](https://github.com/solidusio/solidus_stripe/issues/44)
10
+ - Fix for 3D-Secure payments on cart page checkout [\#49](https://github.com/solidusio/solidus_stripe/pull/49) ([spaghetticode](https://github.com/spaghetticode))
10
11
  - Send form data also when paying with payment request button [\#47](https://github.com/solidusio/solidus_stripe/pull/47) ([spaghetticode](https://github.com/spaghetticode))
11
12
  - Create a single charge when using Stripe Payment Intents [\#45](https://github.com/solidusio/solidus_stripe/pull/45) ([spaghetticode](https://github.com/spaghetticode))
12
13
 
13
14
  **Closed issues:**
14
15
 
16
+ - Custom stripe element field options \(e.g for showing a credit card icon\) [\#41](https://github.com/solidusio/solidus_stripe/issues/41)
15
17
  - Stripe Elements submit button stuck in disabled state. [\#39](https://github.com/solidusio/solidus_stripe/issues/39)
16
18
  - Visa credit card type is blank [\#36](https://github.com/solidusio/solidus_stripe/issues/36)
17
19
  - Pay with Apple Pay from cart page [\#23](https://github.com/solidusio/solidus_stripe/issues/23)
20
+ - Clearer documentation on how to implement [\#15](https://github.com/solidusio/solidus_stripe/issues/15)
18
21
 
19
22
  **Merged pull requests:**
20
23
 
24
+ - Relax solidus\_support dependency [\#48](https://github.com/solidusio/solidus_stripe/pull/48) ([kennyadsl](https://github.com/kennyadsl))
21
25
  - Replace deprecated route `/stripe/confirm\_payment` [\#46](https://github.com/solidusio/solidus_stripe/pull/46) ([spaghetticode](https://github.com/spaghetticode))
22
26
  - Custom Stripe Elements field options [\#42](https://github.com/solidusio/solidus_stripe/pull/42) ([stuffmatic](https://github.com/stuffmatic))
23
27
  - Improve the way Stripe Elements validation errors are displayed [\#40](https://github.com/solidusio/solidus_stripe/pull/40) ([stuffmatic](https://github.com/stuffmatic))
data/Gemfile CHANGED
@@ -30,3 +30,10 @@ group :development, :test do
30
30
  end
31
31
 
32
32
  gemspec
33
+
34
+ # Use a local Gemfile to include development dependencies that might not be
35
+ # relevant for the project or for other contributors, e.g. pry-byebug.
36
+ #
37
+ # We use `send` instead of calling `eval_gemfile` to work around an issue with
38
+ # how Dependabot parses projects: https://github.com/dependabot/dependabot-core/issues/1658.
39
+ send(:eval_gemfile, 'Gemfile-local') if File.exist? 'Gemfile-local'
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2020 Solidus Team
1
+ Copyright (c) 2014 Spree Commerce Inc. and other contributors.
2
2
  All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without modification,
@@ -9,7 +9,7 @@ are permitted provided that the following conditions are met:
9
9
  * Redistributions in binary form must reproduce the above copyright notice,
10
10
  this list of conditions and the following disclaimer in the documentation
11
11
  and/or other materials provided with the distribution.
12
- * Neither the name Solidus nor the names of its contributors may be used to
12
+ * Neither the name Spree nor the names of its contributors may be used to
13
13
  endorse or promote products derived from this software without specific
14
14
  prior written permission.
15
15
 
data/README.md CHANGED
@@ -138,14 +138,11 @@ Stripe account to receive payments via Apple Pay.
138
138
  It's possible to pay with Apple Pay and Google Pay directly from the cart
139
139
  page. The functionality is self-contained in the view partial
140
140
  `_stripe_payment_request_button.html.erb`. In order to use it, you need
141
- to load that partial in the `orders#edit` frontend page, and pass it the
141
+ to render that partial in the `orders#edit` frontend page, and pass it the
142
142
  payment method configured for Stripe via the local variable
143
- `cart_checkout_payment_method`, for example using `deface`:
143
+ `cart_checkout_payment_method`:
144
144
 
145
145
  ```ruby
146
- # app/overrides/spree/orders/edit/add_payment_request_button.html.erb.deface
147
-
148
- <!-- insert_after '[data-hook="cart_container"]' -->
149
146
  <%= render 'stripe_payment_request_button', cart_checkout_payment_method: Spree::PaymentMethod::StripeCreditCard.first %>
150
147
  ```
151
148
 
@@ -313,3 +310,5 @@ gem bump --version minor --remote upstream
313
310
  gem tag --remote upstream
314
311
  gem release
315
312
  ```
313
+
314
+ Copyright (c) 2020 Spree Commerce Inc., released under the New BSD License
data/Rakefile CHANGED
@@ -3,4 +3,4 @@
3
3
  require 'solidus_dev_support/rake_tasks'
4
4
  SolidusDevSupport::RakeTasks.install
5
5
 
6
- task default: %w[extension:test_app extension:specs]
6
+ task default: 'extension:specs'
@@ -5,13 +5,7 @@ module SolidusStripe
5
5
  include Spree::Core::ControllerHelpers::Order
6
6
 
7
7
  def create_intent
8
- begin
9
- @intent = create_payment_intent
10
- rescue Stripe::CardError => e
11
- render json: { error: e.message }, status: 500
12
- return
13
- end
14
-
8
+ @intent = create_payment_intent
15
9
  generate_payment_response
16
10
  end
17
11
 
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module RefundDecorator
5
+ attr_reader :response
6
+
7
+ Spree::Refund.prepend(self)
8
+ end
9
+ end
@@ -43,7 +43,10 @@ module SolidusStripe
43
43
  end
44
44
 
45
45
  def state
46
- @state ||= country.states.find_by_abbr(address_params[:region])
46
+ @state ||= begin
47
+ region = address_params[:region]
48
+ country.states.find_by(abbr: region) || country.states.find_by(name: region)
49
+ end
47
50
  end
48
51
 
49
52
  def default_attributes
@@ -61,7 +61,7 @@ module SolidusStripe
61
61
  cc_type: intent_card['brand'],
62
62
  last_digits: intent_card['last4'],
63
63
  gateway_payment_profile_id: intent_customer_profile,
64
- name: address_full_name,
64
+ name: card_holder_name || address_full_name,
65
65
  address_attributes: address_attributes
66
66
  }
67
67
  }]
@@ -69,26 +69,38 @@ module SolidusStripe
69
69
  end
70
70
 
71
71
  def intent_card
72
- intent.params['charges']['data'][0]['payment_method_details']['card']
72
+ intent_data['payment_method_details']['card']
73
73
  end
74
74
 
75
75
  def intent_customer_profile
76
76
  intent.params['payment_method']
77
77
  end
78
78
 
79
+ def card_holder_name
80
+ (html_payment_source_data['name'] || intent_data['billing_details']['name']).presence
81
+ end
82
+
83
+ def intent_data
84
+ intent.params['charges']['data'][0]
85
+ end
86
+
79
87
  def form_data
80
88
  params[:form_data]
81
89
  end
82
90
 
83
- def address_attributes
91
+ def html_payment_source_data
84
92
  if form_data.is_a?(String)
85
93
  data = Rack::Utils.parse_nested_query(form_data)
86
- data['payment_source'][stripe.id.to_s]['address_attributes']
94
+ data['payment_source'][stripe.id.to_s]
87
95
  else
88
- SolidusStripe::AddressFromParamsService.new(form_data).call.attributes
96
+ {}
89
97
  end
90
98
  end
91
99
 
100
+ def address_attributes
101
+ html_payment_source_data['address_attributes'] || SolidusStripe::AddressFromParamsService.new(form_data).call.attributes
102
+ end
103
+
92
104
  def address_full_name
93
105
  current_order.bill_address&.full_name || form_data[:recipient]
94
106
  end
@@ -81,6 +81,21 @@ module Spree
81
81
  gateway.void(response_code, {})
82
82
  end
83
83
 
84
+ def payment_intents_refund_reason
85
+ Spree::RefundReason.where(name: Spree::Payment::Cancellation::DEFAULT_REASON).first_or_create
86
+ end
87
+
88
+ def try_void(payment)
89
+ if v3_intents? && payment.completed?
90
+ payment.refunds.create!(
91
+ amount: payment.credit_allowed,
92
+ reason: payment_intents_refund_reason
93
+ ).response
94
+ else
95
+ payment.void_transaction!
96
+ end
97
+ end
98
+
84
99
  def cancel(response_code)
85
100
  gateway.void(response_code, {})
86
101
  end
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'
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "rubygems"
5
+ require "bundler/setup"
6
+
7
+ load Gem.bin_path("rake", "rake")
@@ -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."
@@ -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
@@ -5,4 +5,4 @@ set -vx
5
5
 
6
6
  gem install bundler --conservative
7
7
  bundle update
8
- bundle exec rake extension:test_app
8
+ bin/rake clobber
@@ -1,3 +1,5 @@
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'
@@ -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 'bundle exec rake db:migrate'
23
+ run 'bin/rails db:migrate'
20
24
  else
21
- puts 'Skipping rake db:migrate, don\'t forget to run it!' # rubocop:disable Rails/Output
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
 
@@ -6,7 +6,7 @@ module SolidusStripe
6
6
  class Engine < Rails::Engine
7
7
  include SolidusSupport::EngineExtensions
8
8
 
9
- isolate_namespace Spree
9
+ isolate_namespace ::Spree
10
10
 
11
11
  engine_name 'solidus_stripe'
12
12
 
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusStripe
4
- VERSION = "4.0.0"
4
+ VERSION = "4.1.0"
5
5
  end
@@ -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">
@@ -1,40 +1,37 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- $:.push File.expand_path('lib', __dir__)
4
- require 'solidus_stripe/version'
5
-
6
- Gem::Specification.new do |s|
7
- s.name = 'solidus_stripe'
8
- s.version = SolidusStripe::VERSION
9
- s.summary = "Stripe Payment Method for Solidus"
10
- s.description = s.summary
11
- s.required_ruby_version = ">= 2.2"
12
-
13
- s.author = "Solidus Team"
14
- s.email = "contact@solidus.io"
15
- s.homepage = "https://solidus.io"
16
- s.license = 'BSD-3'
17
-
18
- if s.respond_to?(:metadata)
19
- s.metadata["homepage_uri"] = s.homepage if s.homepage
20
- s.metadata["source_code_uri"] = s.homepage if s.homepage
21
- end
22
-
23
- s.files = `git ls-files`.split("\n")
24
- s.test_files = `git ls-files -- spec/*`.split("\n")
25
- s.require_path = "lib"
26
- s.requirements << "none"
27
-
28
- s.bindir = "exe"
29
- s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
30
-
31
- s.add_dependency 'solidus_core', ['>= 2.3', '< 3']
32
- s.add_dependency 'solidus_support', '~> 0.5'
33
- # ActiveMerchant v1.58 through v1.59 introduced a breaking change
34
- # to the stripe gateway.
35
- #
36
- # This was resolved in v1.60, but we still need to skip 1.58 & 1.59.
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
@@ -217,7 +217,7 @@ RSpec.describe "Stripe checkout", type: :feature do
217
217
  end
218
218
  end
219
219
 
220
- context 'when using Stripe V3 API libarary with Elements', :js do
220
+ context 'when using Stripe V3 API library with Elements', :js do
221
221
  let(:preferred_v3_elements) { true }
222
222
  let(:preferred_v3_intents) { false }
223
223
 
@@ -293,7 +293,7 @@ RSpec.describe "Stripe checkout", type: :feature do
293
293
  it_behaves_like "Stripe Elements invalid payments"
294
294
  end
295
295
 
296
- context "when using Stripe V3 API libarary with Intents", :js do
296
+ context "when using Stripe V3 API library with Intents", :js do
297
297
  let(:preferred_v3_elements) { false }
298
298
  let(:preferred_v3_intents) { true }
299
299
 
@@ -400,8 +400,9 @@ RSpec.describe "Stripe checkout", type: :feature do
400
400
  click_button "Place Order"
401
401
  expect(page).to have_content("Your order has been processed successfully")
402
402
 
403
- # Capture in backend
404
403
  Spree::Order.complete.each do |order|
404
+ # Capture in backend
405
+
405
406
  visit spree.admin_path
406
407
 
407
408
  expect(page).to have_selector("#listing_orders tbody tr", count: 2)
@@ -413,6 +414,21 @@ RSpec.describe "Stripe checkout", type: :feature do
413
414
 
414
415
  expect(page).to have_content "Payment Updated"
415
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
416
432
  end
417
433
  end
418
434
  end
@@ -489,7 +505,9 @@ RSpec.describe "Stripe checkout", type: :feature do
489
505
  def within_3d_secure_modal
490
506
  within_frame "__privateStripeFrame11" do
491
507
  within_frame "__stripeJSChallengeFrame" do
492
- yield
508
+ within_frame "acsFrame" do
509
+ yield
510
+ end
493
511
  end
494
512
  end
495
513
  end
@@ -14,7 +14,8 @@ RSpec.describe SolidusStripe::AddressFromParamsService do
14
14
  recipient: 'Clark Kent',
15
15
  city: 'Metropolis',
16
16
  postalCode: '12345',
17
- addressLine: [ '12, Lincoln Rd']
17
+ addressLine: [ '12, Lincoln Rd'],
18
+ phone: '555-555-0199'
18
19
  }
19
20
  end
20
21
 
@@ -39,7 +40,8 @@ RSpec.describe SolidusStripe::AddressFromParamsService do
39
40
  firstname: 'Clark',
40
41
  lastname: 'Kent',
41
42
  address1: params[:addressLine].first,
42
- address2: nil
43
+ address2: nil,
44
+ phone: '555-555-0199'
43
45
  )
44
46
  end
45
47
 
@@ -50,11 +52,23 @@ RSpec.describe SolidusStripe::AddressFromParamsService do
50
52
 
51
53
  context "when no user's address is compatible with the params" do
52
54
  before do
53
- user.addresses << create(:address)
55
+ user.addresses << create(:address, state: state)
54
56
  end
55
57
 
56
- it "returns a non-persisted address model" do
57
- expect(subject).to be_new_record
58
+ it "returns a non-persisted valid address" do
59
+ aggregate_failures do
60
+ expect(subject).to be_new_record
61
+ expect(subject).to be_valid
62
+ expect(subject.state).to eq state
63
+ end
64
+ end
65
+
66
+ context "when the region is the state name" do
67
+ before { params[:region] = state.name }
68
+
69
+ it "still can set the address state attribute" do
70
+ expect(subject.state).to eq state
71
+ end
58
72
  end
59
73
  end
60
74
  end
@@ -41,6 +41,9 @@ RSpec.describe SolidusStripe::CreateIntentsPaymentService do
41
41
  "id" => intent_id,
42
42
  "charges" => {
43
43
  "data" => [{
44
+ "billing_details" => {
45
+ "name" => "John Doe"
46
+ },
44
47
  "payment_method_details" => {
45
48
  "card" => {
46
49
  "brand" => "visa",
@@ -70,6 +73,19 @@ RSpec.describe SolidusStripe::CreateIntentsPaymentService do
70
73
  expect(order.payments.last.reload).to be_pending
71
74
  end
72
75
 
76
+ it "creates a credit card with the correct information" do
77
+ expect { subject }.to change { Spree::CreditCard.count }
78
+ card = Spree::CreditCard.last
79
+
80
+ aggregate_failures do
81
+ expect(card.name).to eq "John Doe"
82
+ expect(card.cc_type).to eq "visa"
83
+ expect(card.month).to eq "1"
84
+ expect(card.year).to eq "2022"
85
+ expect(card.last_digits).to eq "4242"
86
+ end
87
+ end
88
+
73
89
  context "when for any reason the payment could not be created" do
74
90
  before { params[:form_data].delete(:city) }
75
91
 
@@ -22,7 +22,8 @@ describe Spree::PaymentMethod::StripeCreditCard do
22
22
  let(:payment) {
23
23
  double('Spree::Payment',
24
24
  source: source,
25
- order: order
25
+ order: order,
26
+ amount: order.total
26
27
  )
27
28
  }
28
29
 
@@ -241,4 +242,46 @@ describe Spree::PaymentMethod::StripeCreditCard do
241
242
  expect(gateway).to receive(:capture).with(9855, '12345', anything).and_return(success_response)
242
243
  end
243
244
  end
245
+
246
+ describe '#try_void' do
247
+ let(:payment) { create :payment, amount: order.total }
248
+
249
+ shared_examples 'voids the payment transaction' do
250
+ it 'voids the payment transaction' do
251
+ expect(payment).to receive(:void_transaction!)
252
+
253
+ subject.try_void(payment)
254
+ end
255
+ end
256
+
257
+ context 'when using Payment Intents' do
258
+ before { subject.preferred_v3_intents = true }
259
+
260
+ context 'when the payment is completed' do
261
+ before do
262
+ allow(payment).to receive(:completed?) { true }
263
+ end
264
+
265
+ it 'creates a refund' do
266
+ expect { subject.try_void(payment) }.to change { Spree::Refund.count }.by(1)
267
+ end
268
+ end
269
+
270
+ context 'when the payment is not completed' do
271
+ it_behaves_like 'voids the payment transaction'
272
+ end
273
+ end
274
+
275
+ context 'when not using Payment Intents' do
276
+ before { subject.preferred_v3_intents = false }
277
+
278
+ context 'when the payment is completed' do
279
+ it_behaves_like 'voids the payment transaction'
280
+ end
281
+
282
+ context 'when the payment is not completed' do
283
+ it_behaves_like 'voids the payment transaction'
284
+ end
285
+ end
286
+ end
244
287
  end
@@ -13,7 +13,10 @@ require 'solidus_dev_support/rspec/feature_helper'
13
13
 
14
14
  # Requires supporting ruby files with custom matchers and macros, etc,
15
15
  # in spec/support/ and its subdirectories.
16
- Dir[File.join(File.dirname(__FILE__), "support/**/*.rb")].each { |f| require f }
16
+ Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require f }
17
+
18
+ # Requires factories defined in lib/solidus_stripe/factories.rb
19
+ require 'solidus_stripe/factories'
17
20
 
18
21
  RSpec.configure do |config|
19
22
  config.infer_spec_type_from_file_location!
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solidus_stripe
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Solidus Team
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-29 00:00:00.000000000 Z
11
+ date: 2020-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: solidus_core
@@ -88,7 +88,6 @@ files:
88
88
  - CHANGELOG.md
89
89
  - Gemfile
90
90
  - LICENSE
91
- - LICENSE.md
92
91
  - README.md
93
92
  - Rakefile
94
93
  - app/assets/javascripts/spree/frontend/solidus_stripe.js
@@ -103,13 +102,18 @@ files:
103
102
  - app/controllers/spree/stripe_controller.rb
104
103
  - app/decorators/models/spree/order_update_attributes_decorator.rb
105
104
  - app/decorators/models/spree/payment_decorator.rb
105
+ - app/decorators/models/spree/refund_decorator.rb
106
106
  - app/models/solidus_stripe/address_from_params_service.rb
107
107
  - app/models/solidus_stripe/create_intents_payment_service.rb
108
108
  - app/models/solidus_stripe/prepare_order_for_payment_service.rb
109
109
  - app/models/solidus_stripe/shipping_rates_service.rb
110
110
  - app/models/spree/payment_method/stripe_credit_card.rb
111
111
  - bin/console
112
+ - bin/r
112
113
  - bin/rails
114
+ - bin/rake
115
+ - bin/sandbox
116
+ - bin/sandbox_rails
113
117
  - bin/setup
114
118
  - config/routes.rb
115
119
  - db/migrate/20181010123508_update_stripe_payment_method_type_to_credit_card.rb
@@ -118,6 +122,7 @@ files:
118
122
  - lib/generators/solidus_stripe/install/install_generator.rb
119
123
  - lib/solidus_stripe.rb
120
124
  - lib/solidus_stripe/engine.rb
125
+ - lib/solidus_stripe/factories.rb
121
126
  - lib/solidus_stripe/version.rb
122
127
  - lib/tasks/solidus_stripe/db/seed.rake
123
128
  - lib/views/api/spree/api/payments/source_views/_stripe.json.jbuilder
@@ -141,30 +146,29 @@ files:
141
146
  - spec/models/spree/payment_method/stripe_credit_card_spec.rb
142
147
  - spec/spec_helper.rb
143
148
  - spec/support/solidus_address_helper.rb
144
- homepage: https://solidus.io
149
+ homepage: https://github.com/solidusio/solidus_stripe#readme
145
150
  licenses:
146
151
  - BSD-3
147
152
  metadata:
148
- homepage_uri: https://solidus.io
149
- source_code_uri: https://solidus.io
153
+ homepage_uri: https://github.com/solidusio/solidus_stripe#readme
154
+ source_code_uri: https://github.com/solidusio/solidus_stripe
155
+ changelog_uri: https://github.com/solidusio/solidus_stripe/blob/master/CHANGELOG.md
150
156
  post_install_message:
151
157
  rdoc_options: []
152
158
  require_paths:
153
159
  - lib
154
160
  required_ruby_version: !ruby/object:Gem::Requirement
155
161
  requirements:
156
- - - ">="
162
+ - - "~>"
157
163
  - !ruby/object:Gem::Version
158
- version: '2.2'
164
+ version: '2.4'
159
165
  required_rubygems_version: !ruby/object:Gem::Requirement
160
166
  requirements:
161
167
  - - ">="
162
168
  - !ruby/object:Gem::Version
163
169
  version: '0'
164
- requirements:
165
- - none
166
- rubyforge_project:
167
- rubygems_version: 2.7.10
170
+ requirements: []
171
+ rubygems_version: 3.0.3
168
172
  signing_key:
169
173
  specification_version: 4
170
174
  summary: Stripe Payment Method for Solidus
data/LICENSE.md DELETED
@@ -1,26 +0,0 @@
1
- Copyright (c) 2014 Spree Commerce Inc. and other contributors.
2
- All rights reserved.
3
-
4
- Redistribution and use in source and binary forms, with or without modification,
5
- are permitted provided that the following conditions are met:
6
-
7
- * Redistributions of source code must retain the above copyright notice,
8
- this list of conditions and the following disclaimer.
9
- * Redistributions in binary form must reproduce the above copyright notice,
10
- this list of conditions and the following disclaimer in the documentation
11
- and/or other materials provided with the distribution.
12
- * Neither the name Spree nor the names of its contributors may be used to
13
- endorse or promote products derived from this software without specific
14
- prior written permission.
15
-
16
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.