Commit dc508e26687f8aafe5d78317b3e00df790ddccf8
1 parent
2be92c1e
Exists in
master
and in
1 other branch
Avoid delete himself
* Extract in UserDestroy the user destroy system with callback * Avoid delete himself * little refactor on rspec to be more rspec compiliant
Showing
7 changed files
with
76 additions
and
20 deletions
Show diff stats
app/controllers/users_controller.rb
... | ... | @@ -40,9 +40,12 @@ class UsersController < ApplicationController |
40 | 40 | end |
41 | 41 | |
42 | 42 | def destroy |
43 | - user.destroy | |
44 | - | |
45 | - flash[:success] = "That's sad. #{user.name} is no longer part of your team." | |
43 | + if user == current_user | |
44 | + flash[:error] = I18n.t('controllers.users.flash.destroy.error') | |
45 | + else | |
46 | + UserDestroy.new(user).destroy | |
47 | + flash[:success] = "That's sad. #{user.name} is no longer part of your team." | |
48 | + end | |
46 | 49 | redirect_to users_path |
47 | 50 | end |
48 | 51 | ... | ... |
app/models/user.rb
... | ... | @@ -13,7 +13,6 @@ class User |
13 | 13 | field :per_page, :type => Fixnum, :default => PER_PAGE |
14 | 14 | field :time_zone, :default => "UTC" |
15 | 15 | |
16 | - after_destroy :destroy_watchers | |
17 | 16 | before_save :ensure_authentication_token |
18 | 17 | |
19 | 18 | validates_presence_of :name |
... | ... | @@ -57,10 +56,5 @@ class User |
57 | 56 | self[:github_login] = login |
58 | 57 | end |
59 | 58 | |
60 | - protected | |
61 | - | |
62 | - def destroy_watchers | |
63 | - watchers.each(&:destroy) | |
64 | - end | |
65 | 59 | end |
66 | 60 | ... | ... |
config/locales/en.yml
spec/controllers/users_controller_spec.rb
... | ... | @@ -212,19 +212,30 @@ describe UsersController do |
212 | 212 | |
213 | 213 | context "DELETE /users/:id" do |
214 | 214 | |
215 | - it "destroys the user" do | |
216 | - delete :destroy, :id => user.id | |
217 | - User.where(:id => user.id).first.should be_nil | |
218 | - end | |
215 | + context "with a destroy success" do | |
216 | + let(:user_destroy) { mock(:destroy => true) } | |
217 | + | |
218 | + before { | |
219 | + UserDestroy.should_receive(:new).with(user).and_return(user_destroy) | |
220 | + delete :destroy, :id => user.id | |
221 | + } | |
219 | 222 | |
220 | - it "redirects to the users index page" do | |
221 | - delete :destroy, :id => user.id | |
222 | - response.should redirect_to(users_path) | |
223 | + it 'should destroy user' do | |
224 | + expect(request.flash[:success]).to eq I18n.t('controllers.users.flash.destroy.success', :name => user.name) | |
225 | + response.should redirect_to(users_path) | |
226 | + end | |
223 | 227 | end |
224 | 228 | |
225 | - it "sets a message to display" do | |
226 | - delete :destroy, :id => user.id | |
227 | - request.flash[:success].should include('no longer part of your team') | |
229 | + context "with trying destroy himself" do | |
230 | + before { | |
231 | + UserDestroy.should_not_receive(:new) | |
232 | + delete :destroy, :id => admin.id | |
233 | + } | |
234 | + | |
235 | + it 'should not destroy user' do | |
236 | + response.should redirect_to(users_path) | |
237 | + expect(request.flash[:error]).to eq I18n.t('controllers.users.flash.destroy.error') | |
238 | + end | |
228 | 239 | end |
229 | 240 | end |
230 | 241 | end | ... | ... |
spec/fabricators/app_fabricator.rb
... | ... | @@ -4,7 +4,9 @@ Fabricator(:app) do |
4 | 4 | end |
5 | 5 | |
6 | 6 | Fabricator(:app_with_watcher, :from => :app) do |
7 | - watchers(:count => 1) { |parent, i| Fabricate.build(:watcher, :app => parent) } | |
7 | + watchers(:count => 1) { |parent, i| | |
8 | + Fabricate.build(:watcher, :app => parent) | |
9 | + } | |
8 | 10 | end |
9 | 11 | |
10 | 12 | Fabricator(:watcher) do | ... | ... |
... | ... | @@ -0,0 +1,27 @@ |
1 | +require 'spec_helper' | |
2 | + | |
3 | +describe UserDestroy do | |
4 | + let(:app) { Fabricate( | |
5 | + :app, | |
6 | + :watchers => [ | |
7 | + Fabricate.build(:user_watcher, :user => user) | |
8 | + ]) | |
9 | + } | |
10 | + | |
11 | + describe "#destroy" do | |
12 | + let!(:user) { Fabricate(:user) } | |
13 | + it 'should delete user' do | |
14 | + expect { | |
15 | + UserDestroy.new(user).destroy | |
16 | + }.to change(User, :count) | |
17 | + end | |
18 | + | |
19 | + it 'should delete watcher' do | |
20 | + expect { | |
21 | + UserDestroy.new(user).destroy | |
22 | + }.to change{ | |
23 | + app.reload.watchers.where(:user_id => user.id).count | |
24 | + }.from(1).to(0) | |
25 | + end | |
26 | + end | |
27 | +end | ... | ... |