2017-07-24 16:20:53 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2016-08-06 12:54:50 -04:00
|
|
|
require "abstract_unit"
|
|
|
|
require "controller/fake_controllers"
|
|
|
|
require "active_support/core_ext/object/with_options"
|
2011-08-12 18:53:14 -04:00
|
|
|
|
|
|
|
module ActionPack
|
|
|
|
class URLForIntegrationTest < ActiveSupport::TestCase
|
|
|
|
include RoutingTestHelpers
|
2014-07-02 18:55:25 -04:00
|
|
|
include ActionDispatch::RoutingVerbs
|
2011-08-12 18:53:14 -04:00
|
|
|
|
|
|
|
Model = Struct.new(:to_param)
|
|
|
|
|
|
|
|
Mapping = lambda {
|
|
|
|
namespace :admin do
|
|
|
|
resources :users, :posts
|
|
|
|
end
|
|
|
|
|
2016-08-06 12:54:50 -04:00
|
|
|
namespace "api" do
|
2016-08-06 13:35:13 -04:00
|
|
|
root to: "users#index"
|
2011-08-12 18:53:14 -04:00
|
|
|
end
|
|
|
|
|
2016-08-06 12:54:50 -04:00
|
|
|
get "/blog(/:year(/:month(/:day)))" => "posts#show_date",
|
2011-08-12 18:53:14 -04:00
|
|
|
:constraints => {
|
2016-08-06 13:35:13 -04:00
|
|
|
year: /(19|20)\d\d/,
|
|
|
|
month: /[01]?\d/,
|
|
|
|
day: /[0-3]?\d/
|
2011-08-12 18:53:14 -04:00
|
|
|
},
|
|
|
|
:day => nil,
|
|
|
|
:month => nil
|
|
|
|
|
2016-08-06 13:35:13 -04:00
|
|
|
get "archive/:year", controller: "archive", action: "index",
|
|
|
|
defaults: { year: nil },
|
|
|
|
constraints: { year: /\d{4}/ },
|
|
|
|
as: "blog"
|
2011-08-12 18:53:14 -04:00
|
|
|
|
|
|
|
resources :people
|
|
|
|
#match 'legacy/people' => "people#index", :legacy => "true"
|
|
|
|
|
2016-08-06 13:35:13 -04:00
|
|
|
get "symbols", controller: :symbols, action: :show, name: :as_symbol
|
2016-08-06 12:54:50 -04:00
|
|
|
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"
|
2011-08-12 18:53:14 -04:00
|
|
|
|
2016-08-06 12:54:50 -04:00
|
|
|
get "ignorecase/geocode/:postalcode" => "geocode#show", :postalcode => /hx\d\d-\d[a-z]{2}/i
|
2016-10-28 23:05:58 -04:00
|
|
|
get "extended/geocode/:postalcode" => "geocode#show", :constraints => {
|
2016-08-06 13:35:13 -04:00
|
|
|
postalcode: /# Postcode format
|
2011-08-12 18:53:14 -04:00
|
|
|
\d{5} #Prefix
|
|
|
|
(-\d{4})? #Suffix
|
|
|
|
/x
|
|
|
|
}, :as => "geocode"
|
|
|
|
|
2016-08-06 12:54:50 -04:00
|
|
|
get "news(.:format)" => "news#index"
|
2011-08-12 18:53:14 -04:00
|
|
|
|
2016-03-01 03:48:53 -05:00
|
|
|
ActiveSupport::Deprecation.silence {
|
2016-08-06 12:54:50 -04:00
|
|
|
get "comment/:id(/:action)" => "comments#show"
|
2016-08-06 13:35:13 -04:00
|
|
|
get "ws/:controller(/:action(/:id))", ws: true
|
2016-08-06 12:54:50 -04:00
|
|
|
get "account(/:action)" => "account#subscription"
|
|
|
|
get "pages/:page_id/:controller(/:action(/:id))"
|
2016-08-06 13:35:13 -04:00
|
|
|
get ":controller/ping", action: "ping"
|
2016-08-06 12:54:50 -04:00
|
|
|
get ":controller(/:action(/:id))(.:format)"
|
2016-03-01 03:48:53 -05:00
|
|
|
}
|
|
|
|
|
2016-08-06 13:35:13 -04:00
|
|
|
root to: "news#index"
|
2011-08-12 18:53:14 -04:00
|
|
|
}
|
|
|
|
|
2014-07-02 18:55:25 -04:00
|
|
|
attr_reader :routes
|
|
|
|
attr_accessor :controller
|
|
|
|
|
2011-08-12 18:53:14 -04:00
|
|
|
def setup
|
2014-07-02 18:55:25 -04:00
|
|
|
@routes = make_set false
|
2011-08-12 18:53:14 -04:00
|
|
|
@routes.draw(&Mapping)
|
|
|
|
end
|
|
|
|
|
|
|
|
[
|
2016-10-28 23:05:58 -04:00
|
|
|
["/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" }]],
|
2016-08-06 13:35:13 -04:00
|
|
|
["/posts?foo%5B%5D=bar&foo%5B%5D=baz", [{ controller: "posts", foo: ["bar", "baz"] }]],
|
|
|
|
["/posts?page=2", [{ controller: "posts", page: 2 }]],
|
2016-08-16 03:30:11 -04:00
|
|
|
["/posts?q%5Bfoo%5D%5Ba%5D=b", [{ controller: "posts", q: { foo: { a: "b" } } }]],
|
2016-08-06 13:35:13 -04:00
|
|
|
|
|
|
|
["/news.rss", [{ controller: "news", action: "index", format: "rss" }]],
|
2011-08-12 18:53:14 -04:00
|
|
|
].each_with_index do |(url, params), i|
|
2014-07-02 18:55:25 -04:00
|
|
|
if params.length > 1
|
|
|
|
hash, path_params, route = *params
|
|
|
|
hash[:only_path] = true
|
|
|
|
|
|
|
|
define_method("test_#{url.gsub(/\W/, '_')}_#{i}") do
|
2016-08-06 12:54:50 -04:00
|
|
|
get URI("http://test.host" + route.to_s)
|
2014-07-02 18:55:25 -04:00
|
|
|
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
|
2011-08-12 18:53:14 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|