Module: ActionController::Assertions::ResponseAssertions

Defined in:
lib/action_controller/assertions/response_assertions.rb

Overview

A small suite of assertions that test responses from Rails applications.

Instance Method Summary collapse

Instance Method Details

#assert_redirected_to(options = {}, message = nil) ⇒ Object

Assert that the redirection options passed in match those of the redirect called in the latest action. This match can be partial, such that assert_redirected_to(:controller => “weblog”) will also match the redirection of redirect_to(:controller => “weblog”, :action => “show”) and so on.

Examples

# assert that the redirection was to the "index" action on the WeblogController
assert_redirected_to :controller => "weblog", :action => "index"

# assert that the redirection was to the named route login_url
assert_redirected_to 

# assert that the redirection was to the url for @customer
assert_redirected_to @customer

62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/action_controller/assertions/response_assertions.rb', line 62

def assert_redirected_to(options = {}, message=nil)
  clean_backtrace do
    assert_response(:redirect, message)
    return true if options == @response.redirected_to
    
    # Support partial arguments for hash redirections
    if options.is_a?(Hash) && @response.redirected_to.is_a?(Hash)
      return true if options.all? {|(key, value)| @response.redirected_to[key] == value}
    end
    
    redirected_to_after_normalisation = normalize_argument_to_redirection(@response.redirected_to)
    options_after_normalisation       = normalize_argument_to_redirection(options)

    if redirected_to_after_normalisation != options_after_normalisation
      flunk "Expected response to be a redirect to <#{options_after_normalisation}> but was a redirect to <#{redirected_to_after_normalisation}>"
    end
  end
end

#assert_response(type, message = nil) ⇒ Object

Asserts that the response is one of the following types:

  • :success - Status code was 200

  • :redirect - Status code was in the 300-399 range

  • :missing - Status code was 404

  • :error - Status code was in the 500-599 range

You can also pass an explicit status number like assert_response(501) or its symbolic equivalent assert_response(:not_implemented). See ActionController::StatusCodes for a full list.

Examples

# assert that the response was a redirection
assert_response :redirect 

# assert that the response code was status code 401 (unauthorized)
assert_response 401

27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/action_controller/assertions/response_assertions.rb', line 27

def assert_response(type, message = nil)
  clean_backtrace do
    if [ :success, :missing, :redirect, :error ].include?(type) && @response.send("#{type}?")
      assert_block("") { true } # to count the assertion
    elsif type.is_a?(Fixnum) && @response.response_code == type
      assert_block("") { true } # to count the assertion
    elsif type.is_a?(Symbol) && @response.response_code == ActionController::StatusCodes::SYMBOL_TO_STATUS_CODE[type]
      assert_block("") { true } # to count the assertion
    else
      if @response.error?
        exception = @response.template.instance_variable_get(:@exception)
        exception_message = exception && exception.message
        assert_block(build_message(message, "Expected response to be a <?>, but was <?>\n<?>", type, @response.response_code, exception_message.to_s)) { false }
      else
        assert_block(build_message(message, "Expected response to be a <?>, but was <?>", type, @response.response_code)) { false }
      end
    end
  end
end

#assert_template(expected = nil, message = nil) ⇒ Object

Asserts that the request was rendered with the appropriate template file.

Examples

# assert that the "new" view template was rendered
assert_template "new"

88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/action_controller/assertions/response_assertions.rb', line 88

def assert_template(expected = nil, message=nil)
  clean_backtrace do
    rendered = @response.rendered_template.to_s
    msg = build_message(message, "expecting <?> but rendering with <?>", expected, rendered)
    assert_block(msg) do
      if expected.nil?
        @response.rendered_template.blank?
      else
        rendered.to_s.match(expected)
      end
    end
  end
end