aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/test/abstract_controller/callbacks_test.rb
diff options
context:
space:
mode:
authorPratik Naik <pratiknaik@gmail.com>2009-04-22 15:26:03 +0100
committerPratik Naik <pratiknaik@gmail.com>2009-04-22 15:26:03 +0100
commit5f3f100ce2d689480da85abc88e5e940cf90189e (patch)
tree15c1a05a5308a9eea56d7f0889ac46d9cac5b57c /actionpack/test/abstract_controller/callbacks_test.rb
parentd758d996d1b66e2a65640f79f01ce2ac674d7ed5 (diff)
parentca49299434bc764b667cd86846d892e91a150ef3 (diff)
downloadrails-5f3f100ce2d689480da85abc88e5e940cf90189e.tar.gz
rails-5f3f100ce2d689480da85abc88e5e940cf90189e.tar.bz2
rails-5f3f100ce2d689480da85abc88e5e940cf90189e.zip
Merge branch 'master' into active_model
Conflicts: activeresource/lib/active_resource/validations.rb
Diffstat (limited to 'actionpack/test/abstract_controller/callbacks_test.rb')
-rw-r--r--actionpack/test/abstract_controller/callbacks_test.rb197
1 files changed, 197 insertions, 0 deletions
diff --git a/actionpack/test/abstract_controller/callbacks_test.rb b/actionpack/test/abstract_controller/callbacks_test.rb
new file mode 100644
index 0000000000..5fce30f478
--- /dev/null
+++ b/actionpack/test/abstract_controller/callbacks_test.rb
@@ -0,0 +1,197 @@
+require File.join(File.expand_path(File.dirname(__FILE__)), "test_helper")
+
+module AbstractController
+ module Testing
+
+ class ControllerWithCallbacks < AbstractController::Base
+ use AbstractController::Callbacks
+ end
+
+ class Callback1 < ControllerWithCallbacks
+ process_action_callback :before, :first
+
+ def first
+ @text = "Hello world"
+ end
+
+ def index
+ self.response_body = @text
+ end
+ end
+
+ class TestCallbacks < ActiveSupport::TestCase
+ test "basic callbacks work" do
+ result = Callback1.process(:index)
+ assert_equal "Hello world", result.response_obj[:body]
+ end
+ end
+
+ class Callback2 < ControllerWithCallbacks
+ before_filter :first
+ after_filter :second
+ around_filter :aroundz
+
+ def first
+ @text = "Hello world"
+ end
+
+ def second
+ @second = "Goodbye"
+ end
+
+ def aroundz
+ @aroundz = "FIRST"
+ yield
+ @aroundz << "SECOND"
+ end
+
+ def index
+ self.response_body = @text
+ end
+ end
+
+ class TestCallbacks < ActiveSupport::TestCase
+ test "before_filter works" do
+ result = Callback2.process(:index)
+ assert_equal "Hello world", result.response_obj[:body]
+ end
+
+ test "after_filter works" do
+ result = Callback2.process(:index)
+ assert_equal "Goodbye", result.instance_variable_get("@second")
+ end
+
+ test "around_filter works" do
+ result = Callback2.process(:index)
+ assert_equal "FIRSTSECOND", result.instance_variable_get("@aroundz")
+ end
+ end
+
+ class Callback3 < ControllerWithCallbacks
+ before_filter do |c|
+ c.instance_variable_set("@text", "Hello world")
+ end
+
+ after_filter do |c|
+ c.instance_variable_set("@second", "Goodbye")
+ end
+
+ def index
+ self.response_body = @text
+ end
+ end
+
+ class TestCallbacks < ActiveSupport::TestCase
+ test "before_filter works with procs" do
+ result = Callback3.process(:index)
+ assert_equal "Hello world", result.response_obj[:body]
+ end
+
+ test "after_filter works with procs" do
+ result = Callback3.process(:index)
+ assert_equal "Goodbye", result.instance_variable_get("@second")
+ end
+ end
+
+ class CallbacksWithConditions < ControllerWithCallbacks
+ before_filter :list, :only => :index
+ before_filter :authenticate, :except => :index
+
+ def index
+ self.response_body = @list.join(", ")
+ end
+
+ def sekrit_data
+ self.response_body = (@list + [@authenticated]).join(", ")
+ end
+
+ private
+ def list
+ @list = ["Hello", "World"]
+ end
+
+ def authenticate
+ @list = []
+ @authenticated = "true"
+ end
+ end
+
+ class TestCallbacks < ActiveSupport::TestCase
+ test "when :only is specified, a before filter is triggered on that action" do
+ result = CallbacksWithConditions.process(:index)
+ assert_equal "Hello, World", result.response_obj[:body]
+ end
+
+ test "when :only is specified, a before filter is not triggered on other actions" do
+ result = CallbacksWithConditions.process(:sekrit_data)
+ assert_equal "true", result.response_obj[:body]
+ end
+
+ test "when :except is specified, an after filter is not triggered on that action" do
+ result = CallbacksWithConditions.process(:index)
+ assert_nil result.instance_variable_get("@authenticated")
+ end
+ end
+
+ class CallbacksWithArrayConditions < ControllerWithCallbacks
+ before_filter :list, :only => [:index, :listy]
+ before_filter :authenticate, :except => [:index, :listy]
+
+ def index
+ self.response_body = @list.join(", ")
+ end
+
+ def sekrit_data
+ self.response_body = (@list + [@authenticated]).join(", ")
+ end
+
+ private
+ def list
+ @list = ["Hello", "World"]
+ end
+
+ def authenticate
+ @list = []
+ @authenticated = "true"
+ end
+ end
+
+ class TestCallbacks < ActiveSupport::TestCase
+ test "when :only is specified with an array, a before filter is triggered on that action" do
+ result = CallbacksWithArrayConditions.process(:index)
+ assert_equal "Hello, World", result.response_obj[:body]
+ end
+
+ test "when :only is specified with an array, a before filter is not triggered on other actions" do
+ result = CallbacksWithArrayConditions.process(:sekrit_data)
+ assert_equal "true", result.response_obj[:body]
+ end
+
+ test "when :except is specified with an array, an after filter is not triggered on that action" do
+ result = CallbacksWithArrayConditions.process(:index)
+ assert_nil result.instance_variable_get("@authenticated")
+ end
+ end
+
+ class ChangedConditions < Callback2
+ before_filter :first, :only => :index
+
+ def not_index
+ self.response_body = @text.to_s
+ end
+ end
+
+ class TestCallbacks < ActiveSupport::TestCase
+ test "when a callback is modified in a child with :only, it works for the :only action" do
+ result = ChangedConditions.process(:index)
+ assert_equal "Hello world", result.response_obj[:body]
+ end
+
+ test "when a callback is modified in a child with :only, it does not work for other actions" do
+ result = ChangedConditions.process(:not_index)
+ assert_equal "", result.response_obj[:body]
+ end
+ end
+
+ end
+end \ No newline at end of file