提交 ed2e776b 编写于 作者: J Joshua Peek

Move metal above method piggybacking middleware and add some test coverage

上级 f7ee082b
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 @@ def initialize(*args, &block)
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)
......
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
......@@ -537,7 +537,7 @@ def initialize_i18n
end
def initialize_metal
configuration.middleware.use Rails::Rack::Metal
configuration.middleware.insert_before(:"ActionController::VerbPiggybacking", Rails::Rack::Metal)
end
# Initializes framework-specific settings for each of the loaded frameworks
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册