aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack')
-rw-r--r--actionpack/test/abstract_controller/callbacks_test.rb217
1 files changed, 217 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..2657a31ca9
--- /dev/null
+++ b/actionpack/test/abstract_controller/callbacks_test.rb
@@ -0,0 +1,217 @@
+$:.unshift(File.dirname(__FILE__) + '/../../lib')
+$:.unshift(File.dirname(__FILE__) + '/../../../activesupport/lib')
+
+require 'test/unit'
+require 'active_support'
+require 'active_support/test_case'
+require 'action_controller'
+require 'action_view/base'
+
+begin
+ require 'ruby-debug'
+ Debugger.settings[:autoeval] = true
+ Debugger.start
+rescue LoadError
+ # Debugging disabled. `gem install ruby-debug` to enable.
+end
+
+require 'action_controller/abstract/base'
+require 'action_controller/abstract/renderer'
+require 'action_controller/abstract/layouts'
+require 'action_controller/abstract/callbacks'
+
+module AbstractController
+ module Testing
+
+ class ControllerWithCallbacks < AbstractController::Base
+ include 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