spree_api 3.3.0.rc1 → 3.3.0.rc2

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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/spree/api/v1/users_controller.rb +9 -1
  3. data/config/routes.rb +7 -1
  4. data/spree_api.gemspec +1 -2
  5. metadata +6 -94
  6. data/spec/controllers/spree/api/base_controller_spec.rb +0 -84
  7. data/spec/controllers/spree/api/v1/addresses_controller_spec.rb +0 -56
  8. data/spec/controllers/spree/api/v1/checkouts_controller_spec.rb +0 -361
  9. data/spec/controllers/spree/api/v1/classifications_controller_spec.rb +0 -48
  10. data/spec/controllers/spree/api/v1/countries_controller_spec.rb +0 -48
  11. data/spec/controllers/spree/api/v1/credit_cards_controller_spec.rb +0 -80
  12. data/spec/controllers/spree/api/v1/customer_returns_controller_spec.rb +0 -27
  13. data/spec/controllers/spree/api/v1/images_controller_spec.rb +0 -114
  14. data/spec/controllers/spree/api/v1/inventory_units_controller_spec.rb +0 -48
  15. data/spec/controllers/spree/api/v1/line_items_controller_spec.rb +0 -210
  16. data/spec/controllers/spree/api/v1/option_types_controller_spec.rb +0 -122
  17. data/spec/controllers/spree/api/v1/option_values_controller_spec.rb +0 -141
  18. data/spec/controllers/spree/api/v1/orders_controller_spec.rb +0 -735
  19. data/spec/controllers/spree/api/v1/payments_controller_spec.rb +0 -234
  20. data/spec/controllers/spree/api/v1/product_properties_controller_spec.rb +0 -156
  21. data/spec/controllers/spree/api/v1/products_controller_spec.rb +0 -409
  22. data/spec/controllers/spree/api/v1/promotion_application_spec.rb +0 -50
  23. data/spec/controllers/spree/api/v1/promotions_controller_spec.rb +0 -64
  24. data/spec/controllers/spree/api/v1/properties_controller_spec.rb +0 -102
  25. data/spec/controllers/spree/api/v1/reimbursements_controller_spec.rb +0 -24
  26. data/spec/controllers/spree/api/v1/return_authorizations_controller_spec.rb +0 -161
  27. data/spec/controllers/spree/api/v1/shipments_controller_spec.rb +0 -187
  28. data/spec/controllers/spree/api/v1/states_controller_spec.rb +0 -86
  29. data/spec/controllers/spree/api/v1/stock_items_controller_spec.rb +0 -151
  30. data/spec/controllers/spree/api/v1/stock_locations_controller_spec.rb +0 -113
  31. data/spec/controllers/spree/api/v1/stock_movements_controller_spec.rb +0 -84
  32. data/spec/controllers/spree/api/v1/stores_controller_spec.rb +0 -133
  33. data/spec/controllers/spree/api/v1/tags_controller_spec.rb +0 -102
  34. data/spec/controllers/spree/api/v1/taxonomies_controller_spec.rb +0 -114
  35. data/spec/controllers/spree/api/v1/taxons_controller_spec.rb +0 -177
  36. data/spec/controllers/spree/api/v1/unauthenticated_products_controller_spec.rb +0 -26
  37. data/spec/controllers/spree/api/v1/users_controller_spec.rb +0 -153
  38. data/spec/controllers/spree/api/v1/variants_controller_spec.rb +0 -205
  39. data/spec/controllers/spree/api/v1/zones_controller_spec.rb +0 -91
  40. data/spec/fixtures/thinking-cat.jpg +0 -0
  41. data/spec/models/spree/legacy_user_spec.rb +0 -19
  42. data/spec/requests/rabl_cache_spec.rb +0 -32
  43. data/spec/requests/ransackable_attributes_spec.rb +0 -79
  44. data/spec/requests/version_spec.rb +0 -19
  45. data/spec/shared_examples/protect_product_actions.rb +0 -17
  46. data/spec/spec_helper.rb +0 -63
  47. data/spec/support/controller_hacks.rb +0 -40
  48. data/spec/support/database_cleaner.rb +0 -14
  49. data/spec/support/have_attributes_matcher.rb +0 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 26fb8c0927a1d6b2423649295a3dd8ea7aeb798f
