From a844a1daf4f6f1539adabcfd3275775499f6fedd Mon Sep 17 00:00:00 2001 From: evazion Date: Wed, 14 Jun 2017 20:02:32 -0500 Subject: [PATCH] posts: fix expunging posts not deleting files. Fix expungement to ignore the "file still in use" check. --- Gemfile | 1 + Gemfile.lock | 5 ++++- app/models/post.rb | 12 +++++++----- test/test_helper.rb | 1 + test/unit/post_test.rb | 18 +++++++++++++++++- 5 files changed, 30 insertions(+), 7 deletions(-) diff --git a/Gemfile b/Gemfile index 042cef674..ed13ce07a 100644 --- a/Gemfile +++ b/Gemfile @@ -74,4 +74,5 @@ group :test do gem "simplecov", :require => false gem "timecop" gem "fakeweb" + gem "test_after_commit" # XXX remove me after upgrading to rails 5. end diff --git a/Gemfile.lock b/Gemfile.lock index d52bcb5a8..2487e96ef 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -337,6 +337,8 @@ GEM rest-client (~> 1.4) term-ansicolor (1.3.2) tins (~> 1.0) + test_after_commit (1.1.0) + activerecord (>= 3.2) therubyracer (0.12.3) libv8 (~> 3.16.14.15) ref @@ -433,6 +435,7 @@ DEPENDENCIES streamio-ffmpeg stripe term-ansicolor + test_after_commit therubyracer timecop twitter @@ -443,4 +446,4 @@ DEPENDENCIES whenever BUNDLED WITH - 1.14.5 + 1.14.6 diff --git a/app/models/post.rb b/app/models/post.rb index 5394e19e0..edde42e13 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -65,11 +65,13 @@ class Post < ActiveRecord::Base extend ActiveSupport::Concern module ClassMethods - def delete_files(post_id, file_path, large_file_path, preview_file_path) - post = Post.find(post_id) + def delete_files(post_id, file_path, large_file_path, preview_file_path, force: false) + unless force + post = Post.find(post_id) - if post.file_path == file_path || post.large_file_path == large_file_path || post.preview_file_path == preview_file_path - raise DeletionError.new("Files still in use; skipping deletion.") + if post.file_path == file_path || post.large_file_path == large_file_path || post.preview_file_path == preview_file_path + raise DeletionError.new("Files still in use; skipping deletion.") + end end # the large file and the preview don't necessarily exist. if so errors will be ignored. @@ -84,7 +86,7 @@ class Post < ActiveRecord::Base end def delete_files - Post.delete_files(id, file_path, large_file_path, preview_file_path) + Post.delete_files(id, file_path, large_file_path, preview_file_path, force: true) end def distribute_files diff --git a/test/test_helper.rb b/test/test_helper.rb index dbe64b14a..16d22d0eb 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -48,6 +48,7 @@ class ActionController::TestCase end Delayed::Worker.delay_jobs = false +TestAfterCommit.enabled = false require "helpers/reportbooru_helper" class ActiveSupport::TestCase diff --git a/test/unit/post_test.rb b/test/unit/post_test.rb index 5f7d06835..2e701c837 100644 --- a/test/unit/post_test.rb +++ b/test/unit/post_test.rb @@ -33,7 +33,23 @@ class PostTest < ActiveSupport::TestCase context "Deletion:" do context "Expunging a post" do setup do - @post = FactoryGirl.create(:post) + @upload = FactoryGirl.create(:jpg_upload) + @upload.process! + @post = @upload.post + end + + should "delete the files" do + assert_equal(true, File.exists?(@post.preview_file_path)) + assert_equal(true, File.exists?(@post.large_file_path)) + assert_equal(true, File.exists?(@post.file_path)) + + TestAfterCommit.with_commits(true) do + @post.expunge! + end + + assert_equal(false, File.exists?(@post.preview_file_path)) + assert_equal(false, File.exists?(@post.large_file_path)) + assert_equal(false, File.exists?(@post.file_path)) end context "that is status locked" do