test/paranoia_test.rb in paranoia-1.3.2 vs test/paranoia_test.rb in paranoia-1.3.3

- old
+ new

@@ -15,10 +15,12 @@ ActiveRecord::Base.connection.execute 'CREATE TABLE callback_models (id INTEGER NOT NULL PRIMARY KEY, deleted_at DATETIME)' ActiveRecord::Base.connection.execute 'CREATE TABLE related_models (id INTEGER NOT NULL PRIMARY KEY, parent_model_id INTEGER NOT NULL, deleted_at DATETIME)' ActiveRecord::Base.connection.execute 'CREATE TABLE employers (id INTEGER NOT NULL PRIMARY KEY, deleted_at DATETIME)' ActiveRecord::Base.connection.execute 'CREATE TABLE employees (id INTEGER NOT NULL PRIMARY KEY, deleted_at DATETIME)' ActiveRecord::Base.connection.execute 'CREATE TABLE jobs (id INTEGER NOT NULL PRIMARY KEY, employer_id INTEGER NOT NULL, employee_id INTEGER NOT NULL, deleted_at DATETIME)' +ActiveRecord::Base.connection.execute 'CREATE TABLE custom_column_models (id INTEGER NOT NULL PRIMARY KEY, destroyed_at DATETIME)' +ActiveRecord::Base.connection.execute 'CREATE TABLE non_paranoid_models (id INTEGER NOT NULL PRIMARY KEY, parent_model_id INTEGER)' class ParanoiaTest < Test::Unit::TestCase def test_plain_model_class_is_not_paranoid assert_equal false, PlainModel.paranoid? end @@ -57,10 +59,41 @@ assert_equal 0, model.class.count assert_equal 0, model.class.unscoped.count end + # Anti-regression test for #81, which would've introduced a bug to break this test. + def test_destroy_behavior_for_plain_models_callbacks + model = CallbackModel.new + model.save + model.remove_called_variables # clear called callback flags + model.destroy + + assert_equal nil, model.instance_variable_get(:@update_callback_called) + assert_equal nil, model.instance_variable_get(:@save_callback_called) + assert_equal nil, model.instance_variable_get(:@validate_called) + + assert model.instance_variable_get(:@destroy_callback_called) + assert model.instance_variable_get(:@after_destroy_callback_called) + assert model.instance_variable_get(:@after_commit_callback_called) + end + + + def test_delete_behavior_for_plain_models_callbacks + model = CallbackModel.new + model.save + model.remove_called_variables # clear called callback flags + model.delete + + assert_equal nil, model.instance_variable_get(:@update_callback_called) + assert_equal nil, model.instance_variable_get(:@save_callback_called) + assert_equal nil, model.instance_variable_get(:@validate_called) + assert_equal nil, model.instance_variable_get(:@destroy_callback_called) + assert_equal nil, model.instance_variable_get(:@after_destroy_callback_called) + assert_equal nil, model.instance_variable_get(:@after_commit_callback_called) + end + def test_destroy_behavior_for_paranoid_models model = ParanoidModel.new assert_equal 0, model.class.count model.save! assert_equal 1, model.class.count @@ -86,10 +119,27 @@ p3 = ParanoidModel.create(:parent_model => parent1) assert_equal 2, parent1.paranoid_models.with_deleted.count assert_equal [p1, p3], parent1.paranoid_models.with_deleted end + def test_destroy_behavior_for_custom_column_models + model = CustomColumnModel.new + assert_equal 0, model.class.count + model.save! + assert_nil model.destroyed_at + assert_equal 1, model.class.count + model.destroy + + assert_equal false, model.destroyed_at.nil? + assert model.destroyed? + + assert_equal 0, model.class.count + assert_equal 1, model.class.unscoped.count + assert_equal 1, model.class.only_deleted.count + assert_equal 1, model.class.deleted.count + end + def test_destroy_behavior_for_featureful_paranoid_models model = get_featureful_model assert_equal 0, model.class.count model.save! assert_equal 1, model.class.count @@ -163,18 +213,18 @@ def test_delete_behavior_for_callbacks model = CallbackModel.new model.save model.delete - assert_equal nil, model.instance_variable_get(:@callback_called) + assert_equal nil, model.instance_variable_get(:@destroy_callback_called) end def test_destroy_behavior_for_callbacks model = CallbackModel.new model.save model.destroy - assert model.instance_variable_get(:@callback_called) + assert model.instance_variable_get(:@destroy_callback_called) end def test_restore model = ParanoidModel.new model.save @@ -188,17 +238,18 @@ model.reload assert_equal false, model.destroyed? end + # Regression test for #92 def test_destroy_twice model = ParanoidModel.new model.save model.destroy model.destroy - assert_equal 0, ParanoidModel.unscoped.where(id: model.id).count + assert_equal 1, ParanoidModel.unscoped.where(id: model.id).count end def test_restore_behavior_for_callbacks model = CallbackModel.new model.save @@ -254,10 +305,54 @@ refute a.destroyed? assert b.destroyed? refute c.destroyed? end + def test_restore_with_associations + parent = ParentModel.create + first_child = parent.very_related_models.create + second_child = parent.non_paranoid_models.create + + parent.destroy + assert_equal false, parent.deleted_at.nil? + assert_equal false, first_child.reload.deleted_at.nil? + assert_equal true, second_child.destroyed? + + parent.restore! + assert_equal true, parent.deleted_at.nil? + assert_equal false, first_child.reload.deleted_at.nil? + assert_equal true, second_child.destroyed? + + parent.destroy + parent.restore(:recursive => true) + assert_equal true, parent.deleted_at.nil? + assert_equal true, first_child.reload.deleted_at.nil? + assert_equal true, second_child.destroyed? + + parent.destroy + ParentModel.restore(parent.id, :recursive => true) + assert_equal true, parent.reload.deleted_at.nil? + assert_equal true, first_child.reload.deleted_at.nil? + assert_equal true, second_child.destroyed? + end + + def test_observers_notified + a = ParanoidModelWithObservers.create + a.destroy + a.restore! + + assert a.observers_notified.select {|args| args == [:before_restore, a]} + assert a.observers_notified.select {|args| args == [:after_restore, a]} + end + + def test_observers_not_notified_if_not_supported + a = ParanoidModelWithObservers.create + a.destroy + a.restore! + # essentially, we're just ensuring that this doesn't crash + end + private def get_featureful_model FeaturefulModel.new(:name => 'not empty') end end @@ -281,17 +376,30 @@ class PlainModel < ActiveRecord::Base end class CallbackModel < ActiveRecord::Base acts_as_paranoid - before_destroy {|model| model.instance_variable_set :@callback_called, true } + before_destroy {|model| model.instance_variable_set :@destroy_callback_called, true } before_restore {|model| model.instance_variable_set :@restore_callback_called, true } + before_update {|model| model.instance_variable_set :@update_callback_called, true } + before_save {|model| model.instance_variable_set :@save_callback_called, true} + + after_destroy {|model| model.instance_variable_set :@after_destroy_callback_called, true } + after_commit {|model| model.instance_variable_set :@after_commit_callback_called, true } + + validate {|model| model.instance_variable_set :@validate_called, true } + + def remove_called_variables + instance_variables.each {|name| (name.to_s.end_with?('_called')) ? remove_instance_variable(name) : nil} + end end class ParentModel < ActiveRecord::Base acts_as_paranoid has_many :related_models + has_many :very_related_models, :class_name => 'RelatedModel', dependent: :destroy + has_many :non_paranoid_models, dependent: :destroy end class RelatedModel < ActiveRecord::Base acts_as_paranoid belongs_to :parent_model @@ -311,6 +419,27 @@ class Job < ActiveRecord::Base acts_as_paranoid belongs_to :employer belongs_to :employee +end + +class CustomColumnModel < ActiveRecord::Base + acts_as_paranoid column: :destroyed_at +end + +class NonParanoidModel < ActiveRecord::Base +end + +class ParanoidModelWithObservers < ParanoidModel + def observers_notified + @observers_notified ||= [] + end + + def self.notify_observer(*args) + observers_notified << args + end +end + +class ParanoidModelWithoutObservers < ParanoidModel + self.class.send(remove_method :notify_observers) if method_defined?(:notify_observers) end