Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

root/trunk/activesupport/test/callbacks_test.rb

Revision 9055, 3.2 kB (checked in by bitsweat, 7 months ago)

Refactor filters to use Active Support callbacks. Closes #11235.

Line 
1 require 'abstract_unit'
2
3 class Record
4   include ActiveSupport::Callbacks
5
6   define_callbacks :before_save, :after_save
7
8   class << self
9     def callback_symbol(callback_method)
10       returning("#{callback_method}_method") do |method_name|
11         define_method(method_name) do
12           history << [callback_method, :symbol]
13         end
14       end
15     end
16
17     def callback_string(callback_method)
18       "history << [#{callback_method.to_sym.inspect}, :string]"
19     end
20
21     def callback_proc(callback_method)
22       Proc.new { |model| model.history << [callback_method, :proc] }
23     end
24
25     def callback_object(callback_method)
26       klass = Class.new
27       klass.send(:define_method, callback_method) do |model|
28         model.history << [callback_method, :object]
29       end
30       klass.new
31     end
32   end
33
34   def history
35     @history ||= []
36   end
37 end
38
39 class Person < Record
40   [:before_save, :after_save].each do |callback_method|
41     callback_method_sym = callback_method.to_sym
42     send(callback_method, callback_symbol(callback_method_sym))
43     send(callback_method, callback_string(callback_method_sym))
44     send(callback_method, callback_proc(callback_method_sym))
45     send(callback_method, callback_object(callback_method_sym))
46     send(callback_method) { |model| model.history << [callback_method_sym, :block] }
47   end
48
49   def save
50     run_callbacks(:before_save)
51     run_callbacks(:after_save)
52   end
53 end
54
55 class ConditionalPerson < Record
56   before_save Proc.new { |r| r.history << [:before_save, :proc] }, :if => Proc.new { |r| true }
57   before_save Proc.new { |r| r.history << "b00m" }, :if => Proc.new { |r| false }
58   before_save Proc.new { |r| r.history << [:before_save, :proc] }, :unless => Proc.new { |r| false }
59   before_save Proc.new { |r| r.history << "b00m" }, :unless => Proc.new { |r| true }
60
61   def save
62     run_callbacks(:before_save)
63     run_callbacks(:after_save)
64   end
65 end
66
67 class CallbacksTest < Test::Unit::TestCase
68   def test_save_person
69     person = Person.new
70     assert_equal [], person.history
71     person.save
72     assert_equal [
73       [:before_save, :symbol],
74       [:before_save, :string],
75       [:before_save, :proc],
76       [:before_save, :object],
77       [:before_save, :block],
78       [:after_save, :symbol],
79       [:after_save, :string],
80       [:after_save, :proc],
81       [:after_save, :object],
82       [:after_save, :block]
83     ], person.history
84   end
85 end
86
87 class ConditionalCallbackTest < Test::Unit::TestCase
88   def test_save_conditional_person
89     person = ConditionalPerson.new
90     person.save
91     assert_equal [
92       [:before_save, :proc],
93       [:before_save, :proc]
94     ], person.history
95   end
96 end
97
98 class CallbackTest < Test::Unit::TestCase
99   def test_eql
100     callback = Callback.new(:before, :save, :identifier => :lifesaver)
101     assert callback.eql?(Callback.new(:before, :save, :identifier => :lifesaver))
102     assert callback.eql?(Callback.new(:before, :save))
103     assert callback.eql?(:lifesaver)
104     assert callback.eql?(:save)
105     assert !callback.eql?(Callback.new(:before, :destroy))
106     assert !callback.eql?(:destroy)
107   end
108
109   def test_dup
110     a = Callback.new(:before, :save)
111     assert_equal({}, a.options)
112     b = a.dup
113     b.options[:unless] = :pigs_fly
114     assert_equal({:unless => :pigs_fly}, b.options)
115     assert_equal({}, a.options)
116   end
117 end
Note: See TracBrowser for help on using the browser.