solidus_api 2.10.5 → 2.11.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 (99) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/app/controllers/spree/api/addresses_controller.rb +1 -1
  4. data/app/controllers/spree/api/base_controller.rb +11 -3
  5. data/app/controllers/spree/api/checkouts_controller.rb +1 -11
  6. data/app/controllers/spree/api/countries_controller.rb +2 -2
  7. data/app/controllers/spree/api/credit_cards_controller.rb +2 -2
  8. data/app/controllers/spree/api/customer_returns_controller.rb +67 -0
  9. data/app/controllers/spree/api/images_controller.rb +4 -4
  10. data/app/controllers/spree/api/inventory_units_controller.rb +1 -1
  11. data/app/controllers/spree/api/option_types_controller.rb +3 -3
  12. data/app/controllers/spree/api/option_values_controller.rb +2 -2
  13. data/app/controllers/spree/api/orders_controller.rb +1 -1
  14. data/app/controllers/spree/api/payments_controller.rb +1 -1
  15. data/app/controllers/spree/api/product_properties_controller.rb +9 -14
  16. data/app/controllers/spree/api/promotions_controller.rb +3 -12
  17. data/app/controllers/spree/api/properties_controller.rb +3 -3
  18. data/app/controllers/spree/api/resource_controller.rb +2 -2
  19. data/app/controllers/spree/api/return_authorizations_controller.rb +3 -3
  20. data/app/controllers/spree/api/shipments_controller.rb +1 -1
  21. data/app/controllers/spree/api/states_controller.rb +3 -3
  22. data/app/controllers/spree/api/stock_items_controller.rb +2 -2
  23. data/app/controllers/spree/api/stock_locations_controller.rb +3 -3
  24. data/app/controllers/spree/api/stock_movements_controller.rb +3 -3
  25. data/app/controllers/spree/api/stores_controller.rb +3 -3
  26. data/app/controllers/spree/api/taxonomies_controller.rb +2 -2
  27. data/app/controllers/spree/api/taxons_controller.rb +4 -4
  28. data/app/controllers/spree/api/users_controller.rb +13 -0
  29. data/app/controllers/spree/api/variants_controller.rb +3 -3
  30. data/app/controllers/spree/api/zones_controller.rb +2 -2
  31. data/app/helpers/spree/api/api_helpers.rb +18 -5
  32. data/app/views/spree/api/customer_returns/index.json.jbuilder +6 -0
  33. data/app/views/spree/api/customer_returns/new.json.jbuilder +4 -0
  34. data/app/views/spree/api/customer_returns/show.json.jbuilder +3 -0
  35. data/app/views/spree/api/errors/could_not_transition.json.jbuilder +4 -0
  36. data/app/views/spree/api/orders/could_not_transition.json.jbuilder +5 -0
  37. data/config/locales/en.yml +2 -0
  38. data/config/routes.rb +6 -3
  39. data/lib/spree/api/testing_support/helpers.rb +1 -1
  40. data/openapi/authentication.md +9 -1
  41. data/openapi/checkout-flow.md +17 -4
  42. data/openapi/main.hub.yml +1 -1
  43. data/openapi/solidus-api.oas.yml +6753 -0
  44. data/solidus_api.gemspec +19 -19
  45. metadata +14 -114
  46. data/openapi/api.oas2.yml +0 -6108
  47. data/script/rails +0 -10
  48. data/spec/controllers/spree/api/base_controller_spec.rb +0 -118
  49. data/spec/controllers/spree/api/resource_controller_spec.rb +0 -190
  50. data/spec/features/checkout_spec.rb +0 -192
  51. data/spec/fixtures/thinking-cat.jpg +0 -0
  52. data/spec/lib/spree_api_responders_spec.rb +0 -10
  53. data/spec/models/spree/legacy_user_spec.rb +0 -103
  54. data/spec/requests/api/address_books_spec.rb +0 -240
  55. data/spec/requests/jbuilder_cache_spec.rb +0 -34
  56. data/spec/requests/ransackable_attributes_spec.rb +0 -79
  57. data/spec/requests/spree/api/addresses_controller_spec.rb +0 -57
  58. data/spec/requests/spree/api/checkouts_controller_spec.rb +0 -484
  59. data/spec/requests/spree/api/classifications_controller_spec.rb +0 -50
  60. data/spec/requests/spree/api/config_controller_spec.rb +0 -26
  61. data/spec/requests/spree/api/countries_controller_spec.rb +0 -48
  62. data/spec/requests/spree/api/coupon_codes_controller_spec.rb +0 -105
  63. data/spec/requests/spree/api/credit_cards_controller_spec.rb +0 -105
  64. data/spec/requests/spree/api/images_controller_spec.rb +0 -99
  65. data/spec/requests/spree/api/inventory_units_controller_spec.rb +0 -55
  66. data/spec/requests/spree/api/line_items_controller_spec.rb +0 -213
  67. data/spec/requests/spree/api/option_types_controller_spec.rb +0 -116
  68. data/spec/requests/spree/api/option_values_controller_spec.rb +0 -138
  69. data/spec/requests/spree/api/orders_controller_spec.rb +0 -954
  70. data/spec/requests/spree/api/payments_controller_spec.rb +0 -259
  71. data/spec/requests/spree/api/product_properties_controller_spec.rb +0 -114
  72. data/spec/requests/spree/api/products_controller_spec.rb +0 -422
  73. data/spec/requests/spree/api/promotion_application_spec.rb +0 -50
  74. data/spec/requests/spree/api/promotions_controller_spec.rb +0 -67
  75. data/spec/requests/spree/api/properties_controller_spec.rb +0 -102
  76. data/spec/requests/spree/api/return_authorizations_controller_spec.rb +0 -180
  77. data/spec/requests/spree/api/shipments_controller_spec.rb +0 -532
  78. data/spec/requests/spree/api/states_controller_spec.rb +0 -69
  79. data/spec/requests/spree/api/stock_items_controller_spec.rb +0 -311
  80. data/spec/requests/spree/api/stock_locations_controller_spec.rb +0 -170
  81. data/spec/requests/spree/api/stock_movements_controller_spec.rb +0 -81
  82. data/spec/requests/spree/api/store_credit_events_controller_spec.rb +0 -59
  83. data/spec/requests/spree/api/stores_controller_spec.rb +0 -134
  84. data/spec/requests/spree/api/taxonomies_controller_spec.rb +0 -114
  85. data/spec/requests/spree/api/taxons_controller_spec.rb +0 -217
  86. data/spec/requests/spree/api/unauthenticated_products_controller_spec.rb +0 -27
  87. data/spec/requests/spree/api/users_controller_spec.rb +0 -151
  88. data/spec/requests/spree/api/variants_controller_spec.rb +0 -340
  89. data/spec/requests/spree/api/zones_controller_spec.rb +0 -89
  90. data/spec/shared_examples/protect_product_actions.rb +0 -18
  91. data/spec/spec_helper.rb +0 -73
  92. data/spec/support/be_paginated_matcher.rb +0 -9
  93. data/spec/support/controller_hacks.rb +0 -43
  94. data/spec/support/database_cleaner.rb +0 -16
  95. data/spec/support/have_attributes_matcher.rb +0 -11
  96. data/spec/test_views/spree/api/widgets/_widget.json.jbuilder +0 -3
  97. data/spec/test_views/spree/api/widgets/index.json.jbuilder +0 -9
  98. data/spec/test_views/spree/api/widgets/new.json.jbuilder +0 -3
  99. data/spec/test_views/spree/api/widgets/show.json.jbuilder +0 -3
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- module Spree
6
- describe Api::AddressesController, type: :request do
7
- before do
8
- stub_authentication!
9
- @address = create(:address)
10
- @order = create(:order, bill_address: @address)
11
- end
12
-
13
- context "with order" do
14
- before do
15
- allow_any_instance_of(Order).to receive_messages user: current_api_user
16
- end
17
-
18
- context "with their own address" do
19
- it "gets an address" do
20
- get spree.api_order_address_path(@order, @address.id)
21
- expect(json_response['address1']).to eq @address.address1
22
- end
23
-
24
- it "update replaces the readonly Address associated to the Order" do
25
- put spree.api_order_address_path(@order, @address.id), params: { address: { address1: "123 Test Lane" } }
26
- expect(Order.find(@order.id).bill_address_id).not_to eq @address.id
27
- expect(json_response['address1']).to eq '123 Test Lane'
28
- end
29
-
30
- it "receives the errors object if address is invalid" do
31
- put spree.api_order_address_path(@order, @address.id), params: { address: { address1: "" } }
32
-
33
- expect(json_response['error']).not_to be_nil
34
- expect(json_response['errors']).not_to be_nil
35
- expect(json_response['errors']['address1'].first).to eq "can't be blank"
36
- end
37
- end
38
- end
39
-
40
- context "on an address that does not belong to this order" do
41
- before do
42
- @order.bill_address_id = nil
43
- @order.ship_address = nil
44
- end
45
-
46
- it "cannot retrieve address information" do
47
- get spree.api_order_address_path(@order, @address.id)
48
- assert_unauthorized!
49
- end
50
-
51
- it "cannot update address information" do
52
- get spree.api_order_address_path(@order, @address.id)
53
- assert_unauthorized!
54
- end
55
- end
56
- end
57
- end
@@ -1,484 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- module Spree
6
- describe Api::CheckoutsController, type: :request do
7
- before(:each) do
8
- stub_authentication!
9
- stub_spree_preferences(track_inventory_levels: false)
10
- country_zone = create(:zone, name: 'CountryZone')
11
- @state = create(:state)
12
- @country = @state.country
13
- country_zone.members.create(zoneable: @country)
14
- create(:stock_location)
15
-
16
- @shipping_method = create(:shipping_method, zones: [country_zone])
17
- @payment_method = create(:credit_card_payment_method)
18
- end
19
-
20
- context "PUT 'update'" do
21
- let(:order) do
22
- order = create(:order_with_line_items)
23
- # Order should be in a pristine state
24
- # Without doing this, the order may transition from 'cart' straight to 'delivery'
25
- order.shipments.delete_all
26
- order
27
- end
28
-
29
- before(:each) do
30
- allow_any_instance_of(Order).to receive_messages(payment_required?: true)
31
- end
32
-
33
- it "should transition a recently created order from cart to address" do
34
- expect(order.state).to eq "cart"
35
- expect(order.email).not_to be_nil
36
- put spree.api_checkout_path(order.to_param), params: { order_token: order.guest_token }
37
- expect(order.reload.state).to eq "address"
38
- end
39
-
40
- it "should transition a recently created order from cart to address with order token in header" do
41
- expect(order.state).to eq "cart"
42
- expect(order.email).not_to be_nil
43
- put spree.api_checkout_path(order), headers: { "X-Spree-Order-Token" => order.guest_token }
44
- expect(order.reload.state).to eq "address"
45
- end
46
-
47
- it "can take line_items_attributes as a parameter" do
48
- line_item = order.line_items.first
49
- put spree.api_checkout_path(order.to_param), params: { order_token: order.guest_token, order: { line_items_attributes: { 0 => { id: line_item.id, quantity: 1 } } } }
50
- expect(response.status).to eq(200)
51
- expect(order.reload.state).to eq "address"
52
- end
53
-
54
- it "can take line_items as a parameter" do
55
- line_item = order.line_items.first
56
- put spree.api_checkout_path(order.to_param), params: { order_token: order.guest_token, order: { line_items: { 0 => { id: line_item.id, quantity: 1 } } } }
57
- expect(response.status).to eq(200)
58
- expect(order.reload.state).to eq "address"
59
- end
60
-
61
- it "will return an error if the order cannot transition" do
62
- skip "not sure if this test is valid"
63
- order.bill_address = nil
64
- order.save
65
- order.update_column(:state, "address")
66
- put spree.api_checkout_path(order.to_param), params: { order_token: order.guest_token }
67
- # Order has not transitioned
68
- expect(response.status).to eq(422)
69
- end
70
-
71
- context "transitioning to delivery" do
72
- before do
73
- order.update_column(:state, "address")
74
- end
75
-
76
- let(:address) do
77
- {
78
- firstname: 'John',
79
- lastname: 'Doe',
80
- address1: '7735 Old Georgetown Road',
81
- city: 'Bethesda',
82
- phone: '3014445002',
83
- zipcode: '20814',
84
- state_id: @state.id,
85
- country_id: @country.id
86
- }
87
- end
88
-
89
- it "can update addresses and transition from address to delivery" do
90
- put spree.api_checkout_path(order),
91
- params: { order_token: order.guest_token, order: {
92
- bill_address_attributes: address,
93
- ship_address_attributes: address
94
- } }
95
- expect(json_response['state']).to eq('delivery')
96
- expect(json_response['bill_address']['firstname']).to eq('John')
97
- expect(json_response['ship_address']['firstname']).to eq('John')
98
- expect(response.status).to eq(200)
99
- end
100
-
101
- # Regression Spec for https://github.com/spree/spree/issues/5389 and https://github.com/spree/spree/issues/5880
102
- it "can update addresses but not transition to delivery w/o shipping setup" do
103
- Spree::ShippingMethod.all.each(&:really_destroy!)
104
- put spree.api_checkout_path(order),
105
- params: { order_token: order.guest_token, order: {
106
- bill_address_attributes: address,
107
- ship_address_attributes: address
108
- } }
109
- expect(json_response['error']).to eq(I18n.t(:could_not_transition, scope: "spree.api.order"))
110
- expect(response.status).to eq(422)
111
- end
112
-
113
- # Regression test for https://github.com/spree/spree/issues/4498
114
- it "does not contain duplicate variant data in delivery return" do
115
- put spree.api_checkout_path(order),
116
- params: { order_token: order.guest_token, order: {
117
- bill_address_attributes: address,
118
- ship_address_attributes: address
119
- } }
120
- # Shipments manifests should not return the ENTIRE variant
121
- # This information is already present within the order's line items
122
- expect(json_response['shipments'].first['manifest'].first['variant']).to be_nil
123
- expect(json_response['shipments'].first['manifest'].first['variant_id']).to_not be_nil
124
- end
125
- end
126
-
127
- it "can update shipping method and transition from delivery to payment" do
128
- order.update_column(:state, "delivery")
129
- shipment = create(:shipment, order: order)
130
- shipment.refresh_rates
131
- shipping_rate = shipment.shipping_rates.where(selected: false).first
132
- put spree.api_checkout_path(order.to_param), params: { order_token: order.guest_token, order: { shipments_attributes: { "0" => { selected_shipping_rate_id: shipping_rate.id, id: shipment.id } } } }
133
- expect(response.status).to eq(200)
134
- # Find the correct shipment...
135
- json_shipment = json_response['shipments'].detect { |value| value["id"] == shipment.id }
136
- # Find the correct shipping rate for that shipment...
137
- json_shipping_rate = json_shipment['shipping_rates'].detect { |value| value["id"] == shipping_rate.id }
138
- # ... And finally ensure that it's selected
139
- expect(json_shipping_rate['selected']).to be true
140
- # Order should automatically transfer to payment because all criteria are met
141
- expect(json_response['state']).to eq('payment')
142
- end
143
-
144
- it "can update payment method and transition from payment to confirm" do
145
- order.update_column(:state, "payment")
146
- allow_any_instance_of(Spree::PaymentMethod::BogusCreditCard).to receive(:source_required?).and_return(false)
147
- put spree.api_checkout_path(order.to_param), params: { order_token: order.guest_token, order: { payments_attributes: [{ payment_method_id: @payment_method.id }] } }
148
- expect(json_response['state']).to eq('confirm')
149
- expect(json_response['payments'][0]['payment_method']['name']).to eq(@payment_method.name)
150
- expect(json_response['payments'][0]['amount']).to eq(order.total.to_s)
151
- expect(response.status).to eq(200)
152
- end
153
-
154
- context "with disallowed payment method" do
155
- it "returns not found" do
156
- order.update_column(:state, "payment")
157
- allow_any_instance_of(Spree::PaymentMethod::BogusCreditCard).to receive(:source_required?).and_return(false)
158
- @payment_method.update!(available_to_users: false)
159
- expect {
160
- put spree.api_checkout_path(order.to_param), params: { order_token: order.guest_token, order: { payments_attributes: [{ payment_method_id: @payment_method.id }] } }
161
- }.not_to change { Spree::Payment.count }
162
- expect(response.status).to eq(404)
163
- end
164
- end
165
-
166
- it "returns errors when source is required and missing" do
167
- order.update_column(:state, "payment")
168
- put spree.api_checkout_path(order.to_param), params: { order_token: order.guest_token, order: { payments_attributes: [{ payment_method_id: @payment_method.id }] } }
169
- expect(response.status).to eq(422)
170
- source_errors = json_response['errors']['payments.source']
171
- expect(source_errors).to include("can't be blank")
172
- end
173
-
174
- describe 'setting the payment amount' do
175
- let(:order) { create(:order_with_line_items, state: :payment) }
176
- let(:params) do
177
- {
178
- order_token: order.guest_token,
179
- order: {
180
- payments_attributes: [
181
- {
182
- payment_method_id: @payment_method.id.to_s,
183
- source_attributes: attributes_for(:credit_card)
184
- }
185
- ]
186
- }
187
- }
188
- end
189
-
190
- it 'sets the payment amount to the order total' do
191
- put spree.api_checkout_path(order), params: params
192
- expect(response.status).to eq(200)
193
- expect(json_response['payments'][0]['amount']).to eq(order.total.to_s)
194
- end
195
- end
196
-
197
- describe 'payment method with source and transition from payment to confirm' do
198
- before do
199
- order.update_column(:state, "payment")
200
- end
201
-
202
- let(:params) do
203
- {
204
- order_token: order.guest_token,
205
- order: {
206
- payments_attributes: [
207
- {
208
- payment_method_id: @payment_method.id.to_s,
209
- source_attributes: attributes_for(:credit_card)
210
- }
211
- ]
212
- }
213
- }
214
- end
215
-
216
- it 'succeeds' do
217
- put spree.api_checkout_path(order), params: params
218
- expect(response.status).to eq(200)
219
- expect(json_response['payments'][0]['payment_method']['name']).to eq(@payment_method.name)
220
- expect(json_response['payments'][0]['amount']).to eq(order.total.to_s)
221
- end
222
- end
223
-
224
- context 'when source is missing attributes' do
225
- before do
226
- order.update_column(:state, "payment")
227
- end
228
-
229
- let(:params) do
230
- {
231
- order_token: order.guest_token,
232
- order: {
233
- payments_attributes: [
234
- {
235
- payment_method_id: @payment_method.id.to_s,
236
- source_attributes: { name: "Spree" }
237
- }
238
- ]
239
- }
240
- }
241
- end
242
-
243
- it 'returns errors' do
244
- put spree.api_checkout_path(order), params: params
245
-
246
- expect(response.status).to eq(422)
247
- cc_errors = json_response['errors']['payments.Credit Card']
248
- expect(cc_errors).to include("Card Number can't be blank")
249
- expect(cc_errors).to include("Month is not a number")
250
- expect(cc_errors).to include("Year is not a number")
251
- expect(cc_errors).to include("Verification Value can't be blank")
252
- end
253
- end
254
-
255
- context 'reusing a credit card' do
256
- before do
257
- order.update_column(:state, "payment")
258
- end
259
-
260
- let(:params) do
261
- {
262
- order_token: order.guest_token,
263
- order: {
264
- payments_attributes: [
265
- {
266
- source_attributes: {
267
- wallet_payment_source_id: wallet_payment_source.id.to_param,
268
- verification_value: '456'
269
- }
270
- }
271
- ]
272
- }
273
- }
274
- end
275
-
276
- let!(:wallet_payment_source) do
277
- order.user.wallet.add(credit_card)
278
- end
279
-
280
- let(:credit_card) do
281
- create(:credit_card, user_id: order.user_id, payment_method_id: @payment_method.id)
282
- end
283
-
284
- it 'succeeds' do
285
- # unfortunately the credit card gets reloaded by `@order.next` before
286
- # the controller action finishes so this is the best way I could think
287
- # of to test that the verification_value gets set.
288
- expect_any_instance_of(Spree::CreditCard).to(
289
- receive(:verification_value=).with('456').and_call_original
290
- )
291
-
292
- put spree.api_checkout_path(order), params: params
293
-
294
- expect(response.status).to eq 200
295
- expect(order.credit_cards).to match_array [credit_card]
296
- end
297
-
298
- context 'with deprecated existing_card_id param' do
299
- let(:params) do
300
- {
301
- order_token: order.guest_token,
302
- order: {
303
- payments_attributes: [
304
- {
305
- source_attributes: {
306
- existing_card_id: credit_card.id.to_param,
307
- verification_value: '456'
308
- }
309
- }
310
- ]
311
- }
312
- }
313
- end
314
-
315
- it 'succeeds' do
316
- Spree::Deprecation.silence do
317
- put spree.api_checkout_path(order), params: params
318
- end
319
-
320
- expect(response.status).to eq 200
321
- expect(order.credit_cards).to match_array [credit_card]
322
- end
323
- end
324
- end
325
-
326
- it "cannot update attributes of another step" do
327
- order.update_column(:state, "payment")
328
-
329
- params = {
330
- order_token: order.guest_token,
331
- order: {
332
- payments_attributes: [
333
- {
334
- payment_method_id: @payment_method.id.to_s,
335
- source_attributes: attributes_for(:credit_card)
336
- }
337
- ],
338
- ship_address_attributes: {
339
- zipcode: 'MALICIOUS ZIPCODE'
340
- }
341
- }
342
- }
343
- expect do
344
- put spree.api_checkout_path(order), params: params
345
- end.not_to change { order.reload.ship_address.zipcode }
346
- expect(response.status).to eq(200)
347
- end
348
-
349
- it "returns the order if the order is already complete" do
350
- order.update_columns(completed_at: Time.current, state: 'complete')
351
- put spree.api_checkout_path(order.to_param), params: { order_token: order.guest_token }
352
- assert_unauthorized!
353
- end
354
-
355
- context "in delivery state" do
356
- let(:order) { create(:order_with_line_items, state: :delivery) }
357
-
358
- # Regression test for https://github.com/spree/spree/issues/3784
359
- it "can update the special instructions for an order" do
360
- instructions = "Don't drop it. (Please)"
361
- put spree.api_checkout_path(order.to_param), params: { order_token: order.guest_token, order: { special_instructions: instructions } }
362
- expect(json_response['special_instructions']).to eql(instructions)
363
- end
364
- end
365
-
366
- context "as an admin" do
367
- sign_in_as_admin!
368
- it "can assign a user to the order" do
369
- user = create(:user)
370
- # Need to pass email as well so that validations succeed
371
- put spree.api_checkout_path(order.to_param), params: { order_token: order.guest_token, order: { user_id: user.id, email: "guest@spreecommerce.com" } }
372
- expect(response.status).to eq(200)
373
- expect(json_response['user_id']).to eq(user.id)
374
- end
375
- end
376
-
377
- it "can assign an email to the order" do
378
- put spree.api_checkout_path(order.to_param), params: { order_token: order.guest_token, order: { email: "guest@spreecommerce.com" } }
379
- expect(json_response['email']).to eq("guest@spreecommerce.com")
380
- expect(response.status).to eq(200)
381
- end
382
-
383
- it "can apply a coupon code to an order" do
384
- expect(Spree::Deprecation).to receive(:warn)
385
- order.update_column(:state, "payment")
386
- expect(PromotionHandler::Coupon).to receive(:new).with(order).and_call_original
387
- expect_any_instance_of(PromotionHandler::Coupon).to receive(:apply).and_return({ coupon_applied?: true })
388
- put spree.api_checkout_path(order.to_param), params: { order_token: order.guest_token, order: { coupon_code: "foobar" } }
389
- expect(response.status).to eq(200)
390
- end
391
-
392
- it "renders error failing to apply coupon" do
393
- expect(Spree::Deprecation).to receive(:warn)
394
- order.update_column(:state, "payment")
395
- put spree.api_checkout_path(order.to_param), params: { order_token: order.guest_token, order: { coupon_code: "foobar" } }
396
- expect(response.status).to eq(422)
397
- expect(json_response).to eq({ "error" => "The coupon code you entered doesn't exist. Please try again." })
398
- end
399
- end
400
-
401
- context "PUT 'next'" do
402
- let!(:order) { create(:order_with_line_items) }
403
- it "cannot transition to address without a line item" do
404
- order.line_items.delete_all
405
- order.update_column(:email, "spree@example.com")
406
- put spree.next_api_checkout_path(order), params: { order_token: order.guest_token }
407
- expect(response.status).to eq(422)
408
- expect(json_response["errors"]["base"]).to include(I18n.t('spree.there_are_no_items_for_this_order'))
409
- end
410
-
411
- it "can transition an order to the next state" do
412
- order.update_column(:email, "spree@example.com")
413
-
414
- put spree.next_api_checkout_path(order), params: { order_token: order.guest_token }
415
- expect(response.status).to eq(200)
416
- expect(json_response['state']).to eq('address')
417
- end
418
-
419
- it "cannot transition if order email is blank" do
420
- order.update_columns(
421
- state: 'address',
422
- email: nil
423
- )
424
-
425
- put spree.next_api_checkout_path(order), params: { id: order.to_param, order_token: order.guest_token }
426
- expect(response.status).to eq(422)
427
- expect(json_response['error']).to match(/could not be transitioned/)
428
- end
429
- end
430
-
431
- context "complete" do
432
- context "with order in confirm state" do
433
- subject do
434
- put spree.complete_api_checkout_path(order), params: params
435
- end
436
-
437
- let(:params) { { order_token: order.guest_token } }
438
- let(:order) { create(:order_with_line_items) }
439
-
440
- before do
441
- order.update_column(:state, "confirm")
442
- end
443
-
444
- it "can transition from confirm to complete" do
445
- allow_any_instance_of(Spree::Order).to receive_messages(payment_required?: false)
446
- subject
447
- expect(json_response['state']).to eq('complete')
448
- expect(response.status).to eq(200)
449
- end
450
-
451
- it "returns a sensible error when no payment method is specified" do
452
- # put :complete, id: order.to_param, order_token: order.token, order: {}
453
- subject
454
- expect(json_response["errors"]["base"]).to include(I18n.t('spree.no_payment_found'))
455
- end
456
-
457
- context "with mismatched expected_total" do
458
- let(:params) { super().merge(expected_total: order.total + 1) }
459
-
460
- it "returns an error if expected_total is present and does not match actual total" do
461
- # put :complete, id: order.to_param, order_token: order.token, expected_total: order.total + 1
462
- subject
463
- expect(response.status).to eq(400)
464
- expect(json_response['errors']['expected_total']).to include(I18n.t('spree.api.order.expected_total_mismatch'))
465
- end
466
- end
467
- end
468
- end
469
-
470
- context "PUT 'advance'" do
471
- let!(:order) { create(:order_with_line_items) }
472
-
473
- it 'continues to advance an order while it can move forward' do
474
- expect_any_instance_of(Spree::Order).to receive(:next).exactly(3).times.and_return(true, true, false)
475
- put spree.advance_api_checkout_path(order), params: { order_token: order.guest_token }
476
- end
477
-
478
- it 'returns the order' do
479
- put spree.advance_api_checkout_path(order), params: { order_token: order.guest_token }
480
- expect(json_response['id']).to eq(order.id)
481
- end
482
- end
483
- end
484
- end