From 5ce817766253e91b77273dd15d443d739387b5fa Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Wed, 14 Mar 2018 15:11:35 -0400 Subject: [PATCH] FIX: unable to delete user belonging to a group that grants a trust level --- app/models/user.rb | 9 +++++---- spec/services/user_destroyer_spec.rb | 26 +++++++++++++++++++------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index a2c60eb345d..0ac14d77a19 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -50,6 +50,11 @@ class User < ActiveRecord::Base has_many :email_change_requests, dependent: :destroy has_many :directory_items, dependent: :delete_all has_many :user_auth_tokens, dependent: :destroy + + has_many :group_users, dependent: :destroy + has_many :groups, through: :group_users + has_many :secure_categories, through: :groups, source: :categories + has_many :user_emails, dependent: :destroy has_one :primary_email, -> { where(primary: true) }, class_name: 'UserEmail', dependent: :destroy @@ -69,10 +74,6 @@ class User < ActiveRecord::Base belongs_to :approved_by, class_name: 'User' belongs_to :primary_group, class_name: 'Group' - has_many :group_users, dependent: :destroy - has_many :groups, through: :group_users - has_many :secure_categories, through: :groups, source: :categories - has_many :muted_user_records, class_name: 'MutedUser' has_many :muted_users, through: :muted_user_records diff --git a/spec/services/user_destroyer_spec.rb b/spec/services/user_destroyer_spec.rb index 3c829d89fdb..ccf428dc627 100644 --- a/spec/services/user_destroyer_spec.rb +++ b/spec/services/user_destroyer_spec.rb @@ -2,6 +2,10 @@ require 'rails_helper' require_dependency 'user_destroyer' describe UserDestroyer do + + let(:user) { Fabricate(:user) } + let(:admin) { Fabricate(:admin) } + describe 'new' do it 'raises an error when user is nil' do expect { UserDestroyer.new(nil) }.to raise_error(Discourse::InvalidParameters) @@ -74,8 +78,6 @@ describe UserDestroyer do end context "with a queued post" do - let(:user) { Fabricate(:user) } - let(:admin) { Fabricate(:admin) } let!(:qp) { Fabricate(:queued_post, user: user) } it "removes the queued post" do @@ -85,8 +87,6 @@ describe UserDestroyer do end context "with a directory item record" do - let(:user) { Fabricate(:user) } - let(:admin) { Fabricate(:admin) } it "removes the directory item" do DirectoryItem.create!( @@ -104,8 +104,6 @@ describe UserDestroyer do end context "with a draft" do - let(:user) { Fabricate(:user) } - let(:admin) { Fabricate(:admin) } let!(:draft) { Draft.set(user, 'test', 1, 'test') } it "removed the draft" do @@ -319,7 +317,6 @@ describe UserDestroyer do end context 'user got an email' do - let(:user) { Fabricate(:user) } let!(:email_log) { Fabricate(:email_log, user: user) } it "deletes the email log" do @@ -343,6 +340,21 @@ describe UserDestroyer do expect(@post.reload.like_count).to eq(0) end end + + context 'user belongs to groups that grant trust level' do + let(:group) { Fabricate(:group, grant_trust_level: 2) } + + before do + group.add(user) + end + + it 'can delete the user' do + d = UserDestroyer.new(admin) + expect { + d.destroy(user) + }.to change { User.count }.by(-1) + end + end end end