rails--rails/actionpack/test/controller/url_for_integration_test.rb

193 lines
10 KiB
Ruby

# frozen_string_literal: true
require "abstract_unit"
require "controller/fake_controllers"
require "active_support/core_ext/object/with_options"
module ActionPack
class URLForIntegrationTest < ActiveSupport::TestCase
include RoutingTestHelpers
include ActionDispatch::RoutingVerbs
Model = Struct.new(:to_param)
Mapping = lambda {
namespace :admin do
resources :users, :posts
end
namespace "api" do
root to: "users#index"
end
get "/blog(/:year(/:month(/:day)))" => "posts#show_date",
:constraints => {
year: /(19|20)\d\d/,
month: /[01]?\d/,
day: /[0-3]?\d/
},
:day => nil,
:month => nil
get "archive/:year", controller: "archive", action: "index",
defaults: { year: nil },
constraints: { year: /\d{4}/ },
as: "blog"
resources :people
get "symbols", controller: :symbols, action: :show, name: :as_symbol
get "id_default(/:id)" => "foo#id_default", :id => 1
match "get_or_post" => "foo#get_or_post", :via => [:get, :post]
get "optional/:optional" => "posts#index"
get "projects/:project_id" => "project#index", :as => "project"
get "clients" => "projects#index"
get "ignorecase/geocode/:postalcode" => "geocode#show", :postalcode => /hx\d\d-\d[a-z]{2}/i
get "extended/geocode/:postalcode" => "geocode#show", :constraints => {
postalcode: /# Postcode format
\d{5} #Prefix
(-\d{4})? #Suffix
/x
}, :as => "geocode"
get "news(.:format)" => "news#index"
ActiveSupport::Deprecation.silence {
get "comment/:id(/:action)" => "comments#show"
get "ws/:controller(/:action(/:id))", ws: true
get "account(/:action)" => "account#subscription"
get "pages/:page_id/:controller(/:action(/:id))"
get ":controller/ping", action: "ping"
get ":controller(/:action(/:id))(.:format)"
}
root to: "news#index"
}
attr_reader :routes
attr_accessor :controller
def setup
@routes = make_set false
@routes.draw(&Mapping)
end
[
["/admin/users", [ { use_route: "admin_users" }]],
["/admin/users", [ { controller: "admin/users" }]],
["/admin/users", [ { controller: "admin/users", action: "index" }]],
["/admin/users", [ { action: "index" }, { controller: "admin/users", action: "index" }, "/admin/users"]],
["/admin/users", [ { controller: "users", action: "index" }, { controller: "admin/accounts", action: "show", id: "1" }, "/admin/accounts/show/1"]],
["/people", [ { controller: "/people", action: "index" }, { controller: "admin/accounts", action: "foo", id: "bar" }, "/admin/accounts/foo/bar"]],
["/admin/posts", [ { controller: "admin/posts" }]],
["/admin/posts/new", [ { controller: "admin/posts", action: "new" }]],
["/blog/2009", [ { controller: "posts", action: "show_date", year: 2009 }]],
["/blog/2009/1", [ { controller: "posts", action: "show_date", year: 2009, month: 1 }]],
["/blog/2009/1/1", [ { controller: "posts", action: "show_date", year: 2009, month: 1, day: 1 }]],
["/archive/2010", [ { controller: "archive", action: "index", year: "2010" }]],
["/archive", [ { controller: "archive", action: "index" }]],
["/archive?year=january", [ { controller: "archive", action: "index", year: "january" }]],
["/people", [ { controller: "people", action: "index" }]],
["/people", [ { action: "index" }, { controller: "people", action: "index" }, "/people"]],
["/people", [ { action: "index" }, { controller: "people", action: "show", id: "1" }, "/people/show/1"]],
["/people", [ { controller: "people", action: "index" }, { controller: "people", action: "show", id: "1" }, "/people/show/1"]],
["/people", [ {}, { controller: "people", action: "index" }, "/people"]],
["/people/1", [ { controller: "people", action: "show" }, { controller: "people", action: "show", id: "1" }, "/people/show/1"]],
["/people/new", [ { use_route: "new_person" }]],
["/people/new", [ { controller: "people", action: "new" }]],
["/people/1", [ { use_route: "person", id: "1" }]],
["/people/1", [ { controller: "people", action: "show", id: "1" }]],
["/people/1.xml", [ { controller: "people", action: "show", id: "1", format: "xml" }]],
["/people/1", [ { controller: "people", action: "show", id: 1 }]],
["/people/1", [ { controller: "people", action: "show", id: Model.new("1") }]],
["/people/1", [ { action: "show", id: "1" }, { controller: "people", action: "index" }, "/people"]],
["/people/1", [ { action: "show", id: 1 }, { controller: "people", action: "show", id: "1" }, "/people/show/1"]],
["/people", [ { controller: "people", action: "index" }, { controller: "people", action: "show", id: "1" }, "/people/show/1"]],
["/people/1", [ {}, { controller: "people", action: "show", id: "1" }, "/people/show/1"]],
["/people/1", [ { controller: "people", action: "show" }, { controller: "people", action: "index", id: "1" }, "/people/index/1"]],
["/people/1/edit", [ { controller: "people", action: "edit", id: "1" }]],
["/people/1/edit.xml", [ { controller: "people", action: "edit", id: "1", format: "xml" }]],
["/people/1/edit", [ { use_route: "edit_person", id: "1" }]],
["/people/1?legacy=true", [ { controller: "people", action: "show", id: "1", legacy: "true" }]],
["/people?legacy=true", [ { controller: "people", action: "index", legacy: "true" }]],
["/id_default/2", [ { controller: "foo", action: "id_default", id: "2" }]],
["/id_default", [ { controller: "foo", action: "id_default", id: "1" }]],
["/id_default", [ { controller: "foo", action: "id_default", id: 1 }]],
["/id_default", [ { controller: "foo", action: "id_default" }]],
["/optional/bar", [ { controller: "posts", action: "index", optional: "bar" }]],
["/posts", [ { controller: "posts", action: "index" }]],
["/project", [ { controller: "project", action: "index" }]],
["/projects/1", [ { controller: "project", action: "index", project_id: "1" }]],
["/projects/1", [ { controller: "project", action: "index" }, { project_id: "1", controller: "project", action: "index" }, "/projects/1"]],
["/projects/1", [ { use_route: "project", controller: "project", action: "index", project_id: "1" }]],
["/projects/1", [ { use_route: "project", controller: "project", action: "index" }, { controller: "project", action: "index", project_id: "1" }, "/projects/1"]],
["/clients", [ { controller: "projects", action: "index" }]],
["/clients?project_id=1", [ { controller: "projects", action: "index", project_id: "1" }]],
["/clients", [ { controller: "projects", action: "index" }, { project_id: "1", controller: "project", action: "index" }, "/projects/1"]],
["/comment/20", [ { id: 20 }, { controller: "comments", action: "show" }, "/comments/show"]],
["/comment/20", [ { controller: "comments", id: 20, action: "show" }]],
["/comments/boo", [ { controller: "comments", action: "boo" }]],
["/ws/posts/show/1", [ { controller: "posts", action: "show", id: "1", ws: true }]],
["/ws/posts", [ { controller: "posts", action: "index", ws: true }]],
["/account", [ { controller: "account", action: "subscription" }]],
["/account/billing", [ { controller: "account", action: "billing" }]],
["/pages/1/notes/show/1", [ { page_id: "1", controller: "notes", action: "show", id: "1" }]],
["/pages/1/notes/list", [ { page_id: "1", controller: "notes", action: "list" }]],
["/pages/1/notes", [ { page_id: "1", controller: "notes", action: "index" }]],
["/pages/1/notes", [ { page_id: "1", controller: "notes" }]],
["/notes", [ { page_id: nil, controller: "notes" }]],
["/notes", [ { controller: "notes" }]],
["/notes/print", [ { controller: "notes", action: "print" }]],
["/notes/print", [ {}, { controller: "notes", action: "print" }, "/notes/print"]],
["/notes/index/1", [ { controller: "notes" }, { controller: "notes", action: "index", id: "1" }, "/notes/index/1"]],
["/notes/index/1", [ { controller: "notes" }, { controller: "notes", id: "1", action: "index" }, "/notes/index/1"]],
["/notes/index/1", [ { action: "index" }, { controller: "notes", id: "1", action: "index" }, "/notes/index/1"]],
["/notes/index/1", [ {}, { controller: "notes", id: "1", action: "index" }, "/notes/index/1"]],
["/notes/show/1", [ {}, { controller: "notes", action: "show", id: "1" }, "/notes/show/1"]],
["/posts", [ { controller: "posts" }, { controller: "notes", action: "show", id: "1" }, "/notes/show/1"]],
["/notes/list", [ { action: "list" }, { controller: "notes", action: "show", id: "1" }, "/notes/show/1"]],
["/posts/ping", [ { controller: "posts", action: "ping" }]],
["/posts/show/1", [ { controller: "posts", action: "show", id: "1" }]],
["/posts/show/1", [ { controller: "posts", action: "show", id: "1", format: "" }]],
["/posts", [ { controller: "posts" }]],
["/posts", [ { controller: "posts", action: "index" }]],
["/posts/create", [ { action: "create" }, { day: nil, month: nil, controller: "posts", action: "show_date" }, "/blog"]],
["/posts?foo=bar", [ { controller: "posts", foo: "bar" }]],
["/posts?foo%5B%5D=bar&foo%5B%5D=baz", [{ controller: "posts", foo: ["bar", "baz"] }]],
["/posts?page=2", [{ controller: "posts", page: 2 }]],
["/posts?q%5Bfoo%5D%5Ba%5D=b", [{ controller: "posts", q: { foo: { a: "b" } } }]],
["/news.rss", [{ controller: "news", action: "index", format: "rss" }]],
].each_with_index do |(url, params), i|
if params.length > 1
hash, path_params, route = *params
hash[:only_path] = true
define_method("test_#{url.gsub(/\W/, '_')}_#{i}") do
get URI("http://test.host" + route.to_s)
assert_equal path_params, controller.request.path_parameters
assert_equal url, controller.url_for(hash), params.inspect
end
else
define_method("test_#{url.gsub(/\W/, '_')}_#{i}") do
assert_equal url, url_for(@routes, params.first), params.inspect
end
end
end
end
end