require 'abstract_unit' module ActionDispatch class ShowExceptions private def public_path "#{FIXTURE_LOAD_PATH}/public" end # Silence logger def logger nil end end end class ShowExceptionsTest < ActionController::IntegrationTest Boomer = lambda do |env| req = ActionDispatch::Request.new(env) case req.path when "/not_found" raise ActionController::UnknownAction when "/method_not_allowed" raise ActionController::MethodNotAllowed when "/not_implemented" raise ActionController::NotImplemented when "/unprocessable_entity" raise ActionController::InvalidAuthenticityToken else raise "puke!" end end ProductionApp = ActionDispatch::ShowExceptions.new(Boomer, false) DevelopmentApp = ActionDispatch::ShowExceptions.new(Boomer, true) test "rescue in public from a remote ip" do @app = ProductionApp self.remote_addr = '208.77.188.166' get "/" assert_response 500 assert_equal "500 error fixture\n", body get "/not_found" assert_response 404 assert_equal "404 error fixture\n", body get "/method_not_allowed" assert_response 405 assert_equal "", body end test "rescue locally from a local request" do @app = ProductionApp self.remote_addr = '127.0.0.1' get "/" assert_response 500 assert_match /puke/, body get "/not_found" assert_response 404 assert_match /#{ActionController::UnknownAction.name}/, body get "/method_not_allowed" assert_response 405 assert_match /ActionController::MethodNotAllowed/, body end test "localize public rescue message" do # Change locale old_locale, I18n.locale = I18n.locale, :da begin @app = ProductionApp self.remote_addr = '208.77.188.166' get "/" assert_response 500 assert_equal "500 localized error fixture\n", body get "/not_found" assert_response 404 assert_equal "404 error fixture\n", body ensure I18n.locale = old_locale end end test "always rescue locally in development mode" do @app = DevelopmentApp self.remote_addr = '208.77.188.166' get "/" assert_response 500 assert_match /puke/, body get "/not_found" assert_response 404 assert_match /#{ActionController::UnknownAction.name}/, body get "/method_not_allowed" assert_response 405 assert_match /ActionController::MethodNotAllowed/, body end test "publishes notifications" do # Wait pending notifications to be published ActiveSupport::Notifications.notifier.wait @app, event = ProductionApp, nil self.remote_addr = '127.0.0.1' ActiveSupport::Notifications.subscribe('action_dispatch.show_exception') do |*args| event = args end get "/" assert_response 500 assert_match /puke/, body ActiveSupport::Notifications.notifier.wait assert_equal 'action_dispatch.show_exception', event.first assert_kind_of Hash, event.last[:env] assert_equal 'GET', event.last[:env]["REQUEST_METHOD"] assert_kind_of RuntimeError, event.last[:exception] end end