Rails now allows specifying the HTTP status code in assert_redirected_to

Rails provides a plethora of assertion methods to test the request/response flow in applications. One of the most commonly used assertion methods is assert_redirected_to which is used to assert that the request was redirected to the specified path.

Before

Let’s create a controller and some actions to test this assertion method.

  class HomeController < ApplicationController
    def index
    end

    def go_back
      redirect_to root_path, status: :moved_permanently
    end
  end

When users visit the go_back action, they are redirected to the root_path with a :moved_permanently status code (can be a HTTP response code as well). Let’s write a test to assert that the request was redirected to the root_path.

  class HomeControllerTest < ActionDispatch::IntegrationTest
    test "should redirect to root path" do
      get go_back_path
      assert_redirected_to root_path
    end
  end

However, if we are unable to assert the status code, we can’t be sure that the request was redirected with the correct status code.

After

Thanks to this PR the assertion statement can now be used to assert status codes and the corresponding symbols (as shown below).

  class HomeControllerTest < ActionDispatch::IntegrationTest
    test "should redirect to root path with status code" do
      get go_back_path
      assert_redirected_to root_path, status: :moved_permanently
      # equivalent to
      # assert_redirected_to root_path, status: 301
    end
  end
Response Class HTTP Status Code Symbol
Informational 100 :continue
  101 :switching_protocols
  102 :processing
Success 200 :ok
  201 :created
  202 :accepted
  203 :non_authoritative_information
  204 :no_content
  205 :reset_content
  206 :partial_content
  207 :multi_status
  208 :already_reported
  226 :im_used
Redirection 300 :multiple_choices
  301 :moved_permanently
  302 :found
  303 :see_other
  304 :not_modified
  305 :use_proxy
  307 :temporary_redirect
  308 :permanent_redirect
Client Error 400 :bad_request
  401 :unauthorized
  402 :payment_required
  403 :forbidden
  404 :not_found
  405 :method_not_allowed
  406 :not_acceptable
  407 :proxy_authentication_required
  408 :request_timeout
  409 :conflict
  410 :gone
  411 :length_required
  412 :precondition_failed
  413 :payload_too_large
  414 :uri_too_long
  415 :unsupported_media_type
  416 :range_not_satisfiable
  417 :expectation_failed
  421 :misdirected_request
  422 :unprocessable_entity
  423 :locked
  424 :failed_dependency
  426 :upgrade_required
  428 :precondition_required
  429 :too_many_requests
  431 :request_header_fields_too_large
  451 :unavailable_for_legal_reasons
Server Error 500 :internal_server_error
  501 :not_implemented
  502 :bad_gateway
  503 :service_unavailable
  504 :gateway_timeout
  505 :http_version_not_supported
  506 :variant_also_negotiates
  507 :insufficient_storage
  508 :loop_detected
  510 :not_extended
  511 :network_authentication_required

Need help on your Ruby on Rails or React project?

Join Our Newsletter