Updated to lastest rails + a patch of our own (in url_helper, ticket #294)
[gitorious:lachies-clone.git] / vendor / rails / actionpack / test / template / url_helper_test.rb
1 require 'abstract_unit'
2
3 RequestMock = Struct.new("Request", :request_uri, :protocol, :host_with_port, :env)
4
5 class UrlHelperTest < ActionView::TestCase
6   tests ActionView::Helpers::UrlHelper
7
8   def setup
9     @controller = Class.new do
10       attr_accessor :url, :request
11       def url_for(options)
12         url
13       end
14     end
15     @controller = @controller.new
16     @controller.url = "http://www.example.com"
17   end
18
19   def test_url_for_escapes_urls
20     @controller.url = "http://www.example.com?a=b&c=d"
21     assert_equal "http://www.example.com?a=b&amp;c=d", url_for(:a => 'b', :c => 'd')
22     assert_equal "http://www.example.com?a=b&amp;c=d", url_for(:a => 'b', :c => 'd', :escape => true)
23     assert_equal "http://www.example.com?a=b&c=d", url_for(:a => 'b', :c => 'd', :escape => false)
24   end
25
26   def test_url_for_escapes_url_once
27     @controller.url = "http://www.example.com?a=b&amp;c=d"
28     assert_equal "http://www.example.com?a=b&amp;c=d", url_for("http://www.example.com?a=b&amp;c=d")
29   end
30
31   # todo: missing test cases
32   def test_button_to_with_straight_url
33     assert_dom_equal "<form method=\"post\" action=\"http://www.example.com\" class=\"button-to\"><div><input type=\"submit\" value=\"Hello\" /></div></form>", button_to("Hello", "http://www.example.com")
34   end
35
36   def test_button_to_with_query
37     assert_dom_equal "<form method=\"post\" action=\"http://www.example.com/q1=v1&amp;q2=v2\" class=\"button-to\"><div><input type=\"submit\" value=\"Hello\" /></div></form>", button_to("Hello", "http://www.example.com/q1=v1&q2=v2")
38   end
39
40   def test_button_to_with_escaped_query
41     assert_dom_equal "<form method=\"post\" action=\"http://www.example.com/q1=v1&amp;q2=v2\" class=\"button-to\"><div><input type=\"submit\" value=\"Hello\" /></div></form>", button_to("Hello", "http://www.example.com/q1=v1&amp;q2=v2")
42   end
43
44   def test_button_to_with_query_and_no_name
45     assert_dom_equal "<form method=\"post\" action=\"http://www.example.com?q1=v1&amp;q2=v2\" class=\"button-to\"><div><input type=\"submit\" value=\"http://www.example.com?q1=v1&amp;q2=v2\" /></div></form>", button_to(nil, "http://www.example.com?q1=v1&q2=v2")
46   end
47
48   def test_button_to_with_javascript_confirm
49     assert_dom_equal(
50       "<form method=\"post\" action=\"http://www.example.com\" class=\"button-to\"><div><input onclick=\"return confirm('Are you sure?');\" type=\"submit\" value=\"Hello\" /></div></form>",
51       button_to("Hello", "http://www.example.com", :confirm => "Are you sure?")
52     )
53   end
54
55   def test_button_to_enabled_disabled
56     assert_dom_equal(
57       "<form method=\"post\" action=\"http://www.example.com\" class=\"button-to\"><div><input type=\"submit\" value=\"Hello\" /></div></form>",
58       button_to("Hello", "http://www.example.com", :disabled => false)
59     )
60     assert_dom_equal(
61       "<form method=\"post\" action=\"http://www.example.com\" class=\"button-to\"><div><input disabled=\"disabled\" type=\"submit\" value=\"Hello\" /></div></form>",
62       button_to("Hello", "http://www.example.com", :disabled => true)
63     )
64   end
65
66   def test_button_to_with_method_delete
67     assert_dom_equal(
68       "<form method=\"post\" action=\"http://www.example.com\" class=\"button-to\"><div><input type=\"hidden\" name=\"_method\" value=\"delete\" /><input type=\"submit\" value=\"Hello\" /></div></form>",
69       button_to("Hello", "http://www.example.com", :method => :delete)
70     )
71   end
72
73   def test_button_to_with_method_get
74     assert_dom_equal(
75       "<form method=\"get\" action=\"http://www.example.com\" class=\"button-to\"><div><input type=\"submit\" value=\"Hello\" /></div></form>",
76       button_to("Hello", "http://www.example.com", :method => :get)
77     )
78   end
79
80   def test_link_tag_with_straight_url
81     assert_dom_equal "<a href=\"http://www.example.com\">Hello</a>", link_to("Hello", "http://www.example.com")
82   end
83   
84   def test_link_tag_without_host_option
85     ActionController::Base.class_eval { attr_accessor :url }
86     url = {:controller => 'weblog', :action => 'show'}
87     @controller = ActionController::Base.new
88     @controller.request = ActionController::TestRequest.new
89     @controller.url = ActionController::UrlRewriter.new(@controller.request, url)
90     assert_dom_equal(%q{<a href="/weblog/show">Test Link</a>}, link_to('Test Link', url))
91   end
92
93   def test_link_tag_with_host_option
94     ActionController::Base.class_eval { attr_accessor :url }
95     url = {:controller => 'weblog', :action => 'show', :host => 'www.example.com'}
96     @controller = ActionController::Base.new
97     @controller.request = ActionController::TestRequest.new
98     @controller.url = ActionController::UrlRewriter.new(@controller.request, url)
99     assert_dom_equal(%q{<a href="http://www.example.com/weblog/show">Test Link</a>}, link_to('Test Link', url))
100   end
101
102   def test_link_tag_with_query
103     assert_dom_equal "<a href=\"http://www.example.com?q1=v1&amp;q2=v2\">Hello</a>", link_to("Hello", "http://www.example.com?q1=v1&amp;q2=v2")
104   end
105
106   def test_link_tag_with_query_and_no_name
107     assert_dom_equal "<a href=\"http://www.example.com?q1=v1&amp;q2=v2\">http://www.example.com?q1=v1&amp;q2=v2</a>", link_to(nil, "http://www.example.com?q1=v1&amp;q2=v2")
108   end
109
110   def test_link_tag_with_back
111     @controller.request = RequestMock.new("http://www.example.com/weblog/show", nil, nil, {'HTTP_REFERER' => 'http://www.example.com/referer'})
112     assert_dom_equal "<a href=\"http://www.example.com/referer\">go back</a>", link_to('go back', :back)
113   end
114
115   def test_link_tag_with_back_and_no_referer
116     @controller.request = RequestMock.new("http://www.example.com/weblog/show", nil, nil, {})
117     assert_dom_equal "<a href=\"javascript:history.back()\">go back</a>", link_to('go back', :back)
118   end
119
120   def test_link_tag_with_back
121     @controller.request = RequestMock.new("http://www.example.com/weblog/show", nil, nil, {'HTTP_REFERER' => 'http://www.example.com/referer'})
122     assert_dom_equal "<a href=\"http://www.example.com/referer\">go back</a>", link_to('go back', :back)
123   end
124   
125   def test_link_tag_with_back_and_no_referer
126     @controller.request = RequestMock.new("http://www.example.com/weblog/show", nil, nil, {})
127     assert_dom_equal "<a href=\"javascript:history.back()\">go back</a>", link_to('go back', :back)
128   end
129
130   def test_link_tag_with_img
131     assert_dom_equal "<a href=\"http://www.example.com\"><img src='/favicon.jpg' /></a>", link_to("<img src='/favicon.jpg' />", "http://www.example.com")
132   end
133
134   def test_link_with_nil_html_options
135     assert_dom_equal "<a href=\"http://www.example.com\">Hello</a>", link_to("Hello", {:action => 'myaction'}, nil)
136   end
137
138   def test_link_tag_with_custom_onclick
139     assert_dom_equal "<a href=\"http://www.example.com\" onclick=\"alert('yay!')\">Hello</a>", link_to("Hello", "http://www.example.com", :onclick => "alert('yay!')")
140   end
141
142   def test_link_tag_with_javascript_confirm
143     assert_dom_equal(
144       "<a href=\"http://www.example.com\" onclick=\"return confirm('Are you sure?');\">Hello</a>",
145       link_to("Hello", "http://www.example.com", :confirm => "Are you sure?")
146     )
147     assert_dom_equal(
148       "<a href=\"http://www.example.com\" onclick=\"return confirm('You can\\'t possibly be sure, can you?');\">Hello</a>",
149       link_to("Hello", "http://www.example.com", :confirm => "You can't possibly be sure, can you?")
150     )
151     assert_dom_equal(
152       "<a href=\"http://www.example.com\" onclick=\"return confirm('You can\\'t possibly be sure,\\n can you?');\">Hello</a>",
153       link_to("Hello", "http://www.example.com", :confirm => "You can't possibly be sure,\n can you?")
154     )
155   end
156
157   def test_link_tag_with_popup
158     assert_dom_equal(
159       "<a href=\"http://www.example.com\" onclick=\"window.open(this.href);return false;\">Hello</a>",
160       link_to("Hello", "http://www.example.com", :popup => true)
161     )
162     assert_dom_equal(
163       "<a href=\"http://www.example.com\" onclick=\"window.open(this.href);return false;\">Hello</a>",
164       link_to("Hello", "http://www.example.com", :popup => 'true')
165     )
166     assert_dom_equal(
167       "<a href=\"http://www.example.com\" onclick=\"window.open(this.href,'window_name','width=300,height=300');return false;\">Hello</a>",
168       link_to("Hello", "http://www.example.com", :popup => ['window_name', 'width=300,height=300'])
169     )
170   end
171
172   def test_link_tag_with_popup_and_javascript_confirm
173     assert_dom_equal(
174       "<a href=\"http://www.example.com\" onclick=\"if (confirm('Fo\\' sho\\'?')) { window.open(this.href); };return false;\">Hello</a>",
175       link_to("Hello", "http://www.example.com", { :popup => true, :confirm => "Fo' sho'?" })
176     )
177     assert_dom_equal(
178       "<a href=\"http://www.example.com\" onclick=\"if (confirm('Are you serious?')) { window.open(this.href,'window_name','width=300,height=300'); };return false;\">Hello</a>",
179       link_to("Hello", "http://www.example.com", { :popup => ['window_name', 'width=300,height=300'], :confirm => "Are you serious?" })
180     )
181   end
182
183   def test_link_tag_using_post_javascript
184     assert_dom_equal(
185       "<a href='http://www.example.com' onclick=\"var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;f.submit();return false;\">Hello</a>",
186       link_to("Hello", "http://www.example.com", :method => :post)
187     )
188   end
189
190   def test_link_tag_using_delete_javascript
191     assert_dom_equal(
192       "<a href='http://www.example.com' onclick=\"var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var m = document.createElement('input'); m.setAttribute('type', 'hidden'); m.setAttribute('name', '_method'); m.setAttribute('value', 'delete'); f.appendChild(m);f.submit();return false;\">Destroy</a>",
193       link_to("Destroy", "http://www.example.com", :method => :delete)
194     )
195   end
196
197   def test_link_tag_using_delete_javascript_and_href
198     assert_dom_equal(
199       "<a href='\#' onclick=\"var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = 'http://www.example.com';var m = document.createElement('input'); m.setAttribute('type', 'hidden'); m.setAttribute('name', '_method'); m.setAttribute('value', 'delete'); f.appendChild(m);f.submit();return false;\">Destroy</a>",
200       link_to("Destroy", "http://www.example.com", :method => :delete, :href => '#')
201     )
202   end
203
204   def test_link_tag_using_post_javascript_and_confirm
205     assert_dom_equal(
206       "<a href=\"http://www.example.com\" onclick=\"if (confirm('Are you serious?')) { var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;f.submit(); };return false;\">Hello</a>",
207       link_to("Hello", "http://www.example.com", :method => :post, :confirm => "Are you serious?")
208     )
209   end
210
211   def test_link_tag_using_post_javascript_and_popup
212     assert_raises(ActionView::ActionViewError) { link_to("Hello", "http://www.example.com", :popup => true, :method => :post, :confirm => "Are you serious?") }
213   end
214   
215   def test_link_to_unless
216     assert_equal "Showing", link_to_unless(true, "Showing", :action => "show", :controller => "weblog")
217     assert_dom_equal "<a href=\"http://www.example.com\">Listing</a>", link_to_unless(false, "Listing", :action => "list", :controller => "weblog")
218     assert_equal "Showing", link_to_unless(true, "Showing", :action => "show", :controller => "weblog", :id => 1)
219     assert_equal "<strong>Showing</strong>", link_to_unless(true, "Showing", :action => "show", :controller => "weblog", :id => 1) { |name, options, html_options|
220       "<strong>#{name}</strong>"
221     }
222     assert_equal "<strong>Showing</strong>", link_to_unless(true, "Showing", :action => "show", :controller => "weblog", :id => 1) { |name|
223       "<strong>#{name}</strong>"
224     }
225     assert_equal "test", link_to_unless(true, "Showing", :action => "show", :controller => "weblog", :id => 1) {
226       "test"
227     }
228   end
229
230   def test_link_to_if
231     assert_equal "Showing", link_to_if(false, "Showing", :action => "show", :controller => "weblog")
232     assert_dom_equal "<a href=\"http://www.example.com\">Listing</a>", link_to_if(true, "Listing", :action => "list", :controller => "weblog")
233     assert_equal "Showing", link_to_if(false, "Showing", :action => "show", :controller => "weblog", :id => 1)
234   end
235
236   def test_link_unless_current
237     @controller.request = RequestMock.new("http://www.example.com/weblog/show")
238     @controller.url = "http://www.example.com/weblog/show"
239     assert_equal "Showing", link_to_unless_current("Showing", { :action => "show", :controller => "weblog" })
240     assert_equal "Showing", link_to_unless_current("Showing", "http://www.example.com/weblog/show")
241
242     @controller.request = RequestMock.new("http://www.example.com/weblog/show")
243     @controller.url = "http://www.example.com/weblog/list"
244     assert_equal "<a href=\"http://www.example.com/weblog/list\">Listing</a>",
245       link_to_unless_current("Listing", :action => "list", :controller => "weblog")
246     assert_equal "<a href=\"http://www.example.com/weblog/list\">Listing</a>",
247       link_to_unless_current("Listing", "http://www.example.com/weblog/list")
248   end
249
250   def test_mail_to
251     assert_dom_equal "<a href=\"mailto:david@loudthinking.com\">david@loudthinking.com</a>", mail_to("david@loudthinking.com")
252     assert_dom_equal "<a href=\"mailto:david@loudthinking.com\">David Heinemeier Hansson</a>", mail_to("david@loudthinking.com", "David Heinemeier Hansson")
253     assert_dom_equal(
254       "<a class=\"admin\" href=\"mailto:david@loudthinking.com\">David Heinemeier Hansson</a>",
255       mail_to("david@loudthinking.com", "David Heinemeier Hansson", "class" => "admin")
256     )
257     assert_equal mail_to("david@loudthinking.com", "David Heinemeier Hansson", "class" => "admin"),
258                  mail_to("david@loudthinking.com", "David Heinemeier Hansson", :class => "admin")
259   end
260
261   def test_mail_to_with_javascript
262     assert_dom_equal "<script type=\"text/javascript\">eval(unescape('%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%3d%22%6d%61%69%6c%74%6f%3a%6d%65%40%64%6f%6d%61%69%6e%2e%63%6f%6d%22%3e%4d%79%20%65%6d%61%69%6c%3c%2f%61%3e%27%29%3b'))</script>", mail_to("me@domain.com", "My email", :encode => "javascript")
263   end
264
265   def test_mail_with_options
266     assert_dom_equal(
267       %(<a href="mailto:me@example.com?cc=ccaddress%40example.com&amp;bcc=bccaddress%40example.com&amp;body=This%20is%20the%20body%20of%20the%20message.&amp;subject=This%20is%20an%20example%20email">My email</a>),
268       mail_to("me@example.com", "My email", :cc => "ccaddress@example.com", :bcc => "bccaddress@example.com", :subject => "This is an example email", :body => "This is the body of the message.")
269     )
270   end
271
272   def test_mail_to_with_img
273     assert_dom_equal %(<a href="mailto:feedback@example.com"><img src="/feedback.png" /></a>), mail_to('feedback@example.com', '<img src="/feedback.png" />')
274   end
275
276   def test_mail_to_with_hex
277     assert_dom_equal "<a href=\"&#109;&#97;&#105;&#108;&#116;&#111;&#58;%6d%65@%64%6f%6d%61%69%6e.%63%6f%6d\">My email</a>", mail_to("me@domain.com", "My email", :encode => "hex")
278     assert_dom_equal "<a href=\"&#109;&#97;&#105;&#108;&#116;&#111;&#58;%6d%65@%64%6f%6d%61%69%6e.%63%6f%6d\">&#109;&#101;&#64;&#100;&#111;&#109;&#97;&#105;&#110;&#46;&#99;&#111;&#109;</a>", mail_to("me@domain.com", nil, :encode => "hex")
279   end
280
281   def test_mail_to_with_replace_options
282     assert_dom_equal "<a href=\"mailto:wolfgang@stufenlos.net\">wolfgang(at)stufenlos(dot)net</a>", mail_to("wolfgang@stufenlos.net", nil, :replace_at => "(at)", :replace_dot => "(dot)")
283     assert_dom_equal "<a href=\"&#109;&#97;&#105;&#108;&#116;&#111;&#58;%6d%65@%64%6f%6d%61%69%6e.%63%6f%6d\">&#109;&#101;&#40;&#97;&#116;&#41;&#100;&#111;&#109;&#97;&#105;&#110;&#46;&#99;&#111;&#109;</a>", mail_to("me@domain.com", nil, :encode => "hex", :replace_at => "(at)")
284     assert_dom_equal "<a href=\"&#109;&#97;&#105;&#108;&#116;&#111;&#58;%6d%65@%64%6f%6d%61%69%6e.%63%6f%6d\">My email</a>", mail_to("me@domain.com", "My email", :encode => "hex", :replace_at => "(at)")
285     assert_dom_equal "<a href=\"&#109;&#97;&#105;&#108;&#116;&#111;&#58;%6d%65@%64%6f%6d%61%69%6e.%63%6f%6d\">&#109;&#101;&#40;&#97;&#116;&#41;&#100;&#111;&#109;&#97;&#105;&#110;&#40;&#100;&#111;&#116;&#41;&#99;&#111;&#109;</a>", mail_to("me@domain.com", nil, :encode => "hex", :replace_at => "(at)", :replace_dot => "(dot)")
286     assert_dom_equal "<script type=\"text/javascript\">eval(unescape('%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%27%3c%61%20%68%72%65%66%3d%22%6d%61%69%6c%74%6f%3a%6d%65%28%61%74%29%64%6f%6d%61%69%6e%28%64%6f%74%29%63%6f%6d%22%3e%4d%79%20%65%6d%61%69%6c%3c%2f%61%3e%27%29%3b'))</script>", mail_to("me@domain.com", "My email", :encode => "javascript", :replace_at => "(at)", :replace_dot => "(dot)")
287   end
288   
289   def protect_against_forgery?
290     false
291   end
292 end
293
294 class UrlHelperWithControllerTest < ActionView::TestCase
295   class UrlHelperController < ActionController::Base
296     self.view_paths = [ "#{File.dirname(__FILE__)}/../fixtures/" ]
297
298     def self.controller_path; 'url_helper_with_controller' end
299
300     def show_url_for
301       render :inline => "<%= url_for :controller => 'url_helper_with_controller', :action => 'show_url_for' %>"
302     end
303
304     def show_named_route
305       render :inline => "<%= show_named_route_#{params[:kind]} %>"
306     end
307
308     def rescue_action(e) raise e end
309   end
310
311   tests ActionView::Helpers::UrlHelper
312
313   def setup
314     @request    = ActionController::TestRequest.new
315     @response   = ActionController::TestResponse.new
316     @controller = UrlHelperController.new
317   end
318
319   def test_url_for_shows_only_path
320     get :show_url_for
321     assert_equal '/url_helper_with_controller/show_url_for', @response.body
322   end
323
324   def test_named_route_shows_host_and_path
325     with_url_helper_routing do
326       get :show_named_route, :kind => 'url'
327       assert_equal 'http://test.host/url_helper_with_controller/show_named_route', @response.body
328     end
329   end
330
331   def test_named_route_path_shows_only_path
332     with_url_helper_routing do
333       get :show_named_route, :kind => 'path'
334       assert_equal '/url_helper_with_controller/show_named_route', @response.body
335     end
336   end
337
338   protected
339     def with_url_helper_routing
340       with_routing do |set|
341         set.draw do |map|
342           map.show_named_route 'url_helper_with_controller/show_named_route', :controller => 'url_helper_with_controller', :action => 'show_named_route'
343         end
344         yield
345       end
346     end
347 end
348
349 class LinkToUnlessCurrentWithControllerTest < ActionView::TestCase
350   class TasksController < ActionController::Base
351     self.view_paths = ["#{File.dirname(__FILE__)}/../fixtures/"]
352
353     def self.controller_path; 'tasks' end
354
355     def index
356       render_default
357     end
358
359     def show
360       render_default
361     end
362
363     def rescue_action(e) raise e end
364
365     protected
366       def render_default
367         render :inline =>
368           "<%= link_to_unless_current(\"tasks\", tasks_path) %>\n" +
369           "<%= link_to_unless_current(\"tasks\", tasks_url) %>"
370       end
371   end
372
373   tests ActionView::Helpers::UrlHelper
374
375   def setup
376     @request    = ActionController::TestRequest.new
377     @response   = ActionController::TestResponse.new
378     @controller = TasksController.new
379   end
380
381   def test_link_to_unless_current_to_current
382     with_restful_routing do
383       get :index
384       assert_equal "tasks\ntasks", @response.body
385     end
386   end
387
388   def test_link_to_unless_current_shows_link
389     with_restful_routing do
390       get :show, :id => 1
391       assert_equal "<a href=\"/tasks\">tasks</a>\n" +
392         "<a href=\"#{@request.protocol}#{@request.host_with_port}/tasks\">tasks</a>",
393         @response.body
394     end
395   end
396
397   protected
398     def with_restful_routing
399       with_routing do |set|
400         set.draw do |map|
401           map.resources :tasks
402         end
403         yield
404       end
405     end
406 end
407
408
409 class Workshop
410   attr_accessor :id, :new_record
411
412   def initialize(id, new_record)
413     @id, @new_record = id, new_record
414   end
415   
416   def new_record?
417     @new_record
418   end
419   
420   def to_s
421     id.to_s
422   end
423 end
424
425 class Session
426   attr_accessor :id, :workshop_id, :new_record
427
428   def initialize(id, new_record)
429     @id, @new_record = id, new_record
430   end
431
432   def new_record?
433     @new_record
434   end
435
436   def to_s
437     id.to_s
438   end
439 end
440
441 class PolymorphicControllerTest < ActionView::TestCase
442   class WorkshopsController < ActionController::Base
443     self.view_paths = ["#{File.dirname(__FILE__)}/../fixtures/"]
444
445     def self.controller_path; 'workshops' end
446
447     def index
448       @workshop = Workshop.new(1, true)
449       render :inline => "<%= url_for(@workshop) %>\n<%= link_to('Workshop', @workshop) %>"
450     end
451
452     def show
453       @workshop = Workshop.new(params[:id], false)
454       render :inline => "<%= url_for(@workshop) %>\n<%= link_to('Workshop', @workshop) %>"
455     end
456
457     def rescue_action(e) raise e end
458   end
459
460   class SessionsController < ActionController::Base
461     self.view_paths = ["#{File.dirname(__FILE__)}/../fixtures/"]
462
463     def self.controller_path; 'sessions' end
464
465     def index
466       @workshop = Workshop.new(params[:workshop_id], false)
467       @session = Session.new(1, true)
468       render :inline => "<%= url_for([@workshop, @session]) %>\n<%= link_to('Session', [@workshop, @session]) %>"
469     end
470
471     def show
472       @workshop = Workshop.new(params[:workshop_id], false)
473       @session = Session.new(params[:id], false)
474       render :inline => "<%= url_for([@workshop, @session]) %>\n<%= link_to('Session', [@workshop, @session]) %>"
475     end
476
477     def rescue_action(e) raise e end
478   end
479
480   tests ActionView::Helpers::UrlHelper
481
482   def setup
483     @request    = ActionController::TestRequest.new
484     @response   = ActionController::TestResponse.new
485   end
486
487   def test_new_resource
488     @controller = WorkshopsController.new
489
490     with_restful_routing do
491       get :index
492       assert_equal "/workshops\n<a href=\"/workshops\">Workshop</a>", @response.body
493     end
494   end
495
496   def test_existing_resource
497     @controller = WorkshopsController.new
498
499     with_restful_routing do
500       get :show, :id => 1
501       assert_equal "/workshops/1\n<a href=\"/workshops/1\">Workshop</a>", @response.body
502     end
503   end
504
505   def test_new_nested_resource
506     @controller = SessionsController.new
507
508     with_restful_routing do
509       get :index, :workshop_id => 1
510       assert_equal "/workshops/1/sessions\n<a href=\"/workshops/1/sessions\">Session</a>", @response.body
511     end
512   end
513
514   def test_existing_nested_resource
515     @controller = SessionsController.new
516
517     with_restful_routing do
518       get :show, :workshop_id => 1, :id => 1
519       assert_equal "/workshops/1/sessions/1\n<a href=\"/workshops/1/sessions/1\">Session</a>", @response.body
520     end
521   end
522
523   protected
524     def with_restful_routing
525       with_routing do |set|
526         set.draw do |map|
527           map.resources :workshops do |w|
528             w.resources :sessions
529           end
530         end
531         yield
532       end
533     end
534 end