spree_api 2.1.1 → 2.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -0
- data/app/controllers/spree/api/base_controller.rb +10 -1
- data/app/controllers/spree/api/countries_controller.rb +2 -0
- data/app/controllers/spree/api/orders_controller.rb +9 -2
- data/app/controllers/spree/api/payments_controller.rb +13 -2
- data/app/controllers/spree/api/states_controller.rb +2 -0
- data/app/controllers/spree/api/stock_items_controller.rb +2 -1
- data/app/controllers/spree/api/stock_locations_controller.rb +1 -0
- data/app/controllers/spree/api/stock_movements_controller.rb +1 -0
- data/app/helpers/spree/api/api_helpers.rb +2 -3
- data/app/models/spree/option_value_decorator.rb +4 -0
- data/app/models/spree/order_decorator.rb +25 -18
- data/app/views/spree/api/payments/credit_over_limit.v1.rabl +1 -1
- data/app/views/spree/api/payments/new.v1.rabl +0 -1
- data/app/views/spree/api/payments/update_forbidden.v1.rabl +2 -0
- data/config/locales/en.yml +3 -1
- data/config/routes.rb +1 -1
- data/lib/spree/api/responders/rabl_template.rb +1 -1
- data/spec/controllers/spree/api/base_controller_spec.rb +1 -1
- data/spec/controllers/spree/api/checkouts_controller_spec.rb +14 -0
- data/spec/controllers/spree/api/orders_controller_spec.rb +84 -17
- data/spec/controllers/spree/api/payments_controller_spec.rb +118 -77
- data/spec/controllers/spree/api/stock_items_controller_spec.rb +62 -26
- data/spec/controllers/spree/api/stock_locations_controller_spec.rb +56 -29
- data/spec/controllers/spree/api/stock_movements_controller_spec.rb +51 -27
- data/spec/controllers/spree/api/zones_controller_spec.rb +2 -2
- data/spec/models/spree/order_spec.rb +71 -4
- metadata +5 -4
@@ -13,41 +13,65 @@ module Spree
|
|
13
13
|
stub_authentication!
|
14
14
|
end
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
it 'requires a stock_location_id to be passed as a parameter' do
|
23
|
-
api_get :index
|
24
|
-
json_response['error'].should =~ /stock_location_id parameter must be provided/
|
25
|
-
response.status.should == 422
|
26
|
-
end
|
16
|
+
context 'as a user' do
|
17
|
+
it 'cannot see a list of stock movements' do
|
18
|
+
api_get :index, stock_location_id: stock_location.to_param
|
19
|
+
response.status.should == 404
|
20
|
+
end
|
27
21
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
json_response['current_page'].should == 1
|
33
|
-
json_response['pages'].should == 2
|
34
|
-
end
|
22
|
+
it 'cannot see a stock movement' do
|
23
|
+
api_get :show, stock_location_id: stock_location.to_param, id: stock_movement.id
|
24
|
+
response.status.should == 404
|
25
|
+
end
|
35
26
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
27
|
+
it 'cannot create a stock movement' do
|
28
|
+
params = {
|
29
|
+
stock_location_id: stock_location.to_param,
|
30
|
+
stock_movement: {
|
31
|
+
stock_item_id: stock_item.to_param
|
32
|
+
}
|
33
|
+
}
|
41
34
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
json_response['stock_item_id'].should eq stock_movement.stock_item_id
|
35
|
+
api_post :create, params
|
36
|
+
response.status.should == 404
|
37
|
+
end
|
46
38
|
end
|
47
39
|
|
48
40
|
context 'as an admin' do
|
49
41
|
sign_in_as_admin!
|
50
42
|
|
43
|
+
it 'gets list of stock movements' do
|
44
|
+
api_get :index, stock_location_id: stock_location.to_param
|
45
|
+
json_response['stock_movements'].first.should have_attributes(attributes)
|
46
|
+
json_response['stock_movements'].first['stock_item']['count_on_hand'].should eq 11
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'requires a stock_location_id to be passed as a parameter' do
|
50
|
+
api_get :index
|
51
|
+
json_response['error'].should =~ /stock_location_id parameter must be provided/
|
52
|
+
response.status.should == 422
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'can control the page size through a parameter' do
|
56
|
+
create(:stock_movement, stock_item: stock_item)
|
57
|
+
api_get :index, stock_location_id: stock_location.to_param, per_page: 1
|
58
|
+
json_response['count'].should == 1
|
59
|
+
json_response['current_page'].should == 1
|
60
|
+
json_response['pages'].should == 2
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'can query the results through a paramter' do
|
64
|
+
expected_result = create(:stock_movement, :received, quantity: 10, stock_item: stock_item)
|
65
|
+
api_get :index, stock_location_id: stock_location.to_param, q: { quantity_eq: '10' }
|
66
|
+
json_response['count'].should == 1
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'gets a stock movement' do
|
70
|
+
api_get :show, stock_location_id: stock_location.to_param, id: stock_movement.to_param
|
71
|
+
json_response.should have_attributes(attributes)
|
72
|
+
json_response['stock_item_id'].should eq stock_movement.stock_item_id
|
73
|
+
end
|
74
|
+
|
51
75
|
it 'can create a new stock movement' do
|
52
76
|
params = {
|
53
77
|
stock_location_id: stock_location.to_param,
|
@@ -48,13 +48,13 @@ module Spree
|
|
48
48
|
end
|
49
49
|
|
50
50
|
it "uses the specified template" do
|
51
|
-
request.headers
|
51
|
+
request.headers['X-Spree-Template'] = 'show'
|
52
52
|
api_get :custom_show, :id => @zone.id
|
53
53
|
response.should render_template('spree/api/zones/show')
|
54
54
|
end
|
55
55
|
|
56
56
|
it "falls back to the default template if the specified template does not exist" do
|
57
|
-
request.headers
|
57
|
+
request.headers['X-Spree-Template'] = 'invoice'
|
58
58
|
api_get :show, :id => @zone.id
|
59
59
|
response.should render_template('spree/api/zones/show')
|
60
60
|
end
|
@@ -2,22 +2,25 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module Spree
|
4
4
|
describe Order do
|
5
|
-
let!(:country) {
|
6
|
-
let!(:state) { country.states.first ||
|
7
|
-
let!(:stock_location) {
|
5
|
+
let!(:country) { create(:country) }
|
6
|
+
let!(:state) { country.states.first || create(:state, :country => country) }
|
7
|
+
let!(:stock_location) { create(:stock_location) }
|
8
8
|
|
9
9
|
let(:user) { stub_model(LegacyUser, :email => 'fox@mudler.com') }
|
10
10
|
let(:shipping_method) { create(:shipping_method) }
|
11
11
|
let(:payment_method) { create(:payment_method) }
|
12
|
+
|
12
13
|
let(:product) { product = Spree::Product.create(:name => 'Test',
|
13
14
|
:sku => 'TEST-1',
|
14
15
|
:price => 33.22)
|
15
|
-
product.shipping_category =
|
16
|
+
product.shipping_category = create(:shipping_category)
|
16
17
|
product.save
|
17
18
|
product }
|
19
|
+
|
18
20
|
let(:variant) { variant = product.master
|
19
21
|
variant.stock_items.each { |si| si.update_attribute(:count_on_hand, 10) }
|
20
22
|
variant }
|
23
|
+
|
21
24
|
let(:sku) { variant.sku }
|
22
25
|
let(:variant_id) { variant.id }
|
23
26
|
|
@@ -49,6 +52,12 @@ module Spree
|
|
49
52
|
order.state.should eq 'complete'
|
50
53
|
end
|
51
54
|
|
55
|
+
it "assigns order[email] over user email to order" do
|
56
|
+
params = { email: 'wooowww@test.com' }
|
57
|
+
order = Order.build_from_api(user, params)
|
58
|
+
expect(order.email).to eq params[:email]
|
59
|
+
end
|
60
|
+
|
52
61
|
it 'can build an order from API with just line items' do
|
53
62
|
params = { :line_items_attributes => line_items }
|
54
63
|
|
@@ -164,6 +173,13 @@ module Spree
|
|
164
173
|
end
|
165
174
|
end
|
166
175
|
|
176
|
+
it "raises with proper message when cant find country" do
|
177
|
+
address = { :country => { "name" => "NoNoCountry" } }
|
178
|
+
expect {
|
179
|
+
Order.ensure_country_id_from_api(address)
|
180
|
+
}.to raise_error /NoNoCountry/
|
181
|
+
end
|
182
|
+
|
167
183
|
it 'ensures_state_id for state fields' do
|
168
184
|
[:name, :abbr].each do |field|
|
169
185
|
address = { :state => { field => state.send(field) }}
|
@@ -172,12 +188,20 @@ module Spree
|
|
172
188
|
end
|
173
189
|
end
|
174
190
|
|
191
|
+
it "raises with proper message when cant find state" do
|
192
|
+
address = { :state => { "name" => "NoNoState" } }
|
193
|
+
expect {
|
194
|
+
Order.ensure_state_id_from_api(address)
|
195
|
+
}.to raise_error /NoNoState/
|
196
|
+
end
|
197
|
+
|
175
198
|
context "shippments" do
|
176
199
|
let(:params) do
|
177
200
|
{ :shipments_attributes => [
|
178
201
|
{ :tracking => '123456789',
|
179
202
|
:cost => '4.99',
|
180
203
|
:shipping_method => shipping_method.name,
|
204
|
+
:stock_location => stock_location.name,
|
181
205
|
:inventory_units => [{ :sku => sku }]
|
182
206
|
}
|
183
207
|
] }
|
@@ -195,6 +219,14 @@ module Spree
|
|
195
219
|
shipment.inventory_units.first.variant_id.should eq product.master.id
|
196
220
|
shipment.tracking.should eq '123456789'
|
197
221
|
shipment.shipping_rates.first.cost.should eq 4.99
|
222
|
+
shipment.stock_location.should eq stock_location
|
223
|
+
end
|
224
|
+
|
225
|
+
it "raises if cant find stock location" do
|
226
|
+
params[:shipments_attributes][0][:stock_location] = "doesnt exist"
|
227
|
+
expect {
|
228
|
+
order = Order.build_from_api(user, params)
|
229
|
+
}.to raise_error
|
198
230
|
end
|
199
231
|
end
|
200
232
|
|
@@ -244,5 +276,40 @@ module Spree
|
|
244
276
|
order = Order.build_from_api(user, params)
|
245
277
|
}.to raise_error /XXX/
|
246
278
|
end
|
279
|
+
|
280
|
+
context "raises error" do
|
281
|
+
it "clears out order from db" do
|
282
|
+
params = { :payments_attributes => [{ payment_method: "XXX" }] }
|
283
|
+
count = Order.count
|
284
|
+
|
285
|
+
expect { order = Order.build_from_api(user, params) }.to raise_error
|
286
|
+
expect(Order.count).to eq count
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
context "import param and tax adjustments" do
|
291
|
+
let!(:tax_rate) { create(:tax_rate, amount: 0.05, calculator: Calculator::DefaultTax.create) }
|
292
|
+
let(:other_variant) { create(:variant) }
|
293
|
+
|
294
|
+
let(:line_item_attributes) do
|
295
|
+
line_items.merge({ "1" => { :variant_id => other_variant.id, :quantity => 5 }})
|
296
|
+
end
|
297
|
+
|
298
|
+
before { Zone.stub default_tax: tax_rate.zone }
|
299
|
+
|
300
|
+
it "doesnt create any tax ajustments when importing order" do
|
301
|
+
params = { import: true, line_items_attributes: line_item_attributes }
|
302
|
+
expect {
|
303
|
+
Order.build_from_api(user, params)
|
304
|
+
}.not_to change { Adjustment.count }
|
305
|
+
end
|
306
|
+
|
307
|
+
it "does create tax adjustments if not importing order" do
|
308
|
+
params = { import: false, line_items_attributes: line_item_attributes }
|
309
|
+
expect {
|
310
|
+
Order.build_from_api(user, params)
|
311
|
+
}.to change { Adjustment.count }
|
312
|
+
end
|
313
|
+
end
|
247
314
|
end
|
248
315
|
end
|
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: 2.1.
|
4
|
+
version: 2.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Bigg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-10-15 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: 2.1.
|
19
|
+
version: 2.1.2
|
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: 2.1.
|
26
|
+
version: 2.1.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rabl
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -134,6 +134,7 @@ files:
|
|
134
134
|
- app/views/spree/api/payments/index.v1.rabl
|
135
135
|
- app/views/spree/api/payments/new.v1.rabl
|
136
136
|
- app/views/spree/api/payments/show.v1.rabl
|
137
|
+
- app/views/spree/api/payments/update_forbidden.v1.rabl
|
137
138
|
- app/views/spree/api/product_properties/index.v1.rabl
|
138
139
|
- app/views/spree/api/product_properties/new.v1.rabl
|
139
140
|
- app/views/spree/api/product_properties/show.v1.rabl
|