spree_api 3.0.10 → 3.1.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/spree/api/base_controller.rb +21 -22
  3. data/app/controllers/spree/api/v1/addresses_controller.rb +46 -0
  4. data/app/controllers/spree/api/v1/checkouts_controller.rb +103 -0
  5. data/app/controllers/spree/api/v1/classifications_controller.rb +20 -0
  6. data/app/controllers/spree/api/v1/countries_controller.rb +24 -0
  7. data/app/controllers/spree/api/v1/credit_cards_controller.rb +27 -0
  8. data/app/controllers/spree/api/v1/images_controller.rb +56 -0
  9. data/app/controllers/spree/api/v1/inventory_units_controller.rb +54 -0
  10. data/app/controllers/spree/api/v1/line_items_controller.rb +70 -0
  11. data/app/controllers/spree/api/v1/option_types_controller.rb +51 -0
  12. data/app/controllers/spree/api/v1/option_values_controller.rb +60 -0
  13. data/app/controllers/spree/api/v1/orders_controller.rb +137 -0
  14. data/app/controllers/spree/api/v1/payments_controller.rb +82 -0
  15. data/app/controllers/spree/api/v1/product_properties_controller.rb +73 -0
  16. data/app/controllers/spree/api/v1/products_controller.rb +126 -0
  17. data/app/controllers/spree/api/v1/promotions_controller.rb +28 -0
  18. data/app/controllers/spree/api/v1/properties_controller.rb +72 -0
  19. data/app/controllers/spree/api/v1/return_authorizations_controller.rb +71 -0
  20. data/app/controllers/spree/api/v1/shipments_controller.rb +163 -0
  21. data/app/controllers/spree/api/v1/states_controller.rb +37 -0
  22. data/app/controllers/spree/api/v1/stock_items_controller.rb +77 -0
  23. data/app/controllers/spree/api/v1/stock_locations_controller.rb +52 -0
  24. data/app/controllers/spree/api/v1/stock_movements_controller.rb +45 -0
  25. data/app/controllers/spree/api/v1/stores_controller.rb +57 -0
  26. data/app/controllers/spree/api/v1/taxonomies_controller.rb +66 -0
  27. data/app/controllers/spree/api/v1/taxons_controller.rb +95 -0
  28. data/app/controllers/spree/api/v1/users_controller.rb +60 -0
  29. data/app/controllers/spree/api/v1/variants_controller.rb +75 -0
  30. data/app/controllers/spree/api/v1/zones_controller.rb +51 -0
  31. data/app/helpers/spree/api/api_helpers.rb +3 -2
  32. data/app/views/spree/api/{addresses → v1/addresses}/show.v1.rabl +0 -0
  33. data/app/views/spree/api/{adjustments → v1/adjustments}/show.v1.rabl +0 -0
  34. data/app/views/spree/api/{config → v1/config}/money.v1.rabl +0 -0
  35. data/app/views/spree/api/{config → v1/config}/show.v1.rabl +0 -0
  36. data/app/views/spree/api/{countries → v1/countries}/index.v1.rabl +0 -0
  37. data/app/views/spree/api/{countries → v1/countries}/show.v1.rabl +0 -0
  38. data/app/views/spree/api/{credit_cards → v1/credit_cards}/index.v1.rabl +1 -1
  39. data/app/views/spree/api/{credit_cards → v1/credit_cards}/show.v1.rabl +0 -0
  40. data/app/views/spree/api/{images → v1/images}/index.v1.rabl +1 -1
  41. data/app/views/spree/api/v1/images/new.v1.rabl +3 -0
  42. data/app/views/spree/api/{images → v1/images}/show.v1.rabl +0 -0
  43. data/app/views/spree/api/{inventory_units → v1/inventory_units}/show.rabl +0 -0
  44. data/app/views/spree/api/{line_items → v1/line_items}/new.v1.rabl +0 -0
  45. data/app/views/spree/api/{line_items → v1/line_items}/show.v1.rabl +3 -3
  46. data/app/views/spree/api/v1/option_types/index.v1.rabl +3 -0
  47. data/app/views/spree/api/v1/option_types/new.v1.rabl +3 -0
  48. data/app/views/spree/api/{option_types → v1/option_types}/show.v1.rabl +0 -0
  49. data/app/views/spree/api/v1/option_values/index.v1.rabl +3 -0
  50. data/app/views/spree/api/v1/option_values/new.v1.rabl +3 -0
  51. data/app/views/spree/api/{option_values → v1/option_values}/show.v1.rabl +0 -0
  52. data/app/views/spree/api/{orders → v1/orders}/address.v1.rabl +0 -0
  53. data/app/views/spree/api/{orders → v1/orders}/canceled.v1.rabl +0 -0
  54. data/app/views/spree/api/{orders → v1/orders}/cart.v1.rabl +0 -0
  55. data/app/views/spree/api/{orders → v1/orders}/complete.v1.rabl +0 -0
  56. data/app/views/spree/api/{orders → v1/orders}/could_not_apply_coupon.v1.rabl +0 -0
  57. data/app/views/spree/api/{orders → v1/orders}/could_not_transition.v1.rabl +0 -0
  58. data/app/views/spree/api/{orders → v1/orders}/index.v1.rabl +1 -1
  59. data/app/views/spree/api/{orders → v1/orders}/invalid_shipping_method.v1.rabl +0 -0
  60. data/app/views/spree/api/{orders → v1/orders}/mine.v1.rabl +1 -1
  61. data/app/views/spree/api/{orders → v1/orders}/order.v1.rabl +1 -0
  62. data/app/views/spree/api/{orders → v1/orders}/payment.v1.rabl +0 -0
  63. data/app/views/spree/api/{orders → v1/orders}/show.v1.rabl +9 -9
  64. data/app/views/spree/api/{payments → v1/payments}/credit_over_limit.v1.rabl +0 -0
  65. data/app/views/spree/api/{payments → v1/payments}/index.v1.rabl +0 -0
  66. data/app/views/spree/api/{payments → v1/payments}/new.v1.rabl +0 -0
  67. data/app/views/spree/api/{payments → v1/payments}/show.v1.rabl +0 -0
  68. data/app/views/spree/api/{payments → v1/payments}/update_forbidden.v1.rabl +0 -0
  69. data/app/views/spree/api/{product_properties → v1/product_properties}/index.v1.rabl +0 -0
  70. data/app/views/spree/api/{product_properties → v1/product_properties}/new.v1.rabl +0 -0
  71. data/app/views/spree/api/{product_properties → v1/product_properties}/show.v1.rabl +0 -0
  72. data/app/views/spree/api/{products → v1/products}/index.v1.rabl +1 -1
  73. data/app/views/spree/api/{products → v1/products}/new.v1.rabl +0 -0
  74. data/app/views/spree/api/{products → v1/products}/product.v1.rabl +0 -0
  75. data/app/views/spree/api/{products → v1/products}/show.v1.rabl +3 -3
  76. data/app/views/spree/api/{promotions → v1/promotions}/handler.v1.rabl +0 -0
  77. data/app/views/spree/api/{promotions → v1/promotions}/show.v1.rabl +0 -0
  78. data/app/views/spree/api/{properties → v1/properties}/index.v1.rabl +0 -0
  79. data/app/views/spree/api/{properties → v1/properties}/new.v1.rabl +0 -0
  80. data/app/views/spree/api/{properties → v1/properties}/show.v1.rabl +0 -0
  81. data/app/views/spree/api/{return_authorizations → v1/return_authorizations}/index.v1.rabl +0 -0
  82. data/app/views/spree/api/{return_authorizations → v1/return_authorizations}/new.v1.rabl +0 -0
  83. data/app/views/spree/api/{return_authorizations → v1/return_authorizations}/show.v1.rabl +0 -0
  84. data/app/views/spree/api/{shared → v1/shared}/stock_location_required.v1.rabl +0 -0
  85. data/app/views/spree/api/{shipments → v1/shipments}/big.v1.rabl +7 -7
  86. data/app/views/spree/api/{shipments → v1/shipments}/cannot_ready_shipment.v1.rabl +0 -0
  87. data/app/views/spree/api/{shipments → v1/shipments}/mine.v1.rabl +1 -1
  88. data/app/views/spree/api/{shipments → v1/shipments}/show.v1.rabl +3 -3
  89. data/app/views/spree/api/{shipments → v1/shipments}/small.v1.rabl +3 -3
  90. data/app/views/spree/api/{shipping_rates → v1/shipping_rates}/show.v1.rabl +0 -0
  91. data/app/views/spree/api/{states → v1/states}/index.v1.rabl +0 -0
  92. data/app/views/spree/api/{states → v1/states}/show.v1.rabl +0 -0
  93. data/app/views/spree/api/{stock_items → v1/stock_items}/index.v1.rabl +1 -1
  94. data/app/views/spree/api/{stock_items → v1/stock_items}/show.v1.rabl +1 -1
  95. data/app/views/spree/api/{stock_locations → v1/stock_locations}/index.v1.rabl +1 -1
  96. data/app/views/spree/api/{stock_locations → v1/stock_locations}/show.v1.rabl +0 -0
  97. data/app/views/spree/api/{stock_movements → v1/stock_movements}/index.v1.rabl +1 -1
  98. data/app/views/spree/api/{stock_movements → v1/stock_movements}/show.v1.rabl +1 -1
  99. data/app/views/spree/api/{stores → v1/stores}/index.v1.rabl +0 -0
  100. data/app/views/spree/api/{stores → v1/stores}/show.v1.rabl +0 -0
  101. data/app/views/spree/api/{taxonomies → v1/taxonomies}/index.v1.rabl +1 -1
  102. data/app/views/spree/api/{taxonomies → v1/taxonomies}/jstree.rabl +0 -0
  103. data/app/views/spree/api/{taxonomies → v1/taxonomies}/nested.v1.rabl +1 -1
  104. data/app/views/spree/api/{taxonomies → v1/taxonomies}/new.v1.rabl +0 -0
  105. data/app/views/spree/api/{taxonomies → v1/taxonomies}/show.v1.rabl +4 -4
  106. data/app/views/spree/api/{taxons → v1/taxons}/index.v1.rabl +1 -1
  107. data/app/views/spree/api/{taxons → v1/taxons}/jstree.rabl +0 -0
  108. data/app/views/spree/api/{taxons → v1/taxons}/new.v1.rabl +0 -0
  109. data/app/views/spree/api/{taxons → v1/taxons}/show.v1.rabl +0 -0
  110. data/app/views/spree/api/v1/taxons/taxons.v1.rabl +5 -0
  111. data/app/views/spree/api/{users → v1/users}/index.v1.rabl +1 -1
  112. data/app/views/spree/api/{users → v1/users}/new.v1.rabl +0 -0
  113. data/app/views/spree/api/{users → v1/users}/show.v1.rabl +2 -2
  114. data/app/views/spree/api/{variants → v1/variants}/big.v1.rabl +1 -1
  115. data/app/views/spree/api/{variants → v1/variants}/index.v1.rabl +1 -1
  116. data/app/views/spree/api/{variants → v1/variants}/new.v1.rabl +0 -0
  117. data/app/views/spree/api/{variants → v1/variants}/show.v1.rabl +1 -1
  118. data/app/views/spree/api/{variants → v1/variants}/small.v1.rabl +1 -1
  119. data/app/views/spree/api/{zones → v1/zones}/index.v1.rabl +1 -1
  120. data/app/views/spree/api/{zones → v1/zones}/show.v1.rabl +0 -0
  121. data/config/routes.rb +85 -88
  122. data/spec/controllers/spree/api/base_controller_spec.rb +14 -42
  123. data/spec/controllers/spree/api/{addresses_controller_spec.rb → v1/addresses_controller_spec.rb} +1 -1
  124. data/spec/controllers/spree/api/{checkouts_controller_spec.rb → v1/checkouts_controller_spec.rb} +51 -3
  125. data/spec/controllers/spree/api/{classifications_controller_spec.rb → v1/classifications_controller_spec.rb} +2 -2
  126. data/spec/controllers/spree/api/{countries_controller_spec.rb → v1/countries_controller_spec.rb} +1 -1
  127. data/spec/controllers/spree/api/{credit_cards_controller_spec.rb → v1/credit_cards_controller_spec.rb} +1 -1
  128. data/spec/controllers/spree/api/{images_controller_spec.rb → v1/images_controller_spec.rb} +23 -1
  129. data/spec/controllers/spree/api/{inventory_units_controller_spec.rb → v1/inventory_units_controller_spec.rb} +1 -1
  130. data/spec/controllers/spree/api/{line_items_controller_spec.rb → v1/line_items_controller_spec.rb} +2 -2
  131. data/spec/controllers/spree/api/{option_types_controller_spec.rb → v1/option_types_controller_spec.rb} +9 -3
  132. data/spec/controllers/spree/api/{option_values_controller_spec.rb → v1/option_values_controller_spec.rb} +8 -2
  133. data/spec/controllers/spree/api/{orders_controller_spec.rb → v1/orders_controller_spec.rb} +29 -8
  134. data/spec/controllers/spree/api/{payments_controller_spec.rb → v1/payments_controller_spec.rb} +2 -2
  135. data/spec/controllers/spree/api/{product_properties_controller_spec.rb → v1/product_properties_controller_spec.rb} +1 -1
  136. data/spec/controllers/spree/api/{products_controller_spec.rb → v1/products_controller_spec.rb} +5 -5
  137. data/spec/controllers/spree/api/{promotion_application_spec.rb → v1/promotion_application_spec.rb} +2 -2
  138. data/spec/controllers/spree/api/{promotions_controller_spec.rb → v1/promotions_controller_spec.rb} +1 -1
  139. data/spec/controllers/spree/api/{properties_controller_spec.rb → v1/properties_controller_spec.rb} +1 -1
  140. data/spec/controllers/spree/api/{return_authorizations_controller_spec.rb → v1/return_authorizations_controller_spec.rb} +1 -1
  141. data/spec/controllers/spree/api/{shipments_controller_spec.rb → v1/shipments_controller_spec.rb} +4 -4
  142. data/spec/controllers/spree/api/{states_controller_spec.rb → v1/states_controller_spec.rb} +14 -10
  143. data/spec/controllers/spree/api/{stock_items_controller_spec.rb → v1/stock_items_controller_spec.rb} +1 -1
  144. data/spec/controllers/spree/api/{stock_locations_controller_spec.rb → v1/stock_locations_controller_spec.rb} +1 -1
  145. data/spec/controllers/spree/api/{stock_movements_controller_spec.rb → v1/stock_movements_controller_spec.rb} +1 -1
  146. data/spec/controllers/spree/api/{stores_controller_spec.rb → v1/stores_controller_spec.rb} +1 -1
  147. data/spec/controllers/spree/api/{taxonomies_controller_spec.rb → v1/taxonomies_controller_spec.rb} +1 -1
  148. data/spec/controllers/spree/api/{taxons_controller_spec.rb → v1/taxons_controller_spec.rb} +1 -1
  149. data/spec/controllers/spree/api/{unauthenticated_products_controller_spec.rb → v1/unauthenticated_products_controller_spec.rb} +1 -1
  150. data/spec/controllers/spree/api/{users_controller_spec.rb → v1/users_controller_spec.rb} +1 -1
  151. data/spec/controllers/spree/api/{variants_controller_spec.rb → v1/variants_controller_spec.rb} +3 -3
  152. data/spec/controllers/spree/api/{zones_controller_spec.rb → v1/zones_controller_spec.rb} +7 -5
  153. data/spec/requests/rabl_cache_spec.rb +2 -2
  154. data/spec/requests/ransackable_attributes_spec.rb +6 -6
  155. data/spec/requests/version_spec.rb +19 -0
  156. data/spree_api.gemspec +1 -1
  157. metadata +188 -185
  158. data/CHANGELOG.md +0 -3
  159. data/app/controllers/spree/api/addresses_controller.rb +0 -43
  160. data/app/controllers/spree/api/checkouts_controller.rb +0 -98
  161. data/app/controllers/spree/api/classifications_controller.rb +0 -18
  162. data/app/controllers/spree/api/countries_controller.rb +0 -23
  163. data/app/controllers/spree/api/credit_cards_controller.rb +0 -25
  164. data/app/controllers/spree/api/images_controller.rb +0 -47
  165. data/app/controllers/spree/api/inventory_units_controller.rb +0 -52
  166. data/app/controllers/spree/api/line_items_controller.rb +0 -69
  167. data/app/controllers/spree/api/option_types_controller.rb +0 -49
  168. data/app/controllers/spree/api/option_values_controller.rb +0 -58
  169. data/app/controllers/spree/api/orders_controller.rb +0 -130
  170. data/app/controllers/spree/api/payments_controller.rb +0 -80
  171. data/app/controllers/spree/api/product_properties_controller.rb +0 -72
  172. data/app/controllers/spree/api/products_controller.rb +0 -124
  173. data/app/controllers/spree/api/promotions_controller.rb +0 -26
  174. data/app/controllers/spree/api/properties_controller.rb +0 -70
  175. data/app/controllers/spree/api/return_authorizations_controller.rb +0 -69
  176. data/app/controllers/spree/api/shipments_controller.rb +0 -149
  177. data/app/controllers/spree/api/states_controller.rb +0 -38
  178. data/app/controllers/spree/api/stock_items_controller.rb +0 -75
  179. data/app/controllers/spree/api/stock_locations_controller.rb +0 -50
  180. data/app/controllers/spree/api/stock_movements_controller.rb +0 -43
  181. data/app/controllers/spree/api/stores_controller.rb +0 -55
  182. data/app/controllers/spree/api/taxonomies_controller.rb +0 -64
  183. data/app/controllers/spree/api/taxons_controller.rb +0 -93
  184. data/app/controllers/spree/api/users_controller.rb +0 -56
  185. data/app/controllers/spree/api/variants_controller.rb +0 -73
  186. data/app/controllers/spree/api/zones_controller.rb +0 -49
  187. data/app/models/spree/option_value_decorator.rb +0 -9
  188. data/app/views/spree/api/option_types/index.v1.rabl +0 -3
  189. data/app/views/spree/api/option_values/index.v1.rabl +0 -3
  190. data/app/views/spree/api/taxons/taxons.v1.rabl +0 -5
