rails_legacy_mapper 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,53 @@
1
+ require 'active_support/concern'
2
+ require 'active_support/core_ext/module/aliasing'
3
+
4
+ module RailsLegacyMapper
5
+ module RouteSetExtensions #:nodoc:
6
+ extend ActiveSupport::Concern
7
+
8
+ CONTROLLER_REGEXP = /[_a-zA-Z0-9]+/
9
+
10
+ included do
11
+ attr_accessor :controller_namespaces
12
+ alias_method_chain :initialize, :legacy_mapper
13
+ alias_method_chain :eval_block, :legacy_mapper
14
+ end
15
+
16
+ module InstanceMethods #:nodoc:
17
+ def initialize_with_legacy_mapper(request_class = ActionDispatch::Request)
18
+ initialize_without_legacy_mapper
19
+ self.controller_namespaces = Set.new
20
+ end
21
+
22
+ def controller_constraints
23
+ @controller_constraints ||= begin
24
+ namespaces = controller_namespaces + in_memory_controller_namespaces
25
+ source = namespaces.map { |ns| "#{Regexp.escape(ns)}/#{CONTROLLER_REGEXP.source}" }
26
+ source << CONTROLLER_REGEXP.source
27
+ Regexp.compile(source.sort.reverse.join('|'))
28
+ end
29
+ end
30
+
31
+ def in_memory_controller_namespaces
32
+ namespaces = Set.new
33
+ ActionController::Base.descendants.each do |klass|
34
+ next if klass.anonymous?
35
+ namespaces << klass.name.underscore.split('/')[0...-1].join('/')
36
+ end
37
+ namespaces.delete('')
38
+ namespaces
39
+ end
40
+
41
+ def eval_block_with_legacy_mapper(block)
42
+ mapper = ActionDispatch::Routing::Mapper.new(self)
43
+ if block.arity == 1
44
+ mapper.instance_exec(RailsLegacyMapper::Mapper.new(self), &block)
45
+ elsif default_scope
46
+ mapper.with_default_scope(default_scope, &block)
47
+ else
48
+ mapper.instance_exec(&block)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,3 @@
1
+ module RailsLegacyMapper
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,55 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "rails_legacy_mapper/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "rails_legacy_mapper"
7
+ s.version = RailsLegacyMapper::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Andrew White"]
10
+ s.email = ["andyw@pixeltrix.co.uk"]
11
+ s.homepage = %q{https://github.com/pixeltrix/rails_legacy_mapper/}
12
+ s.summary = %q{Old style routes for Rails 3.1}
13
+ s.description = <<-EOF
14
+ This gem provides an extraction of the DeprecatedMapper from Rails 3.0.
15
+ If you have a legacy application with an old style routes.rb file this
16
+ allows you to get your application running quickly in Rails 3.1.
17
+ EOF
18
+
19
+ s.files = [
20
+ ".gemtest",
21
+ "CHANGELOG",
22
+ "LICENSE",
23
+ "README",
24
+ "Rakefile",
25
+ "lib/rails_legacy_mapper.rb",
26
+ "lib/rails_legacy_mapper/mapper.rb",
27
+ "lib/rails_legacy_mapper/route_set_extensions.rb",
28
+ "lib/rails_legacy_mapper/version.rb",
29
+ "rails_legacy_mapper.gemspec",
30
+ "test/fake_controllers.rb",
31
+ "test/legacy_route_set_test.rb",
32
+ "test/rack_mount_integration_test.rb",
33
+ "test/resources_test.rb",
34
+ "test/route_set_test.rb",
35
+ "test/test_helper.rb",
36
+ "test/uri_reserved_characters_routing_test.rb"
37
+ ]
38
+
39
+ s.test_files = [
40
+ "test/fake_controllers.rb",
41
+ "test/legacy_route_set_test.rb",
42
+ "test/rack_mount_integration_test.rb",
43
+ "test/resources_test.rb",
44
+ "test/route_set_test.rb",
45
+ "test/test_helper.rb",
46
+ "test/uri_reserved_characters_routing_test.rb"
47
+ ]
48
+
49
+ s.require_paths = ["lib"]
50
+
51
+ s.add_dependency "rails", "~> 3.1.0.beta"
52
+ s.add_development_dependency "bundler", "~> 1.0.10"
53
+ s.add_development_dependency "mocha", "~> 0.9.8"
54
+ s.add_development_dependency "rake", "~> 0.8.7"
55
+ end
@@ -0,0 +1,66 @@
1
+ class ContentController < ActionController::Base; end
2
+
3
+ module Admin
4
+ class << self; alias_method :const_available?, :const_defined?; end
5
+ class AccountsController < ActionController::Base; end
6
+ class NewsFeedController < ActionController::Base; end
7
+ class PostsController < ActionController::Base; end
8
+ class StuffController < ActionController::Base; end
9
+ class UserController < ActionController::Base; end
10
+ class UsersController < ActionController::Base; end
11
+ end
12
+
13
+ module Api
14
+ class UsersController < ActionController::Base; end
15
+ class ProductsController < ActionController::Base; end
16
+ end
17
+
18
+ class AccountController < ActionController::Base; end
19
+ class AddressesController < ActionController::Base; end
20
+ class ArchiveController < ActionController::Base; end
21
+ class ArticlesController < ActionController::Base; end
22
+ class BarController < ActionController::Base; end
23
+ class BlogController < ActionController::Base; end
24
+ class BooksController < ActionController::Base; end
25
+ class BraveController < ActionController::Base; end
26
+ class CarsController < ActionController::Base; end
27
+ class CcController < ActionController::Base; end
28
+ class CController < ActionController::Base; end
29
+ class ElsewhereController < ActionController::Base; end
30
+ class FooController < ActionController::Base; end
31
+ class GeocodeController < ActionController::Base; end
32
+ class HiController < ActionController::Base; end
33
+ class ImageController < ActionController::Base; end
34
+ class NewsController < ActionController::Base; end
35
+ class NotesController < ActionController::Base; end
36
+ class PeopleController < ActionController::Base; end
37
+ class PostsController < ActionController::Base; end
38
+ class SessionsController < ActionController::Base; end
39
+ class StuffController < ActionController::Base; end
40
+ class SubpathBooksController < ActionController::Base; end
41
+ class SymbolsController < ActionController::Base; end
42
+ class UserController < ActionController::Base; end
43
+ class WeblogController < ActionController::Base; end
44
+
45
+ # For speed test
46
+ class SpeedController < ActionController::Base; end
47
+ class SearchController < SpeedController; end
48
+ class VideosController < SpeedController; end
49
+ class VideoFileController < SpeedController; end
50
+ class VideoSharesController < SpeedController; end
51
+ class VideoAbusesController < SpeedController; end
52
+ class VideoUploadsController < SpeedController; end
53
+ class VideoVisitsController < SpeedController; end
54
+ class UsersController < SpeedController; end
55
+ class SettingsController < SpeedController; end
56
+ class ChannelsController < SpeedController; end
57
+ class ChannelVideosController < SpeedController; end
58
+ class LostPasswordsController < SpeedController; end
59
+ class PagesController < SpeedController; end
60
+
61
+ # For nested resource test
62
+ class MilestonesController < ActionController::Base
63
+ def index() head :ok end
64
+ alias_method :show, :index
65
+ def rescue_action(e) raise e end
66
+ end
@@ -0,0 +1,578 @@
1
+ require 'test_helper'
2
+ require 'cgi'
3
+
4
+ class LegacyRouteSetTest < ActiveSupport::TestCase
5
+ include RoutingTestHelpers
6
+
7
+ def test_default_setup
8
+ set.draw {|map| map.connect ':controller/:action/:id' }
9
+
10
+ assert_equal({:controller => "content", :action => 'index'}, recognize_path("/content"))
11
+ assert_equal({:controller => "content", :action => 'list'}, recognize_path("/content/list"))
12
+ assert_equal({:controller => "content", :action => 'show', :id => '10'}, recognize_path("/content/show/10"))
13
+ assert_equal({:controller => "admin/user", :action => 'show', :id => '10'}, recognize_path("/admin/user/show/10"))
14
+
15
+ assert_equal '/admin/user/show/10', url_for(:controller => 'admin/user', :action => 'show', :id => 10)
16
+ assert_equal '/admin/user/show', url_for({:action => 'show'}, {:controller => 'admin/user', :action => 'list', :id => '10'})
17
+ assert_equal '/admin/user/list/10', url_for({}, {:controller => 'admin/user', :action => 'list', :id => '10'})
18
+ assert_equal '/admin/stuff', url_for({:controller => 'stuff'}, {:controller => 'admin/user', :action => 'list', :id => '10'})
19
+ assert_equal '/stuff', url_for({:controller => '/stuff'}, {:controller => 'admin/user', :action => 'list', :id => '10'})
20
+ end
21
+
22
+ def test_ignores_leading_slash
23
+ set.draw {|map| map.connect '/:controller/:action/:id'}
24
+
25
+ assert_equal({:controller => "content", :action => 'index'}, recognize_path("/content"))
26
+ assert_equal({:controller => "content", :action => 'list'}, recognize_path("/content/list"))
27
+ assert_equal({:controller => "content", :action => 'show', :id => '10'}, recognize_path("/content/show/10"))
28
+ assert_equal({:controller => "admin/user", :action => 'show', :id => '10'}, recognize_path("/admin/user/show/10"))
29
+
30
+ assert_equal '/admin/user/show/10', url_for(:controller => 'admin/user', :action => 'show', :id => 10)
31
+ assert_equal '/admin/user/show', url_for({:action => 'show'}, {:controller => 'admin/user', :action => 'list', :id => '10'})
32
+ assert_equal '/admin/user/list/10', url_for({}, {:controller => 'admin/user', :action => 'list', :id => '10'})
33
+ assert_equal '/admin/stuff', url_for({:controller => 'stuff'}, {:controller => 'admin/user', :action => 'list', :id => '10'})
34
+ assert_equal '/stuff', url_for({:controller => '/stuff'}, {:controller => 'admin/user', :action => 'list', :id => '10'})
35
+ end
36
+
37
+ def test_time_recognition
38
+ # We create many routes to make situation more realistic
39
+ set.draw { |map|
40
+ map.frontpage '', :controller => 'search', :action => 'new'
41
+ map.resources :videos do |video|
42
+ video.resources :comments
43
+ video.resource :file, :controller => 'video_file'
44
+ video.resource :share, :controller => 'video_shares'
45
+ video.resource :abuse, :controller => 'video_abuses'
46
+ end
47
+ map.resources :abuses, :controller => 'video_abuses'
48
+ map.resources :video_uploads
49
+ map.resources :video_visits
50
+
51
+ map.resources :users do |user|
52
+ user.resource :settings
53
+ user.resources :videos
54
+ end
55
+ map.resources :channels do |channel|
56
+ channel.resources :videos, :controller => 'channel_videos'
57
+ end
58
+ map.resource :session
59
+ map.resource :lost_password
60
+ map.search 'search', :controller => 'search'
61
+ map.resources :pages
62
+ map.connect ':controller/:action/:id'
63
+ }
64
+ end
65
+
66
+ def test_route_with_colon_first
67
+ set.draw do |map|
68
+ map.connect '/:controller/:action/:id', :action => 'index', :id => nil
69
+ map.connect ':url', :controller => 'tiny_url', :action => 'translate'
70
+ end
71
+ end
72
+
73
+ def test_route_with_regexp_for_controller
74
+ set.draw do |map|
75
+ map.connect ':controller/:admintoken/:action/:id', :controller => /admin\/.+/
76
+ map.connect ':controller/:action/:id'
77
+ end
78
+ assert_equal({:controller => "admin/user", :admintoken => "foo", :action => "index"},
79
+ recognize_path("/admin/user/foo"))
80
+ assert_equal({:controller => "content", :action => "foo"}, recognize_path("/content/foo"))
81
+ assert_equal '/admin/user/foo', url_for(:controller => "admin/user", :admintoken => "foo", :action => "index")
82
+ assert_equal '/content/foo', url_for(:controller => "content", :action => "foo")
83
+ end
84
+
85
+ def test_route_with_regexp_and_captures_for_controller
86
+ set.draw do |map|
87
+ map.connect ':controller/:action/:id', :controller => /admin\/(accounts|users)/
88
+ end
89
+ assert_equal({:controller => "admin/accounts", :action => "index"}, recognize_path("/admin/accounts"))
90
+ assert_equal({:controller => "admin/users", :action => "index"}, recognize_path("/admin/users"))
91
+ assert_raise(ActionController::RoutingError) { recognize_path("/admin/products") }
92
+ end
93
+
94
+ def test_route_with_regexp_and_dot
95
+ set.draw do |map|
96
+ map.connect ':controller/:action/:file',
97
+ :controller => /admin|user/,
98
+ :action => /upload|download/,
99
+ :defaults => {:file => nil},
100
+ :requirements => {:file => %r{[^/]+(\.[^/]+)?}}
101
+ end
102
+ # Without a file extension
103
+ assert_equal '/user/download/file',
104
+ url_for(:controller => "user", :action => "download", :file => "file")
105
+ assert_equal(
106
+ {:controller => "user", :action => "download", :file => "file"},
107
+ recognize_path("/user/download/file"))
108
+
109
+ # Now, let's try a file with an extension, really a dot (.)
110
+ assert_equal '/user/download/file.jpg',
111
+ url_for(
112
+ :controller => "user", :action => "download", :file => "file.jpg")
113
+ assert_equal(
114
+ {:controller => "user", :action => "download", :file => "file.jpg"},
115
+ recognize_path("/user/download/file.jpg"))
116
+ end
117
+
118
+ def test_basic_named_route
119
+ set.draw do |map|
120
+ map.home '', :controller => 'content', :action => 'list'
121
+ end
122
+ x = setup_for_named_route
123
+ assert_equal("http://test.host/",
124
+ x.send(:home_url))
125
+ end
126
+
127
+ def test_named_route_with_option
128
+ set.draw do |map|
129
+ map.page 'page/:title', :controller => 'content', :action => 'show_page'
130
+ end
131
+ x = setup_for_named_route
132
+ assert_equal("http://test.host/page/new%20stuff",
133
+ x.send(:page_url, :title => 'new stuff'))
134
+ end
135
+
136
+ def test_named_route_with_default
137
+ set.draw do |map|
138
+ map.page 'page/:title', :controller => 'content', :action => 'show_page', :title => 'AboutPage'
139
+ end
140
+ x = setup_for_named_route
141
+ assert_equal("http://test.host/page/AboutRails",
142
+ x.send(:page_url, :title => "AboutRails"))
143
+
144
+ end
145
+
146
+ def test_named_route_with_name_prefix
147
+ set.draw do |map|
148
+ map.page 'page', :controller => 'content', :action => 'show_page', :name_prefix => 'my_'
149
+ end
150
+ x = setup_for_named_route
151
+ assert_equal("http://test.host/page",
152
+ x.send(:my_page_url))
153
+ end
154
+
155
+ def test_named_route_with_path_prefix
156
+ set.draw do |map|
157
+ map.page 'page', :controller => 'content', :action => 'show_page', :path_prefix => 'my'
158
+ end
159
+ x = setup_for_named_route
160
+ assert_equal("http://test.host/my/page",
161
+ x.send(:page_url))
162
+ end
163
+
164
+ def test_named_route_with_blank_path_prefix
165
+ set.draw do |map|
166
+ map.page 'page', :controller => 'content', :action => 'show_page', :path_prefix => ''
167
+ end
168
+ x = setup_for_named_route
169
+ assert_equal("http://test.host/page",
170
+ x.send(:page_url))
171
+ end
172
+
173
+ def test_named_route_with_nested_controller
174
+ set.draw do |map|
175
+ map.users 'admin/user', :controller => 'admin/user', :action => 'index'
176
+ end
177
+ x = setup_for_named_route
178
+ assert_equal("http://test.host/admin/user",
179
+ x.send(:users_url))
180
+ end
181
+
182
+ def test_optimised_named_route_with_host
183
+ set.draw do |map|
184
+ map.pages 'pages', :controller => 'content', :action => 'show_page', :host => 'foo.com'
185
+ end
186
+ x = setup_for_named_route
187
+ x.expects(:url_for).with(:host => 'foo.com', :only_path => false, :controller => 'content', :action => 'show_page', :use_route => :pages).once
188
+ x.send(:pages_url)
189
+ end
190
+
191
+ def setup_for_named_route
192
+ MockController.build(set.url_helpers).new
193
+ end
194
+
195
+ def test_named_route_without_hash
196
+ set.draw do |map|
197
+ map.normal ':controller/:action/:id'
198
+ end
199
+ end
200
+
201
+ def test_named_route_root
202
+ set.draw do |map|
203
+ map.root :controller => "hello"
204
+ end
205
+ x = setup_for_named_route
206
+ assert_equal("http://test.host/", x.send(:root_url))
207
+ assert_equal("/", x.send(:root_path))
208
+ end
209
+
210
+ def test_named_route_with_regexps
211
+ set.draw do |map|
212
+ map.article 'page/:year/:month/:day/:title', :controller => 'page', :action => 'show',
213
+ :year => /\d+/, :month => /\d+/, :day => /\d+/
214
+ map.connect ':controller/:action/:id'
215
+ end
216
+ x = setup_for_named_route
217
+ # assert_equal(
218
+ # {:controller => 'page', :action => 'show', :title => 'hi', :use_route => :article, :only_path => false},
219
+ # x.send(:article_url, :title => 'hi')
220
+ # )
221
+ assert_equal(
222
+ "http://test.host/page/2005/6/10/hi",
223
+ x.send(:article_url, :title => 'hi', :day => 10, :year => 2005, :month => 6)
224
+ )
225
+ end
226
+
227
+ def test_changing_controller
228
+ set.draw {|map| map.connect ':controller/:action/:id' }
229
+
230
+ assert_equal '/admin/stuff/show/10', url_for(
231
+ {:controller => 'stuff', :action => 'show', :id => 10},
232
+ {:controller => 'admin/user', :action => 'index'}
233
+ )
234
+ end
235
+
236
+ def test_paths_escaped
237
+ set.draw do |map|
238
+ map.path 'file/*path', :controller => 'content', :action => 'show_file'
239
+ map.connect ':controller/:action/:id'
240
+ end
241
+
242
+ # No + to space in URI escaping, only for query params.
243
+ results = recognize_path "/file/hello+world/how+are+you%3F"
244
+ assert results, "Recognition should have succeeded"
245
+ assert_equal ['hello+world', 'how+are+you?'], results[:path]
246
+
247
+ # Use %20 for space instead.
248
+ results = recognize_path "/file/hello%20world/how%20are%20you%3F"
249
+ assert results, "Recognition should have succeeded"
250
+ assert_equal ['hello world', 'how are you?'], results[:path]
251
+ end
252
+
253
+ def test_paths_slashes_unescaped_with_ordered_parameters
254
+ set.draw do |map|
255
+ map.path '/file/*path', :controller => 'content'
256
+ end
257
+
258
+ # No / to %2F in URI, only for query params.
259
+ x = setup_for_named_route
260
+ assert_equal("/file/hello/world", x.send(:path_path, ['hello', 'world']))
261
+ end
262
+
263
+ def test_non_controllers_cannot_be_matched
264
+ set.draw do |map|
265
+ map.connect ':controller/:action/:id'
266
+ end
267
+ assert_raise(ActionController::RoutingError) { recognize_path("/not_a/show/10") }
268
+ end
269
+
270
+ def test_paths_do_not_accept_defaults
271
+ assert_raise(ActionController::RoutingError) do
272
+ set.draw do |map|
273
+ map.path 'file/*path', :controller => 'content', :action => 'show_file', :path => %w(fake default)
274
+ map.connect ':controller/:action/:id'
275
+ end
276
+ end
277
+
278
+ set.draw do |map|
279
+ map.path 'file/*path', :controller => 'content', :action => 'show_file', :path => []
280
+ map.connect ':controller/:action/:id'
281
+ end
282
+ end
283
+
284
+ def test_should_list_options_diff_when_routing_requirements_dont_match
285
+ set.draw do |map|
286
+ map.post 'post/:id', :controller=> 'post', :action=> 'show', :requirements => {:id => /\d+/}
287
+ end
288
+ assert_raise(ActionController::RoutingError) { url_for(:controller => 'post', :action => 'show', :bad_param => "foo", :use_route => "post") }
289
+ end
290
+
291
+ def test_dynamic_path_allowed
292
+ set.draw do |map|
293
+ map.connect '*path', :controller => 'content', :action => 'show_file'
294
+ end
295
+
296
+ assert_equal '/pages/boo', url_for(:controller => 'content', :action => 'show_file', :path => %w(pages boo))
297
+ end
298
+
299
+ def test_dynamic_recall_paths_allowed
300
+ set.draw do |map|
301
+ map.connect '*path', :controller => 'content', :action => 'show_file'
302
+ end
303
+
304
+ assert_equal '/pages/boo', url_for({}, :controller => 'content', :action => 'show_file', :path => %w(pages boo))
305
+ end
306
+
307
+ def test_backwards
308
+ set.draw do |map|
309
+ map.connect 'page/:id/:action', :controller => 'pages', :action => 'show'
310
+ map.connect ':controller/:action/:id'
311
+ end
312
+
313
+ assert_equal '/page/20', url_for({:id => 20}, {:controller => 'pages', :action => 'show'})
314
+ assert_equal '/page/20', url_for(:controller => 'pages', :id => 20, :action => 'show')
315
+ assert_equal '/pages/boo', url_for(:controller => 'pages', :action => 'boo')
316
+ end
317
+
318
+ def test_route_with_fixnum_default
319
+ set.draw do |map|
320
+ map.connect 'page/:id', :controller => 'content', :action => 'show_page', :id => 1
321
+ map.connect ':controller/:action/:id'
322
+ end
323
+
324
+ assert_equal '/page', url_for(:controller => 'content', :action => 'show_page')
325
+ assert_equal '/page', url_for(:controller => 'content', :action => 'show_page', :id => 1)
326
+ assert_equal '/page', url_for(:controller => 'content', :action => 'show_page', :id => '1')
327
+ assert_equal '/page/10', url_for(:controller => 'content', :action => 'show_page', :id => 10)
328
+
329
+ assert_equal({:controller => "content", :action => 'show_page', :id => '1'}, recognize_path("/page"))
330
+ assert_equal({:controller => "content", :action => 'show_page', :id => '1'}, recognize_path("/page/1"))
331
+ assert_equal({:controller => "content", :action => 'show_page', :id => '10'}, recognize_path("/page/10"))
332
+ end
333
+
334
+ # For newer revision
335
+ def test_route_with_text_default
336
+ set.draw do |map|
337
+ map.connect 'page/:id', :controller => 'content', :action => 'show_page', :id => 1
338
+ map.connect ':controller/:action/:id'
339
+ end
340
+
341
+ assert_equal '/page/foo', url_for(:controller => 'content', :action => 'show_page', :id => 'foo')
342
+ assert_equal({:controller => "content", :action => 'show_page', :id => 'foo'}, recognize_path("/page/foo"))
343
+
344
+ token = "\321\202\320\265\320\272\321\201\321\202" # 'text' in russian
345
+ token.force_encoding(Encoding::BINARY) if token.respond_to?(:force_encoding)
346
+ escaped_token = CGI::escape(token)
347
+
348
+ assert_equal '/page/' + escaped_token, url_for(:controller => 'content', :action => 'show_page', :id => token)
349
+ assert_equal({:controller => "content", :action => 'show_page', :id => token}, recognize_path("/page/#{escaped_token}"))
350
+ end
351
+
352
+ def test_action_expiry
353
+ set.draw {|map| map.connect ':controller/:action/:id' }
354
+ assert_equal '/content', url_for({:controller => 'content'}, {:controller => 'content', :action => 'show'})
355
+ end
356
+
357
+ def test_requirement_should_prevent_optional_id
358
+ set.draw do |map|
359
+ map.post 'post/:id', :controller=> 'post', :action=> 'show', :requirements => {:id => /\d+/}
360
+ end
361
+
362
+ assert_equal '/post/10', url_for(:controller => 'post', :action => 'show', :id => 10)
363
+
364
+ assert_raise ActionController::RoutingError do
365
+ url_for(:controller => 'post', :action => 'show')
366
+ end
367
+ end
368
+
369
+ def test_both_requirement_and_optional
370
+ set.draw do |map|
371
+ map.blog('test/:year', :controller => 'post', :action => 'show',
372
+ :defaults => { :year => nil },
373
+ :requirements => { :year => /\d{4}/ }
374
+ )
375
+ map.connect ':controller/:action/:id'
376
+ end
377
+
378
+ assert_equal '/test', url_for(:controller => 'post', :action => 'show')
379
+ assert_equal '/test', url_for(:controller => 'post', :action => 'show', :year => nil)
380
+
381
+ x = setup_for_named_route
382
+ assert_equal("http://test.host/test",
383
+ x.send(:blog_url))
384
+ end
385
+
386
+ def test_set_to_nil_forgets
387
+ set.draw do |map|
388
+ map.connect 'pages/:year/:month/:day', :controller => 'content', :action => 'list_pages', :month => nil, :day => nil
389
+ map.connect ':controller/:action/:id'
390
+ end
391
+
392
+ assert_equal '/pages/2005',
393
+ url_for(:controller => 'content', :action => 'list_pages', :year => 2005)
394
+ assert_equal '/pages/2005/6',
395
+ url_for(:controller => 'content', :action => 'list_pages', :year => 2005, :month => 6)
396
+ assert_equal '/pages/2005/6/12',
397
+ url_for(:controller => 'content', :action => 'list_pages', :year => 2005, :month => 6, :day => 12)
398
+
399
+ assert_equal '/pages/2005/6/4',
400
+ url_for({:day => 4}, {:controller => 'content', :action => 'list_pages', :year => '2005', :month => '6', :day => '12'})
401
+
402
+ assert_equal '/pages/2005/6',
403
+ url_for({:day => nil}, {:controller => 'content', :action => 'list_pages', :year => '2005', :month => '6', :day => '12'})
404
+
405
+ assert_equal '/pages/2005',
406
+ url_for({:day => nil, :month => nil}, {:controller => 'content', :action => 'list_pages', :year => '2005', :month => '6', :day => '12'})
407
+ end
408
+
409
+ def test_url_with_no_action_specified
410
+ set.draw do |map|
411
+ map.connect '', :controller => 'content'
412
+ map.connect ':controller/:action/:id'
413
+ end
414
+
415
+ assert_equal '/', url_for(:controller => 'content', :action => 'index')
416
+ assert_equal '/', url_for(:controller => 'content')
417
+ end
418
+
419
+ def test_named_url_with_no_action_specified
420
+ set.draw do |map|
421
+ map.home '', :controller => 'content'
422
+ map.connect ':controller/:action/:id'
423
+ end
424
+
425
+ assert_equal '/', url_for(:controller => 'content', :action => 'index')
426
+ assert_equal '/', url_for(:controller => 'content')
427
+
428
+ x = setup_for_named_route
429
+ assert_equal("http://test.host/",
430
+ x.send(:home_url))
431
+ end
432
+
433
+ def test_url_generated_when_forgetting_action
434
+ [{:controller => 'content', :action => 'index'}, {:controller => 'content'}].each do |hash|
435
+ set.draw do |map|
436
+ map.home '', hash
437
+ map.connect ':controller/:action/:id'
438
+ end
439
+ assert_equal '/', url_for({:action => nil}, {:controller => 'content', :action => 'hello'})
440
+ assert_equal '/', url_for({:controller => 'content'})
441
+ assert_equal '/content/hi', url_for({:controller => 'content', :action => 'hi'})
442
+ end
443
+ end
444
+
445
+ def test_named_route_method
446
+ set.draw do |map|
447
+ map.categories 'categories', :controller => 'content', :action => 'categories'
448
+ map.connect ':controller/:action/:id'
449
+ end
450
+
451
+ assert_equal '/categories', url_for(:controller => 'content', :action => 'categories')
452
+ assert_equal '/content/hi', url_for({:controller => 'content', :action => 'hi'})
453
+ end
454
+
455
+ def test_named_routes_array
456
+ test_named_route_method
457
+ assert_equal [:categories], set.named_routes.names
458
+ end
459
+
460
+ def test_nil_defaults
461
+ set.draw do |map|
462
+ map.connect 'journal',
463
+ :controller => 'content',
464
+ :action => 'list_journal',
465
+ :date => nil, :user_id => nil
466
+ map.connect ':controller/:action/:id'
467
+ end
468
+
469
+ assert_equal '/journal', url_for(:controller => 'content', :action => 'list_journal', :date => nil, :user_id => nil)
470
+ end
471
+
472
+ def setup_request_method_routes_for(method)
473
+ set.draw do |map|
474
+ map.connect '/match', :controller => 'books', :action => 'get', :conditions => { :method => :get }
475
+ map.connect '/match', :controller => 'books', :action => 'post', :conditions => { :method => :post }
476
+ map.connect '/match', :controller => 'books', :action => 'put', :conditions => { :method => :put }
477
+ map.connect '/match', :controller => 'books', :action => 'delete', :conditions => { :method => :delete }
478
+ end
479
+ end
480
+
481
+ %w(GET POST PUT DELETE).each do |request_method|
482
+ define_method("test_request_method_recognized_with_#{request_method}") do
483
+ setup_request_method_routes_for(request_method)
484
+ params = recognize_path("/match", :method => request_method)
485
+ assert_equal request_method.downcase, params[:action]
486
+ end
487
+ end
488
+
489
+ def test_recognize_array_of_methods
490
+ set.draw do |map|
491
+ map.connect '/match', :controller => 'books', :action => 'get_or_post', :conditions => { :method => [:get, :post] }
492
+ map.connect '/match', :controller => 'books', :action => 'not_get_or_post'
493
+ end
494
+
495
+ params = recognize_path("/match", :method => :post)
496
+ assert_equal 'get_or_post', params[:action]
497
+
498
+ params = recognize_path("/match", :method => :put)
499
+ assert_equal 'not_get_or_post', params[:action]
500
+ end
501
+
502
+ def test_subpath_recognized
503
+ set.draw do |map|
504
+ map.connect '/books/:id/edit', :controller => 'subpath_books', :action => 'edit'
505
+ map.connect '/items/:id/:action', :controller => 'subpath_books'
506
+ map.connect '/posts/new/:action', :controller => 'subpath_books'
507
+ map.connect '/posts/:id', :controller => 'subpath_books', :action => "show"
508
+ end
509
+
510
+ hash = recognize_path "/books/17/edit"
511
+ assert_not_nil hash
512
+ assert_equal %w(subpath_books 17 edit), [hash[:controller], hash[:id], hash[:action]]
513
+
514
+ hash = recognize_path "/items/3/complete"
515
+ assert_not_nil hash
516
+ assert_equal %w(subpath_books 3 complete), [hash[:controller], hash[:id], hash[:action]]
517
+
518
+ hash = recognize_path "/posts/new/preview"
519
+ assert_not_nil hash
520
+ assert_equal %w(subpath_books preview), [hash[:controller], hash[:action]]
521
+
522
+ hash = recognize_path "/posts/7"
523
+ assert_not_nil hash
524
+ assert_equal %w(subpath_books show 7), [hash[:controller], hash[:action], hash[:id]]
525
+ end
526
+
527
+ def test_subpath_generated
528
+ set.draw do |map|
529
+ map.connect '/books/:id/edit', :controller => 'subpath_books', :action => 'edit'
530
+ map.connect '/items/:id/:action', :controller => 'subpath_books'
531
+ map.connect '/posts/new/:action', :controller => 'subpath_books'
532
+ end
533
+
534
+ assert_equal "/books/7/edit", url_for(:controller => "subpath_books", :id => 7, :action => "edit")
535
+ assert_equal "/items/15/complete", url_for(:controller => "subpath_books", :id => 15, :action => "complete")
536
+ assert_equal "/posts/new/preview", url_for(:controller => "subpath_books", :action => "preview")
537
+ end
538
+
539
+ def test_failed_requirements_raises_exception_with_violated_requirements
540
+ set.draw do |map|
541
+ map.foo_with_requirement 'foos/:id', :controller=>'foos', :requirements=>{:id=>/\d+/}
542
+ end
543
+
544
+ x = setup_for_named_route
545
+ assert_raise(ActionController::RoutingError) do
546
+ x.send(:foo_with_requirement_url, "I am Against the requirements")
547
+ end
548
+ end
549
+
550
+ def test_routes_changed_correctly_after_clear
551
+ rs = ::ActionController::Routing::RouteSet.new
552
+ set.draw do |map|
553
+ map.connect 'ca', :controller => 'ca', :action => "aa"
554
+ map.connect 'cb', :controller => 'cb', :action => "ab"
555
+ map.connect 'cc', :controller => 'cc', :action => "ac"
556
+ map.connect ':controller/:action/:id'
557
+ map.connect ':controller/:action/:id.:format'
558
+ end
559
+
560
+ hash = recognize_path "/cc"
561
+
562
+ assert_not_nil hash
563
+ assert_equal %w(cc ac), [hash[:controller], hash[:action]]
564
+
565
+ set.draw do |map|
566
+ map.connect 'cb', :controller => 'cb', :action => "ab"
567
+ map.connect 'cc', :controller => 'cc', :action => "ac"
568
+ map.connect ':controller/:action/:id'
569
+ map.connect ':controller/:action/:id.:format'
570
+ end
571
+
572
+ hash = recognize_path "/cc"
573
+
574
+ assert_not_nil hash
575
+ assert_equal %w(cc ac), [hash[:controller], hash[:action]]
576
+
577
+ end
578
+ end