diff --git a/app/services/user_destroyer.rb b/app/services/user_destroyer.rb index 55f88a00458..0049c677598 100644 --- a/app/services/user_destroyer.rb +++ b/app/services/user_destroyer.rb @@ -14,7 +14,7 @@ class UserDestroyer def destroy(user, opts={}) raise Discourse::InvalidParameters.new('user is nil') unless user and user.is_a?(User) @guardian.ensure_can_delete_user!(user) - raise PostsExistError if !opts[:delete_posts] && user.post_count != 0 + raise PostsExistError if !opts[:delete_posts] && user.posts.count != 0 User.transaction do if opts[:delete_posts] user.posts.each do |post| diff --git a/spec/controllers/admin/users_controller_spec.rb b/spec/controllers/admin/users_controller_spec.rb index 9deedfb62a6..c7a97f86e7a 100644 --- a/spec/controllers/admin/users_controller_spec.rb +++ b/spec/controllers/admin/users_controller_spec.rb @@ -311,8 +311,9 @@ describe Admin::UsersController do context "user has post" do before do - @user = build(:user) - @user.stubs(:post_count).returns(1) + @user = Fabricate(:user) + topic = create_topic(user: @user) + post = create_post(topic: topic, user: @user) @user.stubs(:first_post_created_at).returns(Time.zone.now) User.expects(:find_by).with(id: @delete_me.id).returns(@user) end diff --git a/spec/services/user_destroyer_spec.rb b/spec/services/user_destroyer_spec.rb index bf26b55f760..630dc88773d 100644 --- a/spec/services/user_destroyer_spec.rb +++ b/spec/services/user_destroyer_spec.rb @@ -145,6 +145,16 @@ describe UserDestroyer do end end + context 'user has no posts, but user_stats table has post_count > 0' do + before do + # out of sync user_stat data shouldn't break UserDestroyer + @user.user_stat.update_attribute(:post_count, 1) + end + subject(:destroy) { UserDestroyer.new(@user).destroy(@user, {delete_posts: false}) } + + include_examples "successfully destroy a user" + end + context 'user has deleted posts' do let!(:deleted_post) { Fabricate(:post, user: @user, deleted_at: 1.hour.ago) } it "should mark the user's deleted posts as belonging to a nuked user" do