@@ -60,12 +60,22 @@ describe Spree::Api::BaseController, :type => :controller do
60
60
  end
61
61
  end
62
62
 
63
- it 'handles exceptions' do
63
+ it 'handles parameter missing exceptions' do
64
64
  expect(subject).to receive(:authenticate_user).and_return(true)
65
65
  expect(subject).to receive(:load_user_roles).and_return(true)
66
- expect(subject).to receive(:index).and_raise(Exception.new("no joy"))
67
- get :index, :token => "fake_key"
68
- expect(json_response).to eq({ "exception" => "no joy" })
66
+ expect(subject).to receive(:index).and_raise(ActionController::ParameterMissing.new('foo'))
67
+ get :index, 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, 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")
69
79
  end
70
80
 
71
81
  it "maps semantic keys to nested_attributes keys" do
@@ -83,42 +93,4 @@ describe Spree::Api::BaseController, :type => :controller do
83
93
  it "lets a subclass override the product associations that are eager-loaded" do
84
94
  expect(controller.respond_to?(:product_includes, true)).to be
85
95
  end
86
-
87
- describe '#error_during_processing' do
88
- controller(FakesController) do
89
- # GET /foo
90
- # Simulates a failed API call.
91
- def foo
92
- raise StandardError
93
- end
94
- end
95
-
96
- # What would be placed in config/initializers/spree.rb
97
- Spree::Api::BaseController.error_notifier = Proc.new do |e, controller|
98
- MockHoneybadger.notify_or_ignore(e, rack_env: controller.request.env)
99
- end
100
-
101
- ##
102
- # Fake HB alert class
103
- class MockHoneybadger
104
- # https://github.com/honeybadger-io/honeybadger-ruby/blob/master/lib/honeybadger.rb#L136
105
- def self.notify_or_ignore(exception, opts = {})
106
- end
107
- end
108
-
109
- before do
110
- user = double(email: "spree@example.com")
111
- allow(user).to receive_message_chain :spree_roles, pluck: []
112
- allow(Spree.user_class).to receive_messages find_by: user
113
- @routes = ActionDispatch::Routing::RouteSet.new.tap do |r|
114
- r.draw { get 'foo' => 'fakes#foo' }
115
- end
116
- end
117
-
118
- it 'should notify notify_error_during_processing' do
119
- expect(MockHoneybadger).to receive(:notify_or_ignore).once.with(kind_of(Exception), rack_env: kind_of(Hash))
120
- api_get :foo, token: 123
121
- expect(response.status).to eq(422)
122
- end
123
- end
124
96
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module Spree
4
- describe Api::AddressesController, :type => :controller do
4
+ describe Api::V1::AddressesController, :type => :controller do
5
5
  render_views