4
- data.tar.gz: 914d854628f209659d0693b408b5aedc24bf6a5c
3
+ metadata.gz: 23d326e39ca317d532c54546890bd3983f95c502
4
+ data.tar.gz: e75a525d378f3a1448040ee11f1220737a2db6f6
5
5
  SHA512:
6
- metadata.gz: 254a9e9ba85214262fa672d11d259df4dfbdb141d25a94747d0984d77e926618070ba9662a549e8a6ccd83c902fd696ababfbc7f56db9ac762e7615055d88c16
7
- data.tar.gz: 76cee411a30b7d769e76a74e9ad3146610005e34fc413cb032d98b24122a2ac16f8a5158d4b77f127d32d1668a93698f39c4656463c79b1292478450efc3ca68
6
+ metadata.gz: 032b7f4f3abcbab1843cd5bf1992e5c2fc60993f02a79dcef12881d252bace12e764cade45734a32e691a36f1658f00c1e45f47c76252ed7ee1bf60b25a8b8ce
7
+ data.tar.gz: 6219755053eb139c06e9601360adadb7c0f8f96e326c78e4a66b961577dc2e3bd63d50f51c46e306f2820148704dadf652c72197f0ce2643fd9785c9dabb9645
@@ -6,7 +6,15 @@ module Spree
6
6
  rescue_from Spree::Core::DestroyWithOrdersError, with: :error_during_processing
7
7
 
8
8
  def index
9
- @users = Spree.user_class.accessible_by(current_ability,:read).ransack(params[:q]).result.page(params[:page]).per(params[:per_page])
9
+ @users = Spree.user_class.accessible_by(current_ability, :read)
10
+
11
+ @users = if params[:ids]
12
+ @users.ransack(id_in: params[:ids].split(','))
13
+ else
14
+ @users.ransack(params[:q])
15
+ end
16
+
17
+ @users = @users.result.page(params[:page]).per(params[:per_page])
10
18
  expires_in 15.minutes, public: true
11
19
  headers['Surrogate-Control'] = "max-age=#{15.minutes}"
12
20
  respond_with(@users)
data/config/routes.rb CHANGED
@@ -121,7 +121,13 @@ Spree::Core::Engine.add_routes do
121
121
  end
122
122
 
123
123
  spree_path = Rails.application.routes.url_helpers.try(:spree_path, trailing_slash: true) || '/'
124
- match 'v:api/*path', to: redirect("#{spree_path}api/v1/%{path}"), via: [:get, :post, :put, :patch, :delete]
124
+
125
+ match 'v:api/*path', to: redirect{ |params, request|
126
+ format = ".#{params[:format]}" unless params[:format].blank?
127
+ query = "?#{request.query_string}" unless request.query_string.blank?
128
+
129
+ "#{spree_path}api/v1/#{params[:path]}#{format}#{query}"
130
+ }, via: [:get, :post, :put, :patch, :delete]
125
131
 
