solidus_api 1.0.7 → 1.1.0.beta1
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/address_books_controller.rb +38 -0
- data/app/controllers/spree/api/addresses_controller.rb +19 -15
- data/app/controllers/spree/api/base_controller.rb +7 -28
- data/app/controllers/spree/api/checkouts_controller.rb +17 -8
- data/app/controllers/spree/api/option_values_controller.rb +1 -1
- data/app/controllers/spree/api/orders_controller.rb +13 -18
- data/app/controllers/spree/api/payments_controller.rb +0 -1
- data/app/controllers/spree/api/resource_controller.rb +75 -0
- data/app/controllers/spree/api/shipments_controller.rb +1 -0
- data/app/controllers/spree/api/stock_items_controller.rb +1 -3
- data/app/controllers/spree/api/stock_transfers_controller.rb +1 -0
- data/app/controllers/spree/api/users_controller.rb +13 -49
- data/app/controllers/spree/api/zones_controller.rb +7 -3
- data/app/helpers/spree/api/api_helpers.rb +9 -4
- data/app/views/spree/api/address_books/show.v1.rabl +4 -0
- data/app/views/spree/api/orders/show.v1.rabl +2 -2
- data/app/views/spree/api/variants/big.v1.rabl +3 -0
- data/config/locales/en.yml +0 -1
- data/config/routes.rb +3 -0
- data/lib/spree/api/testing_support/helpers.rb +1 -1
- data/lib/spree/api/testing_support/setup.rb +1 -4
- data/spec/controllers/spree/api/address_books_controller_spec.rb +60 -0
- data/spec/controllers/spree/api/addresses_controller_spec.rb +22 -9
- data/spec/controllers/spree/api/base_controller_spec.rb +0 -12
- data/spec/controllers/spree/api/checkouts_controller_spec.rb +107 -45
- data/spec/controllers/spree/api/credit_cards_controller_spec.rb +4 -11
- data/spec/controllers/spree/api/orders_controller_spec.rb +75 -105
- data/spec/controllers/spree/api/payments_controller_spec.rb +0 -11
- data/spec/controllers/spree/api/products_controller_spec.rb +2 -2
- data/spec/controllers/spree/api/resource_controller_spec.rb +157 -0
- data/spec/controllers/spree/api/shipments_controller_spec.rb +12 -13
- data/spec/controllers/spree/api/stock_items_controller_spec.rb +2 -2
- data/spec/controllers/spree/api/users_controller_spec.rb +2 -2
- data/spec/controllers/spree/api/variants_controller_spec.rb +32 -3
- data/spec/models/spree/legacy_user_spec.rb +8 -2
- data/spec/spec_helper.rb +8 -3
- data/spec/test_views/spree/api/widgets/index.v1.rabl +7 -0
- data/spec/test_views/spree/api/widgets/new.v1.rabl +2 -0
- data/spec/test_views/spree/api/widgets/show.v1.rabl +2 -0
- metadata +20 -9
- data/CHANGELOG.md +0 -1
- data/app/views/spree/api/shared/stock_location_required.v1.rabl +0 -2
@@ -6,16 +6,11 @@ module Spree
|
|
6
6
|
render_views
|
7
7
|
|
8
8
|
let!(:admin_user) do
|
9
|
-
|
10
|
-
user.generate_spree_api_key!
|
11
|
-
allow(user).to receive(:has_spree_role?).with('admin').and_return(true)
|
12
|
-
user
|
9
|
+
create(:admin_user)
|
13
10
|
end
|
14
11
|
|
15
12
|
let!(:normal_user) do
|
16
|
-
|
17
|
-
user.generate_spree_api_key!
|
18
|
-
user
|
13
|
+
create(:user, :with_api_key)
|
19
14
|
end
|
20
15
|
|
21
16
|
let!(:card) { create(:credit_card, :user_id => admin_user.id, gateway_customer_profile_id: "random") }
|
@@ -31,8 +26,7 @@ module Spree
|
|
31
26
|
|
32
27
|
context "calling user is in admin role" do
|
33
28
|
let(:current_api_user) do
|
34
|
-
|
35
|
-
user
|
29
|
+
admin_user
|
36
30
|
end
|
37
31
|
|
38
32
|
it "no credit cards exist for user" do
|
@@ -55,8 +49,7 @@ module Spree
|
|
55
49
|
|
56
50
|
context "calling user is not in admin role" do
|
57
51
|
let(:current_api_user) do
|
58
|
-
|
59
|
-
user
|
52
|
+
normal_user
|
60
53
|
end
|
61
54
|
|
62
55
|
let!(:card) { create(:credit_card, :user_id => normal_user.id, gateway_customer_profile_id: "random") }
|
@@ -29,49 +29,49 @@ module Spree
|
|
29
29
|
|
30
30
|
describe "POST create" do
|
31
31
|
let(:target_user) { create :user }
|
32
|
-
let(:date_override) {
|
33
|
-
let(:attributes) { { user_id: target_user.id, created_at: date_override, email: target_user.email } }
|
32
|
+
let(:date_override) { 3.days.ago }
|
34
33
|
|
35
|
-
|
34
|
+
before do
|
35
|
+
allow_any_instance_of(Spree::Ability).to receive(:can?).
|
36
|
+
and_return(true)
|
37
|
+
|
38
|
+
allow_any_instance_of(Spree::Ability).to receive(:can?).
|
39
|
+
with(:admin, Spree::Order).
|
40
|
+
and_return(can_admin)
|
41
|
+
|
42
|
+
allow(Spree.user_class).to receive(:find).
|
43
|
+
with(target_user.id).
|
44
|
+
and_return(target_user)
|
45
|
+
end
|
46
|
+
|
47
|
+
subject { api_post :create, order: { user_id: target_user.id, created_at: date_override, email: target_user.email } }
|
36
48
|
|
37
49
|
context "when the current user cannot administrate the order" do
|
38
|
-
|
39
|
-
can :create, Spree::Order
|
40
|
-
end
|
50
|
+
let(:can_admin) { false }
|
41
51
|
|
42
52
|
it "does not include unpermitted params, or allow overriding the user", focus: true do
|
53
|
+
expect(Spree::Core::Importer::Order).to receive(:import).
|
54
|
+
once.
|
55
|
+
with(current_api_user, { "email" => target_user.email }).
|
56
|
+
and_call_original
|
43
57
|
subject
|
44
|
-
expect(response).to be_success
|
45
|
-
order = Spree::Order.last
|
46
|
-
expect(order.user).to eq current_api_user
|
47
|
-
expect(order.email).to eq target_user.email
|
48
58
|
end
|
49
59
|
|
50
60
|
it { is_expected.to be_success }
|
61
|
+
end
|
51
62
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
context "with allowed payment method" do
|
56
|
-
let!(:payment_method) { create(:check_payment_method, name: "allowed" ) }
|
57
|
-
it { is_expected.to be_success }
|
58
|
-
it "creates a payment" do
|
59
|
-
expect {
|
60
|
-
subject
|
61
|
-
}.to change { Spree::Payment.count }.by(1)
|
62
|
-
end
|
63
|
-
end
|
63
|
+
context "when the current user can administrate the order" do
|
64
|
+
let(:can_admin) { true }
|
64
65
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
}.not_to change { Spree::Payment.count }
|
72
|
-
end
|
73
|
-
end
|
66
|
+
it "it permits all params and allows overriding the user" do
|
67
|
+
expect(Spree::Core::Importer::Order).to receive(:import).
|
68
|
+
once.
|
69
|
+
with(target_user, { "user_id" => target_user.id, "created_at" => date_override, "email" => target_user.email}).
|
70
|
+
and_call_original
|
71
|
+
subject
|
74
72
|
end
|
73
|
+
|
74
|
+
it { is_expected.to be_success }
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
@@ -81,65 +81,41 @@ module Spree
|
|
81
81
|
let(:can_admin) { false }
|
82
82
|
subject { api_put :update, id: order.to_param, order: order_params }
|
83
83
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
end
|
88
|
-
|
89
|
-
it "updates the user's email" do
|
90
|
-
expect {
|
91
|
-
subject
|
92
|
-
}.to change { order.reload.email }.to("foo@foobar.com")
|
93
|
-
end
|
94
|
-
|
95
|
-
it { is_expected.to be_success }
|
96
|
-
|
97
|
-
it "does not associate users" do
|
98
|
-
expect {
|
99
|
-
subject
|
100
|
-
}.not_to change { order.reload.user }
|
101
|
-
end
|
84
|
+
before do
|
85
|
+
allow_any_instance_of(Spree::Ability).to receive(:can?).
|
86
|
+
and_return(true)
|
102
87
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
}.to_not change{ order.reload.number }
|
107
|
-
end
|
88
|
+
allow(Spree::Order).to receive(:find_by!).
|
89
|
+
with(number: order.number).
|
90
|
+
and_return(order)
|
108
91
|
|
109
|
-
|
110
|
-
|
92
|
+
allow(Spree.user_class).to receive(:find).
|
93
|
+
with(user.id).
|
94
|
+
and_return(user)
|
111
95
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
expect {
|
117
|
-
subject
|
118
|
-
}.to change { Spree::Payment.count }.by(1)
|
119
|
-
end
|
120
|
-
end
|
96
|
+
allow_any_instance_of(Spree::Ability).to receive(:can?).
|
97
|
+
with(:admin, Spree::Order).
|
98
|
+
and_return(can_admin)
|
99
|
+
end
|
121
100
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
subject
|
128
|
-
}.not_to change { Spree::Payment.count }
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
101
|
+
it "updates the cart contents" do
|
102
|
+
expect(order.contents).to receive(:update_cart).
|
103
|
+
once.
|
104
|
+
with({"email" => "foo@foobar.com"})
|
105
|
+
subject
|
132
106
|
end
|
133
107
|
|
108
|
+
it { is_expected.to be_success }
|
109
|
+
|
134
110
|
context "when the user can administer the order" do
|
135
|
-
|
136
|
-
can [:admin, :update], Spree::Order
|
137
|
-
end
|
111
|
+
let(:can_admin) { true }
|
138
112
|
|
139
113
|
it "will associate users" do
|
140
|
-
expect
|
141
|
-
|
142
|
-
|
114
|
+
expect(order).to receive(:associate_user!).
|
115
|
+
once.
|
116
|
+
with(user)
|
117
|
+
|
118
|
+
subject
|
143
119
|
end
|
144
120
|
|
145
121
|
it "updates the otherwise forbidden attributes" do
|
@@ -147,6 +123,17 @@ module Spree
|
|
147
123
|
to("anothernumber")
|
148
124
|
end
|
149
125
|
end
|
126
|
+
|
127
|
+
context "when the user cannot administer the order" do
|
128
|
+
it "does not associate users" do
|
129
|
+
expect(order).to_not receive(:associate_user!)
|
130
|
+
subject
|
131
|
+
end
|
132
|
+
|
133
|
+
it "does not change forbidden attributes" do
|
134
|
+
expect{subject}.to_not change{order.reload.number}
|
135
|
+
end
|
136
|
+
end
|
150
137
|
end
|
151
138
|
|
152
139
|
it "cannot view all orders" do
|
@@ -326,10 +313,7 @@ module Spree
|
|
326
313
|
after { Spree::Ability.remove_ability(::BarAbility) }
|
327
314
|
|
328
315
|
it "can view an order" do
|
329
|
-
user = build(:user)
|
330
|
-
allow(user).to receive_message_chain(:spree_roles, :pluck).and_return(["bar"])
|
331
|
-
allow(user).to receive(:has_spree_role?).with('bar').and_return(true)
|
332
|
-
allow(user).to receive(:has_spree_role?).with('admin').and_return(false)
|
316
|
+
user = build(:user, spree_roles: [Spree::Role.new(name: 'bar')])
|
333
317
|
allow(Spree.user_class).to receive_messages find_by: user
|
334
318
|
api_get :show, :id => order.to_param
|
335
319
|
expect(response.status).to eq(200)
|
@@ -368,13 +352,16 @@ module Spree
|
|
368
352
|
|
369
353
|
# Regression test for #3404
|
370
354
|
it "can specify additional parameters for a line item" do
|
371
|
-
|
355
|
+
expect(Order).to receive(:create!).and_return(order = Spree::Order.new)
|
356
|
+
allow(order).to receive(:associate_user!)
|
357
|
+
allow(order).to receive_message_chain(:contents, :add).and_return(line_item = double('LineItem'))
|
358
|
+
expect(line_item).to receive(:update_attributes!).with("special" => true)
|
372
359
|
|
373
360
|
allow(controller).to receive_messages(permitted_line_item_attributes: [:id, :variant_id, :quantity, :special])
|
374
361
|
api_post :create, :order => {
|
375
362
|
:line_items => {
|
376
363
|
"0" => {
|
377
|
-
variant_id
|
364
|
+
:variant_id => variant.to_param, :quantity => 5, :special => true
|
378
365
|
}
|
379
366
|
}
|
380
367
|
}
|
@@ -395,10 +382,7 @@ module Spree
|
|
395
382
|
end
|
396
383
|
|
397
384
|
context "admin user imports order" do
|
398
|
-
|
399
|
-
allow(current_api_user).to receive_messages has_spree_role?: true
|
400
|
-
allow(current_api_user).to receive_message_chain :spree_roles, pluck: ["admin"]
|
401
|
-
end
|
385
|
+
let!(:current_api_user) { create :admin_user }
|
402
386
|
|
403
387
|
it "is able to set any default unpermitted attribute" do
|
404
388
|
api_post :create, :order => { number: "WOW" }
|
@@ -410,7 +394,6 @@ module Spree
|
|
410
394
|
it "can create an order without any parameters" do
|
411
395
|
expect { api_post :create }.not_to raise_error
|
412
396
|
expect(response.status).to eq(201)
|
413
|
-
order = Order.last
|
414
397
|
expect(json_response["state"]).to eq("cart")
|
415
398
|
end
|
416
399
|
|
@@ -658,19 +641,6 @@ module Spree
|
|
658
641
|
end
|
659
642
|
end
|
660
643
|
|
661
|
-
it "responds with orders updated_at with miliseconds precision" do
|
662
|
-
if ActiveRecord::Base.connection.adapter_name == "Mysql2"
|
663
|
-
skip "MySQL does not support millisecond timestamps."
|
664
|
-
else
|
665
|
-
skip "Probable need to make it call as_json. See https://github.com/rails/rails/commit/0f33d70e89991711ff8b3dde134a61f4a5a0ec06"
|
666
|
-
end
|
667
|
-
|
668
|
-
api_get :index
|
669
|
-
milisecond = order.updated_at.strftime("%L")
|
670
|
-
updated_at = json_response["orders"].first["updated_at"]
|
671
|
-
expect(updated_at.split("T").last).to have_content(milisecond)
|
672
|
-
end
|
673
|
-
|
674
644
|
context "caching enabled" do
|
675
645
|
before do
|
676
646
|
ActionController::Base.perform_caching = true
|
@@ -43,17 +43,6 @@ module Spree
|
|
43
43
|
expect(response.status).to eq(201)
|
44
44
|
expect(json_response).to have_attributes(attributes)
|
45
45
|
end
|
46
|
-
|
47
|
-
context "disallowed payment method" do
|
48
|
-
it "does not create a new payment" do
|
49
|
-
PaymentMethod.first.update!(display_on: "back_end")
|
50
|
-
|
51
|
-
expect {
|
52
|
-
api_post :create, payment: { payment_method_id: PaymentMethod.first.id, amount: 50 }
|
53
|
-
}.not_to change { Spree::Payment.count }
|
54
|
-
expect(response.status).to eq(404)
|
55
|
-
end
|
56
|
-
end
|
57
46
|
end
|
58
47
|
|
59
48
|
context "payment source is required" do
|
@@ -395,13 +395,13 @@ module Spree
|
|
395
395
|
# Regression test for #4123
|
396
396
|
it "puts the created product in the given taxon" do
|
397
397
|
api_put :update, :id => product.to_param, :product => {:taxon_ids => taxon_1.id.to_s}
|
398
|
-
expect(json_response["taxon_ids"]).to eq([taxon_1.id
|
398
|
+
expect(json_response["taxon_ids"]).to eq([taxon_1.id])
|
399
399
|
end
|
400
400
|
|
401
401
|
# Regression test for #4123
|
402
402
|
it "puts the created product in the given taxons" do
|
403
403
|
api_put :update, :id => product.to_param, :product => {:taxon_ids => [taxon_1.id, taxon_2.id].join(',')}
|
404
|
-
expect(json_response["taxon_ids"]).to
|
404
|
+
expect(json_response["taxon_ids"]).to match_array([taxon_1.id, taxon_2.id])
|
405
405
|
end
|
406
406
|
end
|
407
407
|
|
@@ -0,0 +1,157 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
module Api
|
5
|
+
class WidgetsController < Spree::Api::ResourceController
|
6
|
+
prepend_view_path('spec/test_views')
|
7
|
+
|
8
|
+
def model_class
|
9
|
+
Widget
|
10
|
+
end
|
11
|
+
|
12
|
+
def permitted_widget_attributes
|
13
|
+
[:name]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe Api::WidgetsController, type: :controller do
|
19
|
+
render_views
|
20
|
+
|
21
|
+
after(:all) do
|
22
|
+
Rails.application.reload_routes!
|
23
|
+
end
|
24
|
+
|
25
|
+
with_model 'Widget', scope: :all do
|
26
|
+
table do |t|
|
27
|
+
t.string :name
|
28
|
+
t.integer :position
|
29
|
+
t.timestamps null: false
|
30
|
+
end
|
31
|
+
|
32
|
+
model do
|
33
|
+
acts_as_list
|
34
|
+
validates :name, presence: true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
before do
|
39
|
+
Spree::Core::Engine.routes.draw do
|
40
|
+
namespace :api do
|
41
|
+
resources :widgets
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
let(:user) { create(:user, :with_api_key) }
|
47
|
+
let(:admin_user) { create(:admin_user, :with_api_key) }
|
48
|
+
|
49
|
+
describe "#index" do
|
50
|
+
let!(:widget) { Widget.create!(name: "a widget") }
|
51
|
+
|
52
|
+
it "returns no widgets" do
|
53
|
+
api_get :index, token: user.spree_api_key
|
54
|
+
expect(response).to be_success
|
55
|
+
expect(json_response['widgets']).to be_blank
|
56
|
+
end
|
57
|
+
|
58
|
+
context "it has authorization to read widgets" do
|
59
|
+
it "returns widgets" do
|
60
|
+
api_get :index, token: admin_user.spree_api_key
|
61
|
+
expect(response).to be_success
|
62
|
+
expect(json_response['widgets']).to include(
|
63
|
+
'name' => 'a widget',
|
64
|
+
'position' => 1
|
65
|
+
)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "#show" do
|
71
|
+
let(:widget) { Widget.create!(name: "a widget") }
|
72
|
+
|
73
|
+
it "returns not found" do
|
74
|
+
api_get :show, id: widget.to_param, token: user.spree_api_key
|
75
|
+
assert_not_found!
|
76
|
+
end
|
77
|
+
|
78
|
+
context "it has authorization read widgets" do
|
79
|
+
it "returns widget details" do
|
80
|
+
api_get :show, id: widget.to_param, token: admin_user.spree_api_key
|
81
|
+
expect(response).to be_success
|
82
|
+
expect(json_response['name']).to eq 'a widget'
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "#new" do
|
88
|
+
it "returns unauthorized" do
|
89
|
+
api_get :new, token: user.spree_api_key
|
90
|
+
expect(response).to be_unauthorized
|
91
|
+
end
|
92
|
+
|
93
|
+
context "it is allowed to view a new widget" do
|
94
|
+
it "can learn how to create a new widget" do
|
95
|
+
api_get :new, token: admin_user.spree_api_key
|
96
|
+
expect(response).to be_success
|
97
|
+
expect(json_response["attributes"]).to eq(['name'])
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe "#create" do
|
103
|
+
it "returns unauthorized" do
|
104
|
+
expect {
|
105
|
+
api_post :create, widget: { name: "a widget" }, token: user.spree_api_key
|
106
|
+
}.not_to change(Widget, :count)
|
107
|
+
expect(response).to be_unauthorized
|
108
|
+
end
|
109
|
+
|
110
|
+
context "it is authorized to create widgets" do
|
111
|
+
it "can create a widget" do
|
112
|
+
expect {
|
113
|
+
api_post :create, widget: { name: "a widget" }, token: admin_user.spree_api_key
|
114
|
+
}.to change(Widget, :count).by(1)
|
115
|
+
expect(response).to be_created
|
116
|
+
expect(json_response['name']).to eq 'a widget'
|
117
|
+
expect(Widget.last.name).to eq 'a widget'
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
describe "#update" do
|
123
|
+
let!(:widget) { Widget.create!(name: "a widget") }
|
124
|
+
it "returns unauthorized" do
|
125
|
+
api_put :update, id: widget.to_param, widget: { name: "another widget" }, token: user.spree_api_key
|
126
|
+
assert_not_found!
|
127
|
+
expect(widget.reload.name).to eq 'a widget'
|
128
|
+
end
|
129
|
+
|
130
|
+
context "it is authorized to update widgets" do
|
131
|
+
it "can update a widget" do
|
132
|
+
api_put :update, id: widget.to_param, widget: { name: "another widget" }, token: admin_user.spree_api_key
|
133
|
+
expect(response).to be_success
|
134
|
+
expect(json_response['name']).to eq 'another widget'
|
135
|
+
expect(widget.reload.name).to eq 'another widget'
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
describe "#destroy" do
|
141
|
+
let!(:widget) { Widget.create!(name: "a widget") }
|
142
|
+
it "returns unauthorized" do
|
143
|
+
api_delete :destroy, id: widget.to_param, token: user.spree_api_key
|
144
|
+
assert_not_found!
|
145
|
+
expect { widget.reload }.not_to raise_error
|
146
|
+
end
|
147
|
+
|
148
|
+
context "it is authorized to destroy widgets" do
|
149
|
+
it "can destroy a widget" do
|
150
|
+
api_delete :destroy, id: widget.to_param, token: admin_user.spree_api_key
|
151
|
+
expect(response.status).to eq 204
|
152
|
+
expect { widget.reload }.to raise_error(ActiveRecord::RecordNotFound)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|