aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/test/controller/url_for_integration_test.rb
blob: c7ea6c5ef6deda3e4c30a682f7d1f27df358fd7a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
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
      #match 'legacy/people' => "people#index", :legacy => "true"

      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