solidus_afterpay 0.2.0 → 0.3.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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +9 -0
  3. data/Gemfile +6 -3
  4. data/README.md +3 -0
  5. data/app/controllers/solidus_afterpay/callbacks_controller.rb +5 -1
  6. data/app/controllers/solidus_afterpay/express_callbacks_controller.rb +5 -1
  7. data/app/models/solidus_afterpay/order_component_builder.rb +1 -1
  8. data/bin/sandbox +1 -1
  9. data/lib/solidus_afterpay/configuration.rb +9 -2
  10. data/lib/solidus_afterpay/engine.rb +1 -1
  11. data/lib/solidus_afterpay/testing_support/factories.rb +1 -1
  12. data/lib/solidus_afterpay/version.rb +1 -1
  13. data/solidus_afterpay.gemspec +4 -4
  14. metadata +11 -99
  15. data/spec/fixtures/vcr_casettes/create_checkout/invalid.yml +0 -65
  16. data/spec/fixtures/vcr_casettes/create_checkout/valid.yml +0 -64
  17. data/spec/fixtures/vcr_casettes/credit/invalid.yml +0 -61
  18. data/spec/fixtures/vcr_casettes/credit/valid.yml +0 -63
  19. data/spec/fixtures/vcr_casettes/deferred/authorize/declined_payment.yml +0 -120
  20. data/spec/fixtures/vcr_casettes/deferred/authorize/invalid.yml +0 -61
  21. data/spec/fixtures/vcr_casettes/deferred/authorize/valid.yml +0 -120
  22. data/spec/fixtures/vcr_casettes/deferred/capture/invalid.yml +0 -61
  23. data/spec/fixtures/vcr_casettes/deferred/capture/valid.yml +0 -140
  24. data/spec/fixtures/vcr_casettes/deferred/void/invalid.yml +0 -61
  25. data/spec/fixtures/vcr_casettes/deferred/void/valid.yml +0 -137
  26. data/spec/fixtures/vcr_casettes/find_order/invalid.yml +0 -64
  27. data/spec/fixtures/vcr_casettes/find_order/valid.yml +0 -120
  28. data/spec/fixtures/vcr_casettes/find_payment/invalid.yml +0 -61
  29. data/spec/fixtures/vcr_casettes/find_payment/valid.yml +0 -140
  30. data/spec/fixtures/vcr_casettes/immediate/capture/declined_payment.yml +0 -120
  31. data/spec/fixtures/vcr_casettes/immediate/capture/invalid.yml +0 -61
  32. data/spec/fixtures/vcr_casettes/immediate/capture/valid.yml +0 -134
  33. data/spec/fixtures/vcr_casettes/retrieve_configuration/valid.yml +0 -67
  34. data/spec/helpers/solidus_afterpay/afterpay_helper_spec.rb +0 -39
  35. data/spec/models/solidus_afterpay/gateway_spec.rb +0 -492
  36. data/spec/models/solidus_afterpay/order_component_builder_spec.rb +0 -198
  37. data/spec/models/solidus_afterpay/payment_method_spec.rb +0 -207
  38. data/spec/models/solidus_afterpay/payment_source_spec.rb +0 -61
  39. data/spec/models/solidus_afterpay/user_agent_generator_spec.rb +0 -22
  40. data/spec/models/spree/order_spec.rb +0 -158
  41. data/spec/presenters/solidus_afterpay/order_presenter_spec.rb +0 -34
  42. data/spec/presenters/solidus_afterpay/shipping_rate_presenter_spec.rb +0 -28
  43. data/spec/requests/solidus_afterpay/callbacks_controller_spec.rb +0 -127
  44. data/spec/requests/solidus_afterpay/checkouts_controller_spec.rb +0 -258
  45. data/spec/requests/solidus_afterpay/express_callbacks_controller_spec.rb +0 -167
  46. data/spec/services/solidus_afterpay/base_service_spec.rb +0 -13
  47. data/spec/services/solidus_afterpay/shipping_rate_builder_service_spec.rb +0 -34
  48. data/spec/services/solidus_afterpay/update_order_addresses_service_spec.rb +0 -82
  49. data/spec/services/solidus_afterpay/update_order_attributes_service_spec.rb +0 -58
  50. data/spec/spec_helper.rb +0 -31
  51. data/spec/support/auth.rb +0 -15
  52. data/spec/support/cache.rb +0 -5
  53. data/spec/support/preferences.rb +0 -33
  54. data/spec/support/solidus.rb +0 -1
  55. data/spec/support/vcr.rb +0 -18
  56. data/spec/views/solidus_afterpay/express_checkout_button_spec.rb +0 -33
  57. data/spec/views/spree/shared/afterpay_messaging_spec.rb +0 -44
