test/paranoia_test.rb in paranoia-1.3.4 vs test/paranoia_test.rb in paranoia-2.0.0
- old
+ new
@@ -1,28 +1,24 @@
require 'test/unit'
require 'active_record'
-require File.expand_path(File.dirname(__FILE__) + '/../lib/paranoia')
+require File.expand_path(File.dirname(__FILE__) + "/../lib/paranoia")
DB_FILE = 'tmp/test_db'
FileUtils.mkdir_p File.dirname(DB_FILE)
FileUtils.rm_f DB_FILE
ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :database => DB_FILE
ActiveRecord::Base.connection.execute 'CREATE TABLE parent_models (id INTEGER NOT NULL PRIMARY KEY, deleted_at DATETIME)'
ActiveRecord::Base.connection.execute 'CREATE TABLE paranoid_models (id INTEGER NOT NULL PRIMARY KEY, parent_model_id INTEGER, deleted_at DATETIME)'
-ActiveRecord::Base.connection.execute 'CREATE TABLE paranoid_model_with_belongs (id INTEGER NOT NULL PRIMARY KEY, parent_model_id INTEGER, deleted_at DATETIME, paranoid_model_with_has_one_id INTEGER)'
ActiveRecord::Base.connection.execute 'CREATE TABLE featureful_models (id INTEGER NOT NULL PRIMARY KEY, deleted_at DATETIME, name VARCHAR(32))'
ActiveRecord::Base.connection.execute 'CREATE TABLE plain_models (id INTEGER NOT NULL PRIMARY KEY, deleted_at DATETIME)'
ActiveRecord::Base.connection.execute 'CREATE TABLE callback_models (id INTEGER NOT NULL PRIMARY KEY, deleted_at DATETIME)'
-ActiveRecord::Base.connection.execute 'CREATE TABLE fail_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
@@ -61,88 +57,38 @@
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
model.destroy
assert_equal false, model.deleted_at.nil?
- assert_equal false, model.really_destroyed?
assert_equal 0, model.class.count
assert_equal 1, model.class.unscoped.count
end
-
+
def test_scoping_behavior_for_paranoid_models
ParanoidModel.unscoped.delete_all
parent1 = ParentModel.create
parent2 = ParentModel.create
p1 = ParanoidModel.create(:parent_model => parent1)
p2 = ParanoidModel.create(:parent_model => parent2)
p1.destroy
p2.destroy
assert_equal 0, parent1.paranoid_models.count
assert_equal 1, parent1.paranoid_models.only_deleted.count
- assert_equal 1, parent1.paranoid_models.deleted.count
p3 = ParanoidModel.create(:parent_model => parent1)
assert_equal 2, parent1.paranoid_models.with_deleted.count
- assert_equal [p1, p3], parent1.paranoid_models.with_deleted
+ 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
@@ -154,12 +100,12 @@
assert_equal 1, model.class.unscoped.count
end
# Regression test for #24
def test_chaining_for_paranoid_models
- scope = FeaturefulModel.where(:name => 'foo').only_deleted
- assert_equal 'foo', scope.where_values_hash['name']
+ scope = FeaturefulModel.where(:name => "foo").only_deleted
+ assert_equal "foo", scope.where_values_hash['name']
assert_equal 2, scope.where_values.count
end
def test_only_destroyed_scope_for_paranoid_models
model = ParanoidModel.new
@@ -168,11 +114,10 @@
model2 = ParanoidModel.new
model2.save
assert_equal model, ParanoidModel.only_deleted.last
assert_equal false, ParanoidModel.only_deleted.include?(model2)
- assert_equal false, ParanoidModel.deleted.include?(model2)
end
def test_default_scope_for_has_many_relationships
parent = ParentModel.create
assert_equal 0, parent.related_models.count
@@ -216,18 +161,18 @@
def test_delete_behavior_for_callbacks
model = CallbackModel.new
model.save
model.delete
- assert_equal nil, model.instance_variable_get(:@destroy_callback_called)
+ assert_equal nil, model.instance_variable_get(:@callback_called)
end
def test_destroy_behavior_for_callbacks
model = CallbackModel.new
model.save
model.destroy
- assert model.instance_variable_get(:@destroy_callback_called)
+ assert model.instance_variable_get(:@callback_called)
end
def test_restore
model = ParanoidModel.new
model.save
@@ -241,205 +186,29 @@
model.reload
assert_equal false, model.destroyed?
end
- # Regression test for #92
- def test_destroy_twice
+ def test_real_destroy
model = ParanoidModel.new
model.save
- model.destroy
- model.destroy
-
- assert_equal 1, ParanoidModel.unscoped.where(id: model.id).count
- end
-
- def test_destroy_return_value_on_success
- model = ParanoidModel.create
- return_value = model.destroy
-
- assert_equal(return_value, model)
- end
-
- def test_destroy_return_value_on_failure
- model = FailCallbackModel.create
- return_value = model.destroy
-
- assert_equal(return_value, false)
- end
-
- def test_restore_behavior_for_callbacks
- model = CallbackModel.new
- model.save
- id = model.id
- model.destroy
-
- assert model.destroyed?
-
- model = CallbackModel.only_deleted.find(id)
- model.restore!
- model.reload
-
- assert model.instance_variable_get(:@restore_callback_called)
- end
-
- def test_really_destroy
- model = ParanoidModel.new
- model.save
model.destroy!
- assert_equal 0, ParanoidModel.unscoped.where(id: model.id).count
+ refute ParanoidModel.unscoped.exists?(model.id)
end
- def test_really_destroyed
- model = ParanoidModel.new
- model.save
- model.destroy!
-
- assert model.really_destroyed?
- end
-
- def test_real_destroy_dependent_destroy
- parent = ParentModel.create
- child = parent.very_related_models.create
- parent.really_destroy!
- refute RelatedModel.unscoped.exists?(child.id)
- end
-
- def test_real_destroy_dependent_destroy_after_normal_destroy
- parent = ParentModel.create
- child = parent.very_related_models.create
- parent.destroy
- parent.really_destroy!
- refute RelatedModel.unscoped.exists?(child.id)
- end
-
- def test_real_destroy_dependent_destroy_after_normal_destroy_does_not_delete_other_children
- parent_1 = ParentModel.create
- child_1 = parent_1.very_related_models.create
-
- parent_2 = ParentModel.create
- child_2 = parent_2.very_related_models.create
- parent_1.destroy
- parent_1.really_destroy!
- assert RelatedModel.unscoped.exists?(child_2.id)
- end
-
def test_real_delete
model = ParanoidModel.new
model.save
model.delete!
- assert_equal 0, ParanoidModel.unscoped.where(id: model.id).count
- end
- def test_multiple_restore
- a = ParanoidModel.new
- a.save
- a_id = a.id
- a.destroy
-
- b = ParanoidModel.new
- b.save
- b_id = b.id
- b.destroy
-
- c = ParanoidModel.new
- c.save
- c_id = c.id
- c.destroy
-
- ParanoidModel.restore([a_id, c_id])
-
- a.reload
- b.reload
- c.reload
-
- refute a.destroyed?
- assert b.destroyed?
- refute c.destroyed?
+ refute ParanoidModel.unscoped.exists?(model.id)
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
-
- # regression tests for #118
- def test_restore_with_has_one_association
- # setup and destroy test objects
- hasOne = ParanoidModelWithHasOne.create
- belongsTo = ParanoidModelWithBelong.create
- hasOne.paranoid_model_with_belong = belongsTo
- hasOne.save!
-
- hasOne.destroy
- assert_equal false, hasOne.deleted_at.nil?
- assert_equal false, belongsTo.deleted_at.nil?
-
- # Does it restore has_one associations?
- hasOne.restore(:recursive => true)
- hasOne.save!
-
- assert_equal true, hasOne.reload.deleted_at.nil?
- assert_equal true, belongsTo.reload.deleted_at.nil?, "#{belongsTo.deleted_at}"
- assert ParanoidModelWithBelong.with_deleted.reload.count != 0, "There should be a record"
- end
-
- def test_restore_with_nil_has_one_association
- # setup and destroy test object
- hasOne = ParanoidModelWithHasOne.create
- hasOne.destroy
- assert_equal false, hasOne.reload.deleted_at.nil?
-
- # Does it raise NoMethodException on restore of nil
- hasOne.restore(:recursive => true)
-
- assert hasOne.reload.deleted_at.nil?
- 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')
+ FeaturefulModel.new(:name => "not empty")
end
end
# Helper classes
@@ -450,47 +219,26 @@
class ParanoidModel < ActiveRecord::Base
belongs_to :parent_model
acts_as_paranoid
end
-class FailCallbackModel < ActiveRecord::Base
- belongs_to :parent_model
- acts_as_paranoid
-
- before_destroy { |_| false }
-end
-
class FeaturefulModel < ActiveRecord::Base
acts_as_paranoid
validates :name, :presence => true, :uniqueness => true
end
class PlainModel < ActiveRecord::Base
end
class CallbackModel < ActiveRecord::Base
acts_as_paranoid
- 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
+ before_destroy {|model| model.instance_variable_set :@callback_called, true }
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
@@ -510,37 +258,6 @@
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
-
-# refer back to regression test for #118
-class ParanoidModelWithHasOne < ParanoidModel
- has_one :paranoid_model_with_belong, :dependent => :destroy
-end
-
-class ParanoidModelWithBelong < ActiveRecord::Base
- acts_as_paranoid
- belongs_to :paranoid_model_with_has_one
end