diff --git a/.gitignore b/.gitignore index 9b94c8cb..27349769 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ gemfiles/*.lock .idea/ .ruby-version coverage/ +test/tmp diff --git a/gemfiles/active_record_52.gemfile b/gemfiles/active_record_52.gemfile index 36dc8cde..6cb38fdc 100644 --- a/gemfiles/active_record_52.gemfile +++ b/gemfiles/active_record_52.gemfile @@ -2,8 +2,10 @@ source "https://rubygems.org" +gem "activejob", "~> 5.2.0", require: "active_job" gem "activerecord", "~> 5.2.0", require: "active_record" gem "activesupport", "~> 5.2.0", require: "active_support" +gem "activestorage", "~> 5.2.0" # Development dependencies group :development do diff --git a/gemfiles/active_record_60.gemfile b/gemfiles/active_record_60.gemfile index 230fd564..f77df242 100644 --- a/gemfiles/active_record_60.gemfile +++ b/gemfiles/active_record_60.gemfile @@ -2,8 +2,10 @@ source "https://rubygems.org" +gem "activejob", "~> 6.0.0", require: "active_job" gem "activerecord", "~> 6.0.0", require: "active_record" gem "activesupport", "~> 6.0.0", require: "active_support" +gem "activestorage", "~> 6.0.0" # Development dependencies group :development do diff --git a/gemfiles/active_record_edge.gemfile b/gemfiles/active_record_edge.gemfile index f51149e0..e8b06de2 100644 --- a/gemfiles/active_record_edge.gemfile +++ b/gemfiles/active_record_edge.gemfile @@ -3,8 +3,10 @@ source "https://rubygems.org" github "rails/rails" do + gem "activejob", require: "active_job" gem "activerecord", require: "active_record" gem "activesupport", require: "active_support" + gem "activestorage" end # Development dependencies diff --git a/test/fixtures/hello.txt b/test/fixtures/hello.txt new file mode 100644 index 00000000..5dd01c17 --- /dev/null +++ b/test/fixtures/hello.txt @@ -0,0 +1 @@ +Hello, world! \ No newline at end of file diff --git a/test/test_active_storage.rb b/test/test_active_storage.rb new file mode 100644 index 00000000..0d5e043b --- /dev/null +++ b/test/test_active_storage.rb @@ -0,0 +1,15 @@ +require "test_helper" + +class ParanoidActiveStorageTest < ParanoidBaseTest + def create_file_blob(filename: "hello.txt", content_type: "text/plain", metadata: nil) + ActiveStorage::Blob.create_after_upload! io: file_fixture(filename).open, filename: filename, content_type: content_type, metadata: metadata + end + + def test_paranoid_active_storage + unless ENABLE_ACTIVE_STORAGE + skip "ActiveStorage is only available for Rails >= 5.2" + end + pt = ParanoidTime.create(main_file: create_file_blob, files: [create_file_blob, create_file_blob], undependent_main_file: create_file_blob, undependent_files: [create_file_blob, create_file_blob]) + pt.destroy + end +end diff --git a/test/test_core.rb b/test/test_core.rb index 6822e52a..f3d9256d 100644 --- a/test/test_core.rb +++ b/test/test_core.rb @@ -451,7 +451,7 @@ def test_paranoid_destroy_with_update_callbacks @paranoid_with_callback.destroy end ParanoidWithCallback.transaction do - @paranoid_with_callback.update_attributes(:name => "still paranoid") + @paranoid_with_callback.update(:name => "still paranoid") end assert_equal 1, @paranoid_with_callback.called_before_destroy diff --git a/test/test_helper.rb b/test/test_helper.rb index fdeaef47..b30e7994 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -17,6 +17,43 @@ require "acts_as_paranoid" require "minitest/autorun" +ENABLE_ACTIVE_STORAGE = ActiveRecord::VERSION::MAJOR > 5 || (ActiveRecord::VERSION::MAJOR == 5 && ActiveRecord::VERSION::MINOR >= 2) +if ENABLE_ACTIVE_STORAGE + # load ActiveStorage + require "global_id" + ActiveRecord::Base.include(GlobalID::Identification) + GlobalID.app = "ActsAsParanoid" + + require "active_job" + ActiveJob::Base.queue_adapter = :test + + require "active_support/cache" + + require "active_storage" + require "active_storage/attached" + require "active_storage/service/disk_service" + if ActiveRecord::VERSION::MAJOR >= 6 + require "active_storage/reflection" + ActiveRecord::Base.include(ActiveStorage::Reflection::ActiveRecordExtensions) + ActiveRecord::Reflection.singleton_class.prepend(ActiveStorage::Reflection::ReflectionExtension) + ActiveRecord::Base.include(ActiveStorage::Attached::Model) + + if ActiveRecord::VERSION::MINOR == 0 + module Rails + def self.autoloaders + Object.new.tap{|o| def o.zeitwerk_enabled?; false; end} + end + end + end + else + ActiveRecord::Base.extend(ActiveStorage::Attached::Macros) + end + $: << "#{Gem.loaded_specs["activestorage"].full_gem_path}/app/models/" + Dir.glob("#{Gem.loaded_specs["activestorage"].full_gem_path}/app/models/active_storage/*").each{|f| require f} + Dir.glob("#{Gem.loaded_specs["activestorage"].full_gem_path}/app/jobs/active_storage/*").each{|f| require f} + ActiveStorage::Blob.service = ActiveStorage::Service::DiskService.new(root: "test/tmp") +end + # Silence deprecation halfway through the test I18n.enforce_available_locales = true @@ -231,6 +268,29 @@ def setup_db timestamps t end + + if ENABLE_ACTIVE_STORAGE + create_table :active_storage_attachments do |t| + t.string :name, null: false + t.string :record_type, null: false + t.bigint :record_id, null: false + t.bigint :blob_id, null: false + t.datetime :created_at, null: false + t.index [:blob_id], name: "index_active_storage_attachments_on_blob_id" + t.index [:record_type, :record_id, :name, :blob_id], name: "index_active_storage_attachments_uniqueness", unique: true + end + + create_table :active_storage_blobs do |t| + t.string :key, null: false + t.string :filename, null: false + t.string :content_type + t.text :metadata + t.bigint :byte_size, null: false + t.string :checksum, null: false + t.datetime :created_at, null: false + t.index [:key], name: "index_active_storage_blobs_on_key", unique: true + end + end end end # rubocop:enable Metrics/AbcSize @@ -247,6 +307,10 @@ def teardown_db end end +def clean_active_storage_attachments + Dir.glob("test/tmp/*").each{|f| FileUtils.rm_r(f)} +end + class ParanoidTime < ActiveRecord::Base acts_as_paranoid @@ -260,6 +324,13 @@ class ParanoidTime < ActiveRecord::Base has_one :has_one_not_paranoid, dependent: :destroy belongs_to :not_paranoid, dependent: :destroy + + if ENABLE_ACTIVE_STORAGE + has_one_attached :main_file + has_many_attached :files + has_one_attached :undependent_main_file, dependent: false + has_many_attached :undependent_files, dependent: false + end end class ParanoidBoolean < ActiveRecord::Base @@ -458,6 +529,10 @@ class ParanoidHasManyAsParent < ActiveRecord::Base end class ParanoidBaseTest < ActiveSupport::TestCase + if ENABLE_ACTIVE_STORAGE + self.file_fixture_path = 'test/fixtures' + end + def setup setup_db @@ -473,6 +548,7 @@ def setup def teardown teardown_db + clean_active_storage_attachments end def assert_empty(collection)