solidus_api 1.0.0.pre → 1.0.0.pre2
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.
Potentially problematic release.
This version of solidus_api might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/app/controllers/spree/api/base_controller.rb +10 -0
- data/app/controllers/spree/api/checkouts_controller.rb +0 -4
- data/app/controllers/spree/api/return_authorizations_controller.rb +2 -0
- data/app/controllers/spree/api/shipments_controller.rb +9 -5
- data/lib/spree/api/responders/rabl_template.rb +1 -13
- data/solidus_api.gemspec +4 -3
- data/spec/controllers/spree/api/base_controller_spec.rb +20 -0
- data/spec/controllers/spree/api/checkouts_controller_spec.rb +0 -20
- data/spec/controllers/spree/api/orders_controller_spec.rb +13 -31
- data/spec/controllers/spree/api/products_controller_spec.rb +2 -40
- data/spec/controllers/spree/api/return_authorizations_controller_spec.rb +2 -2
- data/spec/controllers/spree/api/shipments_controller_spec.rb +19 -1
- data/spec/controllers/spree/api/zones_controller_spec.rb +0 -26
- data/spec/spec_helper.rb +6 -0
- metadata +8 -9
- data/config/initializers/metal_load_paths.rb +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3552a542c49a1c8586fe3765f8e477a4d267a8d8
|
4
|
+
data.tar.gz: 31fb98454ac818493d461e32d2a2a5357d3bdb14
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 06ed20f3ea44a9015f32606e3192f4a8591568665c6211ea642e145437d751aa0ddc65ff720a4ffa8444f5105de0a4f92b8ae68331428676ac5c4373f7e87550
|
7
|
+
data.tar.gz: fa71e4ecc89775eda5afcb323faa90efcdccf9fa08e91ab2b67cbe05bb833c7ede57f714373cef706b299a9db377b6b8e623edb70293d37fa3f563eec8db1299
|
@@ -184,6 +184,16 @@ module Spree
|
|
184
184
|
render text: e.message, status: 409
|
185
185
|
end
|
186
186
|
|
187
|
+
def insufficient_stock_error(exception)
|
188
|
+
render(
|
189
|
+
json: {
|
190
|
+
errors: [I18n.t(:quantity_is_not_available, :scope => "spree.api.order")],
|
191
|
+
type: 'insufficient_stock',
|
192
|
+
},
|
193
|
+
status: 422,
|
194
|
+
)
|
195
|
+
end
|
196
|
+
|
187
197
|
end
|
188
198
|
end
|
189
199
|
end
|
@@ -124,10 +124,6 @@ module Spree
|
|
124
124
|
return true if expected_total.blank?
|
125
125
|
@order.total == BigDecimal(expected_total)
|
126
126
|
end
|
127
|
-
|
128
|
-
def insufficient_stock_error(exception)
|
129
|
-
render json: { errors: [I18n.t(:quantity_is_not_available, :scope => "spree.api.order")], type: 'insufficient_stock' }, status: 422
|
130
|
-
end
|
131
127
|
end
|
132
128
|
end
|
133
129
|
end
|
@@ -4,6 +4,8 @@ module Spree
|
|
4
4
|
before_filter :load_order
|
5
5
|
around_filter :lock_order, only: [:create, :update, :destroy, :add, :receive, :cancel]
|
6
6
|
|
7
|
+
rescue_from Spree::Order::InsufficientStock, with: :insufficient_stock_error
|
8
|
+
|
7
9
|
def create
|
8
10
|
authorize! :create, ReturnAuthorization
|
9
11
|
@return_authorization = @order.return_authorizations.build(return_authorization_params)
|
@@ -66,16 +66,20 @@ module Spree
|
|
66
66
|
quantity = params[:quantity].to_i
|
67
67
|
|
68
68
|
@shipment.order.contents.add(variant, quantity, {shipment: @shipment})
|
69
|
-
|
70
69
|
respond_with(@shipment, default_template: :show)
|
71
70
|
end
|
72
71
|
|
73
72
|
def remove
|
74
73
|
quantity = params[:quantity].to_i
|
75
74
|
|
76
|
-
@shipment.
|
77
|
-
|
78
|
-
|
75
|
+
if @shipment.pending?
|
76
|
+
@shipment.order.contents.remove(variant, quantity, {shipment: @shipment})
|
77
|
+
@shipment.reload if @shipment.persisted?
|
78
|
+
respond_with(@shipment, default_template: :show)
|
79
|
+
else
|
80
|
+
@shipment.errors.add(:base, :cannot_remove_items_shipment_state, state: @shipment.state)
|
81
|
+
invalid_resource!(@shipment)
|
82
|
+
end
|
79
83
|
end
|
80
84
|
|
81
85
|
def transfer_to_location
|
@@ -85,7 +89,7 @@ module Spree
|
|
85
89
|
end
|
86
90
|
|
87
91
|
def transfer_to_shipment
|
88
|
-
@target_shipment
|
92
|
+
@target_shipment = Spree::Shipment.find_by!(number: params[:target_shipment_number])
|
89
93
|
@original_shipment.transfer_to_shipment(@variant, @quantity, @target_shipment)
|
90
94
|
render json: {success: true, message: Spree.t(:shipment_transfer_success)}, status: 201
|
91
95
|
end
|
@@ -8,22 +8,10 @@ module Spree
|
|
8
8
|
else
|
9
9
|
super
|
10
10
|
end
|
11
|
-
|
12
|
-
rescue ActionView::MissingTemplate
|
13
|
-
api_behavior
|
14
11
|
end
|
15
12
|
|
16
13
|
def template
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
def api_behavior
|
21
|
-
if controller.params[:action] == "destroy"
|
22
|
-
# Render a blank template
|
23
|
-
super
|
24
|
-
else
|
25
|
-
# Do nothing and fallback to the default template
|
26
|
-
end
|
14
|
+
options[:default_template]
|
27
15
|
end
|
28
16
|
end
|
29
17
|
end
|
data/solidus_api.gemspec
CHANGED
@@ -4,9 +4,10 @@ version = File.read(File.expand_path("../../SOLIDUS_VERSION", __FILE__)).strip
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.author = 'Solidus Team'
|
6
6
|
gem.email = 'contact@solidus.io'
|
7
|
-
gem.
|
8
|
-
|
9
|
-
gem.
|
7
|
+
gem.homepage = 'http://solidus.io/'
|
8
|
+
|
9
|
+
gem.summary = %q{REST API for the Solidus e-commerce framework.}
|
10
|
+
gem.description = gem.summary
|
10
11
|
|
11
12
|
gem.files = `git ls-files`.split($\)
|
12
13
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
@@ -6,6 +6,8 @@ end
|
|
6
6
|
describe Spree::Api::BaseController, :type => :controller do
|
7
7
|
render_views
|
8
8
|
controller(Spree::Api::BaseController) do
|
9
|
+
rescue_from Spree::Order::InsufficientStock, with: :insufficient_stock_error
|
10
|
+
|
9
11
|
def index
|
10
12
|
render :text => { "products" => [] }.to_json
|
11
13
|
end
|
@@ -131,6 +133,24 @@ describe Spree::Api::BaseController, :type => :controller do
|
|
131
133
|
end
|
132
134
|
end
|
133
135
|
|
136
|
+
context 'insufficient stock' do
|
137
|
+
before do
|
138
|
+
subject.should_receive(:authenticate_user).and_return(true)
|
139
|
+
subject.should_receive(:index).and_raise(Spree::Order::InsufficientStock)
|
140
|
+
get :index, :token => "fake_key"
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should return a 422" do
|
144
|
+
expect(response.status).to eq(422)
|
145
|
+
end
|
146
|
+
|
147
|
+
it "returns an error message" do
|
148
|
+
expect(json_response).to eq(
|
149
|
+
{"errors" => ["Quantity is not available for items in your order"], "type" => "insufficient_stock"}
|
150
|
+
)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
134
154
|
context 'lock_order' do
|
135
155
|
let!(:order) { create :order }
|
136
156
|
|
@@ -347,26 +347,6 @@ module Spree
|
|
347
347
|
end
|
348
348
|
end
|
349
349
|
end
|
350
|
-
|
351
|
-
context 'insufficient stock' do
|
352
|
-
let(:order) { create(:order_with_line_items) }
|
353
|
-
before do
|
354
|
-
expect_any_instance_of(Spree::Order).to receive(:next!).and_raise(Spree::Order::InsufficientStock)
|
355
|
-
end
|
356
|
-
|
357
|
-
subject { api_put :next, :id => order.to_param, :order_token => order.guest_token }
|
358
|
-
|
359
|
-
it "should return a 422" do
|
360
|
-
expect(subject.status).to eq(422)
|
361
|
-
end
|
362
|
-
|
363
|
-
it "returns an error message" do
|
364
|
-
subject
|
365
|
-
expect(JSON.parse(response.body)).to eq(
|
366
|
-
{"errors" => ["Quantity is not available for items in your order"], "type" => "insufficient_stock"}
|
367
|
-
)
|
368
|
-
end
|
369
|
-
end
|
370
350
|
end
|
371
351
|
|
372
352
|
context "PUT 'advance'" do
|
@@ -318,20 +318,7 @@ module Spree
|
|
318
318
|
:country_id => country.id} }
|
319
319
|
let(:country) { create(:country, {name: "Brazil", iso_name: "BRAZIL", iso: "BR", iso3: "BRA", numcode: 76 })}
|
320
320
|
|
321
|
-
before
|
322
|
-
allow_any_instance_of(Order).to receive_messages user: current_api_user
|
323
|
-
order.next # Switch from cart to address
|
324
|
-
order.bill_address = nil
|
325
|
-
order.ship_address = nil
|
326
|
-
order.save
|
327
|
-
expect(order.state).to eq("address")
|
328
|
-
end
|
329
|
-
|
330
|
-
def clean_address(address)
|
331
|
-
address.delete(:state)
|
332
|
-
address.delete(:country)
|
333
|
-
address
|
334
|
-
end
|
321
|
+
before { allow_any_instance_of(Order).to receive_messages user: current_api_user }
|
335
322
|
|
336
323
|
context "line_items hash not present in request" do
|
337
324
|
it "responds successfully" do
|
@@ -401,15 +388,16 @@ module Spree
|
|
401
388
|
end
|
402
389
|
|
403
390
|
it "can add shipping address" do
|
404
|
-
|
405
|
-
|
406
|
-
api_put :update, :id => order.to_param, :order => { :ship_address_attributes => shipping_address }
|
391
|
+
order.update_attributes!(ship_address_id: nil)
|
407
392
|
|
408
|
-
expect
|
393
|
+
expect {
|
394
|
+
api_put :update, :id => order.to_param, :order => { :ship_address_attributes => shipping_address }
|
395
|
+
}.to change { order.reload.ship_address }.from(nil)
|
409
396
|
end
|
410
397
|
|
411
398
|
it "receives error message if trying to add shipping address with errors" do
|
412
|
-
|
399
|
+
order.update_attributes!(ship_address_id: nil)
|
400
|
+
|
413
401
|
shipping_address[:firstname] = ""
|
414
402
|
|
415
403
|
api_put :update, :id => order.to_param, :order => { :ship_address_attributes => shipping_address }
|
@@ -442,19 +430,15 @@ module Spree
|
|
442
430
|
end
|
443
431
|
|
444
432
|
context "with a line item" do
|
445
|
-
let(:order_with_line_items)
|
446
|
-
order = create(:order_with_line_items)
|
447
|
-
create(:adjustment, order: order, adjustable: order)
|
448
|
-
order
|
449
|
-
end
|
433
|
+
let(:order) { create(:order_with_line_items) }
|
450
434
|
|
451
435
|
it "can empty an order" do
|
452
|
-
|
453
|
-
api_put :empty, :id =>
|
436
|
+
create(:adjustment, order: order, adjustable: order)
|
437
|
+
api_put :empty, :id => order.to_param
|
454
438
|
expect(response.status).to eq(204)
|
455
|
-
|
456
|
-
expect(
|
457
|
-
expect(
|
439
|
+
order.reload
|
440
|
+
expect(order.line_items).to be_empty
|
441
|
+
expect(order.adjustments).to be_empty
|
458
442
|
end
|
459
443
|
|
460
444
|
it "can list its line items with images" do
|
@@ -516,8 +500,6 @@ module Spree
|
|
516
500
|
end
|
517
501
|
|
518
502
|
before do
|
519
|
-
order.bill_address = FactoryGirl.create(:address)
|
520
|
-
order.ship_address = FactoryGirl.create(:address)
|
521
503
|
order.next!
|
522
504
|
order.save
|
523
505
|
end
|
@@ -67,44 +67,6 @@ module Spree
|
|
67
67
|
expect(json_response["per_page"]).to eq(Kaminari.config.default_per_page)
|
68
68
|
end
|
69
69
|
|
70
|
-
context "specifying a rabl template for a custom action" do
|
71
|
-
before do
|
72
|
-
Spree::Api::ProductsController.class_eval do
|
73
|
-
def custom_show
|
74
|
-
@product = find_product(params[:id])
|
75
|
-
respond_with(@product)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def set_custom_route
|
81
|
-
@routes = ActionDispatch::Routing::RouteSet.new.tap do |r|
|
82
|
-
r.draw { get 'custom_show' => 'spree/api/products#custom_show' }
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
it "uses the specified custom template through the request header" do
|
87
|
-
set_custom_route
|
88
|
-
|
89
|
-
request.headers['X-Spree-Template'] = 'show'
|
90
|
-
api_get :custom_show, :id => product.id
|
91
|
-
expect(response).to render_template('spree/api/products/show')
|
92
|
-
end
|
93
|
-
|
94
|
-
it "uses the specified custom template through the template URL parameter" do
|
95
|
-
set_custom_route
|
96
|
-
|
97
|
-
api_get :custom_show, :id => product.id, :template => 'show'
|
98
|
-
expect(response).to render_template('spree/api/products/show')
|
99
|
-
end
|
100
|
-
|
101
|
-
it "falls back to the default template if the specified template does not exist" do
|
102
|
-
request.headers['X-Spree-Template'] = 'invoice'
|
103
|
-
api_get :show, :id => product.id
|
104
|
-
expect(response).to render_template('spree/api/products/show')
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
70
|
context "product has more than one price" do
|
109
71
|
before { product.master.prices.create currency: "EUR", amount: 22 }
|
110
72
|
|
@@ -394,8 +356,8 @@ module Spree
|
|
394
356
|
expect(json_response['variants'].count).to eq(2) # 2 variants
|
395
357
|
|
396
358
|
variants = json_response['variants'].select { |v| !v['is_master'] }
|
397
|
-
|
398
|
-
expect(
|
359
|
+
size_option_value = variants.last['option_values'].detect{|x| x['option_type_name'] == 'size' }
|
360
|
+
expect(size_option_value['name']).to eq('small')
|
399
361
|
|
400
362
|
expect(json_response['option_types'].count).to eq(2) # size, color
|
401
363
|
end
|
@@ -17,9 +17,9 @@ module Spree
|
|
17
17
|
shared_examples_for 'a return authorization creator' do
|
18
18
|
it "can create a new return authorization" do
|
19
19
|
stock_location = FactoryGirl.create(:stock_location)
|
20
|
-
reason = FactoryGirl.create(:
|
20
|
+
reason = FactoryGirl.create(:return_reason)
|
21
21
|
rma_params = { :stock_location_id => stock_location.id,
|
22
|
-
:
|
22
|
+
:return_reason_id => reason.id,
|
23
23
|
:memo => "Defective" }
|
24
24
|
api_post :create, :order_id => order.number, :return_authorization => rma_params
|
25
25
|
response.status.should == 201
|
@@ -91,7 +91,7 @@ describe Spree::Api::ShipmentsController, :type => :controller do
|
|
91
91
|
expect(response.status).to eq(422)
|
92
92
|
end
|
93
93
|
|
94
|
-
context 'for completed
|
94
|
+
context 'for completed orders' do
|
95
95
|
let(:order) { create :completed_order_with_totals }
|
96
96
|
let!(:resource_scoping) { { id: order.shipments.first.to_param, shipment: { order_id: order.to_param } } }
|
97
97
|
|
@@ -119,6 +119,24 @@ describe Spree::Api::ShipmentsController, :type => :controller do
|
|
119
119
|
end
|
120
120
|
end
|
121
121
|
|
122
|
+
context "for shipped shipments" do
|
123
|
+
let(:order) { create :shipped_order }
|
124
|
+
let!(:resource_scoping) { { id: order.shipments.first.to_param, shipment: { order_id: order.to_param } } }
|
125
|
+
|
126
|
+
it 'adds a variant to a shipment' do
|
127
|
+
api_put :add, { variant_id: variant.to_param, quantity: 2 }
|
128
|
+
response.status.should == 200
|
129
|
+
json_response['manifest'].detect { |h| h['variant']['id'] == variant.id }["quantity"].should == 2
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'cannot remove a variant from a shipment' do
|
133
|
+
api_put :remove, { variant_id: variant.to_param, quantity: 1 }
|
134
|
+
response.status.should == 422
|
135
|
+
expect(json_response['errors']['base'].join).to match /Cannot remove items/
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
|
122
140
|
describe '#mine' do
|
123
141
|
subject do
|
124
142
|
api_get :mine, format: 'json', params: params
|
@@ -38,32 +38,6 @@ module Spree
|
|
38
38
|
expect(json_response['zone_members'].size).to eq @zone.zone_members.count
|
39
39
|
end
|
40
40
|
|
41
|
-
context "specifying a rabl template to use" do
|
42
|
-
before do
|
43
|
-
Spree::Api::ZonesController.class_eval do
|
44
|
-
def custom_show
|
45
|
-
respond_with(zone)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
it "uses the specified template" do
|
51
|
-
@routes = ActionDispatch::Routing::RouteSet.new.tap do |r|
|
52
|
-
r.draw { get 'custom_show' => 'spree/api/zones#custom_show' }
|
53
|
-
end
|
54
|
-
|
55
|
-
request.headers['X-Spree-Template'] = 'show'
|
56
|
-
api_get :custom_show, :id => @zone.id
|
57
|
-
expect(response).to render_template('spree/api/zones/show')
|
58
|
-
end
|
59
|
-
|
60
|
-
it "falls back to the default template if the specified template does not exist" do
|
61
|
-
request.headers['X-Spree-Template'] = 'invoice'
|
62
|
-
api_get :show, :id => @zone.id
|
63
|
-
expect(response).to render_template('spree/api/zones/show')
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
41
|
context "as an admin" do
|
68
42
|
sign_in_as_admin!
|
69
43
|
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solidus_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.pre2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Solidus Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: solidus_core
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.0.0.
|
19
|
+
version: 1.0.0.pre2
|
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: 1.0.0.
|
26
|
+
version: 1.0.0.pre2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rabl
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,7 +58,7 @@ dependencies:
|
|
58
58
|
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
60
|
version: 2.3.1
|
61
|
-
description:
|
61
|
+
description: REST API for the Solidus e-commerce framework.
|
62
62
|
email: contact@solidus.io
|
63
63
|
executables: []
|
64
64
|
extensions: []
|
@@ -202,7 +202,6 @@ files:
|
|
202
202
|
- app/views/spree/api/variants/small.v1.rabl
|
203
203
|
- app/views/spree/api/zones/index.v1.rabl
|
204
204
|
- app/views/spree/api/zones/show.v1.rabl
|
205
|
-
- config/initializers/metal_load_paths.rb
|
206
205
|
- config/locales/en.yml
|
207
206
|
- config/routes.rb
|
208
207
|
- db/migrate/20100107141738_add_api_key_to_spree_users.rb
|
@@ -264,7 +263,7 @@ files:
|
|
264
263
|
- spec/support/controller_hacks.rb
|
265
264
|
- spec/support/database_cleaner.rb
|
266
265
|
- spec/support/have_attributes_matcher.rb
|
267
|
-
homepage:
|
266
|
+
homepage: http://solidus.io/
|
268
267
|
licenses: []
|
269
268
|
metadata: {}
|
270
269
|
post_install_message:
|
@@ -283,10 +282,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
283
282
|
version: 1.3.1
|
284
283
|
requirements: []
|
285
284
|
rubyforge_project:
|
286
|
-
rubygems_version: 2.
|
285
|
+
rubygems_version: 2.4.5
|
287
286
|
signing_key:
|
288
287
|
specification_version: 4
|
289
|
-
summary:
|
288
|
+
summary: REST API for the Solidus e-commerce framework.
|
290
289
|
test_files:
|
291
290
|
- spec/controllers/spree/api/addresses_controller_spec.rb
|
292
291
|
- spec/controllers/spree/api/base_controller_spec.rb
|
@@ -1 +0,0 @@
|
|
1
|
-
Spree::Api::BaseController.append_view_path(ApplicationController.view_paths)
|