Skip to content
This repository
tree: c1aa5b0e14
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 197 lines (157 sloc) 5.733 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 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
Something went wrong with that request. Please try again.