From 4e8b3d931095d6bbf2cca2c4142dc2418b20916d Mon Sep 17 00:00:00 2001 From: evazion Date: Fri, 16 Aug 2019 20:49:34 -0500 Subject: [PATCH] jobs: migrate user deletions to ActiveJob. --- app/jobs/delete_favorites_job.rb | 12 +++++++ app/logical/user_deletion.rb | 11 +----- test/jobs/delete_favorites_job_test.rb | 21 ++++++++++++ test/test_helper.rb | 1 + test/unit/user_deletion_test.rb | 47 ++++++++++---------------- 5 files changed, 53 insertions(+), 39 deletions(-) create mode 100644 app/jobs/delete_favorites_job.rb create mode 100644 test/jobs/delete_favorites_job_test.rb diff --git a/app/jobs/delete_favorites_job.rb b/app/jobs/delete_favorites_job.rb new file mode 100644 index 000000000..1ad708a86 --- /dev/null +++ b/app/jobs/delete_favorites_job.rb @@ -0,0 +1,12 @@ +class DeleteFavoritesJob < ApplicationJob + queue_as :default + queue_with_priority 20 + + def perform(user) + Post.without_timeout do + user.favorites.find_each do |favorite| + Favorite.remove(post: favorite.post, user: user) + end + end + end +end diff --git a/app/logical/user_deletion.rb b/app/logical/user_deletion.rb index 1b88f2415..155ef0bc4 100644 --- a/app/logical/user_deletion.rb +++ b/app/logical/user_deletion.rb @@ -3,15 +3,6 @@ class UserDeletion attr_reader :user, :password - def self.remove_favorites_for(user_id) - user = User.find(user_id) - Post.without_timeout do - Post.raw_tag_match("fav:#{user_id}").where("true /* UserDeletion.remove_favorites_for */").find_each do |post| - Favorite.remove(post: post, user: user) - end - end - end - def initialize(user, password) @user = user @password = password @@ -59,7 +50,7 @@ private end def remove_favorites - UserDeletion.delay(:queue => "default").remove_favorites_for(user.id) + DeleteFavoritesJob.perform_later(user) end def rename diff --git a/test/jobs/delete_favorites_job_test.rb b/test/jobs/delete_favorites_job_test.rb new file mode 100644 index 000000000..a7b4fb9d7 --- /dev/null +++ b/test/jobs/delete_favorites_job_test.rb @@ -0,0 +1,21 @@ +require 'test_helper' + +class DeleteFavoritesJobTest < ActiveJob::TestCase + context "DeleteFavoritesJob" do + should "delete all favorites" do + user = create(:user) + posts = create_list(:post, 3) + favorites = posts.each { |post| post.add_favorite!(user) } + + assert_equal(3, user.favorite_count) + assert_equal(3, user.favorites.count) + assert_equal(3, Post.raw_tag_match("fav:#{user.id}").count) + + DeleteFavoritesJob.perform_now(user) + + assert_equal(0, user.reload.favorite_count) + assert_equal(0, user.favorites.count) + assert_equal(0, Post.raw_tag_match("fav:#{user.id}").count) + end + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb index 691204891..9c043f189 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -57,6 +57,7 @@ end class ActiveSupport::TestCase + include ActiveJob::TestHelper include FactoryBot::Syntax::Methods include PostArchiveTestHelper include PoolArchiveTestHelper diff --git a/test/unit/user_deletion_test.rb b/test/unit/user_deletion_test.rb index 7c09e2b8d..292cffaf6 100644 --- a/test/unit/user_deletion_test.rb +++ b/test/unit/user_deletion_test.rb @@ -3,14 +3,10 @@ require 'test_helper' class UserDeletionTest < ActiveSupport::TestCase context "an invalid user deletion" do context "for an invalid password" do - setup do - @user = FactoryBot.create(:user) - CurrentUser.user = @user - CurrentUser.ip_addr = "127.0.0.1" - @deletion = UserDeletion.new(@user, "wrongpassword") - end - should "fail" do + @user = create(:user) + @deletion = UserDeletion.new(@user, "wrongpassword") + assert_raise(UserDeletion::ValidationError) do @deletion.delete! end @@ -18,14 +14,10 @@ class UserDeletionTest < ActiveSupport::TestCase end context "for an admin" do - setup do - @user = FactoryBot.create(:admin_user) - CurrentUser.user = @user - CurrentUser.ip_addr = "127.0.0.1" - @deletion = UserDeletion.new(@user, "password") - end - should "fail" do + @user = create(:admin_user) + @deletion = UserDeletion.new(@user, "password") + assert_raise(UserDeletion::ValidationError) do @deletion.delete! end @@ -35,36 +27,33 @@ class UserDeletionTest < ActiveSupport::TestCase context "a valid user deletion" do setup do - @user = FactoryBot.create(:user) - CurrentUser.user = @user - CurrentUser.ip_addr = "127.0.0.1" - - @post = FactoryBot.create(:post) - Favorite.add(post: @post, user: @user) - - @user.update_attributes(:email => "ted@danbooru.com") - + @user = create(:user, email: "ted@danbooru.com") @deletion = UserDeletion.new(@user, "password") - @deletion.delete! - @user.reload end should "blank out the email" do - assert_nil(@user.email) + @deletion.delete! + assert_nil(@user.reload.email) end should "rename the user" do - assert_equal("user_#{@user.id}", @user.name) + @deletion.delete! + assert_equal("user_#{@user.id}", @user.reload.name) end should "reset the password" do + @deletion.delete! assert_nil(User.authenticate(@user.name, "password")) end should "remove any favorites" do - @post.reload + @post = create(:post) + Favorite.add(post: @post, user: @user) + + perform_enqueued_jobs { @deletion.delete! } + assert_equal(0, Favorite.count) - assert_equal("", @post.fav_string) + assert_equal("", @post.reload.fav_string) assert_equal(0, @post.fav_count) end end