module ActionDispatch::Integration::RequestHelpers

def follow_redirect!(**args)

underlying request.
will be performed. Any arguments are passed to the
the same HTTP verb will be used when redirecting, otherwise a GET request
performed on the location header. If the redirection is a 307 or 308 redirect,
redirect, an exception will be raised. Otherwise, the redirect is
Follow a single redirect response. If the last response was not a
def follow_redirect!(**args)
  raise "not a redirect! #{status} #{status_message}" unless redirect?
  method =
    if [307, 308].include?(response.status)
      request.method.downcase
    else
      :get
    end
  public_send(method, response.location, **args)
  status
end