spree_api 2.3.1 → 2.3.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 +1 -1
- data/app/controllers/spree/api/base_controller.rb +33 -12
- data/app/controllers/spree/api/credit_cards_controller.rb +25 -0
- data/app/controllers/spree/api/inventory_units_controller.rb +1 -0
- data/app/controllers/spree/api/line_items_controller.rb +0 -2
- data/app/controllers/spree/api/orders_controller.rb +24 -37
- data/app/controllers/spree/api/payments_controller.rb +3 -9
- data/app/controllers/spree/api/products_controller.rb +2 -0
- data/app/controllers/spree/api/shipments_controller.rb +4 -4
- data/app/controllers/spree/api/users_controller.rb +4 -1
- data/app/views/spree/api/credit_cards/index.v1.rabl +7 -0
- data/app/views/spree/api/errors/gateway_error.v1.rabl +1 -1
- data/app/views/spree/api/orders/show.v1.rabl +6 -1
- data/config/routes.rb +5 -1
- data/lib/spree/api/testing_support/setup.rb +1 -0
- data/spec/controllers/spree/api/base_controller_spec.rb +9 -3
- data/spec/controllers/spree/api/checkouts_controller_spec.rb +11 -0
- data/spec/controllers/spree/api/credit_cards_controller_spec.rb +80 -0
- data/spec/controllers/spree/api/orders_controller_spec.rb +55 -9
- data/spec/controllers/spree/api/payments_controller_spec.rb +17 -13
- data/spec/controllers/spree/api/products_controller_spec.rb +30 -2
- data/spec/controllers/spree/api/shipments_controller_spec.rb +10 -1
- data/spec/controllers/spree/api/stock_items_controller_spec.rb +1 -2
- data/spec/controllers/spree/api/users_controller_spec.rb +27 -2
- data/spec/controllers/spree/api/variants_controller_spec.rb +0 -1
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c3d7994fdc3ab159cb6c5c25c3df0328bdb7d09
|
4
|
+
data.tar.gz: 8ed983dd2706eacfa4081f2cb2509685f1e4e565
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fd18911bd56574872239ba21ed83030ec250bfaf3d339b05be20d7195bf4a03f27f3fa915b947e09284d01514445e81ae07ef5ef765e5cce971ee8ac69452175
|
7
|
+
data.tar.gz: b82a4694d499d371a463583ae30a7b414576cfca8b0430610b2c4191f42f823341c70cdf4f291a4fe856e46c18778d5a71ac69b7eff0058dd6247b4b9f0eaba8
|
data/CHANGELOG.md
CHANGED
@@ -14,11 +14,14 @@ module Spree
|
|
14
14
|
before_filter :load_user
|
15
15
|
before_filter :authorize_for_order, :if => Proc.new { order_token.present? }
|
16
16
|
before_filter :authenticate_user
|
17
|
+
before_filter :load_user_roles
|
18
|
+
|
17
19
|
after_filter :set_jsonp_format
|
18
20
|
|
19
|
-
rescue_from Exception, :
|
20
|
-
rescue_from
|
21
|
-
rescue_from
|
21
|
+
rescue_from Exception, with: :error_during_processing
|
22
|
+
rescue_from ActiveRecord::RecordNotFound, with: :not_found
|
23
|
+
rescue_from CanCan::AccessDenied, with: :unauthorized
|
24
|
+
rescue_from Spree::Core::GatewayError, with: :gateway_error
|
22
25
|
|
23
26
|
helper Spree::Api::ApiHelpers
|
24
27
|
|
@@ -42,7 +45,7 @@ module Spree
|
|
42
45
|
|
43
46
|
# users should be able to set price when importing orders via api
|
44
47
|
def permitted_line_item_attributes
|
45
|
-
if
|
48
|
+
if @current_user_roles.include?("admin")
|
46
49
|
super << [:price, :variant_id, :sku]
|
47
50
|
else
|
48
51
|
super
|
@@ -78,8 +81,16 @@ module Spree
|
|
78
81
|
end
|
79
82
|
end
|
80
83
|
|
84
|
+
def load_user_roles
|
85
|
+
@current_user_roles = if @current_api_user
|
86
|
+
@current_api_user.spree_roles.pluck(:name)
|
87
|
+
else
|
88
|
+
[]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
81
92
|
def unauthorized
|
82
|
-
render "spree/api/errors/unauthorized", :
|
93
|
+
render "spree/api/errors/unauthorized", status: 401 and return
|
83
94
|
end
|
84
95
|
|
85
96
|
def error_during_processing(exception)
|
@@ -90,12 +101,17 @@ module Spree
|
|
90
101
|
:status => 422 and return
|
91
102
|
end
|
92
103
|
|
104
|
+
def gateway_error(exception)
|
105
|
+
@order.errors.add(:base, exception.message)
|
106
|
+
invalid_resource!(@order)
|
107
|
+
end
|
108
|
+
|
93
109
|
def requires_authentication?
|
94
110
|
Spree::Api::Config[:requires_authentication]
|
95
111
|
end
|
96
112
|
|
97
113
|
def not_found
|
98
|
-
render "spree/api/errors/not_found", :
|
114
|
+
render "spree/api/errors/not_found", status: 404 and return
|
99
115
|
end
|
100
116
|
|
101
117
|
def current_ability
|
@@ -130,22 +146,27 @@ module Spree
|
|
130
146
|
end
|
131
147
|
|
132
148
|
def product_scope
|
133
|
-
|
134
|
-
|
135
|
-
scope = Product.with_deleted.accessible_by(current_ability, :read)
|
136
|
-
.includes(:properties, :option_types, variants: variants_associations, master: variants_associations)
|
149
|
+
if @current_user_roles.include?("admin")
|
150
|
+
scope = Product.with_deleted.accessible_by(current_ability, :read).includes(*product_includes)
|
137
151
|
|
138
152
|
unless params[:show_deleted]
|
139
153
|
scope = scope.not_deleted
|
140
154
|
end
|
141
155
|
else
|
142
|
-
scope = Product.accessible_by(current_ability, :read).active
|
143
|
-
.includes(:properties, :option_types, variants: variants_associations, master: variants_associations)
|
156
|
+
scope = Product.accessible_by(current_ability, :read).active.includes(*product_includes)
|
144
157
|
end
|
145
158
|
|
146
159
|
scope
|
147
160
|
end
|
148
161
|
|
162
|
+
def variants_associations
|
163
|
+
[{ option_values: :option_type }, :default_price, :images]
|
164
|
+
end
|
165
|
+
|
166
|
+
def product_includes
|
167
|
+
[ :option_types, variants: variants_associations, master: variants_associations ]
|
168
|
+
end
|
169
|
+
|
149
170
|
def order_id
|
150
171
|
params[:order_id] || params[:checkout_id] || params[:order_number]
|
151
172
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Spree
|
2
|
+
module Api
|
3
|
+
class CreditCardsController < Spree::Api::BaseController
|
4
|
+
before_filter :user
|
5
|
+
|
6
|
+
def index
|
7
|
+
@credit_cards = user
|
8
|
+
.credit_cards
|
9
|
+
.accessible_by(current_ability, :read)
|
10
|
+
.with_payment_profile
|
11
|
+
.ransack(params[:q]).result.page(params[:page]).per(params[:per_page])
|
12
|
+
respond_with(@credit_cards)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def user
|
18
|
+
if params[:user_id].present?
|
19
|
+
@user ||= Spree::user_class.accessible_by(current_ability, :read).find(params[:user_id])
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -6,7 +6,6 @@ module Spree
|
|
6
6
|
@line_item = order.contents.add(variant, params[:line_item][:quantity] || 1)
|
7
7
|
|
8
8
|
if @line_item.errors.empty?
|
9
|
-
@order.ensure_updated_shipments
|
10
9
|
respond_with(@line_item, status: 201, default_template: :show)
|
11
10
|
else
|
12
11
|
invalid_resource!(@line_item)
|
@@ -27,7 +26,6 @@ module Spree
|
|
27
26
|
@line_item = find_line_item
|
28
27
|
variant = Spree::Variant.find(@line_item.variant_id)
|
29
28
|
@order.contents.remove(variant, @line_item.quantity)
|
30
|
-
@order.ensure_updated_shipments
|
31
29
|
respond_with(@line_item, status: 204)
|
32
30
|
end
|
33
31
|
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Spree
|
2
2
|
module Api
|
3
3
|
class OrdersController < Spree::Api::BaseController
|
4
|
+
wrap_parameters false
|
5
|
+
|
4
6
|
skip_before_filter :check_for_user_or_api_key, only: :apply_coupon_code
|
5
7
|
skip_before_filter :authenticate_user, only: :apply_coupon_code
|
6
8
|
|
@@ -17,12 +19,24 @@ module Spree
|
|
17
19
|
def cancel
|
18
20
|
authorize! :update, @order, params[:token]
|
19
21
|
@order.cancel!
|
20
|
-
|
22
|
+
respond_with(@order, :default_template => :show)
|
21
23
|
end
|
22
24
|
|
23
25
|
def create
|
24
26
|
authorize! :create, Order
|
25
|
-
|
27
|
+
order_user = if @current_user_roles.include?('admin') && order_params[:user_id]
|
28
|
+
Spree.user_class.find(order_params[:user_id])
|
29
|
+
else
|
30
|
+
current_api_user
|
31
|
+
end
|
32
|
+
|
33
|
+
import_params = if @current_user_roles.include?("admin")
|
34
|
+
params[:order].present? ? params[:order].permit! : {}
|
35
|
+
else
|
36
|
+
order_params
|
37
|
+
end
|
38
|
+
|
39
|
+
@order = Spree::Core::Importer::Order.import(order_user, import_params)
|
26
40
|
respond_with(@order, default_template: :show, status: 201)
|
27
41
|
end
|
28
42
|
|
@@ -40,8 +54,6 @@ module Spree
|
|
40
54
|
|
41
55
|
def show
|
42
56
|
authorize! :show, @order, order_token
|
43
|
-
method = "before_#{@order.state}"
|
44
|
-
send(method) if respond_to?(method, true)
|
45
57
|
respond_with(@order)
|
46
58
|
end
|
47
59
|
|
@@ -62,7 +74,7 @@ module Spree
|
|
62
74
|
|
63
75
|
def mine
|
64
76
|
if current_api_user.persisted?
|
65
|
-
@orders = current_api_user.orders.ransack(params[:q]).result.page(params[:page]).per(params[:per_page])
|
77
|
+
@orders = current_api_user.orders.reverse_chronological.ransack(params[:q]).result.page(params[:page]).per(params[:per_page])
|
66
78
|
else
|
67
79
|
render "spree/api/errors/unauthorized", status: :unauthorized
|
68
80
|
end
|
@@ -80,50 +92,25 @@ module Spree
|
|
80
92
|
private
|
81
93
|
def order_params
|
82
94
|
if params[:order]
|
83
|
-
|
84
|
-
params[:order][:shipments_attributes] = params[:order][:shipments] if params[:order][:shipments]
|
85
|
-
params[:order][:line_items_attributes] = params[:order][:line_items] if params[:order][:line_items]
|
86
|
-
params[:order][:ship_address_attributes] = params[:order][:ship_address] if params[:order][:ship_address]
|
87
|
-
params[:order][:bill_address_attributes] = params[:order][:bill_address] if params[:order][:bill_address]
|
88
|
-
|
95
|
+
normalize_params
|
89
96
|
params.require(:order).permit(permitted_order_attributes)
|
90
97
|
else
|
91
98
|
{}
|
92
99
|
end
|
93
100
|
end
|
94
101
|
|
95
|
-
def
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
end
|
102
|
-
|
103
|
-
def permitted_shipment_attributes
|
104
|
-
if current_api_user.has_spree_role? "admin"
|
105
|
-
super << admin_shipment_attributes
|
106
|
-
else
|
107
|
-
super
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def admin_shipment_attributes
|
112
|
-
[:shipping_method, :stock_location, :inventory_units => [:variant_id, :sku]]
|
113
|
-
end
|
114
|
-
|
115
|
-
def admin_order_attributes
|
116
|
-
[:import, :number, :completed_at, :locked_at, :channel]
|
102
|
+
def normalize_params
|
103
|
+
params[:order][:payments_attributes] = params[:order].delete(:payments) if params[:order][:payments]
|
104
|
+
params[:order][:shipments_attributes] = params[:order].delete(:shipments) if params[:order][:shipments]
|
105
|
+
params[:order][:line_items_attributes] = params[:order].delete(:line_items) if params[:order][:line_items]
|
106
|
+
params[:order][:ship_address_attributes] = params[:order].delete(:ship_address) if params[:order][:ship_address]
|
107
|
+
params[:order][:bill_address_attributes] = params[:order].delete(:bill_address) if params[:order][:bill_address]
|
117
108
|
end
|
118
109
|
|
119
110
|
def find_order(lock = false)
|
120
111
|
@order = Spree::Order.lock(lock).find_by!(number: params[:id])
|
121
112
|
end
|
122
113
|
|
123
|
-
def before_delivery
|
124
|
-
@order.create_proposed_shipments
|
125
|
-
end
|
126
|
-
|
127
114
|
def order_id
|
128
115
|
super || params[:id]
|
129
116
|
end
|
@@ -11,7 +11,7 @@ module Spree
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def new
|
14
|
-
@payment_methods = Spree::PaymentMethod.
|
14
|
+
@payment_methods = Spree::PaymentMethod.available
|
15
15
|
respond_with(@payment_method)
|
16
16
|
end
|
17
17
|
|
@@ -76,14 +76,8 @@ module Spree
|
|
76
76
|
|
77
77
|
def perform_payment_action(action, *args)
|
78
78
|
authorize! action, Payment
|
79
|
-
|
80
|
-
|
81
|
-
@payment.send("#{action}!", *args)
|
82
|
-
respond_with(@payment, :default_template => :show)
|
83
|
-
rescue Spree::Core::GatewayError => e
|
84
|
-
@error = e.message
|
85
|
-
render 'spree/api/errors/gateway_error', status: 422
|
86
|
-
end
|
79
|
+
@payment.send("#{action}!", *args)
|
80
|
+
respond_with(@payment, default_template: :show)
|
87
81
|
end
|
88
82
|
|
89
83
|
def payment_params
|
@@ -12,6 +12,7 @@ module Spree
|
|
12
12
|
@products = @products.distinct.page(params[:page]).per(params[:per_page])
|
13
13
|
expires_in 15.minutes, :public => true
|
14
14
|
headers['Surrogate-Control'] = "max-age=#{15.minutes}"
|
15
|
+
respond_with(@products)
|
15
16
|
end
|
16
17
|
|
17
18
|
def show
|
@@ -19,6 +20,7 @@ module Spree
|
|
19
20
|
expires_in 15.minutes, :public => true
|
20
21
|
headers['Surrogate-Control'] = "max-age=#{15.minutes}"
|
21
22
|
headers['Surrogate-Key'] = "product_id=1"
|
23
|
+
respond_with(@product)
|
22
24
|
end
|
23
25
|
|
24
26
|
# Takes besides the products attributes either an array of variants or
|
@@ -8,12 +8,10 @@ module Spree
|
|
8
8
|
@order = Spree::Order.find_by!(number: params[:shipment][:order_id])
|
9
9
|
authorize! :read, @order
|
10
10
|
authorize! :create, Shipment
|
11
|
-
variant = Spree::Variant.find(params[:variant_id])
|
12
11
|
quantity = params[:quantity].to_i
|
13
12
|
@shipment = @order.shipments.create(stock_location_id: params[:stock_location_id])
|
14
13
|
@order.contents.add(variant, quantity, nil, @shipment)
|
15
14
|
|
16
|
-
@shipment.refresh_rates
|
17
15
|
@shipment.save!
|
18
16
|
|
19
17
|
respond_with(@shipment.reload, default_template: :show)
|
@@ -45,7 +43,6 @@ module Spree
|
|
45
43
|
end
|
46
44
|
|
47
45
|
def add
|
48
|
-
variant = Spree::Variant.find(params[:variant_id])
|
49
46
|
quantity = params[:quantity].to_i
|
50
47
|
|
51
48
|
@shipment.order.contents.add(variant, quantity, nil, @shipment)
|
@@ -54,7 +51,6 @@ module Spree
|
|
54
51
|
end
|
55
52
|
|
56
53
|
def remove
|
57
|
-
variant = Spree::Variant.find(params[:variant_id])
|
58
54
|
quantity = params[:quantity].to_i
|
59
55
|
|
60
56
|
@shipment.order.contents.remove(variant, quantity, @shipment)
|
@@ -77,6 +73,10 @@ module Spree
|
|
77
73
|
{}
|
78
74
|
end
|
79
75
|
end
|
76
|
+
|
77
|
+
def variant
|
78
|
+
@variant ||= Spree::Variant.unscoped.find(params.fetch(:variant_id))
|
79
|
+
end
|
80
80
|
end
|
81
81
|
end
|
82
82
|
end
|
@@ -46,8 +46,11 @@ module Spree
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def user_params
|
49
|
-
params.require(:user).permit(
|
49
|
+
params.require(:user).permit(PermittedAttributes.user_attributes |
|
50
|
+
[bill_address_attributes: PermittedAttributes.address_attributes,
|
51
|
+
ship_address_attributes: PermittedAttributes.address_attributes])
|
50
52
|
end
|
53
|
+
|
51
54
|
end
|
52
55
|
end
|
53
56
|
end
|
@@ -1,2 +1,2 @@
|
|
1
1
|
object false
|
2
|
-
node(:error) { I18n.t(:gateway_error, :
|
2
|
+
node(:error) { I18n.t(:gateway_error, scope: "spree.api", text: @error) }
|
@@ -26,6 +26,11 @@ child :payments => :payments do
|
|
26
26
|
|
27
27
|
child :source => :source do
|
28
28
|
attributes *payment_source_attributes
|
29
|
+
if @current_user_roles.include?('admin')
|
30
|
+
attributes *payment_source_attributes.concat([:gateway_customer_profile_id, :gateway_payment_profile_id])
|
31
|
+
else
|
32
|
+
attributes *payment_source_attributes
|
33
|
+
end
|
29
34
|
end
|
30
35
|
end
|
31
36
|
|
@@ -40,4 +45,4 @@ end
|
|
40
45
|
# Necessary for backend's order interface
|
41
46
|
node :permissions do
|
42
47
|
{ can_update: current_ability.can?(:update, root_object) }
|
43
|
-
end
|
48
|
+
end
|
data/config/routes.rb
CHANGED
@@ -92,7 +92,11 @@ Spree::Core::Engine.add_routes do
|
|
92
92
|
resources :taxons, only: [:index]
|
93
93
|
|
94
94
|
resources :inventory_units, only: [:show, :update]
|
95
|
-
|
95
|
+
|
96
|
+
resources :users do
|
97
|
+
resources :credit_cards, only: [:index]
|
98
|
+
end
|
99
|
+
|
96
100
|
resources :properties
|
97
101
|
resources :stock_locations do
|
98
102
|
resources :stock_movements
|
@@ -10,8 +10,9 @@ describe Spree::Api::BaseController do
|
|
10
10
|
|
11
11
|
context "signed in as a user using an authentication extension" do
|
12
12
|
before do
|
13
|
-
|
14
|
-
|
13
|
+
user = double(:email => "spree@example.com")
|
14
|
+
user.stub_chain :spree_roles, pluck: []
|
15
|
+
controller.stub :try_spree_current_user => user
|
15
16
|
end
|
16
17
|
|
17
18
|
it "can make a request" do
|
@@ -66,12 +67,13 @@ describe Spree::Api::BaseController do
|
|
66
67
|
|
67
68
|
it 'handles exceptions' do
|
68
69
|
subject.should_receive(:authenticate_user).and_return(true)
|
70
|
+
subject.should_receive(:load_user_roles).and_return(true)
|
69
71
|
subject.should_receive(:index).and_raise(Exception.new("no joy"))
|
70
72
|
get :index, :token => "fake_key"
|
71
73
|
json_response.should == { "exception" => "no joy" }
|
72
74
|
end
|
73
75
|
|
74
|
-
it "maps
|
76
|
+
it "maps semantic keys to nested_attributes keys" do
|
75
77
|
klass = double(:nested_attributes_options => { :line_items => {},
|
76
78
|
:bill_address => {} })
|
77
79
|
attributes = { 'line_items' => { :id => 1 },
|
@@ -82,4 +84,8 @@ describe Spree::Api::BaseController do
|
|
82
84
|
mapped.has_key?('line_items_attributes').should be_true
|
83
85
|
mapped.has_key?('name').should be_true
|
84
86
|
end
|
87
|
+
|
88
|
+
it "lets a subclass override the product associations that are eager-loaded" do
|
89
|
+
controller.respond_to?(:product_includes, true).should be
|
90
|
+
end
|
85
91
|
end
|
@@ -186,6 +186,17 @@ module Spree
|
|
186
186
|
cc_errors.should include("Verification Value can't be blank")
|
187
187
|
end
|
188
188
|
|
189
|
+
it "allow users to reuse a credit card" do
|
190
|
+
order.update_column(:state, "payment")
|
191
|
+
credit_card = create(:credit_card, user_id: order.user_id, payment_method_id: @payment_method.id)
|
192
|
+
|
193
|
+
api_put :update, :id => order.to_param, :order_token => order.guest_token,
|
194
|
+
:order => { :existing_card => credit_card.id }
|
195
|
+
|
196
|
+
expect(response.status).to eq 200
|
197
|
+
expect(order.credit_cards).to match_array [credit_card]
|
198
|
+
end
|
199
|
+
|
189
200
|
it "can transition from confirm to complete" do
|
190
201
|
order.update_column(:state, "confirm")
|
191
202
|
Spree::Order.any_instance.stub(:payment_required? => false)
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
describe Api::CreditCardsController do
|
5
|
+
render_views
|
6
|
+
|
7
|
+
let!(:admin_user) do
|
8
|
+
user = Spree.user_class.new(:email => "spree@example.com", :id => 1)
|
9
|
+
user.generate_spree_api_key!
|
10
|
+
user.stub(:has_spree_role?).with('admin').and_return(true)
|
11
|
+
user
|
12
|
+
end
|
13
|
+
|
14
|
+
let!(:normal_user) do
|
15
|
+
user = Spree.user_class.new(:email => "spree2@example.com", :id => 2)
|
16
|
+
user.generate_spree_api_key!
|
17
|
+
user
|
18
|
+
end
|
19
|
+
|
20
|
+
let!(:card) { create(:credit_card, :user_id => admin_user.id, gateway_customer_profile_id: "random") }
|
21
|
+
|
22
|
+
before do
|
23
|
+
stub_authentication!
|
24
|
+
end
|
25
|
+
|
26
|
+
it "the user id doesn't exist" do
|
27
|
+
api_get :index, user_id: 1000
|
28
|
+
response.status.should == 404
|
29
|
+
end
|
30
|
+
|
31
|
+
context "calling user is in admin role" do
|
32
|
+
let(:current_api_user) do
|
33
|
+
user = admin_user
|
34
|
+
user
|
35
|
+
end
|
36
|
+
|
37
|
+
it "no credit cards exist for user" do
|
38
|
+
api_get :index, user_id: normal_user.id
|
39
|
+
|
40
|
+
response.status.should == 200
|
41
|
+
json_response["pages"].should == 0
|
42
|
+
end
|
43
|
+
|
44
|
+
it "can view all credit cards for user" do
|
45
|
+
api_get :index, user_id: current_api_user.id
|
46
|
+
|
47
|
+
response.status.should == 200
|
48
|
+
json_response["pages"].should == 1
|
49
|
+
json_response["current_page"].should == 1
|
50
|
+
json_response["credit_cards"].length.should == 1
|
51
|
+
json_response["credit_cards"].first["id"].should == card.id
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "calling user is not in admin role" do
|
56
|
+
let(:current_api_user) do
|
57
|
+
user = normal_user
|
58
|
+
user
|
59
|
+
end
|
60
|
+
|
61
|
+
let!(:card) { create(:credit_card, :user_id => normal_user.id, gateway_customer_profile_id: "random") }
|
62
|
+
|
63
|
+
it "can not view user" do
|
64
|
+
api_get :index, user_id: admin_user.id
|
65
|
+
|
66
|
+
response.status.should == 404
|
67
|
+
end
|
68
|
+
|
69
|
+
it "can view own credit cards" do
|
70
|
+
api_get :index, user_id: normal_user.id
|
71
|
+
|
72
|
+
response.status.should == 200
|
73
|
+
json_response["pages"].should == 1
|
74
|
+
json_response["current_page"].should == 1
|
75
|
+
json_response["credit_cards"].length.should == 1
|
76
|
+
json_response["credit_cards"].first["id"].should == card.id
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -42,11 +42,10 @@ module Spree
|
|
42
42
|
end
|
43
43
|
|
44
44
|
context "the current api user is not persisted" do
|
45
|
-
let(:current_api_user) {
|
45
|
+
let(:current_api_user) { Spree.user_class.new }
|
46
46
|
|
47
47
|
it "returns a 401" do
|
48
48
|
api_get :mine
|
49
|
-
|
50
49
|
response.status.should == 401
|
51
50
|
end
|
52
51
|
end
|
@@ -73,6 +72,18 @@ module Spree
|
|
73
72
|
response.status.should == 200
|
74
73
|
json_response["orders"].length.should == 0
|
75
74
|
end
|
75
|
+
|
76
|
+
it "returns orders in reverse chronological order" do
|
77
|
+
order2 = create(:order, line_items: [line_item], user: order.user)
|
78
|
+
order2.created_at.should > order.created_at
|
79
|
+
|
80
|
+
api_get :mine
|
81
|
+
response.status.should == 200
|
82
|
+
json_response["pages"].should == 1
|
83
|
+
json_response["orders"].length.should == 2
|
84
|
+
json_response["orders"][0]["number"].should == order2.number
|
85
|
+
json_response["orders"][1]["number"].should == order.number
|
86
|
+
end
|
76
87
|
end
|
77
88
|
|
78
89
|
it "can view their own order" do
|
@@ -120,6 +131,7 @@ module Spree
|
|
120
131
|
|
121
132
|
it "can view an order" do
|
122
133
|
user = mock_model(Spree::LegacyUser)
|
134
|
+
user.stub_chain(:spree_roles, :pluck).and_return(["bar"])
|
123
135
|
user.stub(:has_spree_role?).with('bar').and_return(true)
|
124
136
|
user.stub(:has_spree_role?).with('admin').and_return(false)
|
125
137
|
controller.stub try_spree_current_user: user
|
@@ -195,11 +207,15 @@ module Spree
|
|
195
207
|
end
|
196
208
|
|
197
209
|
context "admin user imports order" do
|
198
|
-
before
|
210
|
+
before do
|
211
|
+
current_api_user.stub has_spree_role?: true
|
212
|
+
current_api_user.stub_chain :spree_roles, pluck: ["admin"]
|
213
|
+
end
|
199
214
|
|
200
|
-
it "
|
201
|
-
api_post :create, :order => {
|
202
|
-
expect(
|
215
|
+
it "is able to set any default unpermitted attribute" do
|
216
|
+
api_post :create, :order => { number: "WOW" }
|
217
|
+
expect(response.status).to eq 201
|
218
|
+
expect(json_response['number']).to eq "WOW"
|
203
219
|
end
|
204
220
|
end
|
205
221
|
|
@@ -414,7 +430,7 @@ module Spree
|
|
414
430
|
adjustment['amount'].should == "5.0"
|
415
431
|
end
|
416
432
|
|
417
|
-
it "lists payments source" do
|
433
|
+
it "lists payments source without gateway info" do
|
418
434
|
order.payments.push payment = create(:payment)
|
419
435
|
api_get :show, :id => order.to_param
|
420
436
|
|
@@ -424,6 +440,8 @@ module Spree
|
|
424
440
|
expect(source[:last_digits]).to eq payment.source.last_digits
|
425
441
|
expect(source[:month].to_i).to eq payment.source.month
|
426
442
|
expect(source[:year].to_i).to eq payment.source.year
|
443
|
+
expect(source.has_key?(:gateway_customer_profile_id)).to be false
|
444
|
+
expect(source.has_key?(:gateway_payment_profile_id)).to be false
|
427
445
|
end
|
428
446
|
|
429
447
|
context "when in delivery" do
|
@@ -435,8 +453,9 @@ module Spree
|
|
435
453
|
end
|
436
454
|
|
437
455
|
before do
|
456
|
+
order.bill_address = FactoryGirl.create(:address)
|
438
457
|
order.ship_address = FactoryGirl.create(:address)
|
439
|
-
order.
|
458
|
+
order.next!
|
440
459
|
order.save
|
441
460
|
end
|
442
461
|
|
@@ -520,6 +539,20 @@ module Spree
|
|
520
539
|
after { ActionController::Base.perform_caching = false }
|
521
540
|
end
|
522
541
|
|
542
|
+
it "lists payments source with gateway info" do
|
543
|
+
order.payments.push payment = create(:payment)
|
544
|
+
api_get :show, :id => order.to_param
|
545
|
+
|
546
|
+
source = json_response[:payments].first[:source]
|
547
|
+
expect(source[:name]).to eq payment.source.name
|
548
|
+
expect(source[:cc_type]).to eq payment.source.cc_type
|
549
|
+
expect(source[:last_digits]).to eq payment.source.last_digits
|
550
|
+
expect(source[:month].to_i).to eq payment.source.month
|
551
|
+
expect(source[:year].to_i).to eq payment.source.year
|
552
|
+
expect(source[:gateway_customer_profile_id]).to eq payment.source.gateway_customer_profile_id
|
553
|
+
expect(source[:gateway_payment_profile_id]).to eq payment.source.gateway_payment_profile_id
|
554
|
+
end
|
555
|
+
|
523
556
|
context "with two orders" do
|
524
557
|
before { create(:order) }
|
525
558
|
|
@@ -562,6 +595,13 @@ module Spree
|
|
562
595
|
end
|
563
596
|
|
564
597
|
context "creation" do
|
598
|
+
it "can create an order without any parameters" do
|
599
|
+
lambda { api_post :create }.should_not raise_error
|
600
|
+
response.status.should == 201
|
601
|
+
order = Order.last
|
602
|
+
json_response["state"].should == "cart"
|
603
|
+
end
|
604
|
+
|
565
605
|
it "can arbitrarily set the line items price" do
|
566
606
|
api_post :create, :order => {
|
567
607
|
:line_items => {
|
@@ -570,10 +610,16 @@ module Spree
|
|
570
610
|
}
|
571
611
|
}
|
572
612
|
}
|
573
|
-
|
574
613
|
expect(response.status).to eq 201
|
575
614
|
expect(Order.last.line_items.first.price.to_f).to eq(33.0)
|
576
615
|
end
|
616
|
+
|
617
|
+
it "can set the user_id for the order" do
|
618
|
+
user = Spree.user_class.create
|
619
|
+
api_post :create, :order => { user_id: user.id }
|
620
|
+
expect(response.status).to eq 201
|
621
|
+
json_response["user_id"].should == user.id
|
622
|
+
end
|
577
623
|
end
|
578
624
|
|
579
625
|
context "updating" do
|
@@ -140,7 +140,8 @@ module Spree
|
|
140
140
|
|
141
141
|
it "returns a 422 status" do
|
142
142
|
response.status.should == 422
|
143
|
-
json_response["error"].
|
143
|
+
expect(json_response["error"]).to eq "Invalid resource. Please fix errors and try again."
|
144
|
+
expect(json_response["errors"]["base"][0]).to eq "Could not authorize card"
|
144
145
|
end
|
145
146
|
|
146
147
|
it "does not raise a stack level error" do
|
@@ -166,7 +167,8 @@ module Spree
|
|
166
167
|
it "returns a 422 status" do
|
167
168
|
api_put :capture, :id => payment.to_param
|
168
169
|
response.status.should == 422
|
169
|
-
json_response["error"].
|
170
|
+
expect(json_response["error"]).to eq "Invalid resource. Please fix errors and try again."
|
171
|
+
expect(json_response["errors"]["base"][0]).to eq "Insufficient funds"
|
170
172
|
end
|
171
173
|
end
|
172
174
|
end
|
@@ -187,30 +189,31 @@ module Spree
|
|
187
189
|
it "returns a 422 status" do
|
188
190
|
api_put :purchase, :id => payment.to_param
|
189
191
|
response.status.should == 422
|
190
|
-
json_response["error"].
|
192
|
+
expect(json_response["error"]).to eq "Invalid resource. Please fix errors and try again."
|
193
|
+
expect(json_response["errors"]["base"][0]).to eq "Insufficient funds"
|
191
194
|
end
|
192
195
|
end
|
193
196
|
end
|
194
197
|
|
195
198
|
context "voiding" do
|
196
199
|
it "can void" do
|
197
|
-
api_put :void, :
|
198
|
-
response.status.
|
199
|
-
payment.reload.state.
|
200
|
+
api_put :void, id: payment.to_param
|
201
|
+
expect(response.status).to eq 200
|
202
|
+
expect(payment.reload.state).to eq "void"
|
200
203
|
end
|
201
204
|
|
202
205
|
context "voiding fails" do
|
203
206
|
before do
|
204
|
-
fake_response = double(
|
207
|
+
fake_response = double(success?: false, to_s: "NO REFUNDS")
|
205
208
|
Spree::Gateway::Bogus.any_instance.should_receive(:void).and_return(fake_response)
|
206
209
|
end
|
207
210
|
|
208
211
|
it "returns a 422 status" do
|
209
|
-
api_put :void, :
|
210
|
-
response.status.
|
211
|
-
json_response["error"].
|
212
|
-
|
213
|
-
payment.reload.state.
|
212
|
+
api_put :void, id: payment.to_param
|
213
|
+
expect(response.status).to eq 422
|
214
|
+
expect(json_response["error"]).to eq "Invalid resource. Please fix errors and try again."
|
215
|
+
expect(json_response["errors"]["base"][0]).to eq "NO REFUNDS"
|
216
|
+
expect(payment.reload.state).to eq "checkout"
|
214
217
|
end
|
215
218
|
end
|
216
219
|
end
|
@@ -236,7 +239,8 @@ module Spree
|
|
236
239
|
Spree::Gateway::Bogus.any_instance.should_receive(:credit).and_return(fake_response)
|
237
240
|
api_put :credit, :id => payment.to_param
|
238
241
|
response.status.should == 422
|
239
|
-
json_response["error"].
|
242
|
+
expect(json_response["error"]).to eq "Invalid resource. Please fix errors and try again."
|
243
|
+
expect(json_response["errors"]["base"][0]).to eq "NO CREDIT FOR YOU"
|
240
244
|
end
|
241
245
|
|
242
246
|
it "cannot credit over credit_allowed limit" do
|
@@ -6,7 +6,7 @@ module Spree
|
|
6
6
|
render_views
|
7
7
|
|
8
8
|
let!(:product) { create(:product) }
|
9
|
-
let!(:inactive_product) { create(:product, :
|
9
|
+
let!(:inactive_product) { create(:product, available_on: Time.now.tomorrow, name: "inactive") }
|
10
10
|
let(:base_attributes) { Api::ApiHelpers.product_attributes }
|
11
11
|
let(:show_attributes) { base_attributes.dup.push(:has_variants) }
|
12
12
|
let(:new_attributes) { base_attributes }
|
@@ -67,6 +67,34 @@ module Spree
|
|
67
67
|
json_response["per_page"].should == 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
|
+
it "uses the specified custom template through the request header" do
|
81
|
+
request.headers['X-Spree-Template'] = 'show'
|
82
|
+
api_get :custom_show, :id => product.id
|
83
|
+
response.should render_template('spree/api/products/show')
|
84
|
+
end
|
85
|
+
|
86
|
+
it "uses the specified custom template through the template URL parameter" do
|
87
|
+
api_get :custom_show, :id => product.id, :template => 'show'
|
88
|
+
response.should render_template('spree/api/products/show')
|
89
|
+
end
|
90
|
+
|
91
|
+
it "falls back to the default template if the specified template does not exist" do
|
92
|
+
request.headers['X-Spree-Template'] = 'invoice'
|
93
|
+
api_get :show, :id => product.id
|
94
|
+
response.should render_template('spree/api/products/show')
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
70
98
|
context "product has more than one price" do
|
71
99
|
before { product.master.prices.create currency: "EUR", amount: 22 }
|
72
100
|
|
@@ -360,7 +388,7 @@ module Spree
|
|
360
388
|
end
|
361
389
|
|
362
390
|
it "can create new variants on a product" do
|
363
|
-
api_put :update, :id => product.to_param, :product => { :variants => [attributes_for_variant, attributes_for_variant] }
|
391
|
+
api_put :update, :id => product.to_param, :product => { :variants => [attributes_for_variant, attributes_for_variant.merge(sku: "ABC-#{Kernel.rand(9999)}")] }
|
364
392
|
expect(response.status).to eq 200
|
365
393
|
expect(json_response['variants'].count).to eq(2) # 2 variants
|
366
394
|
|
@@ -84,7 +84,16 @@ describe Spree::Api::ShipmentsController do
|
|
84
84
|
api_put :remove, { variant_id: variant.to_param, quantity: 1 }
|
85
85
|
response.status.should == 200
|
86
86
|
json_response['manifest'].detect { |h| h['variant']['id'] == variant.id }["quantity"].should == 1
|
87
|
-
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'removes a destroyed variant from a shipment' do
|
90
|
+
order.contents.add(variant, 2)
|
91
|
+
variant.destroy
|
92
|
+
|
93
|
+
api_put :remove, { variant_id: variant.to_param, quantity: 1 }
|
94
|
+
response.status.should == 200
|
95
|
+
json_response['manifest'].detect { |h| h['variant']['id'] == variant.id }["quantity"].should == 1
|
96
|
+
end
|
88
97
|
end
|
89
98
|
|
90
99
|
context "can transition a shipment from ready to ship" do
|
@@ -55,7 +55,7 @@ module Spree
|
|
55
55
|
it 'cannot list of stock items' do
|
56
56
|
api_get :index, stock_location_id: stock_location.to_param
|
57
57
|
json_response['stock_items'].first.should have_attributes(attributes)
|
58
|
-
json_response['stock_items'].first['variant']['sku'].should
|
58
|
+
json_response['stock_items'].first['variant']['sku'].should include 'ABC'
|
59
59
|
end
|
60
60
|
|
61
61
|
it 'requires a stock_location_id to be passed as a parameter' do
|
@@ -139,4 +139,3 @@ module Spree
|
|
139
139
|
end
|
140
140
|
end
|
141
141
|
end
|
142
|
-
|
@@ -46,8 +46,33 @@ module Spree
|
|
46
46
|
end
|
47
47
|
|
48
48
|
it "can update own details" do
|
49
|
-
|
50
|
-
|
49
|
+
country = create(:country)
|
50
|
+
api_put :update, id: user.id, user: {
|
51
|
+
email: "mine@example.com",
|
52
|
+
bill_address_attributes: {
|
53
|
+
first_name: 'First',
|
54
|
+
last_name: 'Last',
|
55
|
+
address1: '1 Test Rd',
|
56
|
+
city: 'City',
|
57
|
+
country_id: country.id,
|
58
|
+
state_id: 1,
|
59
|
+
zipcode: '55555',
|
60
|
+
phone: '5555555555'
|
61
|
+
},
|
62
|
+
ship_address_attributes: {
|
63
|
+
first_name: 'First',
|
64
|
+
last_name: 'Last',
|
65
|
+
address1: '1 Test Rd',
|
66
|
+
city: 'City',
|
67
|
+
country_id: country.id,
|
68
|
+
state_id: 1,
|
69
|
+
zipcode: '55555',
|
70
|
+
phone: '5555555555'
|
71
|
+
}
|
72
|
+
}
|
73
|
+
expect(json_response['email']).to eq 'mine@example.com'
|
74
|
+
expect(json_response['bill_address']).to_not be_nil
|
75
|
+
expect(json_response['ship_address']).to_not be_nil
|
51
76
|
end
|
52
77
|
|
53
78
|
it "cannot update other users details" do
|
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.3.
|
4
|
+
version: 2.3.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: 2014-
|
11
|
+
date: 2014-08-29 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.3.
|
19
|
+
version: 2.3.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.3.
|
26
|
+
version: 2.3.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rabl
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,6 +70,7 @@ files:
|
|
70
70
|
- app/controllers/spree/api/classifications_controller.rb
|
71
71
|
- app/controllers/spree/api/config_controller.rb
|
72
72
|
- app/controllers/spree/api/countries_controller.rb
|
73
|
+
- app/controllers/spree/api/credit_cards_controller.rb
|
73
74
|
- app/controllers/spree/api/images_controller.rb
|
74
75
|
- app/controllers/spree/api/inventory_units_controller.rb
|
75
76
|
- app/controllers/spree/api/line_items_controller.rb
|
@@ -100,6 +101,7 @@ files:
|
|
100
101
|
- app/views/spree/api/config/show.v1.rabl
|
101
102
|
- app/views/spree/api/countries/index.v1.rabl
|
102
103
|
- app/views/spree/api/countries/show.v1.rabl
|
104
|
+
- app/views/spree/api/credit_cards/index.v1.rabl
|
103
105
|
- app/views/spree/api/credit_cards/show.v1.rabl
|
104
106
|
- app/views/spree/api/errors/gateway_error.v1.rabl
|
105
107
|
- app/views/spree/api/errors/invalid_api_key.v1.rabl
|
@@ -202,6 +204,7 @@ files:
|
|
202
204
|
- spec/controllers/spree/api/classifications_controller_spec.rb
|
203
205
|
- spec/controllers/spree/api/config_controller_spec.rb
|
204
206
|
- spec/controllers/spree/api/countries_controller_spec.rb
|
207
|
+
- spec/controllers/spree/api/credit_cards_controller_spec.rb
|
205
208
|
- spec/controllers/spree/api/images_controller_spec.rb
|
206
209
|
- spec/controllers/spree/api/inventory_units_controller_spec.rb
|
207
210
|
- spec/controllers/spree/api/line_items_controller_spec.rb
|
@@ -264,6 +267,7 @@ test_files:
|
|
264
267
|
- spec/controllers/spree/api/classifications_controller_spec.rb
|
265
268
|
- spec/controllers/spree/api/config_controller_spec.rb
|
266
269
|
- spec/controllers/spree/api/countries_controller_spec.rb
|
270
|
+
- spec/controllers/spree/api/credit_cards_controller_spec.rb
|
267
271
|
- spec/controllers/spree/api/images_controller_spec.rb
|
268
272
|
- spec/controllers/spree/api/inventory_units_controller_spec.rb
|
269
273
|
- spec/controllers/spree/api/line_items_controller_spec.rb
|