solidus_afterpay 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +41 -0
  3. data/.gem_release.yml +5 -0
  4. data/.github/stale.yml +17 -0
  5. data/.github_changelog_generator +2 -0
  6. data/.gitignore +20 -0
  7. data/.rspec +2 -0
  8. data/.rubocop.yml +14 -0
  9. data/CHANGELOG.md +1 -0
  10. data/Gemfile +33 -0
  11. data/LICENSE +202 -0
  12. data/README.md +175 -0
  13. data/Rakefile +6 -0
  14. data/app/assets/javascripts/solidus_afterpay/afterpay_checkout.js +131 -0
  15. data/app/assets/javascripts/spree/backend/solidus_afterpay.js +2 -0
  16. data/app/assets/javascripts/spree/frontend/solidus_afterpay.js +4 -0
  17. data/app/assets/stylesheets/spree/backend/solidus_afterpay.css +4 -0
  18. data/app/assets/stylesheets/spree/frontend/solidus_afterpay.css +4 -0
  19. data/app/controllers/solidus_afterpay/base_controller.rb +30 -0
  20. data/app/controllers/solidus_afterpay/callbacks_controller.rb +71 -0
  21. data/app/controllers/solidus_afterpay/checkouts_controller.rb +47 -0
  22. data/app/decorators/controllers/solidus_afterpay/spree/checkout_controller_decorator.rb +13 -0
  23. data/app/decorators/models/solidus_afterpay/spree/order_decorator.rb +15 -0
  24. data/app/helpers/solidus_afterpay/afterpay_helper.rb +15 -0
  25. data/app/models/solidus_afterpay/gateway.rb +157 -0
  26. data/app/models/solidus_afterpay/order_component_builder.rb +97 -0
  27. data/app/models/solidus_afterpay/payment_method.rb +56 -0
  28. data/app/models/solidus_afterpay/payment_source.rb +23 -0
  29. data/app/models/solidus_afterpay/user_agent_generator.rb +35 -0
  30. data/app/views/solidus_afterpay/_afterpay_javascript.html.erb +5 -0
  31. data/app/views/spree/admin/payments/source_forms/_afterpay.html.erb +1 -0
  32. data/app/views/spree/admin/payments/source_views/_afterpay.html.erb +0 -0
  33. data/app/views/spree/api/payments/source_views/_afterpay.json.jbuilder +3 -0
  34. data/app/views/spree/checkout/payment/_afterpay.html.erb +9 -0
  35. data/app/views/spree/shared/_afterpay_messaging.html.erb +13 -0
  36. data/bin/console +17 -0
  37. data/bin/rails +7 -0
  38. data/bin/rails-engine +13 -0
  39. data/bin/rails-sandbox +16 -0
  40. data/bin/rake +7 -0
  41. data/bin/sandbox +86 -0
  42. data/bin/setup +8 -0
  43. data/codecov.yml +2 -0
  44. data/config/locales/en.yml +12 -0
  45. data/config/routes.rb +7 -0
  46. data/db/migrate/20210813142725_create_solidus_afterpay_payment_sources.rb +12 -0
  47. data/lib/generators/solidus_afterpay/install/install_generator.rb +43 -0
  48. data/lib/generators/solidus_afterpay/install/templates/initializer.rb +5 -0
  49. data/lib/solidus_afterpay/configuration.rb +25 -0
  50. data/lib/solidus_afterpay/engine.rb +25 -0
  51. data/lib/solidus_afterpay/testing_support/factories.rb +20 -0
  52. data/lib/solidus_afterpay/version.rb +5 -0
  53. data/lib/solidus_afterpay.rb +5 -0
  54. data/solidus_afterpay.gemspec +38 -0
  55. data/spec/fixtures/vcr_casettes/create_checkout/invalid.yml +65 -0
  56. data/spec/fixtures/vcr_casettes/create_checkout/valid.yml +64 -0
  57. data/spec/fixtures/vcr_casettes/credit/invalid.yml +61 -0
  58. data/spec/fixtures/vcr_casettes/credit/valid.yml +63 -0
  59. data/spec/fixtures/vcr_casettes/deferred/authorize/declined_payment.yml +120 -0
  60. data/spec/fixtures/vcr_casettes/deferred/authorize/invalid.yml +61 -0
  61. data/spec/fixtures/vcr_casettes/deferred/authorize/valid.yml +120 -0
  62. data/spec/fixtures/vcr_casettes/deferred/capture/invalid.yml +61 -0
  63. data/spec/fixtures/vcr_casettes/deferred/capture/valid.yml +140 -0
  64. data/spec/fixtures/vcr_casettes/deferred/void/invalid.yml +61 -0
  65. data/spec/fixtures/vcr_casettes/deferred/void/valid.yml +137 -0
  66. data/spec/fixtures/vcr_casettes/find_payment/invalid.yml +61 -0
  67. data/spec/fixtures/vcr_casettes/find_payment/valid.yml +140 -0
  68. data/spec/fixtures/vcr_casettes/immediate/capture/declined_payment.yml +120 -0
  69. data/spec/fixtures/vcr_casettes/immediate/capture/invalid.yml +61 -0
  70. data/spec/fixtures/vcr_casettes/immediate/capture/valid.yml +134 -0
  71. data/spec/fixtures/vcr_casettes/retrieve_configuration/valid.yml +67 -0
  72. data/spec/helpers/solidus_afterpay/afterpay_helper_spec.rb +23 -0
  73. data/spec/models/solidus_afterpay/gateway_spec.rb +418 -0
  74. data/spec/models/solidus_afterpay/order_component_builder_spec.rb +137 -0
  75. data/spec/models/solidus_afterpay/payment_method_spec.rb +143 -0
  76. data/spec/models/solidus_afterpay/payment_source_spec.rb +61 -0
  77. data/spec/models/solidus_afterpay/user_agent_generator_spec.rb +22 -0
  78. data/spec/models/spree/order_spec.rb +158 -0
  79. data/spec/requests/solidus_afterpay/callbacks_controller_spec.rb +127 -0
  80. data/spec/requests/solidus_afterpay/checkouts_controller_spec.rb +190 -0
  81. data/spec/spec_helper.rb +31 -0
  82. data/spec/support/auth.rb +15 -0
  83. data/spec/support/preferences.rb +33 -0
  84. data/spec/support/vcr.rb +18 -0
  85. metadata +249 -0
