Skip to content

Commit 0e410a5

Browse files
Merge pull request #4358 from solidusio/waiting-for-dev/with_model_and_cache_classes
Readd `config.cache_classes` on test env and remove `with_model` dep
2 parents 349e4c7 + c268949 commit 0e410a5

19 files changed

+188
-307
lines changed

Gemfile

-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ group :backend, :frontend, :core, :api do
4040
gem 'rspec-activemodel-mocks', '~> 1.1', require: false
4141
gem 'rspec-rails', '~> 4.0.1', require: false
4242
gem 'simplecov', require: false
43-
gem 'with_model', require: false
4443
gem 'rails-controller-testing', require: false
4544
gem 'puma', require: false
4645

api/app/controllers/spree/api/resource_controller.rb

+9
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
# frozen_string_literal: true
22

3+
# @deprecated Inherit directly from Spree::Api::BaseController
34
class Spree::Api::ResourceController < Spree::Api::BaseController
45
before_action :load_resource, only: [:show, :update, :destroy]
56

7+
def self.inherited(klass)
8+
Spree::Deprecation.warn <<~MSG
9+
Spree::Api::ResourceController is deprecated. Please, copy any logic you
10+
need and inherit directly from Spree::Api::BaseController.
11+
MSG
12+
super
13+
end
14+
615
def index
716
collection_scope = model_class.accessible_by(current_ability)
817
if params[:ids]

api/app/controllers/spree/api/users_controller.rb

+62-9
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
# frozen_string_literal: true
22

3-
class Spree::Api::UsersController < Spree::Api::ResourceController
3+
class Spree::Api::UsersController < Spree::Api::BaseController
4+
before_action :load_resource, only: [:show, :update, :destroy]
5+
46
def index
5-
user_scope = model_class.accessible_by(current_ability, :show)
7+
user_scope = user_class.accessible_by(current_ability, :show)
68
if params[:ids]
79
ids = params[:ids].split(",").flatten
810
@users = user_scope.where(id: ids)
@@ -14,20 +16,71 @@ def index
1416
respond_with(@users)
1517
end
1618

17-
private
19+
def show
20+
respond_with(@user)
21+
end
22+
23+
def new
24+
authorize! :new, user_class
25+
respond_with(user_class.new)
26+
end
27+
28+
def create
29+
authorize! :create, user_class
30+
31+
@user = user_class.new(permitted_user_params)
1832

19-
attr_reader :user
33+
if @user.save
34+
respond_with(@user, status: 201, default_template: :show)
35+
else
36+
invalid_resource!(@user)
37+
end
38+
end
39+
40+
def update
41+
authorize! :update, @user
2042

21-
def model_class
43+
if @user.update(permitted_user_params)
44+
respond_with(@user, status: 200, default_template: :show)
45+
else
46+
invalid_resource!(@user)
47+
end
48+
end
49+
50+
def destroy
51+
authorize! :destroy, @user
52+
53+
destroy_result = if @user.respond_to?(:discard)
54+
@user.discard
55+
else
56+
@user.destroy
57+
end
58+
59+
if destroy_result
60+
respond_with(@user, status: 204)
61+
else
62+
invalid_resource!(@user)
63+
end
64+
rescue ActiveRecord::DeleteRestrictionError
65+
render "spree/api/errors/delete_restriction", status: 422
66+
end
67+
68+
private
69+
70+
def user_class
2271
Spree.user_class
2372
end
2473

25-
def user_params
26-
permitted_resource_params
74+
def load_resource
75+
@user = user_class.accessible_by(current_ability, :show).find(params[:id])
76+
end
77+
78+
def permitted_user_params
79+
params.require(:user).permit(permitted_user_attributes)
2780
end
2881

29-
def permitted_resource_attributes
30-
if action_name == "create" || can?(:update_email, user)
82+
def permitted_user_attributes
83+
if action_name == "create" || can?(:update_email, @user)
3184
super | [:email]
3285
else
3386
super