6
6
 
7
7
  before do
@@ -1,9 +1,39 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module Spree
4
- describe Api::CheckoutsController, type: :controller do
4
+ describe Api::V1::CheckoutsController, type: :controller do
5
5
  render_views
6
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
+
7
37
  before(:each) do
8
38
  stub_authentication!
9
39
  Spree::Config[:track_inventory_levels] = false
@@ -211,7 +241,7 @@ module Spree
211
241
  end
212
242
 
213
243
  it "can transition from confirm to complete" do
214
- order.update_columns(completed_at: Time.now, state: 'complete')
244
+ order.update_columns(state: 'confirm')
215
245
  allow_any_instance_of(Spree::Order).to receive_messages(payment_required?: false)
216
246
  api_put :update, id: order.to_param, order_token: order.guest_token
217
247
  expect(json_response['state']).to eq('complete')
@@ -219,7 +249,7 @@ module Spree
219
249
  end
220
250
 
221
251
  it "returns the order if the order is already complete" do
222
- order.update_columns(completed_at: Time.now, state: 'complete')
252
+ order.update_columns(completed_at: Time.current, state: 'complete')
223
253
  api_put :update, id: order.to_param, order_token: order.guest_token
224
254
  expect(json_response['number']).to eq(order.number)
225
255
  expect(response.status).to eq(200)
