solidus_stripe 3.0.0 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +5 -0
  4. data/CHANGELOG.md +55 -0
  5. data/Gemfile +7 -0
  6. data/LICENSE +2 -2
  7. data/README.md +69 -11
  8. data/Rakefile +1 -1
  9. data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-cart-page-checkout.js +42 -9
  10. data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-elements.js +61 -25
  11. data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-payment-intents.js +4 -2
  12. data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-payment-request-button-shared.js +56 -19
  13. data/app/assets/javascripts/spree/frontend/solidus_stripe/stripe-payment.js +7 -1
  14. data/app/controllers/solidus_stripe/intents_controller.rb +42 -28
  15. data/app/decorators/models/spree/order_update_attributes_decorator.rb +39 -0
  16. data/app/decorators/models/spree/payment_decorator.rb +11 -0
  17. data/app/decorators/models/spree/refund_decorator.rb +9 -0
  18. data/app/models/solidus_stripe/address_from_params_service.rb +5 -2
  19. data/app/models/solidus_stripe/create_intents_payment_service.rb +113 -0
  20. data/app/models/spree/payment_method/stripe_credit_card.rb +19 -9
  21. data/bin/r +13 -0
  22. data/bin/rake +7 -0
  23. data/bin/sandbox +84 -0
  24. data/bin/sandbox_rails +18 -0
  25. data/bin/setup +1 -1
  26. data/config/routes.rb +4 -1
  27. data/lib/generators/solidus_stripe/install/install_generator.rb +7 -3
  28. data/lib/solidus_stripe/engine.rb +2 -2
  29. data/lib/solidus_stripe/factories.rb +4 -0
  30. data/lib/solidus_stripe/version.rb +1 -1
  31. data/lib/views/frontend/spree/checkout/payment/v3/_form_elements.html.erb +0 -1
  32. data/solidus_stripe.gemspec +34 -37
  33. data/spec/features/stripe_checkout_spec.rb +159 -64
  34. data/spec/models/solidus_stripe/address_from_params_service_spec.rb +19 -5
  35. data/spec/models/solidus_stripe/create_intents_payment_service_spec.rb +127 -0
  36. data/spec/models/spree/payment_method/stripe_credit_card_spec.rb +44 -1
  37. data/spec/spec_helper.rb +4 -1
  38. metadata +22 -12
  39. data/LICENSE.md +0 -26
@@ -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
@@ -0,0 +1,127 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe SolidusStripe::CreateIntentsPaymentService do
6
+ let(:service) { described_class.new(intent_id, stripe, controller) }
7
+
8
+ let(:stripe) {
9
+ Spree::PaymentMethod::StripeCreditCard.create!(
10
+ name: "Stripe",
11
+ preferred_secret_key: "sk_test_VCZnDv3GLU15TRvn8i2EsaAN",
12
+ preferred_publishable_key: "pk_test_Cuf0PNtiAkkMpTVC2gwYDMIg",
13
+ preferred_v3_elements: false,
14
+ preferred_v3_intents: true
15
+ )
16
+ }
17
+
18
+ let(:order) { create :order, state: :payment, total: 19.99 }
19
+
20
+ let(:intent_id) { "pi_123123ABC" }
21
+ let(:controller) { double(current_order: order.reload, params: params, request: spy) }
22
+
23
+ let(:params) do
24
+ {
25
+ spree_payment_method_id: stripe.id,
26
+ stripe_payment_intent_id: intent_id,
27
+ form_data: {
28
+ addressLine: ["31 Cotton Rd"],
29
+ city: "San Diego",
30
+ country: "US",
31
+ phone: "+188836412312",
32
+ postalCode: "12345",
33
+ recipient: "James Edwards",
34
+ region: "CA"
35
+ }
36
+ }
37
+ end
38
+
39
+ let(:intent) do
40
+ double(params: {
41
+ "id" => intent_id,
42
+ "charges" => {
43
+ "data" => [{
44
+ "billing_details" => {
45
+ "name" => "John Doe"
46
+ },
47
+ "payment_method_details" => {
48
+ "card" => {
49
+ "brand" => "visa",
50
+ "exp_month" => 1,
51
+ "exp_year" => 2022,
52
+ "last4" => "4242"
53
+ },
54
+ }
55
+ }]
56
+ }
57
+ })
58
+ end
59
+
60
+ describe '#call' do
61
+ subject { service.call }
62
+
63
+ before do
64
+ allow(stripe).to receive(:show_intent) { intent }
65
+ allow_any_instance_of(Spree::CreditCard).to receive(:require_card_numbers?) { false }
66
+ allow_any_instance_of(Spree::PaymentMethod::StripeCreditCard).to receive(:create_profile) { true }
67
+ end
68
+
69
+ it { expect(subject).to be true }
70
+
71
+ it "creates a new pending payment" do
72
+ expect { subject }.to change { order.payments.count }
73
+ expect(order.payments.last.reload).to be_pending
74
+ end
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
+
89
+ context "when for any reason the payment could not be created" do
90
+ before { params[:form_data].delete(:city) }
91
+
92
+ it "returns false" do
93
+ expect(subject).to be false
94
+ end
95
+ end
96
+
97
+ context "when there are previous pending payments" do
98
+ let!(:payment) do
99
+ create(:payment, order: order).tap do |payment|
100
+ payment.update!(state: :pending)
101
+ end
102
+ end
103
+
104
+ before do
105
+ response = double(success?: true, authorization: payment.response_code)
106
+ allow_any_instance_of(Spree::PaymentMethod::StripeCreditCard).to receive(:void) { response }
107
+ end
108
+
109
+ context "when one of them is a Payment Intent" do
110
+ before do
111
+ payment.update!(payment_method: stripe)
112
+ payment.source.update!(payment_method: stripe)
113
+ end
114
+
115
+ it "invalidates it" do
116
+ expect { subject }.to change { payment.reload.state }.to 'void'
117
+ end
118
+ end
119
+
120
+ context "when none is a Payment Intent" do
121
+ it "does not invalidate them" do
122
+ expect { subject }.not_to change { payment.reload.state }
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -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: 3.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-03-11 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
@@ -36,14 +36,14 @@ dependencies:
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 0.4.0
39
+ version: '0.5'
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: 0.4.0
46
+ version: '0.5'
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: activemerchant
49
49
  requirement: !ruby/object:Gem::Requirement
