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