From: Jean-Philippe Lang Date: Thu, 21 Jan 2016 05:38:55 +0000 (+0000) Subject: Removes attachment from disk after rollback on create (#21125). X-Git-Tag: 3.3.0~291 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=3ffdc863dec492808e3f05c8bd0e0e4df44650d6;p=redmine.git Removes attachment from disk after rollback on create (#21125). git-svn-id: http://svn.redmine.org/redmine/trunk@15085 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- diff --git a/app/models/attachment.rb b/app/models/attachment.rb index 0064555b9..3fde84a78 100644 --- a/app/models/attachment.rb +++ b/app/models/attachment.rb @@ -53,6 +53,7 @@ class Attachment < ActiveRecord::Base @@thumbnails_storage_path = File.join(Rails.root, "tmp", "thumbnails") before_create :files_to_final_location + after_rollback :delete_from_disk, :on => :create after_commit :delete_from_disk, :on => :destroy # Returns an unsaved copy of the attachment diff --git a/test/unit/attachment_test.rb b/test/unit/attachment_test.rb index db274dbb9..b813a3446 100644 --- a/test/unit/attachment_test.rb +++ b/test/unit/attachment_test.rb @@ -20,7 +20,7 @@ require File.expand_path('../../test_helper', __FILE__) class AttachmentTest < ActiveSupport::TestCase - fixtures :users, :projects, :roles, :members, :member_roles, + fixtures :users, :email_addresses, :projects, :roles, :members, :member_roles, :enabled_modules, :issues, :trackers, :attachments # TODO: remove this with Rails 5 that supports after_commit callbacks diff --git a/test/unit/attachment_transaction_test.rb b/test/unit/attachment_transaction_test.rb new file mode 100644 index 000000000..59a91eff5 --- /dev/null +++ b/test/unit/attachment_transaction_test.rb @@ -0,0 +1,76 @@ +# encoding: utf-8 +# +# Redmine - project management software +# Copyright (C) 2006-2015 Jean-Philippe Lang +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require File.expand_path('../../test_helper', __FILE__) + +class AttachmentTest < ActiveSupport::TestCase + fixtures :users, :email_addresses, :projects, :roles, :members, :member_roles, + :enabled_modules, :issues, :trackers, :attachments + + self.use_transactional_fixtures = false + + def setup + set_tmp_attachments_directory + end + + def test_rollback_after_create_should_remove_file_from_disk + diskfile = nil + + Attachment.transaction do + a = Attachment.new(:container => Issue.find(1), + :file => uploaded_test_file("testfile.txt", "text/plain"), + :author => User.find(1)) + a.save! + diskfile = a.diskfile + assert File.exist?(diskfile) + raise ActiveRecord::Rollback + end + assert !File.exist?(diskfile) + end + + def test_destroy_should_remove_file_from_disk_after_commit + a = Attachment.new(:container => Issue.find(1), + :file => uploaded_test_file("testfile.txt", "text/plain"), + :author => User.find(1)) + a.save! + diskfile = a.diskfile + assert File.exist?(diskfile) + + Attachment.transaction do + a.destroy + assert File.exist?(diskfile) + end + assert !File.exist?(diskfile) + end + + def test_rollback_after_destroy_should_not_remove_file_from_disk + a = Attachment.new(:container => Issue.find(1), + :file => uploaded_test_file("testfile.txt", "text/plain"), + :author => User.find(1)) + a.save! + diskfile = a.diskfile + assert File.exist?(diskfile) + + Attachment.transaction do + a.destroy + raise ActiveRecord::Rollback + end + assert File.exist?(diskfile) + end +end