@@ -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
@@ -101,12 +100,20 @@ files:
101
100
  - app/controllers/solidus_stripe/intents_controller.rb
102
101
  - app/controllers/solidus_stripe/payment_request_controller.rb
103
102
  - app/controllers/spree/stripe_controller.rb
103
+ - app/decorators/models/spree/order_update_attributes_decorator.rb
104
+ - app/decorators/models/spree/payment_decorator.rb
105
+ - app/decorators/models/spree/refund_decorator.rb
104
106
  - app/models/solidus_stripe/address_from_params_service.rb
107
+ - app/models/solidus_stripe/create_intents_payment_service.rb
105
108
  - app/models/solidus_stripe/prepare_order_for_payment_service.rb
106
109
  - app/models/solidus_stripe/shipping_rates_service.rb
107
110
  - app/models/spree/payment_method/stripe_credit_card.rb
108
111
  - bin/console
112
+ - bin/r
109
113
  - bin/rails
114
+ - bin/rake
115
+ - bin/sandbox
116
+ - bin/sandbox_rails
110
117
  - bin/setup
111
118
  - config/routes.rb
112
119
  - db/migrate/20181010123508_update_stripe_payment_method_type_to_credit_card.rb
@@ -115,6 +122,7 @@ files:
115
122
  - lib/generators/solidus_stripe/install/install_generator.rb
116
123
  - lib/solidus_stripe.rb
117
124
  - lib/solidus_stripe/engine.rb
125
+ - lib/solidus_stripe/factories.rb
118
126
  - lib/solidus_stripe/version.rb
119
127
  - lib/tasks/solidus_stripe/db/seed.rake
120
128
  - lib/views/api/spree/api/payments/source_views/_stripe.json.jbuilder
@@ -132,33 +140,34 @@ files:
132
140
  - solidus_stripe.gemspec
133
141
  - spec/features/stripe_checkout_spec.rb
134
142
  - spec/models/solidus_stripe/address_from_params_service_spec.rb
143
+ - spec/models/solidus_stripe/create_intents_payment_service_spec.rb
135
144
  - spec/models/solidus_stripe/prepare_order_for_payment_service_spec.rb
136
145
  - spec/models/solidus_stripe/shipping_rates_service_spec.rb
137
146
  - spec/models/spree/payment_method/stripe_credit_card_spec.rb
138
147
  - spec/spec_helper.rb
139
148
  - spec/support/solidus_address_helper.rb
140
- homepage: https://solidus.io
149
+ homepage: https://github.com/solidusio/solidus_stripe#readme
141
150
  licenses:
142
151
  - BSD-3
143
152
  metadata:
144
- homepage_uri: https://solidus.io
145
- 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
146
156
  post_install_message:
147
157
  rdoc_options: []
148
158
  require_paths:
149
159
  - lib
150
160
  required_ruby_version: !ruby/object:Gem::Requirement
151
161
  requirements:
152
- - - ">="
162
+ - - "~>"
153
163
  - !ruby/object:Gem::Version
154
- version: '2.2'
164
+ version: '2.4'
155
165
  required_rubygems_version: !ruby/object:Gem::Requirement
156
166
  requirements:
157
167
  - - ">="
158
168
  - !ruby/object:Gem::Version
159
169
  version: '0'
160
- requirements:
161
- - none
170
+ requirements: []
162
171
  rubygems_version: 3.0.3
163
172
  signing_key:
164
173
  specification_version: 4
@@ -166,6 +175,7 @@ summary: Stripe Payment Method for Solidus
166
175
  test_files:
167
176
  - spec/features/stripe_checkout_spec.rb
168
177
  - spec/models/solidus_stripe/address_from_params_service_spec.rb
178
+ - spec/models/solidus_stripe/create_intents_payment_service_spec.rb
169
179
  - spec/models/solidus_stripe/prepare_order_for_payment_service_spec.rb
170
180
  - spec/models/solidus_stripe/shipping_rates_service_spec.rb
171
181
  - spec/models/spree/payment_method/stripe_credit_card_spec.rb
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.