@@ -260,6 +290,12 @@ module Spree
260
290
  expect_any_instance_of(PromotionHandler::Coupon).to receive(:apply).and_return({ coupon_applied?: true })
261
291
  api_put :update, :id => order.to_param, order_token: order.guest_token, order: { coupon_code: "foobar" }
262
292
  end
293
+
294
+ def send_request
295
+ api_put :update, id: order.to_param, order_token: order.guest_token
296
+ end
297
+
298
+ it_should_behave_like 'action which loads order using load_order_with_lock'
263
299
  end
264
300
 
265
301
  context "PUT 'next'" do
@@ -296,6 +332,12 @@ module Spree
296
332
  api_put :next, id: order.to_param, order_token: order.guest_token, order: {}
297
333
  expect(json_response["errors"]["base"]).to include(Spree.t(:no_payment_found))
298
334
  end
335
+
336
+ def send_request
337
+ api_put :next, id: order.to_param, order_token: order.guest_token
338
+ end
339
+
340
+ it_should_behave_like 'action which loads order using load_order_with_lock'
299
341
  end
300
342
 
301
343
  context "PUT 'advance'" do
@@ -310,6 +352,12 @@ module Spree
310
352
  api_put :advance, id: order.to_param, order_token: order.guest_token
311
353
  expect(json_response['id']).to eq(order.id)
