mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
Move metal above method piggybacking middleware and add some test coverage
This commit is contained in:
@@ -1,6 +1,14 @@
|
||||
module ActionController
|
||||
class MiddlewareStack < Array
|
||||
class Middleware
|
||||
def self.new(klass, *args, &block)
|
||||
if klass.is_a?(self)
|
||||
klass
|
||||
else
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
attr_reader :args, :block
|
||||
|
||||
def initialize(klass, *args, &block)
|
||||
@@ -65,6 +73,19 @@ module ActionController
|
||||
block.call(self) if block_given?
|
||||
end
|
||||
|
||||
def insert(index, *objs)
|
||||
index = self.index(index) unless index.is_a?(Integer)
|
||||
objs = objs.map { |obj| Middleware.new(obj) }
|
||||
super(index, *objs)
|
||||
end
|
||||
|
||||
alias_method :insert_before, :insert
|
||||
|
||||
def insert_after(index, *objs)
|
||||
index = self.index(index) unless index.is_a?(Integer)
|
||||
insert(index + 1, *objs)
|
||||
end
|
||||
|
||||
def use(*args, &block)
|
||||
middleware = Middleware.new(*args, &block)
|
||||
push(middleware)
|
||||
|
||||
70
actionpack/test/controller/middleware_stack_test.rb
Normal file
70
actionpack/test/controller/middleware_stack_test.rb
Normal file
@@ -0,0 +1,70 @@
|
||||
require 'abstract_unit'
|
||||
|
||||
class MiddlewareStackTest < ActiveSupport::TestCase
|
||||
class FooMiddleware; end
|
||||
class BarMiddleware; end
|
||||
class BazMiddleware; end
|
||||
|
||||
def setup
|
||||
@stack = ActionController::MiddlewareStack.new
|
||||
@stack.use FooMiddleware
|
||||
@stack.use BarMiddleware
|
||||
end
|
||||
|
||||
test "use should push middleware as class onto the stack" do
|
||||
assert_difference "@stack.size" do
|
||||
@stack.use BazMiddleware
|
||||
end
|
||||
assert_equal BazMiddleware, @stack.last.klass
|
||||
end
|
||||
|
||||
test "use should push middleware as a string onto the stack" do
|
||||
assert_difference "@stack.size" do
|
||||
@stack.use "MiddlewareStackTest::BazMiddleware"
|
||||
end
|
||||
assert_equal BazMiddleware, @stack.last.klass
|
||||
end
|
||||
|
||||
test "use should push middleware as a symbol onto the stack" do
|
||||
assert_difference "@stack.size" do
|
||||
@stack.use :"MiddlewareStackTest::BazMiddleware"
|
||||
end
|
||||
assert_equal BazMiddleware, @stack.last.klass
|
||||
end
|
||||
|
||||
test "use should push middleware class with arguments onto the stack" do
|
||||
assert_difference "@stack.size" do
|
||||
@stack.use BazMiddleware, true, :foo => "bar"
|
||||
end
|
||||
assert_equal BazMiddleware, @stack.last.klass
|
||||
assert_equal([true, {:foo => "bar"}], @stack.last.args)
|
||||
end
|
||||
|
||||
test "insert inserts middleware at the integer index" do
|
||||
@stack.insert(1, BazMiddleware)
|
||||
assert_equal BazMiddleware, @stack[1].klass
|
||||
end
|
||||
|
||||
test "insert_after inserts middleware after the integer index" do
|
||||
@stack.insert_after(1, BazMiddleware)
|
||||
assert_equal BazMiddleware, @stack[2].klass
|
||||
end
|
||||
|
||||
test "insert_before inserts middleware before another middleware class" do
|
||||
@stack.insert_before(BarMiddleware, BazMiddleware)
|
||||
assert_equal BazMiddleware, @stack[1].klass
|
||||
end
|
||||
|
||||
test "insert_after inserts middleware after another middleware class" do
|
||||
@stack.insert_after(BarMiddleware, BazMiddleware)
|
||||
assert_equal BazMiddleware, @stack[2].klass
|
||||
end
|
||||
|
||||
test "active returns all only enabled middleware" do
|
||||
assert_no_difference "@stack.active.size" do
|
||||
assert_difference "@stack.size" do
|
||||
@stack.use BazMiddleware, :if => lambda { false }
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user