Commit dc508e26687f8aafe5d78317b3e00df790ddccf8

Authored by Cyril Mougel
1 parent 2be92c1e
Exists in master and in 1 other branch production

Avoid delete himself

* Extract in UserDestroy the user destroy system with callback
* Avoid delete himself
* little refactor on rspec to be more rspec compiliant
app/controllers/users_controller.rb
@@ -40,9 +40,12 @@ class UsersController < ApplicationController @@ -40,9 +40,12 @@ class UsersController < ApplicationController
40 end 40 end
41 41
42 def destroy 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 redirect_to users_path 49 redirect_to users_path
47 end 50 end
48 51
app/interactors/user_destroy.rb 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +class UserDestroy
  2 + def initialize(user)
  3 + @user = user
  4 + end
  5 +
  6 + def destroy
  7 + @user.destroy
  8 + @user.watchers.each(&:destroy)
  9 + end
  10 +
  11 +end
app/models/user.rb
@@ -13,7 +13,6 @@ class User @@ -13,7 +13,6 @@ class User
13 field :per_page, :type => Fixnum, :default => PER_PAGE 13 field :per_page, :type => Fixnum, :default => PER_PAGE
14 field :time_zone, :default => "UTC" 14 field :time_zone, :default => "UTC"
15 15
16 - after_destroy :destroy_watchers  
17 before_save :ensure_authentication_token 16 before_save :ensure_authentication_token
18 17
19 validates_presence_of :name 18 validates_presence_of :name
@@ -57,10 +56,5 @@ class User @@ -57,10 +56,5 @@ class User
57 self[:github_login] = login 56 self[:github_login] = login
58 end 57 end
59 58
60 - protected  
61 -  
62 - def destroy_watchers  
63 - watchers.each(&:destroy)  
64 - end  
65 end 59 end
66 60
config/locales/en.yml
@@ -14,3 +14,11 @@ en: @@ -14,3 +14,11 @@ en:
14 n_errs_have: 14 n_errs_have:
15 one: "%{count} err has" 15 one: "%{count} err has"
16 other: "%{count} errs have" 16 other: "%{count} errs have"
  17 +
  18 +
  19 + controllers:
  20 + users:
  21 + flash:
  22 + destroy:
  23 + success: "That's sad. %{name} is no longer part of your team."
  24 + error: "You can't delete yourself"
spec/controllers/users_controller_spec.rb
@@ -212,19 +212,30 @@ describe UsersController do @@ -212,19 +212,30 @@ describe UsersController do
212 212
213 context "DELETE /users/:id" do 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 end 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 end 239 end
229 end 240 end
230 end 241 end
spec/fabricators/app_fabricator.rb
@@ -4,7 +4,9 @@ Fabricator(:app) do @@ -4,7 +4,9 @@ Fabricator(:app) do
4 end 4 end
5 5
6 Fabricator(:app_with_watcher, :from => :app) do 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 end 10 end
9 11
10 Fabricator(:watcher) do 12 Fabricator(:watcher) do
spec/interactors/user_destroy_spec.rb 0 → 100644
@@ -0,0 +1,27 @@ @@ -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