312
354
  end
355
+
356
+ def send_request
357
+ api_put :advance, id: order.to_param, order_token: order.guest_token
358
+ end
359
+
360
+ it_should_behave_like 'action which loads order using load_order_with_lock'
313
361
  end
314
362
  end
315
363
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module Spree
4
- describe Api::ClassificationsController, type: :controller do
4
+ describe Api::V1::ClassificationsController, type: :controller do
5
5
  let(:taxon) do
6
6
  taxon = create(:taxon)
7
7
 
@@ -37,7 +37,7 @@ module Spree
37
37
  end
38
38
 
39
39
  it "should touch the taxon" do
40
- taxon.update_attributes(updated_at: Time.now - 10.seconds)
40
+ taxon.update_attributes(updated_at: Time.current - 10.seconds)
41
41
  taxon_last_updated_at = taxon.updated_at
42
42
  api_put :update, taxon_id: taxon, product_id: last_product, position: 0
43
43
  taxon.reload
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module Spree
4
- describe Api::CountriesController, :type => :controller do
4
+ describe Api::V1::CountriesController, :type => :controller do
5
5
  render_views
6
6
 
7
7
  before do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module Spree
4
- describe Api::CreditCardsController, :type => :controller do
4
+ describe Api::V1::CreditCardsController, :type => :controller do
5
5
  render_views
