routing_test.rb 64.3 KB
Newer Older
1
# encoding: utf-8
2 3
require 'abstract_unit'
require 'controller/fake_controllers'
4
require 'active_support/dependencies'
5

J
Jeremy Kemper 已提交
6 7 8 9 10 11
class MilestonesController < ActionController::Base
  def index() head :ok end
  alias_method :show, :index
  def rescue_action(e) raise e end
end

12
ROUTING = ActionController::Routing
13

14
# See RFC 3986, section 3.3 for allowed path characters.
15 16 17 18
class UriReservedCharactersRoutingTest < Test::Unit::TestCase
  def setup
    @set = ActionController::Routing::RouteSet.new
    @set.draw do |map|
19
      map.connect ':controller/:action/:variable/*additional'
20
    end
21

22
    safe, unsafe = %w(: @ & = + $ , ;), %w(^ ? # [ ])
23 24
    hex = unsafe.map { |char| '%' + char.unpack('H2').first.upcase }

25 26
    @segment = "#{safe.join}#{unsafe.join}".freeze
    @escaped = "#{safe.join}#{hex.join}".freeze
27
  end
28 29

  def test_route_generation_escapes_unsafe_path_characters
30 31 32
    @set.generate(:controller => "content", :action => "act#{@segment}ion", :variable => "variable", :additional => "foo")
    assert_equal "/content/act#{@escaped}ion/var#{@escaped}iable/add#{@escaped}itional-1/add#{@escaped}itional-2",
      @set.generate(:controller => "content",
33
                    :action => "act#{@segment}ion",
34 35
                    :variable => "var#{@segment}iable",
                    :additional => ["add#{@segment}itional-1", "add#{@segment}itional-2"])
36
  end
37 38

  def test_route_recognition_unescapes_path_components
39
    options = { :controller => "content",
40
                :action => "act#{@segment}ion",
41 42
                :variable => "var#{@segment}iable",
                :additional => ["add#{@segment}itional-1", "add#{@segment}itional-2"] }
43
    assert_equal options, @set.recognize_path("/content/act#{@escaped}ion/var#{@escaped}iable/add#{@escaped}itional-1/add#{@escaped}itional-2")
44
  end
45 46

  def test_route_generation_allows_passing_non_string_values_to_generated_helper
47
    assert_equal "/content/action/variable/1/2", @set.generate(:controller => "content",
48 49 50 51
                                                                  :action => "action",
                                                                  :variable => "variable",
                                                                  :additional => [1, 2])
  end
52 53
end

54 55 56 57 58 59
class RoutingTest < Test::Unit::TestCase
  def test_normalize_unix_paths
    load_paths = %w(. config/../app/controllers config/../app//helpers script/../config/../vendor/rails/actionpack/lib vendor/rails/railties/builtin/rails_info app/models lib script/../config/../foo/bar/../../app/models .foo/../.bar foo.bar/../config)
    paths = ActionController::Routing.normalize_paths(load_paths)
    assert_equal %w(vendor/rails/railties/builtin/rails_info vendor/rails/actionpack/lib app/controllers app/helpers app/models config .bar lib .), paths
  end
60

61 62 63 64
  def test_normalize_windows_paths
    load_paths = %w(. config\\..\\app\\controllers config\\..\\app\\\\helpers script\\..\\config\\..\\vendor\\rails\\actionpack\\lib vendor\\rails\\railties\\builtin\\rails_info app\\models lib script\\..\\config\\..\\foo\\bar\\..\\..\\app\\models .foo\\..\\.bar foo.bar\\..\\config)
    paths = ActionController::Routing.normalize_paths(load_paths)
    assert_equal %w(vendor\\rails\\railties\\builtin\\rails_info vendor\\rails\\actionpack\\lib app\\controllers app\\helpers app\\models config .bar lib .), paths
65 66
  end

67 68
  def test_routing_helper_module
    assert_kind_of Module, ActionController::Routing::Helpers
69

70 71 72 73 74
    h = ActionController::Routing::Helpers
    c = Class.new
    assert ! c.ancestors.include?(h)
    ActionController::Routing::Routes.install_helpers c
    assert c.ancestors.include?(h)
75
  end
76
end
77

78 79
class MockController
  attr_accessor :routes
80

81 82 83
  def initialize(routes)
    self.routes = routes
  end
84

85 86
  def url_for(options)
    only_path = options.delete(:only_path)
87

88 89
    port        = options.delete(:port) || 80
    port_string = port == 80 ? '' : ":#{port}"
90

91 92 93
    protocol = options.delete(:protocol) || "http"
    host     = options.delete(:host) || "test.host"
    anchor   = "##{options.delete(:anchor)}" if options.key?(:anchor)
94

95
    path = routes.generate(options)
96

97 98
    only_path ? "#{path}#{anchor}" : "#{protocol}://#{host}#{port_string}#{path}#{anchor}"
  end
99

100 101
  def request
    @request ||= ActionController::TestRequest.new
102
  end
103
end
104

105 106
class LegacyRouteSetTests < Test::Unit::TestCase
  attr_reader :rs
107

108 109 110 111 112 113 114 115
  def setup
    # These tests assume optimisation is on, so re-enable it.
    ActionController::Base.optimise_named_routes = true

    @rs = ::ActionController::Routing::RouteSet.new

    ActionController::Routing.use_controllers! %w(content admin/user admin/news_feed)
  end
J
Joshua Peek 已提交
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
  def teardown
    @rs.clear!
  end

  def test_default_setup
    @rs.draw {|m| m.connect ':controller/:action/:id' }
    assert_equal({:controller => "content", :action => 'index'}, rs.recognize_path("/content"))
    assert_equal({:controller => "content", :action => 'list'}, rs.recognize_path("/content/list"))
    assert_equal({:controller => "content", :action => 'show', :id => '10'}, rs.recognize_path("/content/show/10"))

    assert_equal({:controller => "admin/user", :action => 'show', :id => '10'}, rs.recognize_path("/admin/user/show/10"))

    assert_equal '/admin/user/show/10', rs.generate(:controller => 'admin/user', :action => 'show', :id => 10)

    assert_equal '/admin/user/show', rs.generate({:action => 'show'}, {:controller => 'admin/user', :action => 'list', :id => '10'})
    assert_equal '/admin/user/list/10', rs.generate({}, {:controller => 'admin/user', :action => 'list', :id => '10'})

    assert_equal '/admin/stuff', rs.generate({:controller => 'stuff'}, {:controller => 'admin/user', :action => 'list', :id => '10'})
    assert_equal '/stuff', rs.generate({:controller => '/stuff'}, {:controller => 'admin/user', :action => 'list', :id => '10'})
  end

  def test_ignores_leading_slash
    @rs.clear!
    @rs.draw {|m| m.connect '/:controller/:action/:id'}
    test_default_setup
  end

  def test_time_recognition
    # We create many routes to make situation more realistic
    @rs = ::ActionController::Routing::RouteSet.new
    @rs.draw { |map|
      map.frontpage '', :controller => 'search', :action => 'new'
      map.resources :videos do |video|
        video.resources :comments
        video.resource  :file,      :controller => 'video_file'
        video.resource  :share,     :controller => 'video_shares'
        video.resource  :abuse,     :controller => 'video_abuses'
      end
      map.resources :abuses, :controller => 'video_abuses'
      map.resources :video_uploads
      map.resources :video_visits

      map.resources :users do |user|
        user.resource  :settings
        user.resources :videos
      end
      map.resources :channels do |channel|
        channel.resources :videos, :controller => 'channel_videos'
      end
      map.resource  :session
      map.resource  :lost_password
      map.search    'search', :controller => 'search'
      map.resources :pages
      map.connect ':controller/:action/:id'
    }
  end
173

174 175 176 177
  def test_route_with_colon_first
    rs.draw do |map|
      map.connect '/:controller/:action/:id', :action => 'index', :id => nil
      map.connect ':url', :controller => 'tiny_url', :action => 'translate'
178
    end
179 180 181 182 183 184
  end

  def test_route_with_regexp_for_controller
    rs.draw do |map|
      map.connect ':controller/:admintoken/:action/:id', :controller => /admin\/.+/
      map.connect ':controller/:action/:id'
185
    end
186 187 188 189 190 191
    assert_equal({:controller => "admin/user", :admintoken => "foo", :action => "index"},
        rs.recognize_path("/admin/user/foo"))
    assert_equal({:controller => "content", :action => "foo"}, rs.recognize_path("/content/foo"))
    assert_equal '/admin/user/foo', rs.generate(:controller => "admin/user", :admintoken => "foo", :action => "index")
    assert_equal '/content/foo', rs.generate(:controller => "content", :action => "foo")
  end
192

193 194 195 196 197 198
  def test_route_with_regexp_and_captures_for_controller
    rs.draw do |map|
      map.connect ':controller/:action/:id', :controller => /admin\/(accounts|users)/
    end
    assert_equal({:controller => "admin/accounts", :action => "index"}, rs.recognize_path("/admin/accounts"))
    assert_equal({:controller => "admin/users", :action => "index"}, rs.recognize_path("/admin/users"))
199
    assert_raise(ActionController::RoutingError) { rs.recognize_path("/admin/products") }
200 201
  end

202 203 204 205 206 207 208 209 210 211 212 213 214 215
  def test_route_with_regexp_and_dot
    rs.draw do |map|
      map.connect ':controller/:action/:file',
                        :controller => /admin|user/,
                        :action => /upload|download/,
                        :defaults => {:file => nil},
                        :requirements => {:file => %r{[^/]+(\.[^/]+)?}}
    end
    # Without a file extension
    assert_equal '/user/download/file',
      rs.generate(:controller => "user", :action => "download", :file => "file")
    assert_equal(
      {:controller => "user", :action => "download", :file => "file"},
      rs.recognize_path("/user/download/file"))
216

217 218 219 220 221 222 223 224
    # Now, let's try a file with an extension, really a dot (.)
    assert_equal '/user/download/file.jpg',
      rs.generate(
        :controller => "user", :action => "download", :file => "file.jpg")
    assert_equal(
      {:controller => "user", :action => "download", :file => "file.jpg"},
      rs.recognize_path("/user/download/file.jpg"))
  end
225

226
  def test_basic_named_route
227 228 229
    rs.draw do |map|
      map.home '', :controller => 'content', :action => 'list'
    end
230 231 232 233
    x = setup_for_named_route
    assert_equal("http://test.host/",
                 x.send(:home_url))
  end
234

235
  def test_named_route_with_option
236 237 238
    rs.draw do |map|
      map.page 'page/:title', :controller => 'content', :action => 'show_page'
    end
239 240 241 242
    x = setup_for_named_route
    assert_equal("http://test.host/page/new%20stuff",
                 x.send(:page_url, :title => 'new stuff'))
  end
243

244
  def test_named_route_with_default
245 246 247
    rs.draw do |map|
      map.page 'page/:title', :controller => 'content', :action => 'show_page', :title => 'AboutPage'
    end
248 249 250
    x = setup_for_named_route
    assert_equal("http://test.host/page/AboutRails",
                 x.send(:page_url, :title => "AboutRails"))
251

252
  end
253

254
  def test_named_route_with_name_prefix
255 256 257
    rs.draw do |map|
      map.page 'page', :controller => 'content', :action => 'show_page', :name_prefix => 'my_'
    end
258 259 260 261
    x = setup_for_named_route
    assert_equal("http://test.host/page",
                 x.send(:my_page_url))
  end
J
Joshua Peek 已提交
262

263
  def test_named_route_with_path_prefix
264 265 266
    rs.draw do |map|
      map.page 'page', :controller => 'content', :action => 'show_page', :path_prefix => 'my'
    end
267 268 269 270
    x = setup_for_named_route
    assert_equal("http://test.host/my/page",
                 x.send(:page_url))
  end
271

272
  def test_named_route_with_blank_path_prefix
273 274 275
    rs.draw do |map|
      map.page 'page', :controller => 'content', :action => 'show_page', :path_prefix => ''
    end
276 277 278 279 280
    x = setup_for_named_route
    assert_equal("http://test.host/page",
                 x.send(:page_url))
  end

281
  def test_named_route_with_nested_controller
282 283 284
    rs.draw do |map|
      map.users 'admin/user', :controller => 'admin/user', :action => 'index'
    end
285 286 287 288
    x = setup_for_named_route
    assert_equal("http://test.host/admin/user",
                 x.send(:users_url))
  end
289

290
  def test_optimised_named_route_with_host
291 292 293
    rs.draw do |map|
      map.pages 'pages', :controller => 'content', :action => 'show_page', :host => 'foo.com'
    end
294 295 296 297
    x = setup_for_named_route
    x.expects(:url_for).with(:host => 'foo.com', :only_path => false, :controller => 'content', :action => 'show_page', :use_route => :pages).once
    x.send(:pages_url)
  end
298

299 300 301 302 303
  def setup_for_named_route
    klass = Class.new(MockController)
    rs.install_helpers(klass)
    klass.new(rs)
  end
304

305 306 307
  def test_named_route_without_hash
    rs.draw do |map|
      map.normal ':controller/:action/:id'
308
    end
309
  end
310

311 312 313
  def test_named_route_root
    rs.draw do |map|
      map.root :controller => "hello"
314
    end
315 316 317 318
    x = setup_for_named_route
    assert_equal("http://test.host/", x.send(:root_url))
    assert_equal("/", x.send(:root_path))
  end
319

320 321 322 323 324
  def test_named_route_with_regexps
    rs.draw do |map|
      map.article 'page/:year/:month/:day/:title', :controller => 'page', :action => 'show',
        :year => /\d+/, :month => /\d+/, :day => /\d+/
      map.connect ':controller/:action/:id'
325
    end
326 327 328 329 330 331 332 333 334 335
    x = setup_for_named_route
    # assert_equal(
    #   {:controller => 'page', :action => 'show', :title => 'hi', :use_route => :article, :only_path => false},
    #   x.send(:article_url, :title => 'hi')
    # )
    assert_equal(
      "http://test.host/page/2005/6/10/hi",
      x.send(:article_url, :title => 'hi', :day => 10, :year => 2005, :month => 6)
    )
  end
336

337 338
  def test_changing_controller
    @rs.draw {|m| m.connect ':controller/:action/:id' }
339

340 341 342 343 344
    assert_equal '/admin/stuff/show/10', rs.generate(
      {:controller => 'stuff', :action => 'show', :id => 10},
      {:controller => 'admin/user', :action => 'index'}
    )
  end
345

346 347 348 349
  def test_paths_escaped
    rs.draw do |map|
      map.path 'file/*path', :controller => 'content', :action => 'show_file'
      map.connect ':controller/:action/:id'
350
    end
351

352 353 354 355
    # No + to space in URI escaping, only for query params.
    results = rs.recognize_path "/file/hello+world/how+are+you%3F"
    assert results, "Recognition should have succeeded"
    assert_equal ['hello+world', 'how+are+you?'], results[:path]
356

357 358 359 360 361
    # Use %20 for space instead.
    results = rs.recognize_path "/file/hello%20world/how%20are%20you%3F"
    assert results, "Recognition should have succeeded"
    assert_equal ['hello world', 'how are you?'], results[:path]
  end
362

363
  def test_paths_slashes_unescaped_with_ordered_parameters
364 365 366
    rs.draw do |map|
      map.path '/file/*path', :controller => 'content'
    end
367

368 369
    # No / to %2F in URI, only for query params.
    x = setup_for_named_route
370
    assert_equal("/file/hello/world", x.send(:path_path, ['hello', 'world']))
371
  end
372

373 374 375
  def test_non_controllers_cannot_be_matched
    rs.draw do |map|
      map.connect ':controller/:action/:id'
376
    end
377
    assert_raise(ActionController::RoutingError) { rs.recognize_path("/not_a/show/10") }
378
  end
379

380
  def test_paths_do_not_accept_defaults
381
    assert_raise(ActionController::RoutingError) do
382
      rs.draw do |map|
383 384
        map.path 'file/*path', :controller => 'content', :action => 'show_file', :path => %w(fake default)
        map.connect ':controller/:action/:id'
385 386 387
      end
    end

388 389 390
    rs.draw do |map|
      map.path 'file/*path', :controller => 'content', :action => 'show_file', :path => []
      map.connect ':controller/:action/:id'
391
    end
392
  end
393

394 395 396
  def test_should_list_options_diff_when_routing_requirements_dont_match
    rs.draw do |map|
      map.post 'post/:id', :controller=> 'post', :action=> 'show', :requirements => {:id => /\d+/}
397
    end
398
    assert_raise(ActionController::RoutingError) { rs.generate(:controller => 'post', :action => 'show', :bad_param => "foo", :use_route => "post") }
399 400 401 402 403 404
  end

  def test_dynamic_path_allowed
    rs.draw do |map|
      map.connect '*path', :controller => 'content', :action => 'show_file'
    end
405

406 407
    assert_equal '/pages/boo', rs.generate(:controller => 'content', :action => 'show_file', :path => %w(pages boo))
  end
408

409 410 411
  def test_dynamic_recall_paths_allowed
    rs.draw do |map|
      map.connect '*path', :controller => 'content', :action => 'show_file'
412 413
    end

414
    assert_equal '/pages/boo', rs.generate({}, :controller => 'content', :action => 'show_file', :path => %w(pages boo))
415
  end
416

417 418 419 420
  def test_backwards
    rs.draw do |map|
      map.connect 'page/:id/:action', :controller => 'pages', :action => 'show'
      map.connect ':controller/:action/:id'
421 422
    end

423 424 425 426 427 428 429 430 431
    assert_equal '/page/20', rs.generate({:id => 20}, {:controller => 'pages', :action => 'show'})
    assert_equal '/page/20', rs.generate(:controller => 'pages', :id => 20, :action => 'show')
    assert_equal '/pages/boo', rs.generate(:controller => 'pages', :action => 'boo')
  end

  def test_route_with_fixnum_default
    rs.draw do |map|
      map.connect 'page/:id', :controller => 'content', :action => 'show_page', :id => 1
      map.connect ':controller/:action/:id'
432 433
    end

434 435 436 437
    assert_equal '/page', rs.generate(:controller => 'content', :action => 'show_page')
    assert_equal '/page', rs.generate(:controller => 'content', :action => 'show_page', :id => 1)
    assert_equal '/page', rs.generate(:controller => 'content', :action => 'show_page', :id => '1')
    assert_equal '/page/10', rs.generate(:controller => 'content', :action => 'show_page', :id => 10)
438

439 440 441 442 443 444 445 446 447 448
    assert_equal({:controller => "content", :action => 'show_page', :id => '1'}, rs.recognize_path("/page"))
    assert_equal({:controller => "content", :action => 'show_page', :id => '1'}, rs.recognize_path("/page/1"))
    assert_equal({:controller => "content", :action => 'show_page', :id => '10'}, rs.recognize_path("/page/10"))
  end

  # For newer revision
  def test_route_with_text_default
    rs.draw do |map|
      map.connect 'page/:id', :controller => 'content', :action => 'show_page', :id => 1
      map.connect ':controller/:action/:id'
449 450
    end

451 452
    assert_equal '/page/foo', rs.generate(:controller => 'content', :action => 'show_page', :id => 'foo')
    assert_equal({:controller => "content", :action => 'show_page', :id => 'foo'}, rs.recognize_path("/page/foo"))
453

454 455
    token = "\321\202\320\265\320\272\321\201\321\202" # 'text' in russian
    escaped_token = CGI::escape(token)
456

457 458 459
    assert_equal '/page/' + escaped_token, rs.generate(:controller => 'content', :action => 'show_page', :id => token)
    assert_equal({:controller => "content", :action => 'show_page', :id => token}, rs.recognize_path("/page/#{escaped_token}"))
  end
460

461 462 463 464
  def test_action_expiry
    @rs.draw {|m| m.connect ':controller/:action/:id' }
    assert_equal '/content', rs.generate({:controller => 'content'}, {:controller => 'content', :action => 'show'})
  end
465

466 467 468
  def test_requirement_should_prevent_optional_id
    rs.draw do |map|
      map.post 'post/:id', :controller=> 'post', :action=> 'show', :requirements => {:id => /\d+/}
469 470
    end

471
    assert_equal '/post/10', rs.generate(:controller => 'post', :action => 'show', :id => 10)
472

473
    assert_raise ActionController::RoutingError do
474
      rs.generate(:controller => 'post', :action => 'show')
475
    end
476
  end
477

478 479 480 481 482 483 484 485
  def test_both_requirement_and_optional
    rs.draw do |map|
      map.blog('test/:year', :controller => 'post', :action => 'show',
        :defaults => { :year => nil },
        :requirements => { :year => /\d{4}/ }
      )
      map.connect ':controller/:action/:id'
    end
486

487 488 489 490 491 492 493
    assert_equal '/test', rs.generate(:controller => 'post', :action => 'show')
    assert_equal '/test', rs.generate(:controller => 'post', :action => 'show', :year => nil)

    x = setup_for_named_route
    assert_equal("http://test.host/test",
                 x.send(:blog_url))
  end
494

495 496 497 498
  def test_set_to_nil_forgets
    rs.draw do |map|
      map.connect 'pages/:year/:month/:day', :controller => 'content', :action => 'list_pages', :month => nil, :day => nil
      map.connect ':controller/:action/:id'
499 500
    end

501 502 503 504 505 506
    assert_equal '/pages/2005',
      rs.generate(:controller => 'content', :action => 'list_pages', :year => 2005)
    assert_equal '/pages/2005/6',
      rs.generate(:controller => 'content', :action => 'list_pages', :year => 2005, :month => 6)
    assert_equal '/pages/2005/6/12',
      rs.generate(:controller => 'content', :action => 'list_pages', :year => 2005, :month => 6, :day => 12)
507

508 509
    assert_equal '/pages/2005/6/4',
      rs.generate({:day => 4}, {:controller => 'content', :action => 'list_pages', :year => '2005', :month => '6', :day => '12'})
510

511 512
    assert_equal '/pages/2005/6',
      rs.generate({:day => nil}, {:controller => 'content', :action => 'list_pages', :year => '2005', :month => '6', :day => '12'})
513

514 515 516
    assert_equal '/pages/2005',
      rs.generate({:day => nil, :month => nil}, {:controller => 'content', :action => 'list_pages', :year => '2005', :month => '6', :day => '12'})
  end
517

518 519 520 521
  def test_url_with_no_action_specified
    rs.draw do |map|
      map.connect '', :controller => 'content'
      map.connect ':controller/:action/:id'
522 523
    end

524 525 526
    assert_equal '/', rs.generate(:controller => 'content', :action => 'index')
    assert_equal '/', rs.generate(:controller => 'content')
  end
527

528 529 530 531
  def test_named_url_with_no_action_specified
    rs.draw do |map|
      map.home '', :controller => 'content'
      map.connect ':controller/:action/:id'
532 533
    end

534 535
    assert_equal '/', rs.generate(:controller => 'content', :action => 'index')
    assert_equal '/', rs.generate(:controller => 'content')
536

537 538 539 540
    x = setup_for_named_route
    assert_equal("http://test.host/",
                 x.send(:home_url))
  end
541

542 543
  def test_url_generated_when_forgetting_action
    [{:controller => 'content', :action => 'index'}, {:controller => 'content'}].each do |hash|
544
      rs.draw do |map|
545
        map.home '', hash
546 547
        map.connect ':controller/:action/:id'
      end
548 549 550 551 552
      assert_equal '/', rs.generate({:action => nil}, {:controller => 'content', :action => 'hello'})
      assert_equal '/', rs.generate({:controller => 'content'})
      assert_equal '/content/hi', rs.generate({:controller => 'content', :action => 'hi'})
    end
  end
553

554 555 556 557
  def test_named_route_method
    rs.draw do |map|
      map.categories 'categories', :controller => 'content', :action => 'categories'
      map.connect ':controller/:action/:id'
558 559
    end

560 561 562 563 564 565 566 567
    assert_equal '/categories', rs.generate(:controller => 'content', :action => 'categories')
    assert_equal '/content/hi', rs.generate({:controller => 'content', :action => 'hi'})
  end

  def test_named_routes_array
    test_named_route_method
    assert_equal [:categories], rs.named_routes.names
  end
568

569 570 571 572 573 574 575 576
  def test_nil_defaults
    rs.draw do |map|
      map.connect 'journal',
        :controller => 'content',
        :action => 'list_journal',
        :date => nil, :user_id => nil
      map.connect ':controller/:action/:id'
    end
577

578 579
    assert_equal '/journal', rs.generate(:controller => 'content', :action => 'list_journal', :date => nil, :user_id => nil)
  end
580

581 582 583 584
  def setup_request_method_routes_for(method)
    @request = ActionController::TestRequest.new
    @request.env["REQUEST_METHOD"] = method
    @request.request_uri = "/match"
585

586 587 588 589 590
    rs.draw do |r|
      r.connect '/match', :controller => 'books', :action => 'get', :conditions => { :method => :get }
      r.connect '/match', :controller => 'books', :action => 'post', :conditions => { :method => :post }
      r.connect '/match', :controller => 'books', :action => 'put', :conditions => { :method => :put }
      r.connect '/match', :controller => 'books', :action => 'delete', :conditions => { :method => :delete }
591
    end
592
  end
593

594 595
  %w(GET POST PUT DELETE).each do |request_method|
    define_method("test_request_method_recognized_with_#{request_method}") do
596 597 598
      setup_request_method_routes_for(request_method)
      assert_nothing_raised { rs.recognize(@request) }
      assert_equal request_method.downcase, @request.path_parameters[:action]
599 600
    end
  end
601

602 603 604 605
  def test_recognize_array_of_methods
    rs.draw do |r|
      r.connect '/match', :controller => 'books', :action => 'get_or_post', :conditions => { :method => [:get, :post] }
      r.connect '/match', :controller => 'books', :action => 'not_get_or_post'
606 607
    end

608 609 610 611 612
    @request = ActionController::TestRequest.new
    @request.env["REQUEST_METHOD"] = 'POST'
    @request.request_uri = "/match"
    assert_nothing_raised { rs.recognize(@request) }
    assert_equal 'get_or_post', @request.path_parameters[:action]
613

614 615 616 617 618 619 620
    # have to recreate or else the RouteSet uses a cached version:
    @request = ActionController::TestRequest.new
    @request.env["REQUEST_METHOD"] = 'PUT'
    @request.request_uri = "/match"
    assert_nothing_raised { rs.recognize(@request) }
    assert_equal 'not_get_or_post', @request.path_parameters[:action]
  end
621

622 623 624 625 626 627
  def test_subpath_recognized
    rs.draw do |r|
      r.connect '/books/:id/edit', :controller => 'subpath_books', :action => 'edit'
      r.connect '/items/:id/:action', :controller => 'subpath_books'
      r.connect '/posts/new/:action', :controller => 'subpath_books'
      r.connect '/posts/:id', :controller => 'subpath_books', :action => "show"
628 629
    end

630 631 632
    hash = rs.recognize_path "/books/17/edit"
    assert_not_nil hash
    assert_equal %w(subpath_books 17 edit), [hash[:controller], hash[:id], hash[:action]]
633

634 635 636 637 638 639 640 641 642 643 644 645
    hash = rs.recognize_path "/items/3/complete"
    assert_not_nil hash
    assert_equal %w(subpath_books 3 complete), [hash[:controller], hash[:id], hash[:action]]

    hash = rs.recognize_path "/posts/new/preview"
    assert_not_nil hash
    assert_equal %w(subpath_books preview), [hash[:controller], hash[:action]]

    hash = rs.recognize_path "/posts/7"
    assert_not_nil hash
    assert_equal %w(subpath_books show 7), [hash[:controller], hash[:action], hash[:id]]
  end
646

647 648 649 650 651
  def test_subpath_generated
    rs.draw do |r|
      r.connect '/books/:id/edit', :controller => 'subpath_books', :action => 'edit'
      r.connect '/items/:id/:action', :controller => 'subpath_books'
      r.connect '/posts/new/:action', :controller => 'subpath_books'
652 653
    end

654 655 656 657
    assert_equal "/books/7/edit", rs.generate(:controller => "subpath_books", :id => 7, :action => "edit")
    assert_equal "/items/15/complete", rs.generate(:controller => "subpath_books", :id => 15, :action => "complete")
    assert_equal "/posts/new/preview", rs.generate(:controller => "subpath_books", :action => "preview")
  end
658

659 660 661
  def test_failed_requirements_raises_exception_with_violated_requirements
    rs.draw do |r|
      r.foo_with_requirement 'foos/:id', :controller=>'foos', :requirements=>{:id=>/\d+/}
662 663
    end

664
    x = setup_for_named_route
665
    assert_raise(ActionController::RoutingError) do
666 667 668
      x.send(:foo_with_requirement_url, "I am Against the requirements")
    end
  end
669

670 671 672 673 674 675 676 677 678
  def test_routes_changed_correctly_after_clear
    ActionController::Base.optimise_named_routes = true
    rs = ::ActionController::Routing::RouteSet.new
    rs.draw do |r|
      r.connect 'ca', :controller => 'ca', :action => "aa"
      r.connect 'cb', :controller => 'cb', :action => "ab"
      r.connect 'cc', :controller => 'cc', :action => "ac"
      r.connect ':controller/:action/:id'
      r.connect ':controller/:action/:id.:format'
679 680
    end

681
    hash = rs.recognize_path "/cc"
682

683 684
    assert_not_nil hash
    assert_equal %w(cc ac), [hash[:controller], hash[:action]]
685

686 687 688 689 690
    rs.draw do |r|
      r.connect 'cb', :controller => 'cb', :action => "ab"
      r.connect 'cc', :controller => 'cc', :action => "ac"
      r.connect ':controller/:action/:id'
      r.connect ':controller/:action/:id.:format'
691 692
    end

693
    hash = rs.recognize_path "/cc"
694

695 696
    assert_not_nil hash
    assert_equal %w(cc ac), [hash[:controller], hash[:action]]
697

698 699
  end
end
700

701
class RouteSetTest < ActiveSupport::TestCase
702 703 704
  def set
    @set ||= ROUTING::RouteSet.new
  end
705

706 707 708
  def request
    @request ||= ActionController::TestRequest.new
  end
709

710 711
  def default_route_set
    @default_route_set ||= begin
J
Joshua Peek 已提交
712 713 714
      set = ROUTING::RouteSet.new
      set.draw do |map|
        map.connect '/:controller/:action/:id/'
715 716 717 718 719
      end
      set
    end
  end

720 721 722 723
  def test_generate_extras
    set.draw { |m| m.connect ':controller/:action/:id' }
    path, extras = set.generate_extras(:controller => "foo", :action => "bar", :id => 15, :this => "hello", :that => "world")
    assert_equal "/foo/bar/15", path
724
    assert_equal %w(that this), extras.map { |e| e.to_s }.sort
725
  end
726

727 728 729
  def test_extra_keys
    set.draw { |m| m.connect ':controller/:action/:id' }
    extras = set.extra_keys(:controller => "foo", :action => "bar", :id => 15, :this => "hello", :that => "world")
730
    assert_equal %w(that this), extras.map { |e| e.to_s }.sort
731
  end
732

733 734 735 736
  def test_generate_extras_not_first
    set.draw do |map|
      map.connect ':controller/:action/:id.:format'
      map.connect ':controller/:action/:id'
737
    end
738 739
    path, extras = set.generate_extras(:controller => "foo", :action => "bar", :id => 15, :this => "hello", :that => "world")
    assert_equal "/foo/bar/15", path
740
    assert_equal %w(that this), extras.map { |e| e.to_s }.sort
741
  end
742

743 744 745 746
  def test_generate_not_first
    set.draw do |map|
      map.connect ':controller/:action/:id.:format'
      map.connect ':controller/:action/:id'
747
    end
748 749
    assert_equal "/foo/bar/15?this=hello", set.generate(:controller => "foo", :action => "bar", :id => 15, :this => "hello")
  end
750

751 752 753 754
  def test_extra_keys_not_first
    set.draw do |map|
      map.connect ':controller/:action/:id.:format'
      map.connect ':controller/:action/:id'
755
    end
756
    extras = set.extra_keys(:controller => "foo", :action => "bar", :id => 15, :this => "hello", :that => "world")
757
    assert_equal %w(that this), extras.map { |e| e.to_s }.sort
758
  end
759

760 761 762 763
  def test_draw
    assert_equal 0, set.routes.size
    set.draw do |map|
      map.connect '/hello/world', :controller => 'a', :action => 'b'
764
    end
765 766
    assert_equal 1, set.routes.size
  end
767

768 769 770 771 772 773 774 775 776 777 778
  def test_draw_symbol_controller_name
    assert_equal 0, set.routes.size
    set.draw do |map|
      map.connect '/users/index', :controller => :users, :action => :index
    end
    @request = ActionController::TestRequest.new
    @request.request_uri = '/users/index'
    assert_nothing_raised { set.recognize(@request) }
    assert_equal 1, set.routes.size
  end

779 780 781 782
  def test_named_draw
    assert_equal 0, set.routes.size
    set.draw do |map|
      map.hello '/hello/world', :controller => 'a', :action => 'b'
783
    end
784 785 786
    assert_equal 1, set.routes.size
    assert_equal set.routes.first, set.named_routes[:hello]
  end
787

788 789 790 791
  def test_later_named_routes_take_precedence
    set.draw do |map|
      map.hello '/hello/world', :controller => 'a', :action => 'b'
      map.hello '/hello', :controller => 'a', :action => 'b'
792
    end
793 794
    assert_equal set.routes.last, set.named_routes[:hello]
  end
795

796 797 798 799 800 801
  def setup_named_route_test
    set.draw do |map|
      map.show '/people/:id', :controller => 'people', :action => 'show'
      map.index '/people', :controller => 'people', :action => 'index'
      map.multi '/people/go/:foo/:bar/joe/:id', :controller => 'people', :action => 'multi'
      map.users '/admin/users', :controller => 'admin/users', :action => 'index'
802 803
    end

804 805 806 807
    klass = Class.new(MockController)
    set.install_helpers(klass)
    klass.new(set)
  end
808

809 810 811 812 813 814 815 816 817 818 819 820 821 822 823
  def test_named_route_hash_access_method
    controller = setup_named_route_test

    assert_equal(
      { :controller => 'people', :action => 'show', :id => 5, :use_route => :show, :only_path => false },
      controller.send(:hash_for_show_url, :id => 5))

    assert_equal(
      { :controller => 'people', :action => 'index', :use_route => :index, :only_path => false },
      controller.send(:hash_for_index_url))

    assert_equal(
      { :controller => 'people', :action => 'show', :id => 5, :use_route => :show, :only_path => true },
      controller.send(:hash_for_show_path, :id => 5)
    )
824 825
  end

826 827
  def test_named_route_url_method
    controller = setup_named_route_test
828

829 830
    assert_equal "http://test.host/people/5", controller.send(:show_url, :id => 5)
    assert_equal "/people/5", controller.send(:show_path, :id => 5)
831

832 833
    assert_equal "http://test.host/people", controller.send(:index_url)
    assert_equal "/people", controller.send(:index_path)
834

835 836 837 838
    assert_equal "http://test.host/admin/users", controller.send(:users_url)
    assert_equal '/admin/users', controller.send(:users_path)
    assert_equal '/admin/users', set.generate(controller.send(:hash_for_users_url), {:controller => 'users', :action => 'index'})
  end
839

840 841
  def test_named_route_url_method_with_anchor
    controller = setup_named_route_test
842

843 844
    assert_equal "http://test.host/people/5#location", controller.send(:show_url, :id => 5, :anchor => 'location')
    assert_equal "/people/5#location", controller.send(:show_path, :id => 5, :anchor => 'location')
845

846 847
    assert_equal "http://test.host/people#location", controller.send(:index_url, :anchor => 'location')
    assert_equal "/people#location", controller.send(:index_path, :anchor => 'location')
848

849 850
    assert_equal "http://test.host/admin/users#location", controller.send(:users_url, :anchor => 'location')
    assert_equal '/admin/users#location', controller.send(:users_path, :anchor => 'location')
851

852 853
    assert_equal "http://test.host/people/go/7/hello/joe/5#location",
      controller.send(:multi_url, 7, "hello", 5, :anchor => 'location')
854

855 856
    assert_equal "http://test.host/people/go/7/hello/joe/5?baz=bar#location",
      controller.send(:multi_url, 7, "hello", 5, :baz => "bar", :anchor => 'location')
857

858 859 860
    assert_equal "http://test.host/people?baz=bar#location",
      controller.send(:index_url, :baz => "bar", :anchor => 'location')
  end
861

862 863 864 865
  def test_named_route_url_method_with_port
    controller = setup_named_route_test
    assert_equal "http://test.host:8080/people/5", controller.send(:show_url, 5, :port=>8080)
  end
866

867 868 869 870
  def test_named_route_url_method_with_host
    controller = setup_named_route_test
    assert_equal "http://some.example.com/people/5", controller.send(:show_url, 5, :host=>"some.example.com")
  end
871

872 873 874 875
  def test_named_route_url_method_with_protocol
    controller = setup_named_route_test
    assert_equal "https://test.host/people/5", controller.send(:show_url, 5, :protocol => "https")
  end
876

877 878 879 880 881
  def test_named_route_url_method_with_ordered_parameters
    controller = setup_named_route_test
    assert_equal "http://test.host/people/go/7/hello/joe/5",
      controller.send(:multi_url, 7, "hello", 5)
  end
882

883 884 885 886 887
  def test_named_route_url_method_with_ordered_parameters_and_hash
    controller = setup_named_route_test
    assert_equal "http://test.host/people/go/7/hello/joe/5?baz=bar",
      controller.send(:multi_url, 7, "hello", 5, :baz => "bar")
  end
888

889 890 891 892 893
  def test_named_route_url_method_with_ordered_parameters_and_empty_hash
    controller = setup_named_route_test
    assert_equal "http://test.host/people/go/7/hello/joe/5",
      controller.send(:multi_url, 7, "hello", 5, {})
  end
894

895 896 897 898 899
  def test_named_route_url_method_with_no_positional_arguments
    controller = setup_named_route_test
    assert_equal "http://test.host/people?baz=bar",
      controller.send(:index_url, :baz => "bar")
  end
900

901
  def test_draw_default_route
J
Joshua Peek 已提交
902 903 904
    set.draw do |map|
      map.connect '/:controller/:action/:id'
    end
905

J
Joshua Peek 已提交
906
    assert_equal 1, set.routes.size
907

J
Joshua Peek 已提交
908 909
    assert_equal '/users/show/10', set.generate(:controller => 'users', :action => 'show', :id => 10)
    assert_equal '/users/index/10', set.generate(:controller => 'users', :id => 10)
910

J
Joshua Peek 已提交
911 912
    assert_equal({:controller => 'users', :action => 'index', :id => '10'}, set.recognize_path('/users/index/10'))
    assert_equal({:controller => 'users', :action => 'index', :id => '10'}, set.recognize_path('/users/index/10/'))
913
  end
914

915
  def test_draw_default_route_with_default_controller
J
Joshua Peek 已提交
916 917
    set.draw do |map|
      map.connect '/:controller/:action/:id', :controller => 'users'
918
    end
J
Joshua Peek 已提交
919
    assert_equal({:controller => 'users', :action => 'index'}, set.recognize_path('/'))
920
  end
921

922
  def test_route_with_parameter_shell
J
Joshua Peek 已提交
923 924 925 926
    set.draw do |map|
      map.connect 'page/:id', :controller => 'pages', :action => 'show', :id => /\d+/
      map.connect '/:controller/:action/:id'
    end
927

J
Joshua Peek 已提交
928 929 930
    assert_equal({:controller => 'pages', :action => 'index'}, set.recognize_path('/pages'))
    assert_equal({:controller => 'pages', :action => 'index'}, set.recognize_path('/pages/index'))
    assert_equal({:controller => 'pages', :action => 'list'}, set.recognize_path('/pages/list'))
931

J
Joshua Peek 已提交
932 933
    assert_equal({:controller => 'pages', :action => 'show', :id => '10'}, set.recognize_path('/pages/show/10'))
    assert_equal({:controller => 'pages', :action => 'show', :id => '10'}, set.recognize_path('/page/10'))
934
  end
935

936
  def test_route_requirements_with_anchor_chars_are_invalid
937
    assert_raise ArgumentError do
938 939
      set.draw do |map|
        map.connect 'page/:id', :controller => 'pages', :action => 'show', :id => /^\d+/
940
      end
941
    end
942
    assert_raise ArgumentError do
943 944
      set.draw do |map|
        map.connect 'page/:id', :controller => 'pages', :action => 'show', :id => /\A\d+/
945 946
      end
    end
947
    assert_raise ArgumentError do
948 949
      set.draw do |map|
        map.connect 'page/:id', :controller => 'pages', :action => 'show', :id => /\d+$/
950 951
      end
    end
952
    assert_raise ArgumentError do
953 954
      set.draw do |map|
        map.connect 'page/:id', :controller => 'pages', :action => 'show', :id => /\d+\Z/
955 956
      end
    end
957
    assert_raise ArgumentError do
958
      set.draw do |map|
959
        map.connect 'page/:id', :controller => 'pages', :action => 'show', :id => /\d+\z/
960
      end
961 962
    end
  end
963

964
  def test_route_requirements_with_invalid_http_method_is_invalid
965
    assert_raise ArgumentError do
966
      set.draw do |map|
967
        map.connect 'valid/route', :controller => 'pages', :action => 'show', :conditions => {:method => :invalid}
968 969
      end
    end
970
  end
971

972 973 974 975 976 977 978 979
  def test_route_requirements_with_options_method_condition_is_valid
    assert_nothing_raised do
      set.draw do |map|
        map.connect 'valid/route', :controller => 'pages', :action => 'show', :conditions => {:method => :options}
      end
    end
  end

980
  def test_route_requirements_with_head_method_condition_is_invalid
981
    assert_raise ArgumentError do
982
      set.draw do |map|
983
        map.connect 'valid/route', :controller => 'pages', :action => 'show', :conditions => {:method => :head}
984
      end
985 986
    end
  end
987

988 989 990 991
  def test_recognize_with_encoded_id_and_regex
    set.draw do |map|
      map.connect 'page/:id', :controller => 'pages', :action => 'show', :id => /[a-zA-Z0-9\+]+/
    end
992

993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005
    assert_equal({:controller => 'pages', :action => 'show', :id => '10'}, set.recognize_path('/page/10'))
    assert_equal({:controller => 'pages', :action => 'show', :id => 'hello+world'}, set.recognize_path('/page/hello+world'))
  end

  def test_recognize_with_conditions
    set.draw do |map|
      map.with_options(:controller => "people") do |people|
        people.people  "/people",     :action => "index",   :conditions => { :method => :get }
        people.connect "/people",     :action => "create",  :conditions => { :method => :post }
        people.person  "/people/:id", :action => "show",    :conditions => { :method => :get }
        people.connect "/people/:id", :action => "update",  :conditions => { :method => :put }
        people.connect "/people/:id", :action => "destroy", :conditions => { :method => :delete }
      end
1006 1007
    end

1008
    request.request_uri = "/people"
1009 1010 1011 1012
    request.env["REQUEST_METHOD"] = "GET"
    assert_nothing_raised { set.recognize(request) }
    assert_equal("index", request.path_parameters[:action])
    request.recycle!
1013

1014 1015 1016 1017
    request.env["REQUEST_METHOD"] = "POST"
    assert_nothing_raised { set.recognize(request) }
    assert_equal("create", request.path_parameters[:action])
    request.recycle!
1018

1019 1020 1021 1022
    request.env["REQUEST_METHOD"] = "PUT"
    assert_nothing_raised { set.recognize(request) }
    assert_equal("update", request.path_parameters[:action])
    request.recycle!
1023

1024
    assert_raise(ActionController::UnknownHttpMethod) {
1025 1026 1027 1028
      request.env["REQUEST_METHOD"] = "BACON"
      set.recognize(request)
    }
    request.recycle!
1029

1030
    request.request_uri = "/people/5"
1031 1032 1033 1034 1035
    request.env["REQUEST_METHOD"] = "GET"
    assert_nothing_raised { set.recognize(request) }
    assert_equal("show", request.path_parameters[:action])
    assert_equal("5", request.path_parameters[:id])
    request.recycle!
1036

1037 1038 1039 1040 1041
    request.env["REQUEST_METHOD"] = "PUT"
    assert_nothing_raised { set.recognize(request) }
    assert_equal("update", request.path_parameters[:action])
    assert_equal("5", request.path_parameters[:id])
    request.recycle!
1042

1043 1044 1045 1046 1047
    request.env["REQUEST_METHOD"] = "DELETE"
    assert_nothing_raised { set.recognize(request) }
    assert_equal("destroy", request.path_parameters[:action])
    assert_equal("5", request.path_parameters[:id])
    request.recycle!
1048

1049 1050 1051 1052 1053 1054
    begin
      request.env["REQUEST_METHOD"] = "POST"
      set.recognize(request)
      flunk 'Should have raised MethodNotAllowed'
    rescue ActionController::MethodNotAllowed => e
      assert_equal [:get, :put, :delete], e.allowed_methods
1055
    end
1056 1057
    request.recycle!
  end
1058

1059 1060 1061 1062 1063
  def test_recognize_with_alias_in_conditions
    set.draw do |map|
      map.people "/people", :controller => 'people', :action => "index",
        :conditions => { :method => :get }
      map.root   :people
1064
    end
1065

1066 1067 1068 1069 1070
    request.path = "/people"
    request.env["REQUEST_METHOD"] = "GET"
    assert_nothing_raised { set.recognize(request) }
    assert_equal("people", request.path_parameters[:controller])
    assert_equal("index", request.path_parameters[:action])
1071

1072 1073 1074 1075 1076 1077
    request.path = "/"
    request.env["REQUEST_METHOD"] = "GET"
    assert_nothing_raised { set.recognize(request) }
    assert_equal("people", request.path_parameters[:controller])
    assert_equal("index", request.path_parameters[:action])
  end
1078

1079 1080 1081 1082 1083
  def test_typo_recognition
    set.draw do |map|
      map.connect 'articles/:year/:month/:day/:title',
             :controller => 'articles', :action => 'permalink',
             :year => /\d{4}/, :day => /\d{1,2}/, :month => /\d{1,2}/
1084
    end
1085

1086 1087 1088 1089 1090 1091 1092 1093 1094
    request.path = "/articles/2005/11/05/a-very-interesting-article"
    request.env["REQUEST_METHOD"] = "GET"
    assert_nothing_raised { set.recognize(request) }
    assert_equal("permalink", request.path_parameters[:action])
    assert_equal("2005", request.path_parameters[:year])
    assert_equal("11", request.path_parameters[:month])
    assert_equal("05", request.path_parameters[:day])
    assert_equal("a-very-interesting-article", request.path_parameters[:title])
  end
1095

1096 1097 1098 1099
  def test_routing_traversal_does_not_load_extra_classes
    assert !Object.const_defined?("Profiler__"), "Profiler should not be loaded"
    set.draw do |map|
      map.connect '/profile', :controller => 'profile'
1100 1101
    end

1102
    request.path = '/profile'
1103

1104
    set.recognize(request) rescue nil
1105

1106 1107 1108 1109 1110 1111 1112 1113 1114
    assert !Object.const_defined?("Profiler__"), "Profiler should not be loaded"
  end

  def test_recognize_with_conditions_and_format
    set.draw do |map|
      map.with_options(:controller => "people") do |people|
        people.person  "/people/:id", :action => "show",    :conditions => { :method => :get }
        people.connect "/people/:id", :action => "update",  :conditions => { :method => :put }
        people.connect "/people/:id.:_format", :action => "show", :conditions => { :method => :get }
1115
      end
1116 1117
    end

1118
    request.request_uri = "/people/5"
1119 1120 1121 1122 1123 1124 1125 1126 1127 1128
    request.env["REQUEST_METHOD"] = "GET"
    assert_nothing_raised { set.recognize(request) }
    assert_equal("show", request.path_parameters[:action])
    assert_equal("5", request.path_parameters[:id])
    request.recycle!

    request.env["REQUEST_METHOD"] = "PUT"
    assert_nothing_raised { set.recognize(request) }
    assert_equal("update", request.path_parameters[:action])
    request.recycle!
1129

1130
    request.request_uri = "/people/5.png"
1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141
    request.env["REQUEST_METHOD"] = "GET"
    assert_nothing_raised { set.recognize(request) }
    assert_equal("show", request.path_parameters[:action])
    assert_equal("5", request.path_parameters[:id])
    assert_equal("png", request.path_parameters[:_format])
  end

  def test_generate_with_default_action
    set.draw do |map|
      map.connect "/people", :controller => "people"
      map.connect "/people/list", :controller => "people", :action => "list"
1142 1143
    end

1144 1145 1146
    url = set.generate(:controller => "people", :action => "list")
    assert_equal "/people/list", url
  end
1147

1148 1149
  def test_root_map
    set.draw { |map| map.root :controller => "people" }
1150

1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162
    request.path = ""
    request.env["REQUEST_METHOD"] = "GET"
    assert_nothing_raised { set.recognize(request) }
    assert_equal("people", request.path_parameters[:controller])
    assert_equal("index", request.path_parameters[:action])
  end

  def test_namespace
    set.draw do |map|

      map.namespace 'api' do |api|
        api.route 'inventory', :controller => "products", :action => 'inventory'
1163
      end
1164

1165 1166
    end

1167 1168 1169 1170 1171 1172
    request.path = "/api/inventory"
    request.env["REQUEST_METHOD"] = "GET"
    assert_nothing_raised { set.recognize(request) }
    assert_equal("api/products", request.path_parameters[:controller])
    assert_equal("inventory", request.path_parameters[:action])
  end
1173

1174 1175
  def test_namespaced_root_map
    set.draw do |map|
1176

1177 1178
      map.namespace 'api' do |api|
        api.root :controller => "products"
1179 1180 1181 1182
      end

    end

1183 1184 1185 1186 1187 1188
    request.path = "/api"
    request.env["REQUEST_METHOD"] = "GET"
    assert_nothing_raised { set.recognize(request) }
    assert_equal("api/products", request.path_parameters[:controller])
    assert_equal("index", request.path_parameters[:action])
  end
1189

1190 1191 1192 1193
  def test_namespace_with_path_prefix
    set.draw do |map|
      map.namespace 'api', :path_prefix => 'prefix' do |api|
        api.route 'inventory', :controller => "products", :action => 'inventory'
1194
      end
1195 1196
    end

1197 1198 1199 1200 1201 1202
    request.path = "/prefix/inventory"
    request.env["REQUEST_METHOD"] = "GET"
    assert_nothing_raised { set.recognize(request) }
    assert_equal("api/products", request.path_parameters[:controller])
    assert_equal("inventory", request.path_parameters[:action])
  end
1203

1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217
  def test_namespace_with_blank_path_prefix
    set.draw do |map|
      map.namespace 'api', :path_prefix => '' do |api|
        api.route 'inventory', :controller => "products", :action => 'inventory'
      end
    end

    request.path = "/inventory"
    request.env["REQUEST_METHOD"] = "GET"
    assert_nothing_raised { set.recognize(request) }
    assert_equal("api/products", request.path_parameters[:controller])
    assert_equal("inventory", request.path_parameters[:action])
  end

1218 1219 1220 1221 1222 1223 1224
  def test_generate_changes_controller_module
    set.draw { |map| map.connect ':controller/:action/:id' }
    current = { :controller => "bling/bloop", :action => "bap", :id => 9 }
    url = set.generate({:controller => "foo/bar", :action => "baz", :id => 7}, current)
    assert_equal "/foo/bar/baz/7", url
  end

1225 1226 1227 1228 1229 1230 1231 1232 1233 1234
  # def test_id_is_not_impossibly_sticky
  #   set.draw do |map|
  #     map.connect 'foo/:number', :controller => "people", :action => "index"
  #     map.connect ':controller/:action/:id'
  #   end
  #
  #   url = set.generate({:controller => "people", :action => "index", :number => 3},
  #     {:controller => "people", :action => "index", :id => "21"})
  #   assert_equal "/foo/3", url
  # end
1235

1236 1237 1238
  def test_id_is_sticky_when_it_ought_to_be
    set.draw do |map|
      map.connect ':controller/:id/:action'
1239
    end
1240

1241 1242 1243
    url = set.generate({:action => "destroy"}, {:controller => "people", :action => "show", :id => "7"})
    assert_equal "/people/7/destroy", url
  end
1244

1245 1246 1247 1248
  def test_use_static_path_when_possible
    set.draw do |map|
      map.connect 'about', :controller => "welcome", :action => "about"
      map.connect ':controller/:action/:id'
1249 1250
    end

1251 1252 1253 1254
    url = set.generate({:controller => "welcome", :action => "about"},
      {:controller => "welcome", :action => "get", :id => "7"})
    assert_equal "/about", url
  end
1255

1256 1257
  def test_generate
    set.draw { |map| map.connect ':controller/:action/:id' }
1258

1259 1260 1261 1262 1263
    args = { :controller => "foo", :action => "bar", :id => "7", :x => "y" }
    assert_equal "/foo/bar/7?x=y", set.generate(args)
    assert_equal ["/foo/bar/7", [:x]], set.generate_extras(args)
    assert_equal [:x], set.extra_keys(args)
  end
1264

1265 1266
  def test_generate_with_path_prefix
    set.draw { |map| map.connect ':controller/:action/:id', :path_prefix => 'my' }
1267

1268 1269 1270 1271
    args = { :controller => "foo", :action => "bar", :id => "7", :x => "y" }
    assert_equal "/my/foo/bar/7?x=y", set.generate(args)
  end

1272 1273 1274 1275 1276 1277 1278
  def test_generate_with_blank_path_prefix
    set.draw { |map| map.connect ':controller/:action/:id', :path_prefix => '' }

    args = { :controller => "foo", :action => "bar", :id => "7", :x => "y" }
    assert_equal "/foo/bar/7?x=y", set.generate(args)
  end

1279 1280 1281 1282 1283
  def test_named_routes_are_never_relative_to_modules
    set.draw do |map|
      map.connect "/connection/manage/:action", :controller => 'connection/manage'
      map.connect "/connection/connection", :controller => "connection/connection"
      map.family_connection "/connection", :controller => "connection"
1284
    end
1285

1286 1287 1288 1289 1290 1291 1292 1293 1294 1295
    url = set.generate({:controller => "connection"}, {:controller => 'connection/manage'})
    assert_equal "/connection/connection", url

    url = set.generate({:use_route => :family_connection, :controller => "connection"}, {:controller => 'connection/manage'})
    assert_equal "/connection", url
  end

  def test_action_left_off_when_id_is_recalled
    set.draw do |map|
      map.connect ':controller/:action/:id'
1296
    end
1297 1298 1299
    assert_equal '/books', set.generate(
      {:controller => 'books', :action => 'index'},
      {:controller => 'books', :action => 'show', :id => '10'}
1300 1301
    )
  end
1302

1303 1304
  def test_query_params_will_be_shown_when_recalled
    set.draw do |map|
1305
      map.connect 'show_weblog/:parameter', :controller => 'weblog', :action => 'show'
1306
      map.connect ':controller/:action/:id'
1307
    end
1308
    assert_equal '/weblog/edit?parameter=1', set.generate(
1309
      {:action => 'edit', :parameter => 1},
1310
      {:controller => 'weblog', :action => 'show', :parameter => 1}
1311 1312
    )
  end
1313

1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329
  def test_format_is_not_inherit
    set.draw do |map|
      map.connect '/posts.:format', :controller => 'posts'
    end

    assert_equal '/posts', set.generate(
      {:controller => 'posts'},
      {:controller => 'posts', :action => 'index', :format => 'xml'}
    )

    assert_equal '/posts.xml', set.generate(
      {:controller => 'posts', :format => 'xml'},
      {:controller => 'posts', :action => 'index', :format => 'xml'}
    )
  end

1330 1331
  def test_expiry_determination_should_consider_values_with_to_param
    set.draw { |map| map.connect 'projects/:project_id/:controller/:action' }
1332
    assert_equal '/projects/1/weblog/show', set.generate(
1333
      {:action => 'show', :project_id => 1},
1334
      {:controller => 'weblog', :action => 'show', :project_id => '1'})
1335
  end
1336

1337 1338 1339 1340
  def test_named_route_in_nested_resource
    set.draw do |map|
      map.resources :projects do |project|
        project.milestones 'milestones', :controller => 'milestones', :action => 'index'
1341 1342
      end
    end
1343

1344 1345 1346 1347 1348 1349
    request.path = "/projects/1/milestones"
    request.env["REQUEST_METHOD"] = "GET"
    assert_nothing_raised { set.recognize(request) }
    assert_equal("milestones", request.path_parameters[:controller])
    assert_equal("index", request.path_parameters[:action])
  end
1350

1351 1352 1353 1354 1355
  def test_setting_root_in_namespace_using_symbol
    assert_nothing_raised do
      set.draw do |map|
        map.namespace :admin do |admin|
          admin.root :controller => 'home'
1356 1357 1358
        end
      end
    end
1359
  end
1360

1361 1362 1363 1364 1365
  def test_setting_root_in_namespace_using_string
    assert_nothing_raised do
      set.draw do |map|
        map.namespace 'admin' do |admin|
          admin.root :controller => 'home'
1366 1367 1368
        end
      end
    end
1369
  end
1370

1371
  def test_route_requirements_with_unsupported_regexp_options_must_error
1372
    assert_raise ArgumentError do
1373 1374 1375
      set.draw do |map|
        map.connect 'page/:name', :controller => 'pages',
          :action => 'show',
1376
          :requirements => {:name => /(david|jamis)/m}
1377
      end
1378
    end
1379
  end
1380

1381 1382
  def test_route_requirements_with_supported_options_must_not_error
    assert_nothing_raised do
1383 1384 1385 1386 1387 1388
      set.draw do |map|
        map.connect 'page/:name', :controller => 'pages',
          :action => 'show',
          :requirements => {:name => /(david|jamis)/i}
      end
    end
1389
    assert_nothing_raised do
1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400
      set.draw do |map|
        map.connect 'page/:name', :controller => 'pages',
          :action => 'show',
          :requirements => {:name => / # Desperately overcommented regexp
                                      ( #Either
                                       david #The Creator
                                      | #Or
                                        jamis #The Deployer
                                      )/x}
      end
    end
1401
  end
1402

1403 1404 1405 1406 1407 1408 1409
  def test_route_requirement_recognize_with_ignore_case
    set.draw do |map|
      map.connect 'page/:name', :controller => 'pages',
        :action => 'show',
        :requirements => {:name => /(david|jamis)/i}
    end
    assert_equal({:controller => 'pages', :action => 'show', :name => 'jamis'}, set.recognize_path('/page/jamis'))
1410
    assert_raise ActionController::RoutingError do
1411
      set.recognize_path('/page/davidjamis')
1412
    end
1413 1414
    assert_equal({:controller => 'pages', :action => 'show', :name => 'DAVID'}, set.recognize_path('/page/DAVID'))
  end
1415

1416 1417 1418 1419 1420 1421 1422 1423
  def test_route_requirement_generate_with_ignore_case
    set.draw do |map|
      map.connect 'page/:name', :controller => 'pages',
        :action => 'show',
        :requirements => {:name => /(david|jamis)/i}
    end
    url = set.generate({:controller => 'pages', :action => 'show', :name => 'david'})
    assert_equal "/page/david", url
1424
    assert_raise ActionController::RoutingError do
1425
      url = set.generate({:controller => 'pages', :action => 'show', :name => 'davidjamis'})
J
Jeremy Kemper 已提交
1426
    end
1427 1428 1429
    url = set.generate({:controller => 'pages', :action => 'show', :name => 'JAMIS'})
    assert_equal "/page/JAMIS", url
  end
J
Jeremy Kemper 已提交
1430

1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443
  def test_route_requirement_recognize_with_extended_syntax
    set.draw do |map|
      map.connect 'page/:name', :controller => 'pages',
        :action => 'show',
        :requirements => {:name => / # Desperately overcommented regexp
                                    ( #Either
                                     david #The Creator
                                    | #Or
                                      jamis #The Deployer
                                    )/x}
    end
    assert_equal({:controller => 'pages', :action => 'show', :name => 'jamis'}, set.recognize_path('/page/jamis'))
    assert_equal({:controller => 'pages', :action => 'show', :name => 'david'}, set.recognize_path('/page/david'))
1444
    assert_raise ActionController::RoutingError do
1445 1446
      set.recognize_path('/page/david #The Creator')
    end
1447
    assert_raise ActionController::RoutingError do
1448
      set.recognize_path('/page/David')
1449 1450
    end
  end
1451

1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464
  def test_route_requirement_generate_with_extended_syntax
    set.draw do |map|
      map.connect 'page/:name', :controller => 'pages',
        :action => 'show',
        :requirements => {:name => / # Desperately overcommented regexp
                                    ( #Either
                                     david #The Creator
                                    | #Or
                                      jamis #The Deployer
                                    )/x}
    end
    url = set.generate({:controller => 'pages', :action => 'show', :name => 'david'})
    assert_equal "/page/david", url
1465
    assert_raise ActionController::RoutingError do
1466 1467
      url = set.generate({:controller => 'pages', :action => 'show', :name => 'davidjamis'})
    end
1468
    assert_raise ActionController::RoutingError do
1469 1470 1471
      url = set.generate({:controller => 'pages', :action => 'show', :name => 'JAMIS'})
    end
  end
1472

1473 1474 1475 1476 1477 1478 1479 1480 1481 1482
  def test_route_requirement_generate_with_xi_modifiers
    set.draw do |map|
      map.connect 'page/:name', :controller => 'pages',
        :action => 'show',
        :requirements => {:name => / # Desperately overcommented regexp
                                    ( #Either
                                     david #The Creator
                                    | #Or
                                      jamis #The Deployer
                                    )/xi}
1483
    end
1484 1485 1486
    url = set.generate({:controller => 'pages', :action => 'show', :name => 'JAMIS'})
    assert_equal "/page/JAMIS", url
  end
1487

1488 1489 1490 1491 1492 1493 1494 1495 1496 1497
  def test_route_requirement_recognize_with_xi_modifiers
    set.draw do |map|
      map.connect 'page/:name', :controller => 'pages',
        :action => 'show',
        :requirements => {:name => / # Desperately overcommented regexp
                                    ( #Either
                                     david #The Creator
                                    | #Or
                                      jamis #The Deployer
                                    )/xi}
1498
    end
1499 1500
    assert_equal({:controller => 'pages', :action => 'show', :name => 'JAMIS'}, set.recognize_path('/page/JAMIS'))
  end
1501 1502 1503 1504 1505 1506 1507 1508 1509 1510

  def test_routes_with_symbols
    set.draw do |map|
      map.connect 'unnamed', :controller => :pages, :action => :show, :name => :as_symbol
      map.named   'named',   :controller => :pages, :action => :show, :name => :as_symbol
    end
    assert_equal({:controller => 'pages', :action => 'show', :name => :as_symbol}, set.recognize_path('/unnamed'))
    assert_equal({:controller => 'pages', :action => 'show', :name => :as_symbol}, set.recognize_path('/named'))
  end

1511
  def test_regexp_chunk_should_add_question_mark_for_optionals
J
Joshua Peek 已提交
1512 1513 1514 1515
    set.draw do |map|
      map.connect '/', :controller => 'foo'
      map.connect '/hello', :controller => 'bar'
    end
1516

J
Joshua Peek 已提交
1517 1518
    assert_equal '/', set.generate(:controller => 'foo')
    assert_equal '/hello', set.generate(:controller => 'bar')
1519

J
Joshua Peek 已提交
1520 1521
    assert_equal({:controller => "foo", :action => "index"}, set.recognize_path('/'))
    assert_equal({:controller => "bar", :action => "index"}, set.recognize_path('/hello'))
1522 1523 1524
  end

  def test_assign_route_options_with_anchor_chars
J
Joshua Peek 已提交
1525 1526 1527
    set.draw do |map|
      map.connect '/cars/:action/:person/:car/', :controller => 'cars'
    end
1528

J
Joshua Peek 已提交
1529
    assert_equal '/cars/buy/1/2', set.generate(:controller => 'cars', :action => 'buy', :person => '1', :car => '2')
1530

J
Joshua Peek 已提交
1531
    assert_equal({:controller => "cars", :action => "buy", :person => "1", :car => "2"}, set.recognize_path('/cars/buy/1/2'))
1532 1533 1534
  end

  def test_segmentation_of_dot_path
J
Joshua Peek 已提交
1535 1536 1537
    set.draw do |map|
      map.connect '/books/:action.rss', :controller => 'books'
    end
1538

J
Joshua Peek 已提交
1539
    assert_equal '/books/list.rss', set.generate(:controller => 'books', :action => 'list')
1540

J
Joshua Peek 已提交
1541
    assert_equal({:controller => "books", :action => "list"}, set.recognize_path('/books/list.rss'))
1542 1543 1544
  end

  def test_segmentation_of_dynamic_dot_path
J
Joshua Peek 已提交
1545 1546 1547
    set.draw do |map|
      map.connect '/books/:action.:format', :controller => 'books'
    end
1548

J
Joshua Peek 已提交
1549 1550 1551 1552
    assert_equal '/books/list.rss', set.generate(:controller => 'books', :action => 'list', :format => 'rss')
    assert_equal '/books/list.xml', set.generate(:controller => 'books', :action => 'list', :format => 'xml')
    assert_equal '/books/list', set.generate(:controller => 'books', :action => 'list')
    assert_equal '/books', set.generate(:controller => 'books', :action => 'index')
1553

J
Joshua Peek 已提交
1554 1555 1556 1557
    assert_equal({:controller => "books", :action => "list", :format => "rss"}, set.recognize_path('/books/list.rss'))
    assert_equal({:controller => "books", :action => "list", :format => "xml"}, set.recognize_path('/books/list.xml'))
    assert_equal({:controller => "books", :action => "list"}, set.recognize_path('/books/list'))
    assert_equal({:controller => "books", :action => "index"}, set.recognize_path('/books'))
1558 1559 1560
  end

  def test_slashes_are_implied
1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574
    ['/:controller/:action/:id/', '/:controller/:action/:id',
      ':controller/:action/:id', '/:controller/:action/:id/'
    ].each do |path|
      @set = nil
      set.draw { |map| map.connect(path) }

      assert_equal '/content', set.generate(:controller => 'content', :action => 'index')
      assert_equal '/content/list', set.generate(:controller => 'content', :action => 'list')
      assert_equal '/content/show/1', set.generate(:controller => 'content', :action => 'show', :id => '1')

      assert_equal({:controller => "content", :action => "index"}, set.recognize_path('/content'))
      assert_equal({:controller => "content", :action => "index"}, set.recognize_path('/content/index'))
      assert_equal({:controller => "content", :action => "list"}, set.recognize_path('/content/list'))
      assert_equal({:controller => "content", :action => "show", :id => "1"}, set.recognize_path('/content/show/1'))
1575 1576 1577 1578
    end
  end

  def test_default_route_recognition
J
Joshua Peek 已提交
1579 1580 1581
    expected = {:controller => 'pages', :action => 'show', :id => '10'}
    assert_equal expected, default_route_set.recognize_path('/pages/show/10')
    assert_equal expected, default_route_set.recognize_path('/pages/show/10/')
1582 1583

    expected[:id] = 'jamis'
J
Joshua Peek 已提交
1584
    assert_equal expected, default_route_set.recognize_path('/pages/show/jamis/')
1585 1586

    expected.delete :id
J
Joshua Peek 已提交
1587 1588
    assert_equal expected, default_route_set.recognize_path('/pages/show')
    assert_equal expected, default_route_set.recognize_path('/pages/show/')
1589 1590

    expected[:action] = 'index'
J
Joshua Peek 已提交
1591 1592
    assert_equal expected, default_route_set.recognize_path('/pages/')
    assert_equal expected, default_route_set.recognize_path('/pages')
1593 1594

    assert_raise(ActionController::RoutingError) { default_route_set.recognize_path('/') }
J
Joshua Peek 已提交
1595
    assert_raise(ActionController::RoutingError) { default_route_set.recognize_path('/pages/how/goood/it/is/to/be/free') }
1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610
  end

  def test_default_route_should_omit_default_action
    assert_equal '/accounts', default_route_set.generate({:controller => 'accounts', :action => 'index'})
  end

  def test_default_route_should_include_default_action_when_id_present
    assert_equal '/accounts/index/20', default_route_set.generate({:controller => 'accounts', :action => 'index', :id => '20'})
  end

  def test_default_route_should_work_with_action_but_no_id
    assert_equal '/accounts/list_all', default_route_set.generate({:controller => 'accounts', :action => 'list_all'})
  end

  def test_default_route_should_uri_escape_pluses
J
Joshua Peek 已提交
1611 1612 1613
    expected = { :controller => 'pages', :action => 'show', :id => 'hello world' }
    assert_equal expected, default_route_set.recognize_path('/pages/show/hello%20world')
    assert_equal '/pages/show/hello%20world', default_route_set.generate(expected, expected)
1614 1615

    expected[:id] = 'hello+world'
J
Joshua Peek 已提交
1616 1617 1618
    assert_equal expected, default_route_set.recognize_path('/pages/show/hello+world')
    assert_equal expected, default_route_set.recognize_path('/pages/show/hello%2Bworld')
    assert_equal '/pages/show/hello+world', default_route_set.generate(expected, expected)
1619 1620 1621
  end

  def test_build_empty_query_string
J
Joshua Peek 已提交
1622
    assert_uri_equal '/foo', default_route_set.generate({:controller => 'foo'})
1623 1624 1625
  end

  def test_build_query_string_with_nil_value
J
Joshua Peek 已提交
1626
    assert_uri_equal '/foo', default_route_set.generate({:controller => 'foo', :x => nil})
1627 1628 1629
  end

  def test_simple_build_query_string
J
Joshua Peek 已提交
1630
    assert_uri_equal '/foo?x=1&y=2', default_route_set.generate({:controller => 'foo', :x => '1', :y => '2'})
1631 1632 1633
  end

  def test_convert_ints_build_query_string
J
Joshua Peek 已提交
1634
    assert_uri_equal '/foo?x=1&y=2', default_route_set.generate({:controller => 'foo', :x => 1, :y => 2})
1635 1636 1637
  end

  def test_escape_spaces_build_query_string
J
Joshua Peek 已提交
1638
    assert_uri_equal '/foo?x=hello+world&y=goodbye+world', default_route_set.generate({:controller => 'foo', :x => 'hello world', :y => 'goodbye world'})
1639 1640 1641
  end

  def test_expand_array_build_query_string
J
Joshua Peek 已提交
1642
    assert_uri_equal '/foo?x%5B%5D=1&x%5B%5D=2', default_route_set.generate({:controller => 'foo', :x => [1, 2]})
1643 1644 1645
  end

  def test_escape_spaces_build_query_string_selected_keys
J
Joshua Peek 已提交
1646
    assert_uri_equal '/foo?x=hello+world', default_route_set.generate({:controller => 'foo', :x => 'hello world'})
1647
  end
J
Joshua Peek 已提交
1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658

  private
    def assert_uri_equal(expected, actual)
      assert_equal(sort_query_string_params(expected), sort_query_string_params(actual))
    end

    def sort_query_string_params(uri)
      path, qs = uri.split('?')
      qs = qs.split('&').sort.join('&') if qs
      qs ? "#{path}?#{qs}" : path
    end
1659
end
1660

1661 1662 1663
class RouteLoadingTest < Test::Unit::TestCase
  def setup
    routes.instance_variable_set '@routes_last_modified', nil
1664 1665
    Object.remove_const(:RAILS_ROOT) if defined?(::RAILS_ROOT)
    Object.const_set :RAILS_ROOT, '.'
1666
    routes.add_configuration_file(File.join(RAILS_ROOT, 'config', 'routes.rb'))
1667

1668 1669
    @stat = stub_everything
  end
1670

1671 1672 1673 1674
  def teardown
    ActionController::Routing::Routes.configuration_files.clear
    Object.send :remove_const, :RAILS_ROOT
  end
1675

1676 1677 1678
  def test_load
    File.expects(:stat).returns(@stat)
    routes.expects(:load).with(regexp_matches(/routes\.rb$/))
1679

1680 1681
    routes.reload
  end
1682

1683 1684 1685 1686
  def test_no_reload_when_not_modified
    @stat.expects(:mtime).times(2).returns(1)
    File.expects(:stat).times(2).returns(@stat)
    routes.expects(:load).with(regexp_matches(/routes\.rb$/)).at_most_once
1687

1688 1689
    2.times { routes.reload }
  end
1690

1691 1692 1693 1694
  def test_reload_when_modified
    @stat.expects(:mtime).at_least(2).returns(1, 2)
    File.expects(:stat).at_least(2).returns(@stat)
    routes.expects(:load).with(regexp_matches(/routes\.rb$/)).times(2)
1695

1696 1697
    2.times { routes.reload }
  end
1698

1699 1700 1701 1702
  def test_bang_forces_reload
    @stat.expects(:mtime).at_least(2).returns(1)
    File.expects(:stat).at_least(2).returns(@stat)
    routes.expects(:load).with(regexp_matches(/routes\.rb$/)).times(2)
1703

1704 1705
    2.times { routes.reload! }
  end
1706

1707 1708 1709
  def test_adding_inflections_forces_reload
    ActiveSupport::Inflector::Inflections.instance.expects(:uncountable).with('equipment')
    routes.expects(:reload!)
1710

1711 1712
    ActiveSupport::Inflector.inflections { |inflect| inflect.uncountable('equipment') }
  end
1713

1714 1715 1716 1717 1718
  def test_load_with_configuration
    routes.configuration_files.clear
    routes.add_configuration_file("foobarbaz")
    File.expects(:stat).returns(@stat)
    routes.expects(:load).with("foobarbaz")
1719

1720
    routes.reload
1721
  end
J
Joshua Peek 已提交
1722

1723 1724
  def test_load_multiple_configurations
    routes.add_configuration_file("engines.rb")
J
Joshua Peek 已提交
1725

1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737
    File.expects(:stat).at_least_once.returns(@stat)

    routes.expects(:load).with('./config/routes.rb')
    routes.expects(:load).with('engines.rb')

    routes.reload
  end

  private
    def routes
      ActionController::Routing::Routes
    end
1738
end