api/spec/controllers/spree/api/resource_controller_spec.rb

+4-184
Original file line numberDiff line numberDiff line change
@@ -2,190 +2,10 @@
22

33
require 'spec_helper'
44

5-
module Spree
6-
module Api
7-
class WidgetsController < Spree::Api::ResourceController
8-
prepend_view_path('spec/test_views')
5+
describe Spree::Api::ResourceController, type: :controller do
6+
it "is deprecated" do
7+
expect(Spree::Deprecation).to receive(:warn).with(/deprecated/)
98

10-
def model_class
11-
Widget
12-
end
13-
14-
def permitted_widget_attributes
15-
[:name]
16-
end
17-
end
18-
end
19-
20-
describe Api::WidgetsController, type: :controller do
21-
render_views
22-
23-
after(:all) do
24-
Rails.application.reload_routes!
25-
end
26-
27-
with_model 'Widget', scope: :all do
28-
table do |widget|
29-
widget.string :name
30-
widget.integer :position
31-
widget.timestamps null: false
32-
end
33-
34-
model do
35-
acts_as_list
36-
validates :name, presence: true
37-
end
38-
end
39-
40-
before do
41-
Spree::Core::Engine.routes.draw do
42-
namespace :api do
43-
resources :widgets
44-
end
45-
end
46-
end
47-
48-
let(:user) { create(:user, :with_api_key) }
49-
let(:admin_user) { create(:admin_user, :with_api_key) }
50-
51-
describe "#index" do
52-
let!(:widget) { Widget.create!(name: "a widget") }
53-
54-
it "returns no widgets" do
55-
get :index, params: { token: user.spree_api_key }, as: :json
56-
expect(response).to be_successful
57-
expect(json_response['widgets']).to be_blank
58-
end
59-
60-
context "it has authorization to read widgets" do
61-
it "returns widgets" do
62-
get :index, params: { token: admin_user.spree_api_key }, as: :json
63-
expect(response).to be_successful
64-
expect(json_response['widgets']).to include(
65-
hash_including(
66-
'name' => 'a widget',
67-
'position' => 1
68-
)
69-
)
70-
end
71-
72-
context "specifying ids" do
73-
let!(:widget2) { Widget.create!(name: "a widget") }
74-
75-
it "returns both widgets from comma separated string" do
76-
get :index, params: { ids: [widget.id, widget2.id].join(','), token: admin_user.spree_api_key }, as: :json
77-
expect(response).to be_successful
78-
expect(json_response['widgets'].size).to eq 2
79-
end
80-
81-
it "returns both widgets from multiple arguments" do
82-
get :index, params: { ids: [widget.id, widget2.id], token: admin_user.spree_api_key }, as: :json
83-
expect(response).to be_successful
84-
expect(json_response['widgets'].size).to eq 2
85-
end
86-
87-
it "returns one requested widgets" do
88-
get :index, params: { ids: widget2.id.to_s, token: admin_user.spree_api_key }, as: :json
89-
expect(response).to be_successful
90-
expect(json_response['widgets'].size).to eq 1
91-
expect(json_response['widgets'][0]['id']).to eq widget2.id
92-
end
93-
94-
it "returns no widgets if empty" do
95-
get :index, params: { ids: '', token: admin_user.spree_api_key }, as: :json
96-
expect(response).to be_successful
97-
expect(json_response['widgets']).to be_empty
98-
end
99-
end
100-
end
101-
end
102-
103-
describe "#show" do
104-
let(:widget) { Widget.create!(name: "a widget") }
105-
106-
it "returns not found" do
107-
get :show, params: { id: widget.to_param, token: user.spree_api_key }, as: :json
108-
assert_not_found!
109-
end
110-
111-
context "it has authorization read widgets" do
112-
it "returns widget details" do
113-
get :show, params: { id: widget.to_param, token: admin_user.spree_api_key }, as: :json
114-
expect(response).to be_successful
115-
expect(json_response['name']).to eq 'a widget'
116-
end
117-
end
118-
end
119-
120-
describe "#new" do
121-
it "returns unauthorized" do
122-
get :new, params: { token: user.spree_api_key }, as: :json
123-
expect(response).to be_unauthorized
124-
end
125-
126-
context "it is allowed to view a new widget" do
127-
it "can learn how to create a new widget" do
128-
get :new, params: { token: admin_user.spree_api_key }, as: :json
129-
expect(response).to be_successful
130-
expect(json_response["attributes"]).to eq(['name'])
131-
end
132-
end
133-
end
134-
135-
describe "#create" do
136-
it "returns unauthorized" do
137-
expect {
138-
post :create, params: { widget: { name: "a widget" }, token: user.spree_api_key }, as: :json
139-
}.not_to change(Widget, :count)
140-
expect(response).to be_unauthorized
141-
end
142-
143-
context "it is authorized to create widgets" do
144-
it "can create a widget" do
145-
expect {
146-
post :create, params: { widget: { name: "a widget" }, token: admin_user.spree_api_key }, as: :json
147-
}.to change(Widget, :count).by(1)
148-
expect(response).to be_created
149-
expect(json_response['name']).to eq 'a widget'
150-
expect(Widget.last.name).to eq 'a widget'
151-
end
152-
end
153-
end
154-
155-
describe "#update" do
156-
let!(:widget) { Widget.create!(name: "a widget") }
157-
it "returns unauthorized" do
158-
put :update, params: { id: widget.to_param, widget: { name: "another widget" }, token: user.spree_api_key }, as: :json
159-
assert_not_found!
160-
expect(widget.reload.name).to eq 'a widget'
161-
end
162-
163-
context "it is authorized to update widgets" do
164-
it "can update a widget" do
165-
put :update, params: { id: widget.to_param, widget: { name: "another widget" }, token: admin_user.spree_api_key }, as: :json
166-
expect(response).to be_successful
167-
expect(json_response['name']).to eq 'another widget'
168-
expect(widget.reload.name).to eq 'another widget'
169-
end
170-
end
171-
end
172-
173-
describe "#destroy" do
174-
let!(:widget) { Widget.create!(name: "a widget") }
175-
176-
it "returns unauthorized" do
177-
delete :destroy, params: { id: widget.to_param, token: user.spree_api_key }, as: :json
178-
assert_not_found!
179-
expect { Widget.find(widget.id) }.not_to raise_error
180-
end
181-
182-
context "it is authorized to destroy widgets" do
183-
it "hard-deletes the widget" do
184-
delete :destroy, params: { id: widget.to_param, token: admin_user.spree_api_key }, as: :json
185-
expect(response.status).to eq 204
186-
expect { Widget.find(widget.id) }.to raise_error(ActiveRecord::RecordNotFound)
187-
end
188-
end
189-
end
9+
expect(Class.new(described_class))
19010
end
19111
end

api/spec/controllers/spree/api/soft_deletable_resource_controller_spec.rb

-53
This file was deleted.

api/spec/requests/spree/api/users_spec.rb

+12
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,18 @@ module Spree::Api
175175
expect(response.status).to eq(204)
176176
end
177177

178+
unless Spree.user_class.instance_methods.include?(:discard)
179+
it "softs-deletes when user is soft-deletable" do
180+
soft_deleted = false
181+
Spree.user_class.define_method(:discard) { soft_deleted = true }
182+
delete spree.api_user_path(user)
183+
expect(response.status).to eq(204)
184+
expect(soft_deleted).to be(true)
185+
ensure
186+
Spree.user_class.undef_method(:discard)
187+
end
188+
end
189+
178190
it "cannot destroy user with orders" do
179191
create(:completed_order_with_totals, user: user)
180192
delete spree.api_user_path(user)

0 commit comments

Comments
 (0)