6
6
 
7
7
  let!(:admin_user) do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module Spree
4
- describe Spree::Api::ImagesController, :type => :controller do
4
+ describe Api::V1::ImagesController, :type => :controller do
5
5
  render_views
6
6
 
7
7
  let!(:product) { create(:product) }
@@ -16,6 +16,12 @@ module Spree
16
16
  context "as an admin" do
17
17
  sign_in_as_admin!
18
18
 
19
+ it "can learn how to create a new image" do
20
+ api_get :new, product_id: product.id
21
+ expect(json_response["attributes"]).to eq(attributes.map(&:to_s))
22
+ expect(json_response["required_attributes"]).to be_empty
23
+ end
24
+
19
25
  it "can upload a new image for a variant" do
20
26
  expect do
21
27
  api_post :create,
@@ -28,6 +34,15 @@ module Spree
28
34
  end.to change(Image, :count).by(1)
29
35
  end
30
36
 
37
+ it "can't upload a new image for a variant without attachment" do
38
+ api_post :create,
39
+ image: { viewable_type: 'Spree::Variant',
40
+ viewable_id: product.master.to_param
41
+ },
42
+ product_id: product.id
43
+ expect(response.status).to eq(422)
44
+ end
45
+
31
46
  context "working with an existing image" do
32
47
  let!(:product_image) { product.master.images.create!(:attachment => image('thinking-cat.jpg')) }
