From 788ece4799da9727dcc0f249c456041b01f62c98 Mon Sep 17 00:00:00 2001 From: Michael Koziarski Date: Tue, 6 Nov 2007 06:02:24 +0000 Subject: Make rescue_from behave like rescue when dealing with subclasses. Closes #10079 [fxn] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8081 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/test/controller/rescue_test.rb | 159 ++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) (limited to 'actionpack/test') diff --git a/actionpack/test/controller/rescue_test.rb b/actionpack/test/controller/rescue_test.rb index cf4dcac029..a63fd06005 100644 --- a/actionpack/test/controller/rescue_test.rb +++ b/actionpack/test/controller/rescue_test.rb @@ -5,35 +5,62 @@ uses_mocha 'rescue' do class RescueController < ActionController::Base class NotAuthorized < StandardError end + class NotAuthorizedToRescueAsString < StandardError + end class RecordInvalid < StandardError end + class RecordInvalidToRescueAsString < StandardError + end class NotAllowed < StandardError end + class NotAllowedToRescueAsString < StandardError + end class InvalidRequest < StandardError end + class InvalidRequestToRescueAsString < StandardError + end class BadGateway < StandardError end + class BadGatewayToRescueAsString < StandardError + end class ResourceUnavailable < StandardError end + class ResourceUnavailableToRescueAsString < StandardError + end + + # We use a fully-qualified name in some strings, and a relative constant + # name in some other to test correct handling of both cases. rescue_from NotAuthorized, :with => :deny_access + rescue_from 'RescueController::NotAuthorizedToRescueAsString', :with => :deny_access + rescue_from RecordInvalid, :with => :show_errors + rescue_from 'RescueController::RecordInvalidToRescueAsString', :with => :show_errors rescue_from NotAllowed, :with => proc { head :forbidden } + rescue_from 'RescueController::NotAllowedToRescueAsString', :with => proc { head :forbidden } + rescue_from InvalidRequest, :with => proc { |exception| render :text => exception.message } + rescue_from 'InvalidRequestToRescueAsString', :with => proc { |exception| render :text => exception.message } rescue_from BadGateway do head :status => 502 end + rescue_from 'BadGatewayToRescueAsString' do + head :status => 502 + end rescue_from ResourceUnavailable do |exception| render :text => exception.message end + rescue_from 'ResourceUnavailableToRescueAsString' do |exception| + render :text => exception.message + end def raises render :text => 'already rendered' @@ -51,26 +78,44 @@ class RescueController < ActionController::Base def not_authorized raise NotAuthorized end + def not_authorized_raise_as_string + raise NotAuthorizedToRescueAsString + end def not_allowed raise NotAllowed end + def not_allowed_raise_as_string + raise NotAllowedToRescueAsString + end def invalid_request raise InvalidRequest end + def invalid_request_raise_as_string + raise InvalidRequestToRescueAsString + end def record_invalid raise RecordInvalid end + def record_invalid_raise_as_string + raise RecordInvalidToRescueAsString + end def bad_gateway raise BadGateway end + def bad_gateway_raise_as_string + raise BadGatewayToRescueAsString + end def resource_unavailable raise ResourceUnavailable end + def resource_unavailable_raise_as_string + raise ResourceUnavailableToRescueAsString + end def missing_template end @@ -278,32 +323,58 @@ class RescueTest < Test::Unit::TestCase get :not_authorized assert_response :forbidden end + def test_rescue_handler_string + get :not_authorized_raise_as_string + assert_response :forbidden + end def test_rescue_handler_with_argument @controller.expects(:show_errors).once.with { |e| e.is_a?(Exception) } get :record_invalid end + def test_rescue_handler_with_argument_as_string + @controller.expects(:show_errors).once.with { |e| e.is_a?(Exception) } + get :record_invalid_raise_as_string + end def test_proc_rescue_handler get :not_allowed assert_response :forbidden end + def test_proc_rescue_handler_as_string + get :not_allowed_raise_as_string + assert_response :forbidden + end def test_proc_rescue_handle_with_argument get :invalid_request assert_equal "RescueController::InvalidRequest", @response.body end + def test_proc_rescue_handle_with_argument_as_string + get :invalid_request_raise_as_string + assert_equal "RescueController::InvalidRequestToRescueAsString", @response.body + end def test_block_rescue_handler get :bad_gateway assert_response 502 end + def test_block_rescue_handler_as_string + get :bad_gateway_raise_as_string + assert_response 502 + end def test_block_rescue_handler_with_argument get :resource_unavailable assert_equal "RescueController::ResourceUnavailable", @response.body end + def test_block_rescue_handler_with_argument_as_string + get :resource_unavailable_raise_as_string + assert_equal "RescueController::ResourceUnavailableToRescueAsString", @response.body + end + + protected def with_all_requests_local(local = true) old_local, ActionController::Base.consider_all_requests_local = @@ -339,4 +410,92 @@ class RescueTest < Test::Unit::TestCase end end +class ExceptionInheritanceRescueController < ActionController::Base + + class ParentException < StandardError + end + + class ChildException < ParentException + end + + class GrandchildException < ChildException + end + + rescue_from ChildException, :with => lambda { head :ok } + rescue_from ParentException, :with => lambda { head :created } + rescue_from GrandchildException, :with => lambda { head :no_content } + + def raise_parent_exception + raise ParentException + end + + def raise_child_exception + raise ChildException + end + + def raise_grandchild_exception + raise GrandchildException + end +end + +class ExceptionInheritanceRescueTest < Test::Unit::TestCase + + def setup + @controller = ExceptionInheritanceRescueController.new + @request = ActionController::TestRequest.new + @response = ActionController::TestResponse.new + end + + def test_bottom_first + get :raise_grandchild_exception + assert_response :no_content + end + + def test_inheritance_works + get :raise_child_exception + assert_response :created + end +end + +class ControllerInheritanceRescueController < ExceptionInheritanceRescueController + class FirstExceptionInChildController < StandardError + end + + class SecondExceptionInChildController < StandardError + end + + rescue_from FirstExceptionInChildController, 'SecondExceptionInChildController', :with => lambda { head :gone } + + def raise_first_exception_in_child_controller + raise FirstExceptionInChildController + end + + def raise_second_exception_in_child_controller + raise SecondExceptionInChildController + end +end + +class ControllerInheritanceRescueControllerTest < Test::Unit::TestCase + + def setup + @controller = ControllerInheritanceRescueController.new + @request = ActionController::TestRequest.new + @response = ActionController::TestResponse.new + end + + def test_first_exception_in_child_controller + get :raise_first_exception_in_child_controller + assert_response :gone + end + + def test_second_exception_in_child_controller + get :raise_second_exception_in_child_controller + assert_response :gone + end + + def test_exception_in_parent_controller + get :raise_parent_exception + assert_response :created + end +end end # uses_mocha -- cgit v1.2.3