@@ -1,207 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe SolidusAfterpay::PaymentMethod, type: :model do
4
- let(:payment_method) { described_class.new }
5
-
6
- describe "#gateway_class" do
7
- subject { payment_method.gateway_class }
8
-
9
- it { is_expected.to eq(SolidusAfterpay::Gateway) }
10
- end
11
-
12
- describe "#payment_source_class" do
13
- subject { payment_method.payment_source_class }
14
-
15
- it { is_expected.to eq(SolidusAfterpay::PaymentSource) }
16
- end
17
-
18
- describe "#partial_name" do
19
- subject { payment_method.partial_name }
20
-
21
- it { is_expected.to eq('afterpay') }
22
- end
23
-
24
- describe "#try_void" do
25
- subject { payment_method.try_void(payment) }
26
-
27
- let(:response_code) { 'RESPONSE_CODE' }
28
- let(:payment_source) { build(:afterpay_payment_source) }
29
- let(:payment) { build(:afterpay_payment, response_code: response_code, source: payment_source) }
30
-
31
- let(:can_void?) { true }
32
- let(:gateway_response_success?) { true }
33
- let(:gateway_response) { ActiveMerchant::Billing::Response.new(gateway_response_success?, '') }
34
-
35
- let(:gateway_options) { { originator: payment, currency: 'USD' } }
36
-
37
- before do
38
- allow(payment_source).to receive(:can_void?).and_return(can_void?)
39
- allow(payment_method).to receive(:void).with(response_code, gateway_options).and_return(gateway_response)
40
- end
41
-
42
- context 'when the void completes successful' do
43
- it 'returns the void response' do
44
- is_expected.to eq(gateway_response)
45
- end
46
- end
47
-
48
- context 'when the void throws an error' do
49
- let(:gateway_response_success?) { false }
50
-
51
- it { is_expected.to be(false) }
52
- end
53
-
54
- context "when the payment can't be voided" do
55
- let(:can_void?) { false }
56
-
57
- it { is_expected.to be(false) }
58
- end
59
- end
60
-
61
- describe "#excluded_product?" do
62
- subject { payment_method.excluded_product?(product) }
63
-
64
- let(:product) { create(:base_product) }
65
- let(:excluded_product_ids) { product.id.to_s }
66
- let(:payment_method) { described_class.new(preferred_excluded_products: excluded_product_ids) }
67
-
68
- context 'when the product is excluded' do
69
- it { is_expected.to be_truthy }
70
- end
71
-
72
- context 'when the product is not excluded' do
73
- let(:excluded_product_ids) { '' }
74
-
75
- it { is_expected.to be_falsey }
76
- end
77
- end
78
-
79
- describe "#available_for_order?" do
80
- subject { payment_method.available_for_order?(order) }
81
-
82
- let(:product) { create(:base_product) }
83
- let(:excluded_product_ids) { '' }
84
- let(:payment_method) { create(:afterpay_payment_method, preferred_excluded_products: excluded_product_ids) }
85
- let(:order) {
86
- build(:order_with_line_items, currency: order_currency,
87
- line_items_attributes: line_items_attributes)
88
- }
89
- let(:line_items_attributes) do
90
- [{ product: product }]
91
- end
92
- let(:order_currency) { 'USD' }
93
-
94
- context "with cache" do
95
- context 'when order total is inside the range' do
96
- before do
97
- Rails.cache.write("solidus_afterpay_configuration_maximumAmount_currency", "USD")
98
- Rails.cache.write("solidus_afterpay_configuration_maximumAmount_amount", 1000.0)
99
- Rails.cache.write("solidus_afterpay_configuration_minimumAmount_amount", 1.0)
100
- end
101
-
102
- it { is_expected.to be(true) }
103
- end
104
-
105
- context 'when order total is outside the range' do
106
- before do
107
- Rails.cache.write("solidus_afterpay_configuration_maximumAmount_currency", "USD")
108
- Rails.cache.write("solidus_afterpay_configuration_maximumAmount_amount", 4.0)
109
- Rails.cache.write("solidus_afterpay_configuration_minimumAmount_amount", 1.0)
110
- end
111
-
112
- it { is_expected.to be(false) }
113
- end
114
-
115
- context 'when order currency is different from afterpay configuration' do
116
- before do
117
- Rails.cache.write("solidus_afterpay_configuration_maximumAmount_amount", 1000.0)
118
- Rails.cache.write("solidus_afterpay_configuration_minimumAmount_amount", 1.0)
119
- Rails.cache.write("solidus_afterpay_configuration_maximumAmount_currency", "EUR")
120
- end
121
-
122
- it { is_expected.to be(false) }
123
- end
124
-
125
- context 'when order currency is the same from afterpay configuration' do
126
- before do
127
- Rails.cache.write("solidus_afterpay_configuration_maximumAmount_amount", 1000.0)
128
- Rails.cache.write("solidus_afterpay_configuration_minimumAmount_amount", 1.0)
129
- Rails.cache.write("solidus_afterpay_configuration_maximumAmount_currency", "USD")
130
- end
131
-
132
- it { is_expected.to be(true) }
133
- end
134
- end
135
-
136
- context 'when there is no cache' do
137
- let(:configuration) do
138
- require 'hashie'
139
-
140
- Hashie::Mash.new({
141
- minimumAmount: { amount: '1', currency: 'USD' },
142
- maximumAmount: { amount: '110', currency: 'USD' }
143
- })
144
- end
145
-
146
- before do
147
- allow(payment_method.gateway).to receive(:retrieve_configuration).and_return(configuration)
148
- end
149
-
150
- context 'when order total is inside the range and the currency is the same from afterpay configuration' do
151
- it { is_expected.to be(true) }
152
- end
153
-
154
- context 'when order total is outside the range' do
155
- it do
156
- order.update(total: 111)
157
- is_expected.to be(false)
158
- end
159
- end
160
-
161
- context 'when order currency is different from afterpay configuration' do
162
- let(:order_currency) { 'EUR' }
163
-
164
- it { is_expected.to be(false) }
165
- end
166
- end
167
-
168
- context "when the items are excluded from the payment_method" do
169
- let(:excluded_product_ids) { product.id.to_s }
170
-
171
- context "when the id's of all the products are excluded" do
172
- it { is_expected.to be_falsey }
173
- end
174
-
175
- context "when the id of one of the products is excluded" do
176
- let(:second_product) { create(:base_product) }
177
- let(:line_items_attributes) do
178
- [{ product: product }, { product: second_product }]
179
- end
180
-
181
- it { is_expected.to be(false) }
182
- end
183
- end
184
-
185
- context "when none of the items are excluded from the payment_method" do
186
- let(:configuration) do
187
- require 'hashie'
188
-
189
- Hashie::Mash.new({
190
- minimumAmount: { amount: '1', currency: 'USD' },
191
- maximumAmount: { amount: '1000', currency: 'USD' }
192
- })
193
- end
194
-
195
- let(:excluded_product_ids) { '' }
196
-
197
- before do
198
- Rails.cache.clear
199
- allow(payment_method.gateway).to receive(:retrieve_configuration).and_return(configuration)
200
- end
201
-
202
- it "returns true when none of the products are excluded" do
203
- is_expected.to be(true)
204
- end
205
- end
206
- end
207
- end
@@ -1,61 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe SolidusAfterpay::PaymentSource, type: :model do
4
- let(:payment_source) { described_class.new }
5
-
6
- describe '#actions' do
7
- subject { payment_source.actions }
8
-
9
- it 'supports capture, void, and credit' do
10
- is_expected.to eq(%w[capture void credit])
11
- end
12
- end
13
-
14
- describe '#can_void?' do
15
- subject { payment_source.can_void?(payment) }
16
-
17
- let(:auto_capture) { true }
18
- let(:payment_method) { build(:afterpay_payment_method, auto_capture: auto_capture) }
19
- let(:payment) { build(:afterpay_payment, payment_method: payment_method) }
20
-
21
- context 'with the immediate flow' do
22
- it 'is always false' do
23
- is_expected.to be(false)
24
- end
25
- end
26
-
27
- context 'with the deferred flow' do
28
- let(:auto_capture) { false }
29
-
30
- let(:payment_state) { 'AUTH_APPROVED' }
31
- let(:gateway_response) { { paymentState: payment_state } }
32
- let(:gateway) { instance_double(SolidusAfterpay::Gateway, find_payment: gateway_response) }
33
-
34
- before do
35
- allow(payment_method).to receive(:gateway).and_return(gateway)
36
- end
37
-
38
- context 'when the payment exists and the payment state is voidable' do
39
- it 'returns true' do
40
- is_expected.to be(true)
41
- end
42
- end
43
-
44
- context 'when the payment exists when the payment state is not voidable' do
45
- let(:payment_state) { 'NOT_VOIDABLE' }
46
-
47
- it 'returns false' do
48
- is_expected.to be(false)
49
- end
50
- end
51
-
52
- context "when the payment doesn't exist" do
53
- let(:gateway_response) { nil }
54
-
55
- it 'returns false' do
56
- is_expected.to be(false)
57
- end
58
- end
59
- end
60
- end
61
- end
@@ -1,22 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe SolidusAfterpay::UserAgentGenerator do
4
- describe '#generate' do
5
- subject { user_agent_generator.generate }
6
-
7
- let(:user_agent_generator) { described_class.new(merchant_id: merchant_id) }
8
- let(:merchant_id) { 'MERCHANT_ID' }
9
- let(:default_store) { build(:store, url: 'test.com') }
10
-
11
- before do
12
- stub_const('SolidusAfterpay::VERSION', '0.1.0')
13
- allow(::Spree).to receive(:solidus_gem_version).and_return('3.0.1')
14
- stub_const('RUBY_VERSION', '2.6.6')
15
- allow(::Spree::Store).to receive(:default).and_return(default_store)
16
- end
17
-
18
- it 'includes the production javascript' do
19
- is_expected.to eq('SolidusAfterpay/0.1.0 (Solidus/3.0.1; Ruby/2.6.6; Merchant/MERCHANT_ID) https://test.com')
20
- end
21
- end
22
- end
@@ -1,158 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe Spree::Order, type: :model do
6
- let(:store) { create(:store) }
7
- let(:user) { create(:user, email: "solidus@example.com") }
8
- let(:order) { create(:order, user: user, store: store) }
9
-
10
- describe "#available_payment_methods" do
11
- it "includes frontend payment methods" do
12
- payment_method = Spree::PaymentMethod::Check.create!({
13
- name: "Fake",
14
- active: true,
15
- available_to_users: true,
16
- available_to_admin: false
17
- })
18
- expect(order.available_payment_methods).to include(payment_method)
19
- end
20
-
21
- it "includes 'both' payment methods" do
22
- payment_method = Spree::PaymentMethod::Check.create!({
23
- name: "Fake",
24
- active: true,
25
- available_to_users: true,
26
- available_to_admin: true
27
- })
28
- expect(order.available_payment_methods).to include(payment_method)
29
- end
30
-
31
- # rubocop:disable RSpec/MultipleExpectations
32
- it "does not include a payment method twice" do
33
- payment_method = Spree::PaymentMethod::Check.create!({
34
- name: "Fake",
35
- active: true,
36
- available_to_users: true,
37
- available_to_admin: true
38
- })
39
- expect(order.available_payment_methods.count).to eq(1)
40
- expect(order.available_payment_methods).to include(payment_method)
41
- end
42
- # rubocop:enable RSpec/MultipleExpectations
43
-
44
- it "does not include inactive payment methods" do
45
- Spree::PaymentMethod::Check.create!({
46
- name: "Fake",
47
- active: false,
48
- available_to_users: true,
49
- available_to_admin: true
50
- })
51
- expect(order.available_payment_methods.count).to eq(0)
52
- end
53
-
54
- context "with more than one payment method" do
55
- subject { order.available_payment_methods }
56
-
57
- let!(:first_method) {
58
- FactoryBot.create(:payment_method, available_to_users: true,
59
- available_to_admin: true)
60
- }
61
- let!(:second_method) {
62
- FactoryBot.create(:payment_method, available_to_users: true,
63
- available_to_admin: true)
64
- }
65
-
66
- before do
67
- second_method.move_to_top
68
- end
69
-
70
- it "respects the order of methods based on position" do
71
- is_expected.to eq([second_method, first_method])
72
- end
73
-
74
- context 'when a payment method responds to #available_for_order?' do
75
- let(:third_method) {
76
- FakePaymentMethod.create(name: 'Fake', available_to_users: true, available_to_admin: true)
77
- }
78
-
79
- before do
80
- fake_payment_method_class = Class.new(SolidusSupport.payment_method_parent_class)
81
- stub_const('FakePaymentMethod', fake_payment_method_class)
82
-
83
- third_method
84
- end
85
-
86
- context 'when it responds with true' do
87
- before do
88
- FakePaymentMethod.class_eval { def available_for_order?(_order); true; end }
89
- end
90
-
91
- it 'includes it in the result' do
92
- is_expected.to eq([second_method, first_method, third_method])
93
- end
94
- end
95
-
96
- context 'when it responds with false' do
97
- before do
98
- FakePaymentMethod.class_eval { def available_for_order?(_order); false; end }
99
- end
100
-
101
- it "doesn't include it in the result" do
102
- is_expected.to eq([second_method, first_method])
103
- end
104
- end
105
- end
106
- end
107
-
108
- context 'when the order has a store' do
109
- let(:order) { create(:order) }
110
-
111
- let!(:store_with_payment_methods) do
112
- create(:store,
113
- payment_methods: [payment_method_with_store])
114
- end
115
- let!(:payment_method_with_store) { create(:payment_method) }
116
- let!(:store_without_payment_methods) { create(:store) }
117
- let!(:payment_method_without_store) { create(:payment_method) }
118
-
119
- context 'when the store has payment methods' do
120
- before { order.update!(store: store_with_payment_methods) }
121
-
122
- it 'returns only the matching payment methods for that store' do
123
- expect(order.available_payment_methods).to match_array(
124
- [payment_method_with_store]
125
- )
126
- end
127
-
128
- context 'when the store has an extra payment method unavailable to users' do
129
- let!(:admin_only_payment_method) do
130
- create(:payment_method,
131
- available_to_users: false,
132
- available_to_admin: true)
133
- end
134
-
135
- before do
136
- store_with_payment_methods.payment_methods << admin_only_payment_method
137
- end
138
-
139
- it 'returns only the payment methods available to users for that store' do
140
- expect(order.available_payment_methods).to match_array(
141
- [payment_method_with_store]
142
- )
143
- end
144
- end
145
- end
146
-
147
- context 'when the store does not have payment methods' do
148
- before { order.update!(store: store_without_payment_methods) }
149
-
150
- it 'returns all matching payment methods regardless of store' do
151
- expect(order.available_payment_methods).to match_array(
152
- [payment_method_with_store, payment_method_without_store]
153
- )
154
- end
155
- end
156
- end
157
- end
158
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe SolidusAfterpay::OrderPresenter do
6
- describe '#line_items_tax_amount' do
7
- subject(:line_items_tax_amount) { described_class.new(order: order).line_items_tax_amount }
8
-
9
- describe '#line_items_tax_amount' do
10
- before do
11
- country = create(:country)
12
- state = create(:state, country: country)
13
- zone = create(:zone, country_ids: [country.id], state_ids: [state.id])
14
- create(:tax_rate, zone: zone)
15
- end
16
-
17
- context 'when the order has line items' do
18
- let(:order) { create(:order_with_line_items, line_items_count: 2) }
19
-
20
- it 'returns the line items tax total amout' do
21
- expect(line_items_tax_amount).to eq(2.0)
22
- end
23
- end
24
-
25
- context 'when the order does not have line items' do
26
- let(:order) { create(:order) }
27
-
28
- it 'returns 0' do
29
- expect(line_items_tax_amount).to eq(0)
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- describe SolidusAfterpay::ShippingRatePresenter do
6
- let(:order) { create(:order_with_line_items ) }
7
- let(:shipment) { create(:shipment, order: order) }
8
- let(:shipping_rate) { create(:shipping_rate, cost: 5, shipment: shipment) }
9
- let(:shipping_rate_tax) { ::Spree::ShippingRateTax.create(amount: 0.75, shipping_rate: shipping_rate) }
10
-
11
- before { shipping_rate.taxes << shipping_rate_tax }
12
-
13
- describe '#order_amount' do
14
- subject(:order_amount) { described_class.new(shipping_rate: shipping_rate).order_amount }
15
-
16
- it 'returns the order total including the shipping rate' do
17
- expect(order_amount.to_f).to eq(15.75)
18
- end
19
- end
20
-
21
- describe '#amount_with_taxes' do
22
- subject(:amount_with_taxes) { described_class.new(shipping_rate: shipping_rate).amount_with_taxes }
23
-
24
- it 'returns the total amount including taxes' do
25
- expect(amount_with_taxes.to_f).to eq(5.75)
26
- end
27
- end
28
- end
@@ -1,127 +0,0 @@
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