33
48
 
@@ -65,6 +80,13 @@ module Spree
65
80
  expect(product_image.reload.position).to eq(2)
66
81
  end
67
82
 
83
+ it "can't update a image without attachment" do
84
+ api_post :update,
85
+ image: { attachment: nil },
86
+ id: product_image.id, product_id: product.id
87
+ expect(response.status).to eq(422)
88
+ end
89
+
68
90
  it "can delete an image" do
69
91
  api_delete :destroy, :id => product_image.id, :product_id => product.id
70
92
  expect(response.status).to eq(204)
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module Spree
4
- describe Api::InventoryUnitsController, :type => :controller do
4
+ describe Api::V1::InventoryUnitsController, :type => :controller do
5
5
  render_views
6
6
 
7
7
  before do
@@ -10,9 +10,9 @@ module Spree
10
10
  end
11
11
 
12
12
  # This should go in an initializer
13
- Spree::Api::LineItemsController.line_item_options += [:some_option]
13
+ Spree::Api::V1::LineItemsController.line_item_options += [:some_option]
14
14
 
15
- describe Api::LineItemsController, :type => :controller do
15
+ describe Api::V1::LineItemsController, :type => :controller do
16
16
  render_views
17
17
 
18
18
  let!(:order) { create(:order_with_line_items, line_items_count: 1) }
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module Spree
4
- describe Api::OptionTypesController, :type => :controller do
4
+ describe Api::V1::OptionTypesController, :type => :controller do
5
5
  render_views
6
6
 
7
- let(:attributes) { [:id, :name, :position, :presentation] }
7
+ let(:attributes) { [:id, :name, :presentation, :position] }
8
8
  let!(:option_value) { create(:option_value) }
9
9
  let!(:option_type) { option_value.option_type }
10
10
 
@@ -15,7 +15,7 @@ module Spree
15
15
  def check_option_values(option_values)
16
16
  expect(option_values.count).to eq(1)
17
17
  expect(option_values.first).to have_attributes([:id, :name, :presentation,
18
- :option_type_name, :option_type_id])
18
+ :option_type_id, :option_type_name])
19
19
  end
20
20
 
21
21
  it "can list all option types" do
@@ -48,6 +48,12 @@ module Spree
48
48
  check_option_values(json_response["option_values"])
49
49
  end
50
50
 
51
+ it "can learn how to create a new option type" do
52
+ api_get :new
53
+ expect(json_response["attributes"]).to eq(attributes.map(&:to_s))
54
+ expect(json_response["required_attributes"]).to_not be_empty
55
+ end
56
+
51
57
  it "cannot create a new option type" do
