module ActionDispatch::Assertions::RoutingAssertions

def assert_generates(expected_path, options, defaults = {}, extras = {}, message = nil)

assert_generates "changesets/12", { controller: 'scm', action: 'show_diff', revision: "12" }
# Asserts that the generated route gives us our custom route

assert_generates "/items/list/1", { controller: "items", action: "list", id: "1" }
# Tests the generation of a route with a parameter

assert_generates "/items/list", controller: "items", action: "list"
# Tests that the list action is properly routed

assert_generates "/items", controller: "items", action: "index"
# Asserts that the default action is generated for a route with no action

The `defaults` parameter is unused.

custom error message for assertion failures.
would be in a query string. The `message` parameter allows you to specify a
tell the request the names and values of additional request parameters that
This is the inverse of `assert_recognizes`. The `extras` parameter is used to
Asserts that the provided options can be used to generate the provided path.
def assert_generates(expected_path, options, defaults = {}, extras = {}, message = nil)
  if expected_path.include?("://")
    fail_on(URI::InvalidURIError, message) do
      uri = URI.parse(expected_path)
      expected_path = uri.path.to_s.empty? ? "/" : uri.path
    end
  else
    expected_path = "/#{expected_path}" unless expected_path.start_with?("/")
  end
  options = options.clone
  generated_path, query_string_keys = @routes.generate_extras(options, defaults)
  found_extras = options.reject { |k, _| ! query_string_keys.include? k }
  msg = message || sprintf("found extras <%s>, not <%s>", found_extras, extras)
  assert_equal(extras, found_extras, msg)
  msg = message || sprintf("The generated path <%s> did not match <%s>", generated_path,
      expected_path)
  assert_equal(expected_path, generated_path, msg)
end