aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test/cases/repair_helper.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord/test/cases/repair_helper.rb')
-rw-r--r--activerecord/test/cases/repair_helper.rb50
1 files changed, 50 insertions, 0 deletions
diff --git a/activerecord/test/cases/repair_helper.rb b/activerecord/test/cases/repair_helper.rb
new file mode 100644
index 0000000000..0155668811
--- /dev/null
+++ b/activerecord/test/cases/repair_helper.rb
@@ -0,0 +1,50 @@
+module ActiveRecord
+ module Testing
+ module RepairHelper
+ def self.included(base)
+ base.class_eval do
+ extend ClassMethods
+ end
+ end
+
+ module Toolbox
+ def self.record_validations(*model_classes)
+ model_classes.inject({}) do |repair, klass|
+ repair[klass] ||= {}
+ [:validate, :validate_on_create, :validate_on_update].each do |callback|
+ the_callback = klass.instance_variable_get("@#{callback.to_s}_callbacks")
+ repair[klass][callback] = (the_callback.nil? ? nil : the_callback.dup)
+ end
+ repair
+ end
+ end
+
+ def self.reset_validations(recorded)
+ recorded.each do |klass, repairs|
+ [:validate, :validate_on_create, :validate_on_update].each do |callback|
+ klass.instance_variable_set("@#{callback.to_s}_callbacks", repairs[callback])
+ end
+ end
+ end
+ end
+
+ module ClassMethods
+ def repair_validations(*model_classes)
+ setup do
+ @validation_repairs = ActiveRecord::Testing::RepairHelper::Toolbox.record_validations(*model_classes)
+ end
+ teardown do
+ ActiveRecord::Testing::RepairHelper::Toolbox.reset_validations(@validation_repairs)
+ end
+ end
+ end
+
+ def repair_validations(*model_classes, &block)
+ validation_repairs = ActiveRecord::Testing::RepairHelper::Toolbox.record_validations(*model_classes)
+ return block.call
+ ensure
+ ActiveRecord::Testing::RepairHelper::Toolbox.reset_validations(validation_repairs)
+ end
+ end
+ end
+end