52
58
  api_post :create, :option_type => {
53
59
  :name => "Option Type",
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module Spree
4
- describe Api::OptionValuesController, :type => :controller do
4
+ describe Api::V1::OptionValuesController, :type => :controller do
5
5
  render_views
6
6
 
7
- let(:attributes) { [:id, :name, :presentation, :option_type_name, :option_type_name] }
7
+ let(:attributes) { [:id, :name, :presentation, :option_type_name, :option_type_id, :option_type_presentation] }
8
8
  let!(:option_value) { create(:option_value) }
9
9
  let!(:option_type) { option_value.option_type }
10
10
 
@@ -86,6 +86,12 @@ module Spree
86
86
  context "as an admin" do
87
87
  sign_in_as_admin!
88
88
 
89
+ it "can learn how to create a new option value" do
90
+ api_get :new
91
+ expect(json_response["attributes"]).to eq(attributes.map(&:to_s))
92
+ expect(json_response["required_attributes"]).to_not be_empty
93
+ end
94
+
89
95
  it "can create an option value" do
90
96
  api_post :create, :option_value => {
91
97
  :name => "Option Value",
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
  require 'spree/testing_support/bar_ability'
3
3
 
4
4
  module Spree
5
- describe Api::OrdersController, :type => :controller do
5
+ describe Api::V1::OrdersController, :type => :controller do
6
6
  render_views
7
7
 
8
8
  let!(:order) { create(:order) }
@@ -12,7 +12,7 @@ module Spree
12
12
  let(:attributes) do
13
13
  [:number, :item_total, :display_total, :total, :state, :adjustment_total, :user_id,
14
14
  :created_at, :updated_at, :completed_at, :payment_total, :shipment_state, :payment_state,
15
- :email, :special_instructions, :total_quantity, :display_item_total, :currency]
15
+ :email, :special_instructions, :total_quantity, :display_item_total, :currency, :considered_risky]
16
16
  end
17
17
 
18
18
  let(:address_params) { { :country_id => Country.first.id, :state_id => State.first.id } }
@@ -65,9 +65,9 @@ module Spree
65
65
  end
66
66
 
67
67
  it "returns orders in reverse chronological order by completed_at" do
68
- order.update_columns completed_at: Time.now
68
+ order.update_columns completed_at: Time.current
69
69
 
70
- order2 = Order.create user: order.user, completed_at: Time.now - 1.day
70
+ order2 = Order.create user: order.user, completed_at: Time.current - 1.day
71
71
  expect(order2.created_at).to be > order.created_at
72
72
  order3 = Order.create user: order.user, completed_at: nil
73
73
  expect(order3.created_at).to be > order2.created_at
@@ -222,7 +222,7 @@ module Spree
222
222
  end
223
223
 
224
224
  it "cannot cancel an order that doesn't belong to them" do
225
- order.update_attribute(:completed_at, Time.now)
225
+ order.update_attribute(:completed_at, Time.current)
226
226
  order.update_attribute(:shipment_state, "ready")
227
227
  api_put :cancel, :id => order.to_param
228
228
  assert_unauthorized!
@@ -291,7 +291,9 @@ module Spree
291
291
  it "does not update line item needlessly" do
292
292
  expect(Order).to receive(:create!).and_return(order = Spree::Order.new)
293
293
  allow(order).to receive(:associate_user!)
294
- allow(order).to receive_message_chain(:contents, :add).and_return(line_item = double('LineItem'))
294
+ line_item = double('LineItem')
295
+ allow(line_item).to receive_messages(save!: line_item)
296
+ allow(order).to receive_message_chain(:contents, :add).and_return(line_item)
295
297
  expect(line_item).not_to receive(:update_attributes)
296
298
  api_post :create, order: { line_items: [{ variant_id: variant.to_param, quantity: 5 }] }
297
299
  end
@@ -694,17 +696,36 @@ module Spree
694
696
 
695
697
  context "can cancel an order" do
696
698
  before do
697
- order.completed_at = Time.now
699
+ order.completed_at = Time.current
698
700
  order.state = 'complete'
699
701
  order.shipment_state = 'ready'
700
702
  order.save!
701
703
  end
702
704
 
703
705
  specify do
704
- api_put :cancel, :id => order.to_param
706
+ api_put :cancel, id: order.to_param
705
707
  expect(json_response["state"]).to eq("canceled")
708
+ expect(json_response["canceler_id"]).to eq(current_api_user.id)
709
+ end
710
+ end
711
+
712
+ context "can approve an order" do
713
+ before do
714
+ order.completed_at = Time.current
715
+ order.state = 'complete'
716
+ order.shipment_state = 'ready'
717
+ order.considered_risky = true
718
+ order.save!
719
+ end
720
+
721
+ specify do
722
+ api_put :approve, id: order.to_param
723
+ order.reload
724
+ expect(order.approver_id).to eq(current_api_user.id)
725
+ expect(order.considered_risky).to eq(false)
706
726
  end
707
727
  end
728
+
708
729
  end
709
730
  end
710
731
  end
@@ -1,13 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module Spree
4
- describe Spree::Api::PaymentsController, :type => :controller do
4
+ describe Api::V1::PaymentsController, :type => :controller do
5
5
  render_views
6
6
  let!(:order) { create(:order) }
7
7
  let!(:payment) { create(:payment, :order => order) }
8
8
  let!(:attributes) { [:id, :source_type, :source_id, :amount, :display_amount,
9
9
  :payment_method_id, :state, :avs_response,
10
- :created_at, :updated_at] }
10
+ :created_at, :updated_at, :number] }
11
11
 
12
12
  let(:resource_scoping) { { :order_id => order.to_param } }
13
13