@@ -0,0 +1,127 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe SolidusAfterpay::CallbacksController, type: :request do
6
+ describe 'GET cancel' do
7
+ subject(:request) { get '/solidus_afterpay/callbacks/cancel', params: params }
8
+
9
+ let(:order) { create(:order_with_totals, state: 'payment') }
10
+
11
+ let(:params) { { order_number: order.number } }
12
+
13
+ it 'redirects to the order current checkout state page' do
14
+ request
15
+ expect(response).to redirect_to('/checkout/payment')
16
+ end
17
+ end
18
+
19
+ describe 'GET confirm' do
20
+ subject(:request) { get '/solidus_afterpay/callbacks/confirm', params: params }
21
+
22
+ let(:order) { create(:order_with_totals, state: 'payment', user: user) }
23
+ let(:payment_method) { create(:afterpay_payment_method) }
24
+ let(:user) { create(:user) }
25
+
26
+ let(:order_token) { 'ORDER_TOKEN' }
27
+ let(:order_number) { order.number }
28
+ let(:payment_method_id) { payment_method.id }
29
+
30
+ let(:params) { { orderToken: order_token, order_number: order_number, payment_method_id: payment_method_id } }
31
+
32
+ context 'when the user is logged in', with_signed_in_user: true do
33
+ context 'with valid data' do
34
+ it 'redirects to the order next checkout state page' do
35
+ request
36
+ expect(response).to redirect_to('/checkout/confirm')
37
+ end
38
+
39
+ it 'moves the order to its next state' do
40
+ expect { request }.to change { order.reload.state }.from('payment').to('confirm')
41
+ end
42
+
43
+ it 'creates a payment' do
44
+ expect { request }.to change { order.payments.count }.from(0).to(1)
45
+ end
46
+
47
+ it 'sets the payment total equal to the order total' do
48
+ request
49
+ expect(order.payments.last.amount).to eq(order.total)
50
+ end
51
+
52
+ it 'creates a payment source and assigns the order token to it' do
53
+ request
54
+ expect(order.payments.last.payment_source.token).to eq(order_token)
55
+ end
56
+ end
57
+
58
+ context 'when the order_token is missing' do
59
+ let(:order_token) { nil }
60
+
61
+ it 'redirects to the order current checkout state page' do
62
+ request
63
+ expect(response).to redirect_to('/checkout/payment')
64
+ end
65
+ end
66
+
67
+ context 'when the order_number is invalid' do
68
+ let(:order_number) { 'INVALID_ORDER_NUMBER' }
69
+
70
+ it 'redirects to the cart page' do
71
+ request
72
+ expect(response).to redirect_to('/cart')
73
+ end
74
+
75
+ it 'sets a resource not found flash message' do
76
+ request
77
+ expect(flash[:notice]).to eq('The resource you were looking for could not be found.')
78
+ end
79
+ end
80
+
81
+ context 'when the payment_method_id is invalid' do
82
+ let(:payment_method_id) { 0 }
83
+
84
+ it 'redirects to the cart page' do
85
+ request
86
+ expect(response).to redirect_to('/cart')
87
+ end
88
+
89
+ it 'sets a resource not found flash message' do
90
+ request
91
+ expect(flash[:notice]).to eq('The resource you were looking for could not be found.')
92
+ end
93
+ end
94
+
95
+ context 'when the order is already in confirm state' do
96
+ let(:order) { create(:order_with_totals, state: 'confirm') }
97
+
98
+ it "doesn't move the order to its next state" do
99
+ expect { request }.not_to(change { order.reload.state })
100
+ end
101
+ end
102
+
103
+ context 'when the order is already completed' do
104
+ let(:order) { create(:completed_order_with_totals) }
105
+
106
+ it 'redirects to the order detail page' do
107
+ request
108
+ expect(response).to redirect_to("/orders/#{order.number}")
109
+ end
110
+ end
111
+ end
112
+
113
+ context 'when the user is a guest user', with_guest_session: true do
114
+ it 'redirects to the order next checkout state page' do
115
+ request
116
+ expect(response).to redirect_to('/checkout/confirm')
117
+ end
118
+ end
119
+
120
+ context 'when the user is not logged in' do
121
+ it 'redirects the user to vallalah' do
122
+ request
123
+ expect(response).to redirect_to('/cart')
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,190 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe SolidusAfterpay::CheckoutsController, type: :request do
6
+ describe 'POST create' do
7
+ subject(:request) { post '/solidus_afterpay/checkouts.json', params: params, headers: headers }
8
+
9
+ let(:order) { create(:order_with_totals, state: 'payment', user: user) }
10
+ let(:payment_method) { create(:afterpay_payment_method) }
11
+ let(:user) { create(:user, :with_api_key) }
12
+
13
+ let(:order_number) { order.number }
14
+ let(:payment_method_id) { payment_method.id }
15
+
16
+ let(:params) { { order_number: order_number, payment_method_id: payment_method_id } }
17
+
18
+ let(:order_token) { 'ORDER_TOKEN' }
19
+ let(:gateway_response_success?) { true }
20
+ let(:gateway_response_message) { 'Success message' }
21
+ let(:gateway_response_error_code) { nil }
22
+ let(:gateway_response_params) { { 'token' => order_token } }
23
+ let(:headers) { {} }
24
+
25
+ let(:gateway_response) do
26
+ ActiveMerchant::Billing::Response.new(
27
+ gateway_response_success?,
28
+ gateway_response_message,
29
+ gateway_response_params,
30
+ { error_code: gateway_response_error_code }
31
+ )
32
+ end
33
+
34
+ let(:gateway) { instance_double(SolidusAfterpay::Gateway, create_checkout: gateway_response) }
35
+
36
+ before do
37
+ allow(SolidusAfterpay::Gateway).to receive(:new).and_return(gateway)
38
+ end
39
+
40
+ context 'when the use solidus api config is set to false' do
41
+ context 'when the user is logged in', with_signed_in_user: true do
42
+ context 'with valid data' do
43
+ before do
44
+ allow(Spree::Order).to receive(:find_by!).with(number: order.number).and_return(order)
45
+ request
46
+ end
47
+
48
+ it 'returns a 201 status code' do
49
+ expect(response).to have_http_status(:created)
50
+ end
51
+
52
+ it 'returns the order_token' do
53
+ expect(JSON.parse(response.body)['token']).to eq(order_token)
54
+ end
55
+
56
+ it 'returns the correct params' do
57
+ expect(JSON.parse(response.body)).to include('token', 'expires', 'redirectCheckoutUrl')
58
+ end
59
+
60
+ context 'when no redirect URLs are passed as params' do
61
+ let(:redirect_confirm_url) do
62
+ "http://www.example.com/solidus_afterpay/callbacks/confirm?order_number=#{order.number}&payment_method_id=#{payment_method.id}"
63
+ end
64
+
65
+ let(:redirect_cancel_url) do
66
+ "http://www.example.com/solidus_afterpay/callbacks/cancel?order_number=#{order.number}&payment_method_id=#{payment_method.id}"
67
+ end
68
+
69
+ it 'calls the create_checkout with the correct arguments' do
70
+ expect(gateway).to have_received(:create_checkout).with(
71
+ order,
72
+ redirect_confirm_url: redirect_confirm_url,
73
+ redirect_cancel_url: redirect_cancel_url
74
+ )
75
+ end
76
+ end
77
+
78
+ context 'when redirect URLs are passed as params' do
79
+ let(:redirect_confirm_url) { 'http://www.example.com/confirm_url' }
80
+ let(:redirect_cancel_url) { 'http://www.example.com/cancel_url' }
81
+
82
+ let(:params) do
83
+ { order_number: order_number, payment_method_id: payment_method_id,
84
+ redirect_confirm_url: redirect_confirm_url, redirect_cancel_url: redirect_cancel_url }
85
+ end
86
+
87
+ it 'calls the create_checkout with the correct arguments' do
88
+ expect(gateway).to have_received(:create_checkout).with(
89
+ order,
90
+ redirect_confirm_url: redirect_confirm_url,
91
+ redirect_cancel_url: redirect_cancel_url
92
+ )
93
+ end
94
+ end
95
+ end
96
+
97
+ context 'when the order_number is invalid' do
98
+ let(:order_number) { 'INVALID_ORDER_NUMBER' }
99
+
100
+ before { request }
101
+
102
+ it 'returns a 404 status code' do
103
+ expect(response).to have_http_status(:not_found)
104
+ end
105
+
106
+ it 'returns a resource not found error message' do
107
+ expect(JSON.parse(response.body)['error']).to eq('The resource you were looking for could not be found.')
108
+ end
109
+ end
110
+
111
+ context 'when the payment_method_id is invalid' do
112
+ let(:payment_method_id) { 0 }
113
+
114
+ before { request }
115
+
116
+ it 'returns a 404 status code' do
117
+ expect(response).to have_http_status(:not_found)
118
+ end
119
+
120
+ it 'returns a resource not found error message' do
121
+ expect(JSON.parse(response.body)['error']).to eq('The resource you were looking for could not be found.')
122
+ end
123
+ end
124
+
125
+ context 'when the gateway responds with error' do
126
+ let(:gateway_response_success?) { false }
127
+ let(:gateway_response_message) { 'Error message' }
128
+ let(:gateway_response_error_code) { 'errorCode' }
129
+
130
+ before { request }
131
+
132
+ it 'returns a 422 status code' do
133
+ expect(response).to have_http_status(:unprocessable_entity)
134
+ end
135
+
136
+ it 'returns a resource not found error message' do
137
+ expect(JSON.parse(response.body)['error']).to eq(gateway_response_message)
138
+ end
139
+
140
+ it 'returns the error_code' do
141
+ expect(JSON.parse(response.body)['errorCode']).to eq(gateway_response_error_code)
142
+ end
143
+ end
144
+ end
145
+
146
+ context 'when the user is a guest user', with_guest_session: true do
147
+ it 'returns a 201 status code' do
148
+ request
149
+ expect(response).to have_http_status(:created)
150
+ end
151
+ end
152
+
153
+ context 'when the user is not logged in' do
154
+ it 'returns a 401 status code' do
155
+ request
156
+ expect(response).to have_http_status(:unauthorized)
157
+ end
158
+ end
159
+ end
160
+
161
+ context 'when the use solidus api config is set to true', use_solidus_api: true do
162
+ context 'when the user is logged in' do
163
+ let(:headers) { { Authorization: "Bearer #{user.spree_api_key}" } }
164
+
165
+ it 'returns a 201 status code' do
166
+ request
167
+ expect(response).to have_http_status(:created)
168
+ end
169
+ end
170
+
171
+ context 'when the user is a guest user' do
172
+ let(:headers) { { 'X-Spree-Order-Token': order.guest_token } }
173
+
174
+ it 'returns a 201 status code' do
175
+ request
176
+ expect(response).to have_http_status(:created)
177
+ end
178
+ end
179
+
180
+ context 'when the user is not logged in' do
181
+ let(:headers) { { Authorization: 'Bearer 1234' } }
182
+
183
+ it 'returns a 401 status code' do
184
+ request
185
+ expect(response).to have_http_status(:unauthorized)
186
+ end
187
+ end
188
+ end
189
+ end
190
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Configure Rails Environment
4
+ ENV['RAILS_ENV'] = 'test'
5
+
6
+ # Run Coverage report
7
+ require 'solidus_dev_support/rspec/coverage'
8
+
9
+ # Create the dummy app if it's still missing.
10
+ dummy_env = "#{__dir__}/dummy/config/environment.rb"
11
+ system 'bin/rake extension:test_app' unless File.exist? dummy_env
12
+ require dummy_env
13
+
14
+ # Requires factories and other useful helpers defined in spree_core.
15
+ require 'solidus_dev_support/rspec/feature_helper'
16
+
17
+ # Requires supporting ruby files with custom matchers and macros, etc,
18
+ # in spec/support/ and its subdirectories.
19
+ Dir["#{__dir__}/support/**/*.rb"].sort.each { |f| require f }
20
+
21
+ # Requires factories defined in lib/solidus_afterpay/testing_support/factories.rb
22
+ SolidusDevSupport::TestingSupport::Factories.load_for(SolidusAfterpay::Engine)
23
+
24
+ RSpec.configure do |config|
25
+ config.infer_spec_type_from_file_location!
26
+ config.use_transactional_fixtures = false
27
+
28
+ if Spree.solidus_gem_version < Gem::Version.new('2.11')
29
+ config.extend Spree::TestingSupport::AuthorizationHelpers::Request, type: :system
30
+ end
31
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.configure do |config|
4
+ config.include Devise::Test::IntegrationHelpers, type: :request
5
+
6
+ config.before(:each, with_signed_in_user: true) { login_as user }
7
+
8
+ config.before(:each, with_guest_session: true) do
9
+ # rubocop:disable RSpec/AnyInstance
10
+ allow_any_instance_of(ActionDispatch::Cookies::CookieJar).to(
11
+ receive(:signed).and_return({ guest_token: order.guest_token })
12
+ )
13
+ # rubocop:enable RSpec/AnyInstance
14
+ end
15
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.configure do |config|
4
+ def described_class_source_location
5
+ described_class.instance_methods(false).map do |method|
6
+ described_class.instance_method(method).source_location.first
7
+ end.uniq.first
8
+ end
9
+
10
+ config.before(:each, use_solidus_api: true) do
11
+ SolidusAfterpay.configure do |c|
12
+ c.use_solidus_api = true
13
+ end
14
+
15
+ class_name = described_class.to_s.split('::').last
16
+ source_location = described_class_source_location
17
+
18
+ SolidusAfterpay.send(:remove_const, class_name)
19
+ load source_location
20
+ end
21
+
22
+ config.after(:each, use_solidus_api: true) do
23
+ SolidusAfterpay.configure do |c|
24
+ c.use_solidus_api = false
25
+ end
26
+
27
+ class_name = described_class.to_s.split('::').last
28
+ source_location = described_class_source_location
29
+
30
+ SolidusAfterpay.send(:remove_const, class_name)
31
+ load source_location
32
+ end
33
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'vcr'
4
+
5
+ VCR.configure do |config|
6
+ config.ignore_localhost = true
7
+ config.cassette_library_dir = "spec/fixtures/vcr_casettes"
8
+ config.hook_into :webmock
9
+ config.configure_rspec_metadata!
10
+ config.allow_http_connections_when_no_cassette = false
11
+
12
+ config.filter_sensitive_data('<ENCODED_AUTH_HEADER>') do
13
+ Base64.strict_encode64(
14
+ "#{ENV.fetch('AFTERPAY_MERCHANT_ID',
15
+ 'dummy_merchant_id')}:#{ENV.fetch('AFTERPAY_SECRET_KEY', 'dummy_secret_key')}"
16
+ )
17
+ end
18
+ end
metadata ADDED
@@ -0,0 +1,249 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: solidus_afterpay
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Christian Rimondi
8
+ - Jordy Garcia
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2021-09-09 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: afterpay
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 0.2.0
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 0.2.0
28
+ - !ruby/object:Gem::Dependency
29
+ name: solidus_core
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 2.0.0
35
+ - - "<"
36
+ - !ruby/object:Gem::Version
37
+ version: '4'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: 2.0.0
45
+ - - "<"
46
+ - !ruby/object:Gem::Version
47
+ version: '4'
48
+ - !ruby/object:Gem::Dependency
49
+ name: solidus_support
50
+ requirement: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.5'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.5'
62
+ - !ruby/object:Gem::Dependency
63
+ name: solidus_dev_support
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.5'
69
+ type: :development
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.5'
76
+ - !ruby/object:Gem::Dependency
77
+ name: vcr
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '6.0'
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '6.0'
90
+ - !ruby/object:Gem::Dependency
91
+ name: webmock
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.14'
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.14'
104
+ description:
105
+ email: contact@solidus.io
106
+ executables: []
107
+ extensions: []
108
+ extra_rdoc_files: []
109
+ files:
110
+ - ".circleci/config.yml"
111
+ - ".gem_release.yml"
112
+ - ".github/stale.yml"
113
+ - ".github_changelog_generator"
114
+ - ".gitignore"
115
+ - ".rspec"
116
+ - ".rubocop.yml"
117
+ - CHANGELOG.md
118
+ - Gemfile
119
+ - LICENSE
120
+ - README.md
121
+ - Rakefile
122
+ - app/assets/javascripts/solidus_afterpay/afterpay_checkout.js
123
+ - app/assets/javascripts/spree/backend/solidus_afterpay.js
124
+ - app/assets/javascripts/spree/frontend/solidus_afterpay.js
125
+ - app/assets/stylesheets/spree/backend/solidus_afterpay.css
126
+ - app/assets/stylesheets/spree/frontend/solidus_afterpay.css
127
+ - app/controllers/solidus_afterpay/base_controller.rb
128
+ - app/controllers/solidus_afterpay/callbacks_controller.rb
129
+ - app/controllers/solidus_afterpay/checkouts_controller.rb
130
+ - app/decorators/controllers/solidus_afterpay/spree/checkout_controller_decorator.rb
131
+ - app/decorators/models/solidus_afterpay/spree/order_decorator.rb
132
+ - app/helpers/solidus_afterpay/afterpay_helper.rb
133
+ - app/models/solidus_afterpay/gateway.rb
134
+ - app/models/solidus_afterpay/order_component_builder.rb
135
+ - app/models/solidus_afterpay/payment_method.rb
136
+ - app/models/solidus_afterpay/payment_source.rb
137
+ - app/models/solidus_afterpay/user_agent_generator.rb
138
+ - app/views/solidus_afterpay/_afterpay_javascript.html.erb
139
+ - app/views/spree/admin/payments/source_forms/_afterpay.html.erb
140
+ - app/views/spree/admin/payments/source_views/_afterpay.html.erb
141
+ - app/views/spree/api/payments/source_views/_afterpay.json.jbuilder
142
+ - app/views/spree/checkout/payment/_afterpay.html.erb
143
+ - app/views/spree/shared/_afterpay_messaging.html.erb
144
+ - bin/console
145
+ - bin/rails
146
+ - bin/rails-engine
147
+ - bin/rails-sandbox
148
+ - bin/rake
149
+ - bin/sandbox
150
+ - bin/setup
151
+ - codecov.yml
152
+ - config/locales/en.yml
153
+ - config/routes.rb
154
+ - db/migrate/20210813142725_create_solidus_afterpay_payment_sources.rb
155
+ - lib/generators/solidus_afterpay/install/install_generator.rb
156
+ - lib/generators/solidus_afterpay/install/templates/initializer.rb
157
+ - lib/solidus_afterpay.rb
158
+ - lib/solidus_afterpay/configuration.rb
159
+ - lib/solidus_afterpay/engine.rb
160
+ - lib/solidus_afterpay/testing_support/factories.rb
161
+ - lib/solidus_afterpay/version.rb
162
+ - solidus_afterpay.gemspec
163
+ - spec/fixtures/vcr_casettes/create_checkout/invalid.yml
164
+ - spec/fixtures/vcr_casettes/create_checkout/valid.yml
165
+ - spec/fixtures/vcr_casettes/credit/invalid.yml
166
+ - spec/fixtures/vcr_casettes/credit/valid.yml
167
+ - spec/fixtures/vcr_casettes/deferred/authorize/declined_payment.yml
168
+ - spec/fixtures/vcr_casettes/deferred/authorize/invalid.yml
169
+ - spec/fixtures/vcr_casettes/deferred/authorize/valid.yml
170
+ - spec/fixtures/vcr_casettes/deferred/capture/invalid.yml
171
+ - spec/fixtures/vcr_casettes/deferred/capture/valid.yml
172
+ - spec/fixtures/vcr_casettes/deferred/void/invalid.yml
173
+ - spec/fixtures/vcr_casettes/deferred/void/valid.yml
174
+ - spec/fixtures/vcr_casettes/find_payment/invalid.yml
175
+ - spec/fixtures/vcr_casettes/find_payment/valid.yml
176
+ - spec/fixtures/vcr_casettes/immediate/capture/declined_payment.yml
177
+ - spec/fixtures/vcr_casettes/immediate/capture/invalid.yml
178
+ - spec/fixtures/vcr_casettes/immediate/capture/valid.yml
179
+ - spec/fixtures/vcr_casettes/retrieve_configuration/valid.yml
180
+ - spec/helpers/solidus_afterpay/afterpay_helper_spec.rb
181
+ - spec/models/solidus_afterpay/gateway_spec.rb
182
+ - spec/models/solidus_afterpay/order_component_builder_spec.rb
183
+ - spec/models/solidus_afterpay/payment_method_spec.rb
184
+ - spec/models/solidus_afterpay/payment_source_spec.rb
185
+ - spec/models/solidus_afterpay/user_agent_generator_spec.rb
186
+ - spec/models/spree/order_spec.rb
187
+ - spec/requests/solidus_afterpay/callbacks_controller_spec.rb
188
+ - spec/requests/solidus_afterpay/checkouts_controller_spec.rb
189
+ - spec/spec_helper.rb
190
+ - spec/support/auth.rb
191
+ - spec/support/preferences.rb
192
+ - spec/support/vcr.rb
193
+ homepage: https://github.com/solidusio-contrib/solidus_afterpay#readme
194
+ licenses:
195
+ - Apache-2.0
196
+ metadata:
197
+ homepage_uri: https://github.com/solidusio-contrib/solidus_afterpay#readme
198
+ source_code_uri: https://github.com/solidusio-contrib/solidus_afterpay
199
+ changelog_uri: https://github.com/solidusio-contrib/solidus_afterpay/blob/master/CHANGELOG.md
200
+ post_install_message:
201
+ rdoc_options: []
202
+ require_paths:
203
+ - lib
204
+ required_ruby_version: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '2.5'
209
+ required_rubygems_version: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - ">="
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ requirements: []
215
+ rubygems_version: 3.0.3
216
+ signing_key:
217
+ specification_version: 4
218
+ summary: Solidus extension for using Afterpay in your store.
219
+ test_files:
220
+ - spec/fixtures/vcr_casettes/create_checkout/invalid.yml
221
+ - spec/fixtures/vcr_casettes/create_checkout/valid.yml
222
+ - spec/fixtures/vcr_casettes/credit/invalid.yml
223
+ - spec/fixtures/vcr_casettes/credit/valid.yml
224
+ - spec/fixtures/vcr_casettes/deferred/authorize/declined_payment.yml
225
+ - spec/fixtures/vcr_casettes/deferred/authorize/invalid.yml
226
+ - spec/fixtures/vcr_casettes/deferred/authorize/valid.yml
227
+ - spec/fixtures/vcr_casettes/deferred/capture/invalid.yml
228
+ - spec/fixtures/vcr_casettes/deferred/capture/valid.yml
229
+ - spec/fixtures/vcr_casettes/deferred/void/invalid.yml
230
+ - spec/fixtures/vcr_casettes/deferred/void/valid.yml
231
+ - spec/fixtures/vcr_casettes/find_payment/invalid.yml
232
+ - spec/fixtures/vcr_casettes/find_payment/valid.yml
233
+ - spec/fixtures/vcr_casettes/immediate/capture/declined_payment.yml
234
+ - spec/fixtures/vcr_casettes/immediate/capture/invalid.yml
235
+ - spec/fixtures/vcr_casettes/immediate/capture/valid.yml
236
+ - spec/fixtures/vcr_casettes/retrieve_configuration/valid.yml
237
+ - spec/helpers/solidus_afterpay/afterpay_helper_spec.rb
238
+ - spec/models/solidus_afterpay/gateway_spec.rb
239
+ - spec/models/solidus_afterpay/order_component_builder_spec.rb
240
+ - spec/models/solidus_afterpay/payment_method_spec.rb
241
+ - spec/models/solidus_afterpay/payment_source_spec.rb
242
+ - spec/models/solidus_afterpay/user_agent_generator_spec.rb
243
+ - spec/models/spree/order_spec.rb
244
+ - spec/requests/solidus_afterpay/callbacks_controller_spec.rb
245
+ - spec/requests/solidus_afterpay/checkouts_controller_spec.rb
246
+ - spec/spec_helper.rb
247
+ - spec/support/auth.rb
248
+ - spec/support/preferences.rb
249
+ - spec/support/vcr.rb