aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test/callbacks_test.rb
diff options
context:
space:
mode:
authorJamis Buck <jamis@37signals.com>2005-06-13 10:52:53 +0000
committerJamis Buck <jamis@37signals.com>2005-06-13 10:52:53 +0000
commite0537acaeb6c432db844ff835120de7aabb1e39b (patch)
tree230eb2ffda95892d3997ccf5fb6ac8d826d3c596 /activerecord/test/callbacks_test.rb
parent76e4c1a5584c814a761acee6dc36af589e5fe5be (diff)
downloadrails-e0537acaeb6c432db844ff835120de7aabb1e39b.tar.gz
rails-e0537acaeb6c432db844ff835120de7aabb1e39b.tar.bz2
rails-e0537acaeb6c432db844ff835120de7aabb1e39b.zip
Added ActiveRecord::Recursion to guard against recursive calls to #save
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1411 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activerecord/test/callbacks_test.rb')
-rw-r--r--activerecord/test/callbacks_test.rb39
1 files changed, 37 insertions, 2 deletions
diff --git a/activerecord/test/callbacks_test.rb b/activerecord/test/callbacks_test.rb
index 391ce5871a..2e3bf54a86 100644
--- a/activerecord/test/callbacks_test.rb
+++ b/activerecord/test/callbacks_test.rb
@@ -1,9 +1,9 @@
require 'abstract_unit'
class CallbackDeveloper < ActiveRecord::Base
- class << self
- def table_name; 'developers' end
+ set_table_name 'developers'
+ class << self
def callback_string(callback_method)
"history << [#{callback_method.to_sym.inspect}, :string]"
end
@@ -49,6 +49,27 @@ class CallbackDeveloper < ActiveRecord::Base
end
end
+class RecursiveCallbackDeveloper < ActiveRecord::Base
+ set_table_name 'developers'
+
+ before_save :on_before_save
+ after_save :on_after_save
+
+ attr_reader :on_before_save_called, :on_after_save_called
+
+ def on_before_save
+ @on_before_save_called ||= 0
+ @on_before_save_called += 1
+ save unless @on_before_save_called > 1
+ end
+
+ def on_after_save
+ @on_after_save_called ||= 0
+ @on_after_save_called += 1
+ save unless @on_after_save_called > 1
+ end
+end
+
class CallbacksTest < Test::Unit::TestCase
fixtures :developers
@@ -283,4 +304,18 @@ class CallbacksTest < Test::Unit::TestCase
[ :before_validation, :returning_false ]
], david.history
end
+
+ def test_save_not_called_recursively
+ david = RecursiveCallbackDeveloper.find(1)
+ david.save
+ assert_equal 1, david.on_before_save_called
+ assert_equal 1, david.on_after_save_called
+ end
+
+ def test_save_bang_not_called_recursively
+ david = RecursiveCallbackDeveloper.find(1)
+ david.save!
+ assert_equal 1, david.on_before_save_called
+ assert_equal 1, david.on_after_save_called
+ end
end