Skip to content

Commit

Permalink
Move metal above method piggybacking middleware and add some test cov…
Browse files Browse the repository at this point in the history
…erage
  • Loading branch information
josh committed Jan 4, 2009
1 parent f7ee082 commit ed2e776
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 1 deletion.
21 changes: 21 additions & 0 deletions actionpack/lib/action_controller/middleware_stack.rb
@@ -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)
Expand Down Expand Up @@ -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)
Expand Down
70 changes: 70 additions & 0 deletions actionpack/test/controller/middleware_stack_test.rb
@@ -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
2 changes: 1 addition & 1 deletion railties/lib/initializer.rb
Expand Up @@ -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
Expand Down

0 comments on commit ed2e776

Please sign in to comment.