spree_api 2.3.13 → 2.4.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1 -43
- data/Gemfile +1 -1
- data/app/controllers/spree/api/addresses_controller.rb +1 -1
- data/app/controllers/spree/api/base_controller.rb +22 -9
- data/app/controllers/spree/api/checkouts_controller.rb +2 -2
- data/app/controllers/spree/api/countries_controller.rb +2 -2
- data/app/controllers/spree/api/credit_cards_controller.rb +1 -1
- data/app/controllers/spree/api/images_controller.rb +5 -0
- data/app/controllers/spree/api/inventory_units_controller.rb +1 -1
- data/app/controllers/spree/api/line_items_controller.rb +7 -7
- data/app/controllers/spree/api/option_types_controller.rb +2 -2
- data/app/controllers/spree/api/orders_controller.rb +17 -6
- data/app/controllers/spree/api/payments_controller.rb +3 -11
- data/app/controllers/spree/api/product_properties_controller.rb +2 -2
- data/app/controllers/spree/api/promotions_controller.rb +26 -0
- data/app/controllers/spree/api/properties_controller.rb +1 -1
- data/app/controllers/spree/api/return_authorizations_controller.rb +0 -10
- data/app/controllers/spree/api/shipments_controller.rb +71 -4
- data/app/controllers/spree/api/states_controller.rb +3 -3
- data/app/controllers/spree/api/stock_items_controller.rb +1 -1
- data/app/controllers/spree/api/stock_movements_controller.rb +1 -1
- data/app/controllers/spree/api/taxons_controller.rb +1 -1
- data/app/controllers/spree/api/variants_controller.rb +1 -2
- data/app/helpers/spree/api/api_helpers.rb +19 -5
- data/app/views/spree/api/images/index.v1.rabl +4 -0
- data/app/views/spree/api/products/show.v1.rabl +4 -1
- data/app/views/spree/api/promotions/handler.v1.rabl +2 -1
- data/app/views/spree/api/promotions/show.v1.rabl +2 -0
- data/app/views/spree/api/shipments/big.v1.rabl +48 -0
- data/app/views/spree/api/shipments/mine.v1.rabl +9 -0
- data/app/views/spree/api/shipments/small.v1.rabl +1 -5
- data/app/views/spree/api/shipping_rates/show.v1.rabl +2 -2
- data/app/views/spree/api/taxonomies/show.v1.rabl +2 -2
- data/app/views/spree/api/variants/big.v1.rabl +6 -1
- data/app/views/spree/api/variants/show.v1.rabl +1 -1
- data/app/views/spree/api/variants/small.v1.rabl +2 -3
- data/config/routes.rb +9 -0
- data/lib/spree/api/responders/rabl_template.rb +1 -1
- data/lib/spree/api/testing_support/helpers.rb +6 -6
- data/lib/spree/api/testing_support/setup.rb +2 -2
- data/spec/controllers/spree/api/addresses_controller_spec.rb +7 -7
- data/spec/controllers/spree/api/base_controller_spec.rb +66 -19
- data/spec/controllers/spree/api/checkouts_controller_spec.rb +54 -54
- data/spec/controllers/spree/api/classifications_controller_spec.rb +5 -5
- data/spec/controllers/spree/api/config_controller_spec.rb +9 -9
- data/spec/controllers/spree/api/countries_controller_spec.rb +11 -11
- data/spec/controllers/spree/api/credit_cards_controller_spec.rb +16 -16
- data/spec/controllers/spree/api/images_controller_spec.rb +37 -11
- data/spec/controllers/spree/api/inventory_units_controller_spec.rb +6 -6
- data/spec/controllers/spree/api/line_items_controller_spec.rb +34 -35
- data/spec/controllers/spree/api/option_types_controller_spec.rb +18 -18
- data/spec/controllers/spree/api/option_values_controller_spec.rb +21 -21
- data/spec/controllers/spree/api/orders_controller_spec.rb +177 -161
- data/spec/controllers/spree/api/payments_controller_spec.rb +52 -89
- data/spec/controllers/spree/api/product_properties_controller_spec.rb +21 -21
- data/spec/controllers/spree/api/products_controller_spec.rb +103 -60
- data/spec/controllers/spree/api/promotion_application_spec.rb +14 -12
- data/spec/controllers/spree/api/promotions_controller_spec.rb +64 -0
- data/spec/controllers/spree/api/properties_controller_spec.rb +25 -25
- data/spec/controllers/spree/api/return_authorizations_controller_spec.rb +42 -66
- data/spec/controllers/spree/api/shipments_controller_spec.rb +69 -21
- data/spec/controllers/spree/api/states_controller_spec.rb +18 -18
- data/spec/controllers/spree/api/stock_items_controller_spec.rb +26 -26
- data/spec/controllers/spree/api/stock_locations_controller_spec.rb +22 -22
- data/spec/controllers/spree/api/stock_movements_controller_spec.rb +16 -16
- data/spec/controllers/spree/api/taxonomies_controller_spec.rb +24 -24
- data/spec/controllers/spree/api/taxons_controller_spec.rb +39 -39
- data/spec/controllers/spree/api/unauthenticated_products_controller_spec.rb +5 -5
- data/spec/controllers/spree/api/users_controller_spec.rb +41 -41
- data/spec/controllers/spree/api/variants_controller_spec.rb +47 -37
- data/spec/controllers/spree/api/zones_controller_spec.rb +40 -18
- data/spec/models/spree/legacy_user_spec.rb +5 -5
- data/spec/requests/rabl_cache_spec.rb +9 -9
- data/spec/spec_helper.rb +1 -0
- metadata +14 -9
- data/spec/requests/ransackable_attributes_spec.rb +0 -79
@@ -0,0 +1,48 @@
|
|
1
|
+
object @shipment
|
2
|
+
cache @shipment
|
3
|
+
attributes *shipment_attributes
|
4
|
+
|
5
|
+
child selected_shipping_rate: :selected_shipping_rate do
|
6
|
+
extends "spree/api/shipping_rates/show"
|
7
|
+
end
|
8
|
+
|
9
|
+
child inventory_units: :inventory_units do
|
10
|
+
object @inventory_unit
|
11
|
+
attributes *inventory_unit_attributes
|
12
|
+
|
13
|
+
child :variant do
|
14
|
+
extends "spree/api/variants/small"
|
15
|
+
attributes :product_id
|
16
|
+
child(images: :images) { extends "spree/api/images/show" }
|
17
|
+
end
|
18
|
+
|
19
|
+
child :line_item do
|
20
|
+
attributes *line_item_attributes
|
21
|
+
node(:single_display_amount) { |li| li.single_display_amount.to_s }
|
22
|
+
node(:display_amount) { |li| li.display_amount.to_s }
|
23
|
+
node(:total) { |li| li.total }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
child order: :order do
|
28
|
+
extends "spree/api/orders/order"
|
29
|
+
|
30
|
+
child billing_address: :bill_address do
|
31
|
+
extends "spree/api/addresses/show"
|
32
|
+
end
|
33
|
+
|
34
|
+
child shipping_address: :ship_address do
|
35
|
+
extends "spree/api/addresses/show"
|
36
|
+
end
|
37
|
+
|
38
|
+
child adjustments: :adjustments do
|
39
|
+
extends "spree/api/adjustments/show"
|
40
|
+
end
|
41
|
+
|
42
|
+
child payments: :payments do
|
43
|
+
attributes :id, :amount, :display_amount, :state
|
44
|
+
child payment_method: :payment_method do
|
45
|
+
attributes :id, :name
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -14,7 +14,7 @@ child :selected_shipping_rate => :selected_shipping_rate do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
child :shipping_methods => :shipping_methods do
|
17
|
-
attributes :id, :name
|
17
|
+
attributes :id, :code, :name
|
18
18
|
child :zones => :zones do
|
19
19
|
attributes :id, :name, :description
|
20
20
|
end
|
@@ -31,7 +31,3 @@ child :manifest => :manifest do
|
|
31
31
|
node(:quantity) { |m| m.quantity }
|
32
32
|
node(:states) { |m| m.states }
|
33
33
|
end
|
34
|
-
|
35
|
-
child :adjustments => :adjustments do
|
36
|
-
extends "spree/api/adjustments/show"
|
37
|
-
end
|
@@ -1,2 +1,2 @@
|
|
1
|
-
attributes :id, :name, :cost, :selected, :shipping_method_id
|
2
|
-
node(:display_cost) { |sr| sr.display_cost.to_s }
|
1
|
+
attributes :id, :name, :cost, :selected, :shipping_method_id, :shipping_method_code
|
2
|
+
node(:display_cost) { |sr| sr.display_cost.to_s }
|
@@ -1,10 +1,15 @@
|
|
1
1
|
object @variant
|
2
2
|
attributes *variant_attributes
|
3
3
|
|
4
|
-
cache [I18n.locale, 'big_variant', root_object]
|
4
|
+
cache [I18n.locale, @current_user_roles.include?('admin'), 'big_variant', root_object]
|
5
5
|
|
6
6
|
extends "spree/api/variants/small"
|
7
7
|
|
8
|
+
node :total_on_hand do
|
9
|
+
root_object.total_on_hand
|
10
|
+
end
|
11
|
+
|
12
|
+
|
8
13
|
child(:stock_items => :stock_items) do
|
9
14
|
attributes :id, :count_on_hand, :stock_location_id, :backorderable
|
10
15
|
attribute :available? => :available
|
@@ -1,11 +1,10 @@
|
|
1
|
+
cache [I18n.locale, @current_user_roles.include?('admin'), 'small_variant', root_object]
|
2
|
+
|
1
3
|
attributes *variant_attributes
|
2
|
-
cache [I18n.locale, 'small_variant', root_object]
|
3
4
|
|
4
5
|
node(:display_price) { |p| p.display_price.to_s }
|
5
6
|
node(:options_text) { |v| v.options_text }
|
6
7
|
node(:in_stock) { |v| v.in_stock? }
|
7
|
-
node(:is_backorderable) { |v| v.is_backorderable? }
|
8
|
-
node(:total_on_hand) { |v| v.total_on_hand }
|
9
8
|
|
10
9
|
child :option_values => :option_values do
|
11
10
|
attributes *option_value_attributes
|
data/config/routes.rb
CHANGED
@@ -9,6 +9,8 @@ Spree::Core::Engine.add_routes do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
namespace :api, defaults: { format: 'json' } do
|
12
|
+
resources :promotions, only: [:show]
|
13
|
+
|
12
14
|
resources :products do
|
13
15
|
resources :images
|
14
16
|
resources :variants
|
@@ -60,6 +62,7 @@ Spree::Core::Engine.add_routes do
|
|
60
62
|
end
|
61
63
|
|
62
64
|
get '/orders/mine', to: 'orders#mine', as: 'my_orders'
|
65
|
+
get "/orders/current", to: "orders#current", to: "orders#current", as: "current_order"
|
63
66
|
|
64
67
|
resources :orders, concerns: :order_routes
|
65
68
|
|
@@ -69,6 +72,12 @@ Spree::Core::Engine.add_routes do
|
|
69
72
|
end
|
70
73
|
|
71
74
|
resources :shipments, only: [:create, :update] do
|
75
|
+
collection do
|
76
|
+
post 'transfer_to_location'
|
77
|
+
post 'transfer_to_shipment'
|
78
|
+
get :mine
|
79
|
+
end
|
80
|
+
|
72
81
|
member do
|
73
82
|
put :ready
|
74
83
|
put :ship
|
@@ -12,23 +12,23 @@ module Spree
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def assert_not_found!
|
15
|
-
|
16
|
-
|
15
|
+
json_response.should == { "error" => "The resource you were looking for could not be found." }
|
16
|
+
response.status.should == 404
|
17
17
|
end
|
18
18
|
|
19
19
|
def assert_unauthorized!
|
20
|
-
|
21
|
-
|
20
|
+
json_response.should == { "error" => "You are not authorized to perform that action." }
|
21
|
+
response.status.should == 401
|
22
22
|
end
|
23
23
|
|
24
24
|
def stub_authentication!
|
25
|
-
|
25
|
+
Spree::LegacyUser.stub(:find_by).with(hash_including(:spree_api_key)) { current_api_user }
|
26
26
|
end
|
27
27
|
|
28
28
|
# This method can be overriden (with a let block) inside a context
|
29
29
|
# For instance, if you wanted to have an admin user instead.
|
30
30
|
def current_api_user
|
31
|
-
@current_api_user ||= stub_model(Spree::LegacyUser, email
|
31
|
+
@current_api_user ||= stub_model(Spree::LegacyUser, :email => "spree@example.com")
|
32
32
|
end
|
33
33
|
|
34
34
|
def image(filename)
|
@@ -5,8 +5,8 @@ module Spree
|
|
5
5
|
def sign_in_as_admin!
|
6
6
|
let!(:current_api_user) do
|
7
7
|
user = stub_model(Spree::LegacyUser)
|
8
|
-
|
9
|
-
|
8
|
+
user.stub_chain(:spree_roles, :pluck).and_return(["admin"])
|
9
|
+
user.stub(:has_spree_role?).with("admin").and_return(true)
|
10
10
|
user
|
11
11
|
end
|
12
12
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
module Spree
|
4
|
-
describe Api::AddressesController
|
4
|
+
describe Api::AddressesController do
|
5
5
|
render_views
|
6
6
|
|
7
7
|
before do
|
@@ -12,27 +12,27 @@ module Spree
|
|
12
12
|
|
13
13
|
context "with their own address" do
|
14
14
|
before do
|
15
|
-
|
15
|
+
Order.any_instance.stub :user => current_api_user
|
16
16
|
end
|
17
17
|
|
18
18
|
it "gets an address" do
|
19
19
|
api_get :show, :id => @address.id, :order_id => @order.number
|
20
|
-
|
20
|
+
json_response['address1'].should eq @address.address1
|
21
21
|
end
|
22
22
|
|
23
23
|
it "updates an address" do
|
24
24
|
api_put :update, :id => @address.id, :order_id => @order.number,
|
25
25
|
:address => { :address1 => "123 Test Lane" }
|
26
|
-
|
26
|
+
json_response['address1'].should eq '123 Test Lane'
|
27
27
|
end
|
28
28
|
|
29
29
|
it "receives the errors object if address is invalid" do
|
30
30
|
api_put :update, :id => @address.id, :order_id => @order.number,
|
31
31
|
:address => { :address1 => "" }
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
json_response['error'].should_not be_nil
|
34
|
+
json_response['errors'].should_not be_nil
|
35
|
+
json_response['errors']['address1'].first.should eq "can't be blank"
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
3
|
+
class FakesController < Spree::Api::BaseController
|
4
|
+
end
|
5
|
+
|
6
|
+
describe Spree::Api::BaseController do
|
4
7
|
render_views
|
5
8
|
controller(Spree::Api::BaseController) do
|
6
9
|
def index
|
@@ -8,9 +11,17 @@ describe Spree::Api::BaseController, :type => :controller do
|
|
8
11
|
end
|
9
12
|
end
|
10
13
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
+
context "signed in as a user using an authentication extension" do
|
15
|
+
before do
|
16
|
+
user = double(:email => "spree@example.com")
|
17
|
+
user.stub_chain :spree_roles, pluck: []
|
18
|
+
controller.stub :try_spree_current_user => user
|
19
|
+
end
|
20
|
+
|
21
|
+
it "can make a request" do
|
22
|
+
api_get :index
|
23
|
+
json_response.should == { "products" => [] }
|
24
|
+
response.status.should == 200
|
14
25
|
end
|
15
26
|
end
|
16
27
|
|
@@ -20,19 +31,19 @@ describe Spree::Api::BaseController, :type => :controller do
|
|
20
31
|
context "with a correct order token" do
|
21
32
|
it "succeeds" do
|
22
33
|
api_get :index, order_token: order.guest_token, order_id: order.number
|
23
|
-
|
34
|
+
response.status.should == 200
|
24
35
|
end
|
25
36
|
|
26
37
|
it "succeeds with an order_number parameter" do
|
27
38
|
api_get :index, order_token: order.guest_token, order_number: order.number
|
28
|
-
|
39
|
+
response.status.should == 200
|
29
40
|
end
|
30
41
|
end
|
31
42
|
|
32
43
|
context "with an incorrect order token" do
|
33
44
|
it "returns unauthorized" do
|
34
45
|
api_get :index, order_token: "NOT_A_TOKEN", order_id: order.number
|
35
|
-
|
46
|
+
response.status.should == 401
|
36
47
|
end
|
37
48
|
end
|
38
49
|
end
|
@@ -40,29 +51,29 @@ describe Spree::Api::BaseController, :type => :controller do
|
|
40
51
|
context "cannot make a request to the API" do
|
41
52
|
it "without an API key" do
|
42
53
|
api_get :index
|
43
|
-
|
44
|
-
|
54
|
+
json_response.should == { "error" => "You must specify an API key." }
|
55
|
+
response.status.should == 401
|
45
56
|
end
|
46
57
|
|
47
58
|
it "with an invalid API key" do
|
48
59
|
request.headers["X-Spree-Token"] = "fake_key"
|
49
60
|
get :index, {}
|
50
|
-
|
51
|
-
|
61
|
+
json_response.should == { "error" => "Invalid API key (fake_key) specified." }
|
62
|
+
response.status.should == 401
|
52
63
|
end
|
53
64
|
|
54
65
|
it "using an invalid token param" do
|
55
66
|
get :index, :token => "fake_key"
|
56
|
-
|
67
|
+
json_response.should == { "error" => "Invalid API key (fake_key) specified." }
|
57
68
|
end
|
58
69
|
end
|
59
70
|
|
60
71
|
it 'handles exceptions' do
|
61
|
-
|
62
|
-
|
63
|
-
|
72
|
+
subject.should_receive(:authenticate_user).and_return(true)
|
73
|
+
subject.should_receive(:load_user_roles).and_return(true)
|
74
|
+
subject.should_receive(:index).and_raise(Exception.new("no joy"))
|
64
75
|
get :index, :token => "fake_key"
|
65
|
-
|
76
|
+
json_response.should == { "exception" => "no joy" }
|
66
77
|
end
|
67
78
|
|
68
79
|
it "maps semantic keys to nested_attributes keys" do
|
@@ -73,11 +84,47 @@ describe Spree::Api::BaseController, :type => :controller do
|
|
73
84
|
'name' => 'test order' }
|
74
85
|
|
75
86
|
mapped = subject.map_nested_attributes_keys(klass, attributes)
|
76
|
-
|
77
|
-
|
87
|
+
mapped.has_key?('line_items_attributes').should be true
|
88
|
+
mapped.has_key?('name').should be true
|
78
89
|
end
|
79
90
|
|
80
91
|
it "lets a subclass override the product associations that are eager-loaded" do
|
81
|
-
|
92
|
+
controller.respond_to?(:product_includes, true).should be
|
93
|
+
end
|
94
|
+
|
95
|
+
describe '#error_during_processing' do
|
96
|
+
controller(FakesController) do
|
97
|
+
# GET /foo
|
98
|
+
# Simulates a failed API call.
|
99
|
+
def foo
|
100
|
+
raise StandardError
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# What would be placed in config/initializers/spree.rb
|
105
|
+
Spree::Api::BaseController.error_notifier = Proc.new do |e, controller|
|
106
|
+
MockHoneybadger.notify_or_ignore(e, rack_env: controller.request.env)
|
107
|
+
end
|
108
|
+
|
109
|
+
##
|
110
|
+
# Fake HB alert class
|
111
|
+
class MockHoneybadger
|
112
|
+
# https://github.com/honeybadger-io/honeybadger-ruby/blob/master/lib/honeybadger.rb#L136
|
113
|
+
def self.notify_or_ignore(exception, opts = {})
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
before do
|
118
|
+
user = double(email: "spree@example.com")
|
119
|
+
user.stub_chain :spree_roles, pluck: []
|
120
|
+
controller.stub try_spree_current_user: user
|
121
|
+
routes.draw { get 'foo' => 'fakes#foo' }
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'should notify notify_error_during_processing' do
|
125
|
+
expect(MockHoneybadger).to receive(:notify_or_ignore).once.with(kind_of(Exception), rack_env: kind_of(Hash))
|
126
|
+
api_get :foo
|
127
|
+
expect(response.status).to eq(422)
|
128
|
+
end
|
82
129
|
end
|
83
130
|
end
|