From 42f6e9fb38101c0fe199d5425bd71965f9a6dfc9 Mon Sep 17 00:00:00 2001
From: Jeremy Kemper <jeremy@bitsweat.net>
Date: Fri, 20 Apr 2012 12:17:03 -0700
Subject: Freeze the middleware stack after it's built

So apps that accidentally add middlewares later aren't unwittingly dumping them in a black hole.

Closes #5911
---
 .../test/application/middleware/exceptions_test.rb | 35 +++++++++++-----------
 railties/test/application/middleware_test.rb       |  7 +++++
 2 files changed, 25 insertions(+), 17 deletions(-)

(limited to 'railties')

diff --git a/railties/test/application/middleware/exceptions_test.rb b/railties/test/application/middleware/exceptions_test.rb
index a80898092d..c5048afa13 100644
--- a/railties/test/application/middleware/exceptions_test.rb
+++ b/railties/test/application/middleware/exceptions_test.rb
@@ -17,31 +17,32 @@ module ApplicationTests
     end
 
     test "show exceptions middleware filter backtrace before logging" do
-      my_middleware = Struct.new(:app) do
-        def call(env)
-          raise "Failure"
+      controller :foo, <<-RUBY
+        class FooController < ActionController::Base
+          def index
+            raise 'oops'
+          end
         end
-      end
-
-      app.config.middleware.use my_middleware
+      RUBY
 
-      stringio = StringIO.new
-      Rails.logger = Logger.new(stringio)
+      get "/foo"
+      assert_equal 500, last_response.status
 
-      get "/"
-      assert_no_match(/action_dispatch/, stringio.string)
+      log = File.read(Rails.application.config.paths["log"].first)
+      assert_no_match(/action_dispatch/, log, log)
+      assert_match(/oops/, log, log)
     end
 
     test "renders active record exceptions as 404" do
-      my_middleware = Struct.new(:app) do
-        def call(env)
-          raise ActiveRecord::RecordNotFound
+      controller :foo, <<-RUBY
+        class FooController < ActionController::Base
+          def index
+            raise ActiveRecord::RecordNotFound
+          end
         end
-      end
-
-      app.config.middleware.use my_middleware
+      RUBY
 
-      get "/"
+      get "/foo"
       assert_equal 404, last_response.status
     end
 
diff --git a/railties/test/application/middleware_test.rb b/railties/test/application/middleware_test.rb
index fc5fb60174..ba747bc633 100644
--- a/railties/test/application/middleware_test.rb
+++ b/railties/test/application/middleware_test.rb
@@ -148,6 +148,13 @@ module ApplicationTests
       assert_equal "Rack::Config", middleware.first
     end
 
+    test "can't change middleware after it's built" do
+      boot!
+      assert_raise RuntimeError do
+        app.config.middleware.use Rack::Config
+      end
+    end
+
     # ConditionalGet + Etag
     test "conditional get + etag middlewares handle http caching based on body" do
       make_basic_app
-- 
cgit v1.2.3