Merged updates from trunk into stable branch
[feedcatcher.git] / vendor / rails / activerecord / test / cases / repair_helper.rb
1 module ActiveRecord
2 module Testing
3 module RepairHelper
4 def self.included(base)
5 base.class_eval do
6 extend ClassMethods
7 end
8 end
9
10 module Toolbox
11 def self.record_validations(*model_classes)
12 model_classes.inject({}) do |repair, klass|
13 repair[klass] ||= {}
14 [:validate, :validate_on_create, :validate_on_update].each do |callback|
15 the_callback = klass.instance_variable_get("@#{callback.to_s}_callbacks")
16 repair[klass][callback] = (the_callback.nil? ? nil : the_callback.dup)
17 end
18 repair
19 end
20 end
21
22 def self.reset_validations(recorded)
23 recorded.each do |klass, repairs|
24 [:validate, :validate_on_create, :validate_on_update].each do |callback|
25 klass.instance_variable_set("@#{callback.to_s}_callbacks", repairs[callback])
26 end
27 end
28 end
29 end
30
31 module ClassMethods
32 def repair_validations(*model_classes)
33 setup do
34 @validation_repairs = ActiveRecord::Testing::RepairHelper::Toolbox.record_validations(*model_classes)
35 end
36 teardown do
37 ActiveRecord::Testing::RepairHelper::Toolbox.reset_validations(@validation_repairs)
38 end
39 end
40 end
41
42 def repair_validations(*model_classes, &block)
43 validation_repairs = ActiveRecord::Testing::RepairHelper::Toolbox.record_validations(*model_classes)
44 return block.call
45 ensure
46 ActiveRecord::Testing::RepairHelper::Toolbox.reset_validations(validation_repairs)
47 end
48 end
49 end
50 end