diff options
Diffstat (limited to 'actionpack')
-rw-r--r-- | actionpack/test/abstract_controller/callbacks_test.rb | 217 |
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 |