126
132
  match '*path', to: redirect{ |params, request|
127
133
  format = ".#{params[:format]}" unless params[:format].blank?
data/spree_api.gemspec CHANGED
@@ -11,9 +11,8 @@ Gem::Specification.new do |s|
11
11
 
12
12
  s.required_ruby_version = '>= 2.2.7'
13
13
 
14
- s.files = `git ls-files`.split($\)
14
+ s.files = `git ls-files`.split($\).reject { |f| f.match(/^spec/) }
15
15
  s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
16
- s.test_files = s.files.grep(%r{^(test|spec|features)/})
17
16
  s.name = "spree_api"
18
17
  s.require_paths = ["lib"]
19
18
  s.version = Spree.version
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0.rc1
4
+ version: 3.3.0.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Bigg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-02 00:00:00.000000000 Z
11
+ date: 2017-07-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree_core
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 3.3.0.rc1
19
+ version: 3.3.0.rc2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 3.3.0.rc1
26
+ version: 3.3.0.rc2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rabl
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -213,50 +213,6 @@ files:
213
213
  - lib/spree/api/testing_support/setup.rb
214
214
  - lib/spree_api.rb
215
215
  - script/rails
216
- - spec/controllers/spree/api/base_controller_spec.rb
217
- - spec/controllers/spree/api/v1/addresses_controller_spec.rb
218
- - spec/controllers/spree/api/v1/checkouts_controller_spec.rb
219
- - spec/controllers/spree/api/v1/classifications_controller_spec.rb
220
- - spec/controllers/spree/api/v1/countries_controller_spec.rb
221
- - spec/controllers/spree/api/v1/credit_cards_controller_spec.rb
222
- - spec/controllers/spree/api/v1/customer_returns_controller_spec.rb
223
- - spec/controllers/spree/api/v1/images_controller_spec.rb
224
- - spec/controllers/spree/api/v1/inventory_units_controller_spec.rb
225
- - spec/controllers/spree/api/v1/line_items_controller_spec.rb
226
- - spec/controllers/spree/api/v1/option_types_controller_spec.rb
227
- - spec/controllers/spree/api/v1/option_values_controller_spec.rb
228
- - spec/controllers/spree/api/v1/orders_controller_spec.rb
229
- - spec/controllers/spree/api/v1/payments_controller_spec.rb
230
- - spec/controllers/spree/api/v1/product_properties_controller_spec.rb
231
- - spec/controllers/spree/api/v1/products_controller_spec.rb
232
- - spec/controllers/spree/api/v1/promotion_application_spec.rb
233
- - spec/controllers/spree/api/v1/promotions_controller_spec.rb
234
- - spec/controllers/spree/api/v1/properties_controller_spec.rb
235
- - spec/controllers/spree/api/v1/reimbursements_controller_spec.rb
236
- - spec/controllers/spree/api/v1/return_authorizations_controller_spec.rb
237
- - spec/controllers/spree/api/v1/shipments_controller_spec.rb
238
- - spec/controllers/spree/api/v1/states_controller_spec.rb
239
- - spec/controllers/spree/api/v1/stock_items_controller_spec.rb
240
- - spec/controllers/spree/api/v1/stock_locations_controller_spec.rb
241
- - spec/controllers/spree/api/v1/stock_movements_controller_spec.rb
242
- - spec/controllers/spree/api/v1/stores_controller_spec.rb
243
- - spec/controllers/spree/api/v1/tags_controller_spec.rb
244
- - spec/controllers/spree/api/v1/taxonomies_controller_spec.rb
245
- - spec/controllers/spree/api/v1/taxons_controller_spec.rb
246
- - spec/controllers/spree/api/v1/unauthenticated_products_controller_spec.rb
247
- - spec/controllers/spree/api/v1/users_controller_spec.rb
248
- - spec/controllers/spree/api/v1/variants_controller_spec.rb
249
- - spec/controllers/spree/api/v1/zones_controller_spec.rb
250
- - spec/fixtures/thinking-cat.jpg
251
- - spec/models/spree/legacy_user_spec.rb
252
- - spec/requests/rabl_cache_spec.rb
253
- - spec/requests/ransackable_attributes_spec.rb
254
- - spec/requests/version_spec.rb
255
- - spec/shared_examples/protect_product_actions.rb
256
- - spec/spec_helper.rb
257
- - spec/support/controller_hacks.rb
258
- - spec/support/database_cleaner.rb
259
- - spec/support/have_attributes_matcher.rb
260
216
  - spree_api.gemspec
261
217
  homepage: https://spreecommerce.com
262
218
  licenses:
@@ -278,52 +234,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
278
234
  version: 1.3.1
279
235
  requirements: []
280
236
  rubyforge_project:
281
- rubygems_version: 2.6.12
237
+ rubygems_version: 2.6.10
282
238
  signing_key:
283
239
  specification_version: 4
284
240
  summary: Spree's API
285
- test_files:
286
- - spec/controllers/spree/api/base_controller_spec.rb
287
- - spec/controllers/spree/api/v1/addresses_controller_spec.rb
288
- - spec/controllers/spree/api/v1/checkouts_controller_spec.rb
289
- - spec/controllers/spree/api/v1/classifications_controller_spec.rb
290
- - spec/controllers/spree/api/v1/countries_controller_spec.rb
291
- - spec/controllers/spree/api/v1/credit_cards_controller_spec.rb
292
- - spec/controllers/spree/api/v1/customer_returns_controller_spec.rb
293
- - spec/controllers/spree/api/v1/images_controller_spec.rb
294
- - spec/controllers/spree/api/v1/inventory_units_controller_spec.rb
295
- - spec/controllers/spree/api/v1/line_items_controller_spec.rb
296
- - spec/controllers/spree/api/v1/option_types_controller_spec.rb
297
- - spec/controllers/spree/api/v1/option_values_controller_spec.rb
298
- - spec/controllers/spree/api/v1/orders_controller_spec.rb
299
- - spec/controllers/spree/api/v1/payments_controller_spec.rb
300
- - spec/controllers/spree/api/v1/product_properties_controller_spec.rb
301
- - spec/controllers/spree/api/v1/products_controller_spec.rb
302
- - spec/controllers/spree/api/v1/promotion_application_spec.rb
303
- - spec/controllers/spree/api/v1/promotions_controller_spec.rb
304
- - spec/controllers/spree/api/v1/properties_controller_spec.rb
305
- - spec/controllers/spree/api/v1/reimbursements_controller_spec.rb
306
- - spec/controllers/spree/api/v1/return_authorizations_controller_spec.rb
307
- - spec/controllers/spree/api/v1/shipments_controller_spec.rb
308
- - spec/controllers/spree/api/v1/states_controller_spec.rb
309
- - spec/controllers/spree/api/v1/stock_items_controller_spec.rb
310
- - spec/controllers/spree/api/v1/stock_locations_controller_spec.rb
311
- - spec/controllers/spree/api/v1/stock_movements_controller_spec.rb
312
- - spec/controllers/spree/api/v1/stores_controller_spec.rb
313
- - spec/controllers/spree/api/v1/tags_controller_spec.rb
314
- - spec/controllers/spree/api/v1/taxonomies_controller_spec.rb
315
- - spec/controllers/spree/api/v1/taxons_controller_spec.rb
316
- - spec/controllers/spree/api/v1/unauthenticated_products_controller_spec.rb
317
- - spec/controllers/spree/api/v1/users_controller_spec.rb
318
- - spec/controllers/spree/api/v1/variants_controller_spec.rb
319
- - spec/controllers/spree/api/v1/zones_controller_spec.rb
320
- - spec/fixtures/thinking-cat.jpg
321
- - spec/models/spree/legacy_user_spec.rb
322
- - spec/requests/rabl_cache_spec.rb
323
- - spec/requests/ransackable_attributes_spec.rb
324
- - spec/requests/version_spec.rb
325
- - spec/shared_examples/protect_product_actions.rb
326
- - spec/spec_helper.rb
327
- - spec/support/controller_hacks.rb
328
- - spec/support/database_cleaner.rb
329
- - spec/support/have_attributes_matcher.rb
241
+ test_files: []
@@ -1,84 +0,0 @@
1
- require 'spec_helper'
2
-
3
- class FakesController < Spree::Api::BaseController
4
- end
5
-
6
- describe Spree::Api::BaseController, type: :controller do
7
- render_views
8
- controller(Spree::Api::BaseController) do
9
- def index
10
- render plain: { "products" => [] }.to_json
11
- end
12
- end
13
-
14
- before do
15
- @routes = ActionDispatch::Routing::RouteSet.new.tap do |r|
16
- r.draw { get 'index', to: 'spree/api/base#index' }
17
- end
18
- end
19
-
20
- context "when validating based on an order token" do
21
- let!(:order) { create :order }
22
-
23
- context "with a correct order token" do
24
- it "succeeds" do
25
- api_get :index, order_token: order.guest_token, order_id: order.number
26
- expect(response.status).to eq(200)
27
- end
28
-
29
- it "succeeds with an order_number parameter" do
30
- api_get :index, order_token: order.guest_token, order_number: order.number
31
- expect(response.status).to eq(200)
32
- end
33
- end
34
-
35
- context "with an incorrect order token" do
36
- it "returns unauthorized" do
37
- api_get :index, order_token: "NOT_A_TOKEN", order_id: order.number
38
- expect(response.status).to eq(401)
39
- end
40
- end
41
- end
42
-
43
- context "cannot make a request to the API" do
44
- it "without an API key" do
45
- api_get :index
46
- expect(json_response).to eq({ "error" => "You must specify an API key." })
47
- expect(response.status).to eq(401)
48
- end
49
-
50
- it "with an invalid API key" do
51
- request.headers["X-Spree-Token"] = "fake_key"
52
- get :index
53
- expect(json_response).to eq({ "error" => "Invalid API key (fake_key) specified." })
54
- expect(response.status).to eq(401)
55
- end
56
-
57
- it "using an invalid token param" do
58
- get :index, params: { token: "fake_key" }
59
- expect(json_response).to eq({ "error" => "Invalid API key (fake_key) specified." })
60
- end
61
- end
62
-
63
- it 'handles parameter missing exceptions' do
64
- expect(subject).to receive(:authenticate_user).and_return(true)
65
- expect(subject).to receive(:load_user_roles).and_return(true)
66
- expect(subject).to receive(:index).and_raise(ActionController::ParameterMissing.new('foo'))
67
- get :index, params: { token: 'exception-message' }
68
- expect(json_response).to eql('exception' => 'param is missing or the value is empty: foo')
69
- end
70
-
71
- it 'handles record invalid exceptions' do
72
- expect(subject).to receive(:authenticate_user).and_return(true)
73
- expect(subject).to receive(:load_user_roles).and_return(true)
74
- resource = Spree::Product.new
75
- resource.valid? # get some errors
76
- expect(subject).to receive(:index).and_raise(ActiveRecord::RecordInvalid.new(resource))
77
- get :index, params: { token: 'exception-message' }
78
- expect(json_response).to eql('exception' => "Validation failed: Name can't be blank, Shipping Category can't be blank, Price can't be blank")
79
- end
80
-
81
- it "lets a subclass override the product associations that are eager-loaded" do
82
- expect(controller.respond_to?(:product_includes, true)).to be
83
- end
84
- end
@@ -1,56 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Spree
4
- describe Api::V1::AddressesController, type: :controller do
5
- render_views
6
-
7
- before do
8
- stub_authentication!
9
- @address = create(:address)
10
- @order = create(:order, bill_address: @address)
11
- end
12
-
13
- context "with their own address" do
14
- before do
15
- allow_any_instance_of(Order).to receive_messages user: current_api_user
16
- end
17
-
18
- it "gets an address" do
19
- api_get :show, id: @address.id, order_id: @order.number
20
- expect(json_response['address1']).to eq @address.address1
21
- end
22
-
23
- it "updates an address" do
24
- api_put :update, id: @address.id, order_id: @order.number,
25
- address: { address1: "123 Test Lane" }
26
- expect(json_response['address1']).to eq '123 Test Lane'
27
- end
28
-
29
- it "receives the errors object if address is invalid" do
30
- api_put :update, id: @address.id, order_id: @order.number,
31
- 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
-
39
- context "on an address that does not belong to this order" do
40
- before do
41
- @order.bill_address_id = nil
42
- @order.ship_address = nil
43
- end
44
-
45
- it "cannot retrieve address information" do
46
- api_get :show, id: @address.id, order_id: @order.number
47
- assert_unauthorized!
48
- end
49
-
50
- it "cannot update address information" do
51
- api_get :update, id: @address.id, order_id: @order.number
52
- assert_unauthorized!
53
- end
54
- end
55
- end
56
- end
@@ -1,361 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Spree
4
- describe Api::V1::CheckoutsController, type: :controller do
5
- render_views
6
-
7
- shared_examples_for 'action which loads order using load_order_with_lock' do
8
- before do
9
- allow(controller).to receive(:load_order).with(true).and_return(true)
10
- end
11
-
12
- it 'should invoke load_order_with_lock' do
13
- expect(controller).to receive(:load_order_with_lock).exactly(1).times
14
- end
15
-
16
- it 'should invoke load_order' do
17
- expect(controller).to receive(:load_order).with(true).exactly(1).times.and_return(true)
18
- end
19
-
20
- context 'ensure no double_render_error' do
21
- before do
22
- def controller.load_order(*)
23
- respond_with(@order, default_template: 'spree/api/v1/orders/show', status: 200)
24
- end
25
- end
26
-
27
- it 'should not generate double_render_error' do
28
- expect(response).to be_success
29
- end
30
- end
31
-
32
- after do
33
- send_request
34
- end
35
- end
36
-
37
- before(:each) do
38
- stub_authentication!
39
- Spree::Config[:track_inventory_levels] = false
40
- country_zone = create(:zone, name: 'CountryZone')
41
- @state = create(:state)
42
- @country = @state.country
43
- country_zone.members.create(zoneable: @country)
44
- create(:stock_location)
45
-
46
- @shipping_method = create(:shipping_method, zones: [country_zone])
47
- @payment_method = create(:credit_card_payment_method)
48
- end
49
-
50
- after do
51
- Spree::Config[:track_inventory_levels] = true
52
- end
53
-
54
- context "PUT 'update'" do
55
- let(:order) do
56
- order = create(:order_with_line_items)
57
- # Order should be in a pristine state
58
- # Without doing this, the order may transition from 'cart' straight to 'delivery'
59
- order.shipments.delete_all
60
- order
61
- end
62
-
63
- before(:each) do
64
- allow_any_instance_of(Order).to receive_messages(confirmation_required?: true)
65
- allow_any_instance_of(Order).to receive_messages(payment_required?: true)
66
- end
67
-
68
- it "should transition a recently created order from cart to address" do
69
- expect(order.state).to eq "cart"
70
- expect(order.email).not_to be_nil
71
- api_put :update, id: order.to_param, order_token: order.guest_token
72
- expect(order.reload.state).to eq "address"
73
- end
74
-
75
- it "should transition a recently created order from cart to address with order token in header" do
76
- expect(order.state).to eq "cart"
77
- expect(order.email).not_to be_nil
78
- request.headers["X-Spree-Order-Token"] = order.guest_token
79
- api_put :update, id: order.to_param
80
- expect(order.reload.state).to eq "address"
81
- end
82
-
83
- it "can take line_items_attributes as a parameter" do
84
- line_item = order.line_items.first
85
- api_put :update, id: order.to_param, order_token: order.guest_token,
86
- order: { line_items_attributes: { 0 => { id: line_item.id, quantity: 1 } } }
87
- expect(response.status).to eq(200)
88
- expect(order.reload.state).to eq "address"
89
- end
90
-
91
- it "can take line_items as a parameter" do
92
- line_item = order.line_items.first
93
- api_put :update, id: order.to_param, order_token: order.guest_token,
94
- order: { line_items: { 0 => { id: line_item.id, quantity: 1 } } }
95
- expect(response.status).to eq(200)
96
- expect(order.reload.state).to eq "address"
97
- end
98
-
99
- it "will return an error if the order cannot transition" do
100
- skip "not sure if this test is valid"
101
- order.bill_address = nil
102
- order.save
103
- order.update_column(:state, "address")
104
- api_put :update, id: order.to_param, order_token: order.guest_token
105
- # Order has not transitioned
106
- expect(response.status).to eq(422)
107
- end
108
-
109
- context "transitioning to delivery" do
110
- before do
111
- order.update_column(:state, "address")
112
- end
113
-
114
- let(:address) do
115
- {
116
- firstname: 'John',
117
- lastname: 'Doe',
118
- address1: '7735 Old Georgetown Road',
119
- city: 'Bethesda',
120
- phone: '3014445002',
121
- zipcode: '20814',
122
- state_id: @state.id,
123
- country_id: @country.id
124
- }
125
- end
126
-
127
- it "can update addresses and transition from address to delivery" do
128
- api_put :update,
129
- id: order.to_param, order_token: order.guest_token,
130
- order: {
131
- bill_address_attributes: address,
132
- ship_address_attributes: address
133
- }
134
- expect(json_response['state']).to eq('delivery')
135
- expect(json_response['bill_address']['firstname']).to eq('John')
136
- expect(json_response['ship_address']['firstname']).to eq('John')
137
- expect(response.status).to eq(200)
138
- end
139
-
140
- # Regression Spec for #5389 & #5880
141
- it "can update addresses but not transition to delivery w/o shipping setup" do
142
- Spree::ShippingMethod.destroy_all
143
- api_put :update,
144
- id: order.to_param, order_token: order.guest_token,
145
- order: {
146
- bill_address_attributes: address,
147
- ship_address_attributes: address
148
- }
149
- expect(json_response['error']).to eq(I18n.t(:could_not_transition, scope: "spree.api.order"))
150
- expect(response.status).to eq(422)
151
- end
152
-
153
- # Regression test for #4498
154
- it "does not contain duplicate variant data in delivery return" do
155
- api_put :update,
156
- id: order.to_param, order_token: order.guest_token,
157
- order: {
158
- bill_address_attributes: address,
159
- ship_address_attributes: address
160
- }
161
- # Shipments manifests should not return the ENTIRE variant
162
- # This information is already present within the order's line items
163
- expect(json_response['shipments'].first['manifest'].first['variant']).to be_nil
164
- expect(json_response['shipments'].first['manifest'].first['variant_id']).to_not be_nil
165
- end
166
- end
167
-
168
- it "can update shipping method and transition from delivery to payment" do
169
- order.update_column(:state, "delivery")
170
- shipment = create(:shipment, order: order)
171
- shipment.refresh_rates
172
- shipping_rate = shipment.shipping_rates.where(selected: false).first
173
- api_put :update, id: order.to_param, order_token: order.guest_token,
174
- order: { shipments_attributes: { "0" => { selected_shipping_rate_id: shipping_rate.id, id: shipment.id } } }
175
- expect(response.status).to eq(200)
176
- # Find the correct shipment...
177
- json_shipment = json_response['shipments'].detect { |s| s["id"] == shipment.id }
178
- # Find the correct shipping rate for that shipment...
179
- json_shipping_rate = json_shipment['shipping_rates'].detect { |sr| sr["id"] == shipping_rate.id }
180
- # ... And finally ensure that it's selected
181
- expect(json_shipping_rate['selected']).to be true
182
- # Order should automatically transfer to payment because all criteria are met
183
- expect(json_response['state']).to eq('payment')
184
- end
185
-
186
- it "can update payment method and transition from payment to confirm" do
187
- order.update_column(:state, "payment")
188
- api_put :update, id: order.to_param, order_token: order.guest_token,
189
- order: { payments_attributes: [{ payment_method_id: @payment_method.id }] }
190
- expect(json_response['state']).to eq('confirm')
191
- expect(json_response['payments'][0]['payment_method']['name']).to eq(@payment_method.name)
192
- expect(json_response['payments'][0]['amount']).to eq(order.total.to_s)
193
- expect(response.status).to eq(200)
194
- end
195
-
196
- it "can update payment method with source and transition from payment to confirm" do
197
- order.update_column(:state, "payment")
198
- source_attributes = {
199
- number: "4111111111111111",
200
- month: 1.month.from_now.month,
201
- year: 1.month.from_now.year,
202
- verification_value: "123",
203
- name: "Spree Commerce"
204
- }
205
-
206
- api_put :update, id: order.to_param, order_token: order.guest_token,
207
- order: { payments_attributes: [{ payment_method_id: @payment_method.id.to_s }],
208
- payment_source: { @payment_method.id.to_s => source_attributes } }
209
- expect(json_response['payments'][0]['payment_method']['name']).to eq(@payment_method.name)
210
- expect(json_response['payments'][0]['amount']).to eq(order.total.to_s)
211
- expect(response.status).to eq(200)
212
- end
213
-
214
- it "returns errors when source is missing attributes" do
215
- order.update_column(:state, "payment")
216
- api_put :update, id: order.to_param, order_token: order.guest_token,
217
- order: {
218
- payments_attributes: [{ payment_method_id: @payment_method.id }]
219
- },
220
- payment_source: {
221
- @payment_method.id.to_s => { name: "Spree" }
222
- }
223
-
224
- expect(response.status).to eq(422)
225
- cc_errors = json_response['errors']['payments.Credit Card']
226
- expect(cc_errors).to include("Number can't be blank")
227
- expect(cc_errors).to include("Month is not a number")
228
- expect(cc_errors).to include("Year is not a number")
229
- expect(cc_errors).to include("Verification Value can't be blank")
230
- end
231
-
232
- it "allow users to reuse a credit card" do
233
- order.update_column(:state, "payment")
234
- credit_card = create(:credit_card, user_id: order.user_id, payment_method_id: @payment_method.id)
235
-
236
- api_put :update, id: order.to_param, order_token: order.guest_token,
237
- order: { existing_card: credit_card.id }
238
-
239
- expect(response.status).to eq 200
240
- expect(order.credit_cards).to match_array [credit_card]
241
- end
242
-
243
- it "can transition from confirm to complete" do
244
- order.update_columns(state: 'confirm')
245
- allow_any_instance_of(Spree::Order).to receive_messages(payment_required?: false)
246
- api_put :update, id: order.to_param, order_token: order.guest_token
247
- expect(json_response['state']).to eq('complete')
248
- expect(response.status).to eq(200)
249
- end
250
-
251
- it "returns the order if the order is already complete" do
252
- order.update_columns(completed_at: Time.current, state: 'complete')
253
- api_put :update, id: order.to_param, order_token: order.guest_token
254
- expect(json_response['number']).to eq(order.number)
255
- expect(response.status).to eq(200)
256
- end
257
-
258
- # Regression test for #3784
259
- it "can update the special instructions for an order" do
260
- instructions = "Don't drop it. (Please)"
261
- api_put :update, id: order.to_param, order_token: order.guest_token,
262
- order: { special_instructions: instructions }
263
- expect(json_response['special_instructions']).to eql(instructions)
264
- end
265
-
266
- context "as an admin" do
267
- sign_in_as_admin!
268
- it "can assign a user to the order" do
269
- user = create(:user)
270
- # Need to pass email as well so that validations succeed
271
- api_put :update, id: order.to_param, order_token: order.guest_token,
272
- order: { user_id: user.id, email: "guest@spreecommerce.org" }
273
- expect(response.status).to eq(200)
274
- expect(json_response['user_id']).to eq(user.id)
275
- end
276
- end
277
-
278
- it "can assign an email to the order" do
279
- api_put :update, id: order.to_param, order_token: order.guest_token,
280
- order: { email: "guest@spreecommerce.org" }
281
- expect(json_response['email']).to eq("guest@spreecommerce.org")
282
- expect(response.status).to eq(200)
283
- end
284
-
285
- it "can apply a coupon code to an order" do
286
- order.update_column(:state, "payment")
287
- expect(PromotionHandler::Coupon).to receive(:new).with(order).and_call_original
288
- expect_any_instance_of(PromotionHandler::Coupon).to receive(:apply).and_return({ coupon_applied?: true })
289
- api_put :update, id: order.to_param, order_token: order.guest_token, order: { coupon_code: "foobar" }
290
- end
291
-
292
- def send_request
293
- api_put :update, id: order.to_param, order_token: order.guest_token
294
- end
295
-
296
- it_should_behave_like 'action which loads order using load_order_with_lock'
297
- end
298
-
299
- context "PUT 'next'" do
300
- let!(:order) { create(:order_with_line_items) }
301
- it "cannot transition to address without a line item" do
302
- order.line_items.delete_all
303
- order.update_column(:email, "spree@example.com")
304
- api_put :next, id: order.to_param, order_token: order.guest_token
305
- expect(response.status).to eq(422)
306
- expect(json_response["errors"]["base"]).to include(Spree.t(:there_are_no_items_for_this_order))
307
- end
308
-
309
- it "can transition an order to the next state" do
310
- order.update_column(:email, "spree@example.com")
311
-
312
- api_put :next, id: order.to_param, order_token: order.guest_token
313
- expect(response.status).to eq(200)
314
- expect(json_response['state']).to eq('address')
315
- end
316
-
317
- it "cannot transition if order email is blank" do
318
- order.update_columns(
319
- state: 'address',
320
- email: nil
321
- )
322
-
323
- api_put :next, id: order.to_param, order_token: order.guest_token
324
- expect(response.status).to eq(422)
325
- expect(json_response['error']).to match(/could not be transitioned/)
326
- end
327
-
328
- it "doesnt advance payment state if order has no payment" do
329
- order.update_column(:state, "payment")
330
- api_put :next, id: order.to_param, order_token: order.guest_token, order: {}
331
- expect(json_response["errors"]["base"]).to include(Spree.t(:no_payment_found))
332
- end
333
-
334
- def send_request
335
- api_put :next, id: order.to_param, order_token: order.guest_token
336
- end
337
-
338
- it_should_behave_like 'action which loads order using load_order_with_lock'
339
- end
340
-
341
- context "PUT 'advance'" do
342
- let!(:order) { create(:order_with_line_items) }
343
-
344
- it 'continues to advance advances an order while it can move forward' do
345
- expect_any_instance_of(Spree::Order).to receive(:next).exactly(3).times.and_return(true, true, false)
346
- api_put :advance, id: order.to_param, order_token: order.guest_token
347
- end
348
-
349
- it 'returns the order' do
350
- api_put :advance, id: order.to_param, order_token: order.guest_token
351
- expect(json_response['id']).to eq(order.id)
352
- end
353
-
354
- def send_request
355
- api_put :advance, id: order.to_param, order_token: order.guest_token
356
- end
357
-
358
- it_should_behave_like 'action which loads order using load_order_with_lock'
359
- end
360
- end
361
- end