ghazel-erubis_rails_helper 0.9.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. data/README.rdoc +66 -0
  2. data/lib/erubis_rails_helper/erubis/generator.rb +100 -0
  3. data/lib/erubis_rails_helper/template_handlers/erubis.rb +260 -0
  4. data/lib/erubis_rails_helper.rb +20 -0
  5. data/test/abstract_unit.rb +51 -0
  6. data/test/controller/action_pack_assertions_test.rb +516 -0
  7. data/test/controller/addresses_render_test.rb +37 -0
  8. data/test/controller/assert_select_test.rb +734 -0
  9. data/test/controller/base_test.rb +217 -0
  10. data/test/controller/benchmark_test.rb +32 -0
  11. data/test/controller/caching_test.rb +690 -0
  12. data/test/controller/capture_test.rb +66 -0
  13. data/test/controller/content_type_test.rb +168 -0
  14. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  15. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  16. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  17. data/test/controller/cookie_test.rb +111 -0
  18. data/test/controller/deprecation/deprecated_base_methods_test.rb +32 -0
  19. data/test/controller/dispatcher_test.rb +103 -0
  20. data/test/controller/fake_controllers.rb +33 -0
  21. data/test/controller/fake_models.rb +19 -0
  22. data/test/controller/filter_params_test.rb +49 -0
  23. data/test/controller/filters_test.rb +885 -0
  24. data/test/controller/flash_test.rb +142 -0
  25. data/test/controller/header_test.rb +14 -0
  26. data/test/controller/helper_test.rb +224 -0
  27. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  28. data/test/controller/html-scanner/document_test.rb +148 -0
  29. data/test/controller/html-scanner/node_test.rb +89 -0
  30. data/test/controller/html-scanner/sanitizer_test.rb +273 -0
  31. data/test/controller/html-scanner/tag_node_test.rb +238 -0
  32. data/test/controller/html-scanner/text_node_test.rb +50 -0
  33. data/test/controller/html-scanner/tokenizer_test.rb +131 -0
  34. data/test/controller/http_basic_authentication_test.rb +88 -0
  35. data/test/controller/http_digest_authentication_test.rb +178 -0
  36. data/test/controller/integration_test.rb +417 -0
  37. data/test/controller/layout_test.rb +204 -0
  38. data/test/controller/logging_test.rb +46 -0
  39. data/test/controller/middleware_stack_test.rb +90 -0
  40. data/test/controller/mime_responds_test.rb +536 -0
  41. data/test/controller/mime_type_test.rb +93 -0
  42. data/test/controller/polymorphic_routes_test.rb +293 -0
  43. data/test/controller/rack_test.rb +294 -0
  44. data/test/controller/record_identifier_test.rb +139 -0
  45. data/test/controller/redirect_test.rb +282 -0
  46. data/test/controller/render_test.rb +1752 -0
  47. data/test/controller/request/json_params_parsing_test.rb +45 -0
  48. data/test/controller/request/multipart_params_parsing_test.rb +223 -0
  49. data/test/controller/request/query_string_parsing_test.rb +120 -0
  50. data/test/controller/request/url_encoded_params_parsing_test.rb +184 -0
  51. data/test/controller/request/xml_params_parsing_test.rb +88 -0
  52. data/test/controller/request_forgery_protection_test.rb +246 -0
  53. data/test/controller/request_test.rb +407 -0
  54. data/test/controller/rescue_test.rb +536 -0
  55. data/test/controller/resources_test.rb +1341 -0
  56. data/test/controller/routing_test.rb +2557 -0
  57. data/test/controller/selector_test.rb +628 -0
  58. data/test/controller/send_file_test.rb +161 -0
  59. data/test/controller/session/cookie_store_test.rb +239 -0
  60. data/test/controller/session/mem_cache_store_test.rb +127 -0
  61. data/test/controller/session/test_session_test.rb +58 -0
  62. data/test/controller/test_test.rb +692 -0
  63. data/test/controller/translation_test.rb +26 -0
  64. data/test/controller/url_rewriter_test.rb +359 -0
  65. data/test/controller/verification_test.rb +270 -0
  66. data/test/controller/view_paths_test.rb +141 -0
  67. data/test/controller/webservice_test.rb +260 -0
  68. data/test/fixtures/alternate_helpers/foo_helper.rb +3 -0
  69. data/test/fixtures/company.rb +10 -0
  70. data/test/fixtures/developer.rb +9 -0
  71. data/test/fixtures/helpers/abc_helper.rb +5 -0
  72. data/test/fixtures/helpers/fun/games_helper.rb +3 -0
  73. data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  74. data/test/fixtures/mascot.rb +3 -0
  75. data/test/fixtures/project.rb +3 -0
  76. data/test/fixtures/reply.rb +7 -0
  77. data/test/fixtures/topic.rb +3 -0
  78. data/test/template/asset_tag_helper_test.rb +713 -0
  79. data/test/template/atom_feed_helper_test.rb +286 -0
  80. data/test/template/benchmark_helper_test.rb +86 -0
  81. data/test/template/compiled_templates_test.rb +203 -0
  82. data/test/template/date_helper_i18n_test.rb +120 -0
  83. data/test/template/date_helper_test.rb +2469 -0
  84. data/test/template/erb_util_test.rb +24 -0
  85. data/test/template/form_helper_test.rb +1176 -0
  86. data/test/template/form_options_helper_test.rb +751 -0
  87. data/test/template/form_tag_helper_test.rb +327 -0
  88. data/test/template/javascript_helper_test.rb +106 -0
  89. data/test/template/number_helper_i18n_test.rb +69 -0
  90. data/test/template/number_helper_test.rb +128 -0
  91. data/test/template/prototype_helper_test.rb +639 -0
  92. data/test/template/record_tag_helper_test.rb +58 -0
  93. data/test/template/render_test.rb +291 -0
  94. data/test/template/sanitize_helper_test.rb +48 -0
  95. data/test/template/scriptaculous_helper_test.rb +90 -0
  96. data/test/template/tag_helper_test.rb +97 -0
  97. data/test/template/test_test.rb +54 -0
  98. data/test/template/text_helper_test.rb +520 -0
  99. data/test/template/translation_helper_test.rb +32 -0
  100. data/test/template/url_helper_test.rb +614 -0
  101. data/test/test_erubis_rails_helper.rb +4 -0
  102. data/test/testing_sandbox.rb +15 -0
  103. data/test/view/test_case_test.rb +8 -0
  104. metadata +174 -0
@@ -0,0 +1,1752 @@
1
+ require 'abstract_unit'
2
+ require 'controller/fake_models'
3
+
4
+ module Fun
5
+ class GamesController < ActionController::Base
6
+ def hello_world
7
+ end
8
+ end
9
+ end
10
+
11
+ class MockLogger
12
+ attr_reader :logged
13
+
14
+ def initialize
15
+ @logged = []
16
+ end
17
+
18
+ def method_missing(method, *args)
19
+ @logged << args.first
20
+ end
21
+ end
22
+
23
+ class TestController < ActionController::Base
24
+ protect_from_forgery
25
+
26
+ class LabellingFormBuilder < ActionView::Helpers::FormBuilder
27
+ end
28
+
29
+ layout :determine_layout
30
+
31
+ def hello_world
32
+ end
33
+
34
+ def conditional_hello
35
+ if stale?(:last_modified => Time.now.utc.beginning_of_day, :etag => [:foo, 123])
36
+ render :action => 'hello_world'
37
+ end
38
+ end
39
+
40
+ def conditional_hello_with_public_header
41
+ if stale?(:last_modified => Time.now.utc.beginning_of_day, :etag => [:foo, 123], :public => true)
42
+ render :action => 'hello_world'
43
+ end
44
+ end
45
+
46
+ def conditional_hello_with_public_header_and_expires_at
47
+ expires_in 1.minute
48
+ if stale?(:last_modified => Time.now.utc.beginning_of_day, :etag => [:foo, 123], :public => true)
49
+ render :action => 'hello_world'
50
+ end
51
+ end
52
+
53
+ def conditional_hello_with_expires_in
54
+ expires_in 1.minute
55
+ render :action => 'hello_world'
56
+ end
57
+
58
+ def conditional_hello_with_expires_in_with_public
59
+ expires_in 1.minute, :public => true
60
+ render :action => 'hello_world'
61
+ end
62
+
63
+ def conditional_hello_with_expires_in_with_public_with_more_keys
64
+ expires_in 1.minute, :public => true, 'max-stale' => 5.hours
65
+ render :action => 'hello_world'
66
+ end
67
+
68
+ def conditional_hello_with_expires_in_with_public_with_more_keys_old_syntax
69
+ expires_in 1.minute, :public => true, :private => nil, 'max-stale' => 5.hours
70
+ render :action => 'hello_world'
71
+ end
72
+
73
+ def conditional_hello_with_bangs
74
+ render :action => 'hello_world'
75
+ end
76
+ before_filter :handle_last_modified_and_etags, :only=>:conditional_hello_with_bangs
77
+
78
+ def handle_last_modified_and_etags
79
+ fresh_when(:last_modified => Time.now.utc.beginning_of_day, :etag => [ :foo, 123 ])
80
+ end
81
+
82
+ def render_hello_world
83
+ render :template => "test/hello_world"
84
+ end
85
+
86
+ def render_hello_world_with_last_modified_set
87
+ response.last_modified = Date.new(2008, 10, 10).to_time
88
+ render :template => "test/hello_world"
89
+ end
90
+
91
+ def render_hello_world_with_etag_set
92
+ response.etag = "hello_world"
93
+ render :template => "test/hello_world"
94
+ end
95
+
96
+ def render_hello_world_with_forward_slash
97
+ render :template => "/test/hello_world"
98
+ end
99
+
100
+ def render_template_in_top_directory
101
+ render :template => 'shared'
102
+ end
103
+
104
+ def render_template_in_top_directory_with_slash
105
+ render :template => '/shared'
106
+ end
107
+
108
+ def render_hello_world_from_variable
109
+ @person = "david"
110
+ render :text => "hello #{@person}"
111
+ end
112
+
113
+ def render_action_hello_world
114
+ render :action => "hello_world"
115
+ end
116
+
117
+ def render_action_hello_world_as_string
118
+ render "hello_world"
119
+ end
120
+
121
+ def render_action_hello_world_with_symbol
122
+ render :action => :hello_world
123
+ end
124
+
125
+ def render_text_hello_world
126
+ render :text => "hello world"
127
+ end
128
+
129
+ def render_text_hello_world_with_layout
130
+ @variable_for_layout = ", I'm here!"
131
+ render :text => "hello world", :layout => true
132
+ end
133
+
134
+ def hello_world_with_layout_false
135
+ render :layout => false
136
+ end
137
+
138
+ def render_file_with_instance_variables
139
+ @secret = 'in the sauce'
140
+ path = File.join(File.dirname(__FILE__), '../fixtures/test/render_file_with_ivar.erb')
141
+ render :file => path
142
+ end
143
+
144
+ def render_file_as_string_with_instance_variables
145
+ @secret = 'in the sauce'
146
+ path = File.expand_path(File.join(File.dirname(__FILE__), '../fixtures/test/render_file_with_ivar.erb'))
147
+ render path
148
+ end
149
+
150
+ def render_file_not_using_full_path
151
+ @secret = 'in the sauce'
152
+ render :file => 'test/render_file_with_ivar'
153
+ end
154
+
155
+ def render_file_not_using_full_path_with_dot_in_path
156
+ @secret = 'in the sauce'
157
+ render :file => 'test/dot.directory/render_file_with_ivar'
158
+ end
159
+
160
+ def render_file_using_pathname
161
+ @secret = 'in the sauce'
162
+ render :file => Pathname.new(File.dirname(__FILE__)).join('..', 'fixtures', 'test', 'dot.directory', 'render_file_with_ivar.erb')
163
+ end
164
+
165
+ def render_file_from_template
166
+ @secret = 'in the sauce'
167
+ @path = File.expand_path(File.join(File.dirname(__FILE__), '../fixtures/test/render_file_with_ivar.erb'))
168
+ end
169
+
170
+ def render_file_with_locals
171
+ path = File.join(File.dirname(__FILE__), '../fixtures/test/render_file_with_locals.erb')
172
+ render :file => path, :locals => {:secret => 'in the sauce'}
173
+ end
174
+
175
+ def render_file_as_string_with_locals
176
+ path = File.expand_path(File.join(File.dirname(__FILE__), '../fixtures/test/render_file_with_locals.erb'))
177
+ render path, :locals => {:secret => 'in the sauce'}
178
+ end
179
+
180
+ def accessing_request_in_template
181
+ render :inline => "Hello: <%= request.host %>"
182
+ end
183
+
184
+ def accessing_logger_in_template
185
+ render :inline => "<%= logger.class %>"
186
+ end
187
+
188
+ def accessing_action_name_in_template
189
+ render :inline => "<%= action_name %>"
190
+ end
191
+
192
+ def accessing_controller_name_in_template
193
+ render :inline => "<%= controller_name %>"
194
+ end
195
+
196
+ def render_json_hello_world
197
+ render :json => {:hello => 'world'}.to_json
198
+ end
199
+
200
+ def render_json_hello_world_with_callback
201
+ render :json => {:hello => 'world'}.to_json, :callback => 'alert'
202
+ end
203
+
204
+ def render_json_with_custom_content_type
205
+ render :json => {:hello => 'world'}.to_json, :content_type => 'text/javascript'
206
+ end
207
+
208
+ def render_symbol_json
209
+ render :json => {:hello => 'world'}.to_json
210
+ end
211
+
212
+ def render_json_with_render_to_string
213
+ render :json => {:hello => render_to_string(:partial => 'partial')}
214
+ end
215
+
216
+ def render_custom_code
217
+ render :text => "hello world", :status => 404
218
+ end
219
+
220
+ def render_custom_code_rjs
221
+ render :update, :status => 404 do |page|
222
+ page.replace :foo, :partial => 'partial'
223
+ end
224
+ end
225
+
226
+ def render_text_with_nil
227
+ render :text => nil
228
+ end
229
+
230
+ def render_text_with_false
231
+ render :text => false
232
+ end
233
+
234
+ def render_nothing_with_appendix
235
+ render :text => "appended"
236
+ end
237
+
238
+ def render_vanilla_js_hello
239
+ render :js => "alert('hello')"
240
+ end
241
+
242
+ def render_xml_hello
243
+ @name = "David"
244
+ render :template => "test/hello"
245
+ end
246
+
247
+ def render_xml_hello_as_string_template
248
+ @name = "David"
249
+ render "test/hello"
250
+ end
251
+
252
+ def render_xml_with_custom_content_type
253
+ render :xml => "<blah/>", :content_type => "application/atomsvc+xml"
254
+ end
255
+
256
+ def render_line_offset
257
+ render :inline => '<% raise %>', :locals => {:foo => 'bar'}
258
+ end
259
+
260
+ def heading
261
+ head :ok
262
+ end
263
+
264
+ def greeting
265
+ # let's just rely on the template
266
+ end
267
+
268
+ def blank_response
269
+ render :text => ' '
270
+ end
271
+
272
+ def layout_test
273
+ render :action => "hello_world"
274
+ end
275
+
276
+ def builder_layout_test
277
+ render :action => "hello", :layout => "layouts/builder"
278
+ end
279
+
280
+ def builder_partial_test
281
+ render :action => "hello_world_container"
282
+ end
283
+
284
+ def partials_list
285
+ @test_unchanged = 'hello'
286
+ @customers = [ Customer.new("david"), Customer.new("mary") ]
287
+ render :action => "list"
288
+ end
289
+
290
+ def partial_only
291
+ render :partial => true
292
+ end
293
+
294
+ def hello_in_a_string
295
+ @customers = [ Customer.new("david"), Customer.new("mary") ]
296
+ render :text => "How's there? " + render_to_string(:template => "test/list")
297
+ end
298
+
299
+ def accessing_params_in_template
300
+ render :inline => "Hello: <%= params[:name] %>"
301
+ end
302
+
303
+ def accessing_local_assigns_in_inline_template
304
+ name = params[:local_name]
305
+ render :inline => "<%= 'Goodbye, ' + local_name %>",
306
+ :locals => { :local_name => name }
307
+ end
308
+
309
+ def render_implicit_html_template
310
+ end
311
+
312
+ def render_explicit_html_template
313
+ end
314
+
315
+ def render_implicit_html_template_from_xhr_request
316
+ end
317
+
318
+ def render_implicit_js_template_without_layout
319
+ end
320
+
321
+ def render_html_explicit_template_and_layout
322
+ render :template => 'test/render_implicit_html_template_from_xhr_request', :layout => 'layouts/default_html'
323
+ end
324
+
325
+ def formatted_html_erb
326
+ end
327
+
328
+ def formatted_xml_erb
329
+ end
330
+
331
+ def render_to_string_test
332
+ @foo = render_to_string :inline => "this is a test"
333
+ end
334
+
335
+ def default_render
336
+ if @alternate_default_render
337
+ @alternate_default_render.call
338
+ else
339
+ super
340
+ end
341
+ end
342
+
343
+ def render_action_hello_world_as_symbol
344
+ render :action => :hello_world
345
+ end
346
+
347
+ def layout_test_with_different_layout
348
+ render :action => "hello_world", :layout => "standard"
349
+ end
350
+
351
+ def layout_test_with_different_layout_and_string_action
352
+ render "hello_world", :layout => "standard"
353
+ end
354
+
355
+ def layout_test_with_different_layout_and_symbol_action
356
+ render :hello_world, :layout => "standard"
357
+ end
358
+
359
+ def rendering_without_layout
360
+ render :action => "hello_world", :layout => false
361
+ end
362
+
363
+ def layout_overriding_layout
364
+ render :action => "hello_world", :layout => "standard"
365
+ end
366
+
367
+ def rendering_nothing_on_layout
368
+ render :nothing => true
369
+ end
370
+
371
+ def render_to_string_with_assigns
372
+ @before = "i'm before the render"
373
+ render_to_string :text => "foo"
374
+ @after = "i'm after the render"
375
+ render :action => "test/hello_world"
376
+ end
377
+
378
+ def render_to_string_with_exception
379
+ render_to_string :file => "exception that will not be caught - this will certainly not work"
380
+ end
381
+
382
+ def render_to_string_with_caught_exception
383
+ @before = "i'm before the render"
384
+ begin
385
+ render_to_string :file => "exception that will be caught- hope my future instance vars still work!"
386
+ rescue
387
+ end
388
+ @after = "i'm after the render"
389
+ render :action => "test/hello_world"
390
+ end
391
+
392
+ def accessing_params_in_template_with_layout
393
+ render :layout => nil, :inline => "Hello: <%= params[:name] %>"
394
+ end
395
+
396
+ def render_with_explicit_template
397
+ render :template => "test/hello_world"
398
+ end
399
+
400
+ def render_with_explicit_string_template
401
+ render "test/hello_world"
402
+ end
403
+
404
+ def render_with_explicit_template_with_locals
405
+ render :template => "test/render_file_with_locals", :locals => { :secret => 'area51' }
406
+ end
407
+
408
+ def double_render
409
+ render :text => "hello"
410
+ render :text => "world"
411
+ end
412
+
413
+ def double_redirect
414
+ redirect_to :action => "double_render"
415
+ redirect_to :action => "double_render"
416
+ end
417
+
418
+ def render_and_redirect
419
+ render :text => "hello"
420
+ redirect_to :action => "double_render"
421
+ end
422
+
423
+ def render_to_string_and_render
424
+ @stuff = render_to_string :text => "here is some cached stuff"
425
+ render :text => "Hi web users! #{@stuff}"
426
+ end
427
+
428
+ def render_to_string_with_inline_and_render
429
+ render_to_string :inline => "<%= 'dlrow olleh'.reverse %>"
430
+ render :template => "test/hello_world"
431
+ end
432
+
433
+ def rendering_with_conflicting_local_vars
434
+ @name = "David"
435
+ def @template.name() nil end
436
+ render :action => "potential_conflicts"
437
+ end
438
+
439
+ def hello_world_from_rxml_using_action
440
+ render :action => "hello_world_from_rxml.builder"
441
+ end
442
+
443
+ def hello_world_from_rxml_using_template
444
+ render :template => "test/hello_world_from_rxml.builder"
445
+ end
446
+
447
+ module RenderTestHelper
448
+ def rjs_helper_method_from_module
449
+ page.visual_effect :highlight
450
+ end
451
+ end
452
+
453
+ helper RenderTestHelper
454
+ helper do
455
+ def rjs_helper_method(value)
456
+ page.visual_effect :highlight, value
457
+ end
458
+ end
459
+
460
+ def enum_rjs_test
461
+ render :update do |page|
462
+ page.select('.product').each do |value|
463
+ page.rjs_helper_method_from_module
464
+ page.rjs_helper_method(value)
465
+ page.sortable(value, :url => { :action => "order" })
466
+ page.draggable(value)
467
+ end
468
+ end
469
+ end
470
+
471
+ def delete_with_js
472
+ @project_id = 4
473
+ end
474
+
475
+ def render_js_with_explicit_template
476
+ @project_id = 4
477
+ render :template => 'test/delete_with_js'
478
+ end
479
+
480
+ def render_js_with_explicit_action_template
481
+ @project_id = 4
482
+ render :action => 'delete_with_js'
483
+ end
484
+
485
+ def update_page
486
+ render :update do |page|
487
+ page.replace_html 'balance', '$37,000,000.00'
488
+ page.visual_effect :highlight, 'balance'
489
+ end
490
+ end
491
+
492
+ def update_page_with_instance_variables
493
+ @money = '$37,000,000.00'
494
+ @div_id = 'balance'
495
+ render :update do |page|
496
+ page.replace_html @div_id, @money
497
+ page.visual_effect :highlight, @div_id
498
+ end
499
+ end
500
+
501
+ def update_page_with_view_method
502
+ render :update do |page|
503
+ page.replace_html 'person', pluralize(2, 'person')
504
+ end
505
+ end
506
+
507
+ def action_talk_to_layout
508
+ # Action template sets variable that's picked up by layout
509
+ end
510
+
511
+ def render_text_with_assigns
512
+ @hello = "world"
513
+ render :text => "foo"
514
+ end
515
+
516
+ def yield_content_for
517
+ render :action => "content_for", :layout => "yield"
518
+ end
519
+
520
+ def render_content_type_from_body
521
+ response.content_type = Mime::RSS
522
+ render :text => "hello world!"
523
+ end
524
+
525
+ def head_with_location_header
526
+ head :location => "/foo"
527
+ end
528
+
529
+ def head_with_symbolic_status
530
+ head :status => params[:status].intern
531
+ end
532
+
533
+ def head_with_integer_status
534
+ head :status => params[:status].to_i
535
+ end
536
+
537
+ def head_with_string_status
538
+ head :status => params[:status]
539
+ end
540
+
541
+ def head_with_custom_header
542
+ head :x_custom_header => "something"
543
+ end
544
+
545
+ def head_with_status_code_first
546
+ head :forbidden, :x_custom_header => "something"
547
+ end
548
+
549
+ def render_with_location
550
+ render :xml => "<hello/>", :location => "http://example.com", :status => 201
551
+ end
552
+
553
+ def render_with_object_location
554
+ customer = Customer.new("Some guy", 1)
555
+ render :xml => "<customer/>", :location => customer_url(customer), :status => :created
556
+ end
557
+
558
+ def render_with_to_xml
559
+ to_xmlable = Class.new do
560
+ def to_xml
561
+ "<i-am-xml/>"
562
+ end
563
+ end.new
564
+
565
+ render :xml => to_xmlable
566
+ end
567
+
568
+ def render_using_layout_around_block
569
+ render :action => "using_layout_around_block"
570
+ end
571
+
572
+ def render_using_layout_around_block_with_args
573
+ render :action => "using_layout_around_block_with_args"
574
+ end
575
+
576
+ def render_using_layout_around_block_in_main_layout_and_within_content_for_layout
577
+ render :action => "using_layout_around_block", :layout => "layouts/block_with_layout"
578
+ end
579
+
580
+ def partial_dot_html
581
+ render :partial => 'partial.html.erb'
582
+ end
583
+
584
+ def partial_as_rjs
585
+ render :update do |page|
586
+ page.replace :foo, :partial => 'partial'
587
+ end
588
+ end
589
+
590
+ def respond_to_partial_as_rjs
591
+ respond_to do |format|
592
+ format.js do
593
+ render :update do |page|
594
+ page.replace :foo, :partial => 'partial'
595
+ end
596
+ end
597
+ end
598
+ end
599
+
600
+ def partial
601
+ render :partial => 'partial'
602
+ end
603
+
604
+ def render_alternate_default
605
+ # For this test, the method "default_render" is overridden:
606
+ @alternate_default_render = lambda do
607
+ render :update do |page|
608
+ page.replace :foo, :partial => 'partial'
609
+ end
610
+ end
611
+ end
612
+
613
+ def partial_only_with_layout
614
+ render :partial => "partial_only", :layout => true
615
+ end
616
+
617
+ def render_to_string_with_partial
618
+ @partial_only = render_to_string :partial => "partial_only"
619
+ @partial_with_locals = render_to_string :partial => "customer", :locals => { :customer => Customer.new("david") }
620
+ render :action => "test/hello_world"
621
+ end
622
+
623
+ def partial_with_counter
624
+ render :partial => "counter", :locals => { :counter_counter => 5 }
625
+ end
626
+
627
+ def partial_with_locals
628
+ render :partial => "customer", :locals => { :customer => Customer.new("david") }
629
+ end
630
+
631
+ def partial_with_form_builder
632
+ render :partial => ActionView::Helpers::FormBuilder.new(:post, nil, @template, {}, Proc.new {})
633
+ end
634
+
635
+ def partial_with_form_builder_subclass
636
+ render :partial => LabellingFormBuilder.new(:post, nil, @template, {}, Proc.new {})
637
+ end
638
+
639
+ def partial_collection
640
+ render :partial => "customer", :collection => [ Customer.new("david"), Customer.new("mary") ]
641
+ end
642
+
643
+ def partial_collection_with_as
644
+ render :partial => "customer_with_var", :collection => [ Customer.new("david"), Customer.new("mary") ], :as => :customer
645
+ end
646
+
647
+ def partial_collection_with_counter
648
+ render :partial => "customer_counter", :collection => [ Customer.new("david"), Customer.new("mary") ]
649
+ end
650
+
651
+ def partial_collection_with_locals
652
+ render :partial => "customer_greeting", :collection => [ Customer.new("david"), Customer.new("mary") ], :locals => { :greeting => "Bonjour" }
653
+ end
654
+
655
+ def partial_collection_with_spacer
656
+ render :partial => "customer", :spacer_template => "partial_only", :collection => [ Customer.new("david"), Customer.new("mary") ]
657
+ end
658
+
659
+ def partial_collection_shorthand_with_locals
660
+ render :partial => [ Customer.new("david"), Customer.new("mary") ], :locals => { :greeting => "Bonjour" }
661
+ end
662
+
663
+ def partial_collection_shorthand_with_different_types_of_records
664
+ render :partial => [
665
+ BadCustomer.new("mark"),
666
+ GoodCustomer.new("craig"),
667
+ BadCustomer.new("john"),
668
+ GoodCustomer.new("zach"),
669
+ GoodCustomer.new("brandon"),
670
+ BadCustomer.new("dan") ],
671
+ :locals => { :greeting => "Bonjour" }
672
+ end
673
+
674
+ def empty_partial_collection
675
+ render :partial => "customer", :collection => []
676
+ end
677
+
678
+ def partial_collection_shorthand_with_different_types_of_records_with_counter
679
+ partial_collection_shorthand_with_different_types_of_records
680
+ end
681
+
682
+ def missing_partial
683
+ render :partial => 'thisFileIsntHere'
684
+ end
685
+
686
+ def partial_with_hash_object
687
+ render :partial => "hash_object", :object => {:first_name => "Sam"}
688
+ end
689
+
690
+ def partial_with_nested_object
691
+ render :partial => "quiz/questions/question", :object => Quiz::Question.new("first")
692
+ end
693
+
694
+ def partial_with_nested_object_shorthand
695
+ render Quiz::Question.new("first")
696
+ end
697
+
698
+ def partial_hash_collection
699
+ render :partial => "hash_object", :collection => [ {:first_name => "Pratik"}, {:first_name => "Amy"} ]
700
+ end
701
+
702
+ def partial_hash_collection_with_locals
703
+ render :partial => "hash_greeting", :collection => [ {:first_name => "Pratik"}, {:first_name => "Amy"} ], :locals => { :greeting => "Hola" }
704
+ end
705
+
706
+ def partial_with_implicit_local_assignment
707
+ @customer = Customer.new("Marcel")
708
+ render :partial => "customer"
709
+ end
710
+
711
+ def render_call_to_partial_with_layout
712
+ render :action => "calling_partial_with_layout"
713
+ end
714
+
715
+ def render_call_to_partial_with_layout_in_main_layout_and_within_content_for_layout
716
+ render :action => "calling_partial_with_layout", :layout => "layouts/partial_with_layout"
717
+ end
718
+
719
+ def rescue_action(e)
720
+ raise
721
+ end
722
+
723
+ private
724
+ def determine_layout
725
+ case action_name
726
+ when "hello_world", "layout_test", "rendering_without_layout",
727
+ "rendering_nothing_on_layout", "render_text_hello_world",
728
+ "render_text_hello_world_with_layout",
729
+ "hello_world_with_layout_false",
730
+ "partial_only", "partial_only_with_layout",
731
+ "accessing_params_in_template",
732
+ "accessing_params_in_template_with_layout",
733
+ "render_with_explicit_template",
734
+ "render_with_explicit_string_template",
735
+ "render_js_with_explicit_template",
736
+ "render_js_with_explicit_action_template",
737
+ "delete_with_js", "update_page", "update_page_with_instance_variables"
738
+
739
+ "layouts/standard"
740
+ when "render_implicit_js_template_without_layout"
741
+ "layouts/default_html"
742
+ when "action_talk_to_layout", "layout_overriding_layout"
743
+ "layouts/talk_from_action"
744
+ when "render_implicit_html_template_from_xhr_request"
745
+ (request.xhr? ? 'layouts/xhr' : 'layouts/standard')
746
+ end
747
+ end
748
+ end
749
+
750
+ class RenderTest < ActionController::TestCase
751
+ tests TestController
752
+
753
+ def setup
754
+ # enable a logger so that (e.g.) the benchmarking stuff runs, so we can get
755
+ # a more accurate simulation of what happens in "real life".
756
+ @controller.logger = Logger.new(nil)
757
+
758
+ @request.host = "www.nextangle.com"
759
+ end
760
+
761
+ def test_simple_show
762
+ get :hello_world
763
+ assert_response 200
764
+ assert_response :success
765
+ assert_template "test/hello_world"
766
+ assert_equal "<html>Hello world!</html>", @response.body
767
+ end
768
+
769
+ def test_renders_default_template_for_missing_action
770
+ get :'hyphen-ated'
771
+ assert_template 'test/hyphen-ated'
772
+ end
773
+
774
+ def test_render
775
+ get :render_hello_world
776
+ assert_template "test/hello_world"
777
+ end
778
+
779
+ def test_line_offset
780
+ begin
781
+ get :render_line_offset
782
+ flunk "the action should have raised an exception"
783
+ rescue RuntimeError => exc
784
+ line = exc.backtrace.first
785
+ assert(line =~ %r{:(\d+):})
786
+ assert_equal "1", $1,
787
+ "The line offset is wrong, perhaps the wrong exception has been raised, exception was: #{exc.inspect}"
788
+ end
789
+ end
790
+
791
+ def test_render_with_forward_slash
792
+ get :render_hello_world_with_forward_slash
793
+ assert_template "test/hello_world"
794
+ end
795
+
796
+ def test_render_in_top_directory
797
+ get :render_template_in_top_directory
798
+ assert_template "shared"
799
+ assert_equal "Elastica", @response.body
800
+ end
801
+
802
+ def test_render_in_top_directory_with_slash
803
+ get :render_template_in_top_directory_with_slash
804
+ assert_template "shared"
805
+ assert_equal "Elastica", @response.body
806
+ end
807
+
808
+ def test_render_from_variable
809
+ get :render_hello_world_from_variable
810
+ assert_equal "hello david", @response.body
811
+ end
812
+
813
+ def test_render_action
814
+ get :render_action_hello_world
815
+ assert_template "test/hello_world"
816
+ end
817
+
818
+ def test_render_action_hello_world_as_string
819
+ get :render_action_hello_world_as_string
820
+ assert_equal "Hello world!", @response.body
821
+ assert_template "test/hello_world"
822
+ end
823
+
824
+ def test_render_action_with_symbol
825
+ get :render_action_hello_world_with_symbol
826
+ assert_template "test/hello_world"
827
+ end
828
+
829
+ def test_render_text
830
+ get :render_text_hello_world
831
+ assert_equal "hello world", @response.body
832
+ end
833
+
834
+ def test_do_with_render_text_and_layout
835
+ get :render_text_hello_world_with_layout
836
+ assert_equal "<html>hello world, I'm here!</html>", @response.body
837
+ end
838
+
839
+ def test_xhr_with_render_text_and_layout
840
+ xhr :get, :render_text_hello_world_with_layout
841
+ assert_equal "<html>hello world, I'm here!</html>", @response.body
842
+ end
843
+
844
+ def test_do_with_render_action_and_layout_false
845
+ get :hello_world_with_layout_false
846
+ assert_equal 'Hello world!', @response.body
847
+ end
848
+
849
+ def test_render_file_with_instance_variables
850
+ get :render_file_with_instance_variables
851
+ assert_equal "The secret is in the sauce\n", @response.body
852
+ end
853
+
854
+ def test_render_file_as_string_with_instance_variables
855
+ get :render_file_as_string_with_instance_variables
856
+ assert_equal "The secret is in the sauce\n", @response.body
857
+ end
858
+
859
+ def test_render_file_not_using_full_path
860
+ get :render_file_not_using_full_path
861
+ assert_equal "The secret is in the sauce\n", @response.body
862
+ end
863
+
864
+ def test_render_file_not_using_full_path_with_dot_in_path
865
+ get :render_file_not_using_full_path_with_dot_in_path
866
+ assert_equal "The secret is in the sauce\n", @response.body
867
+ end
868
+
869
+ def test_render_file_using_pathname
870
+ get :render_file_using_pathname
871
+ assert_equal "The secret is in the sauce\n", @response.body
872
+ end
873
+
874
+ def test_render_file_with_locals
875
+ get :render_file_with_locals
876
+ assert_equal "The secret is in the sauce\n", @response.body
877
+ end
878
+
879
+ def test_render_file_as_string_with_locals
880
+ get :render_file_as_string_with_locals
881
+ assert_equal "The secret is in the sauce\n", @response.body
882
+ end
883
+
884
+ def test_render_file_from_template
885
+ get :render_file_from_template
886
+ assert_equal "The secret is in the sauce\n", @response.body
887
+ end
888
+
889
+ def test_render_json
890
+ get :render_json_hello_world
891
+ assert_equal '{"hello": "world"}', @response.body
892
+ assert_equal 'application/json', @response.content_type
893
+ end
894
+
895
+ def test_render_json_with_callback
896
+ get :render_json_hello_world_with_callback
897
+ assert_equal 'alert({"hello": "world"})', @response.body
898
+ assert_equal 'application/json', @response.content_type
899
+ end
900
+
901
+ def test_render_json_with_custom_content_type
902
+ get :render_json_with_custom_content_type
903
+ assert_equal '{"hello": "world"}', @response.body
904
+ assert_equal 'text/javascript', @response.content_type
905
+ end
906
+
907
+ def test_render_symbol_json
908
+ get :render_symbol_json
909
+ assert_equal '{"hello": "world"}', @response.body
910
+ assert_equal 'application/json', @response.content_type
911
+ end
912
+
913
+ def test_render_json_with_render_to_string
914
+ get :render_json_with_render_to_string
915
+ assert_equal '{"hello": "partial html"}', @response.body
916
+ assert_equal 'application/json', @response.content_type
917
+ end
918
+
919
+ def test_render_custom_code
920
+ get :render_custom_code
921
+ assert_response 404
922
+ assert_response :missing
923
+ assert_equal 'hello world', @response.body
924
+ end
925
+
926
+ def test_render_custom_code_rjs
927
+ get :render_custom_code_rjs
928
+ assert_response 404
929
+ assert_equal %(Element.replace("foo", "partial html");), @response.body
930
+ end
931
+
932
+ def test_render_text_with_nil
933
+ get :render_text_with_nil
934
+ assert_response 200
935
+ assert_equal ' ', @response.body
936
+ end
937
+
938
+ def test_render_text_with_false
939
+ get :render_text_with_false
940
+ assert_equal 'false', @response.body
941
+ end
942
+
943
+ def test_render_nothing_with_appendix
944
+ get :render_nothing_with_appendix
945
+ assert_response 200
946
+ assert_equal 'appended', @response.body
947
+ end
948
+
949
+ def test_attempt_to_access_object_method
950
+ assert_raise(ActionController::UnknownAction, "No action responded to [clone]") { get :clone }
951
+ end
952
+
953
+ def test_private_methods
954
+ assert_raise(ActionController::UnknownAction, "No action responded to [determine_layout]") { get :determine_layout }
955
+ end
956
+
957
+ def test_access_to_request_in_view
958
+ get :accessing_request_in_template
959
+ assert_equal "Hello: www.nextangle.com", @response.body
960
+ end
961
+
962
+ def test_access_to_logger_in_view
963
+ get :accessing_logger_in_template
964
+ assert_equal "Logger", @response.body
965
+ end
966
+
967
+ def test_access_to_action_name_in_view
968
+ get :accessing_action_name_in_template
969
+ assert_equal "accessing_action_name_in_template", @response.body
970
+ end
971
+
972
+ def test_access_to_controller_name_in_view
973
+ get :accessing_controller_name_in_template
974
+ assert_equal "test", @response.body # name is explicitly set to 'test' inside the controller.
975
+ end
976
+
977
+ def test_render_vanilla_js
978
+ get :render_vanilla_js_hello
979
+ assert_equal "alert('hello')", @response.body
980
+ assert_equal "text/javascript", @response.content_type
981
+ end
982
+
983
+ def test_render_xml
984
+ get :render_xml_hello
985
+ assert_equal "<html>\n <p>Hello David</p>\n<p>This is grand!</p>\n</html>\n", @response.body
986
+ assert_equal "application/xml", @response.content_type
987
+ end
988
+
989
+ def test_render_xml_as_string_template
990
+ get :render_xml_hello_as_string_template
991
+ assert_equal "<html>\n <p>Hello David</p>\n<p>This is grand!</p>\n</html>\n", @response.body
992
+ assert_equal "application/xml", @response.content_type
993
+ end
994
+
995
+ def test_render_xml_with_default
996
+ get :greeting
997
+ assert_equal "<p>This is grand!</p>\n", @response.body
998
+ end
999
+
1000
+ def test_render_xml_with_partial
1001
+ get :builder_partial_test
1002
+ assert_equal "<test>\n <hello/>\n</test>\n", @response.body
1003
+ end
1004
+
1005
+ def test_enum_rjs_test
1006
+ ActiveSupport::SecureRandom.stubs(:base64).returns("asdf")
1007
+ get :enum_rjs_test
1008
+ body = %{
1009
+ $$(".product").each(function(value, index) {
1010
+ new Effect.Highlight(element,{});
1011
+ new Effect.Highlight(value,{});
1012
+ Sortable.create(value, {onUpdate:function(){new Ajax.Request('/test/order', {asynchronous:true, evalScripts:true, parameters:Sortable.serialize(value) + '&authenticity_token=' + encodeURIComponent('asdf')})}});
1013
+ new Draggable(value, {});
1014
+ });
1015
+ }.gsub(/^ /, '').strip
1016
+ assert_equal body, @response.body
1017
+ end
1018
+
1019
+ def test_layout_rendering
1020
+ get :layout_test
1021
+ assert_equal "<html>Hello world!</html>", @response.body
1022
+ end
1023
+
1024
+ def test_render_xml_with_layouts
1025
+ get :builder_layout_test
1026
+ assert_equal "<wrapper>\n<html>\n <p>Hello </p>\n<p>This is grand!</p>\n</html>\n</wrapper>\n", @response.body
1027
+ end
1028
+
1029
+ def test_partials_list
1030
+ get :partials_list
1031
+ assert_equal "goodbyeHello: davidHello: marygoodbye\n", @response.body
1032
+ end
1033
+
1034
+ def test_render_to_string
1035
+ get :hello_in_a_string
1036
+ assert_equal "How's there? goodbyeHello: davidHello: marygoodbye\n", @response.body
1037
+ end
1038
+
1039
+ def test_render_to_string_resets_assigns
1040
+ get :render_to_string_test
1041
+ assert_equal "The value of foo is: ::this is a test::\n", @response.body
1042
+ end
1043
+
1044
+ def test_render_to_string_inline
1045
+ get :render_to_string_with_inline_and_render
1046
+ assert_template "test/hello_world"
1047
+ end
1048
+
1049
+ def test_nested_rendering
1050
+ @controller = Fun::GamesController.new
1051
+ get :hello_world
1052
+ assert_equal "Living in a nested world", @response.body
1053
+ end
1054
+
1055
+ def test_accessing_params_in_template
1056
+ get :accessing_params_in_template, :name => "David"
1057
+ assert_equal "Hello: David", @response.body
1058
+ end
1059
+
1060
+ def test_accessing_local_assigns_in_inline_template
1061
+ get :accessing_local_assigns_in_inline_template, :local_name => "Local David"
1062
+ assert_equal "Goodbye, Local David", @response.body
1063
+ end
1064
+
1065
+ def test_render_in_an_rjs_template_should_pick_html_templates_when_available
1066
+ [:js, "js"].each do |format|
1067
+ assert_nothing_raised do
1068
+ get :render_implicit_html_template, :format => format
1069
+ assert_equal %(document.write("Hello world\\n");), @response.body
1070
+ end
1071
+ end
1072
+ end
1073
+
1074
+ def test_explicitly_rendering_an_html_template_with_implicit_html_template_renders_should_be_possible_from_an_rjs_template
1075
+ [:js, "js"].each do |format|
1076
+ assert_nothing_raised do
1077
+ get :render_explicit_html_template, :format => format
1078
+ assert_equal %(document.write("Hello world\\n");), @response.body
1079
+ end
1080
+ end
1081
+ end
1082
+
1083
+ def test_should_implicitly_render_html_template_from_xhr_request
1084
+ xhr :get, :render_implicit_html_template_from_xhr_request
1085
+ assert_equal "XHR!\nHello HTML!", @response.body
1086
+ end
1087
+
1088
+ def test_should_render_explicit_html_template_with_html_layout
1089
+ xhr :get, :render_html_explicit_template_and_layout
1090
+ assert_equal "<html>Hello HTML!</html>\n", @response.body
1091
+ end
1092
+
1093
+ def test_should_implicitly_render_js_template_without_layout
1094
+ get :render_implicit_js_template_without_layout, :format => :js
1095
+ assert_no_match /<html>/, @response.body
1096
+ end
1097
+
1098
+ def test_should_render_formatted_template
1099
+ get :formatted_html_erb
1100
+ assert_equal 'formatted html erb', @response.body
1101
+ end
1102
+
1103
+ def test_should_render_formatted_xml_erb_template
1104
+ get :formatted_xml_erb, :format => :xml
1105
+ assert_equal '<test>passed formatted xml erb</test>', @response.body
1106
+ end
1107
+
1108
+ def test_should_render_formatted_html_erb_template
1109
+ get :formatted_xml_erb
1110
+ assert_equal '<test>passed formatted html erb</test>', @response.body
1111
+ end
1112
+
1113
+ def test_should_render_formatted_html_erb_template_with_faulty_accepts_header
1114
+ @request.accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, appliction/x-shockwave-flash, */*"
1115
+ get :formatted_xml_erb
1116
+ assert_equal '<test>passed formatted html erb</test>', @response.body
1117
+ end
1118
+
1119
+ def test_should_render_xml_but_keep_custom_content_type
1120
+ get :render_xml_with_custom_content_type
1121
+ assert_equal "application/atomsvc+xml", @response.content_type
1122
+ end
1123
+
1124
+ def test_render_with_default_from_accept_header
1125
+ xhr :get, :greeting
1126
+ assert_equal "$(\"body\").visualEffect(\"highlight\");", @response.body
1127
+ end
1128
+
1129
+ def test_render_rjs_with_default
1130
+ get :delete_with_js
1131
+ assert_equal %!Element.remove("person");\nnew Effect.Highlight(\"project-4\",{});!, @response.body
1132
+ end
1133
+
1134
+ def test_render_rjs_template_explicitly
1135
+ get :render_js_with_explicit_template
1136
+ assert_equal %!Element.remove("person");\nnew Effect.Highlight(\"project-4\",{});!, @response.body
1137
+ end
1138
+
1139
+ def test_rendering_rjs_action_explicitly
1140
+ get :render_js_with_explicit_action_template
1141
+ assert_equal %!Element.remove("person");\nnew Effect.Highlight(\"project-4\",{});!, @response.body
1142
+ end
1143
+
1144
+ def test_layout_test_with_different_layout
1145
+ get :layout_test_with_different_layout
1146
+ assert_equal "<html>Hello world!</html>", @response.body
1147
+ end
1148
+
1149
+ def test_layout_test_with_different_layout_and_string_action
1150
+ get :layout_test_with_different_layout_and_string_action
1151
+ assert_equal "<html>Hello world!</html>", @response.body
1152
+ end
1153
+
1154
+ def test_layout_test_with_different_layout_and_symbol_action
1155
+ get :layout_test_with_different_layout_and_symbol_action
1156
+ assert_equal "<html>Hello world!</html>", @response.body
1157
+ end
1158
+
1159
+ def test_rendering_without_layout
1160
+ get :rendering_without_layout
1161
+ assert_equal "Hello world!", @response.body
1162
+ end
1163
+
1164
+ def test_layout_overriding_layout
1165
+ get :layout_overriding_layout
1166
+ assert_no_match %r{<title>}, @response.body
1167
+ end
1168
+
1169
+ def test_rendering_nothing_on_layout
1170
+ get :rendering_nothing_on_layout
1171
+ assert_equal " ", @response.body
1172
+ end
1173
+
1174
+ def test_render_to_string
1175
+ assert_not_deprecated { get :hello_in_a_string }
1176
+ assert_equal "How's there? goodbyeHello: davidHello: marygoodbye\n", @response.body
1177
+ end
1178
+
1179
+ def test_render_to_string_doesnt_break_assigns
1180
+ get :render_to_string_with_assigns
1181
+ assert_equal "i'm before the render", assigns(:before)
1182
+ assert_equal "i'm after the render", assigns(:after)
1183
+ end
1184
+
1185
+ def test_bad_render_to_string_still_throws_exception
1186
+ assert_raise(ActionView::MissingTemplate) { get :render_to_string_with_exception }
1187
+ end
1188
+
1189
+ def test_render_to_string_that_throws_caught_exception_doesnt_break_assigns
1190
+ assert_nothing_raised { get :render_to_string_with_caught_exception }
1191
+ assert_equal "i'm before the render", assigns(:before)
1192
+ assert_equal "i'm after the render", assigns(:after)
1193
+ end
1194
+
1195
+ def test_accessing_params_in_template_with_layout
1196
+ get :accessing_params_in_template_with_layout, :name => "David"
1197
+ assert_equal "<html>Hello: David</html>", @response.body
1198
+ end
1199
+
1200
+ def test_render_with_explicit_template
1201
+ get :render_with_explicit_template
1202
+ assert_response :success
1203
+ end
1204
+
1205
+ def test_render_with_explicit_string_template
1206
+ get :render_with_explicit_string_template
1207
+ assert_equal "<html>Hello world!</html>", @response.body
1208
+ end
1209
+
1210
+ def test_double_render
1211
+ assert_raise(ActionController::DoubleRenderError) { get :double_render }
1212
+ end
1213
+
1214
+ def test_double_redirect
1215
+ assert_raise(ActionController::DoubleRenderError) { get :double_redirect }
1216
+ end
1217
+
1218
+ def test_render_and_redirect
1219
+ assert_raise(ActionController::DoubleRenderError) { get :render_and_redirect }
1220
+ end
1221
+
1222
+ # specify the one exception to double render rule - render_to_string followed by render
1223
+ def test_render_to_string_and_render
1224
+ get :render_to_string_and_render
1225
+ assert_equal("Hi web users! here is some cached stuff", @response.body)
1226
+ end
1227
+
1228
+ def test_rendering_with_conflicting_local_vars
1229
+ get :rendering_with_conflicting_local_vars
1230
+ assert_equal("First: David\nSecond: Stephan\nThird: David\nFourth: David\nFifth: ", @response.body)
1231
+ end
1232
+
1233
+ def test_action_talk_to_layout
1234
+ get :action_talk_to_layout
1235
+ assert_equal "<title>Talking to the layout</title>\nAction was here!", @response.body
1236
+ end
1237
+
1238
+ def test_render_text_with_assigns
1239
+ get :render_text_with_assigns
1240
+ assert_equal "world", assigns["hello"]
1241
+ end
1242
+
1243
+ def test_template_with_locals
1244
+ get :render_with_explicit_template_with_locals
1245
+ assert_equal "The secret is area51\n", @response.body
1246
+ end
1247
+
1248
+ def test_update_page
1249
+ get :update_page
1250
+ assert_template nil
1251
+ assert_equal 'text/javascript; charset=utf-8', @response.headers['Content-Type']
1252
+ assert_equal 2, @response.body.split($/).length
1253
+ end
1254
+
1255
+ def test_update_page_with_instance_variables
1256
+ get :update_page_with_instance_variables
1257
+ assert_template nil
1258
+ assert_equal 'text/javascript; charset=utf-8', @response.headers["Content-Type"]
1259
+ assert_match /balance/, @response.body
1260
+ assert_match /\$37/, @response.body
1261
+ end
1262
+
1263
+ def test_update_page_with_view_method
1264
+ get :update_page_with_view_method
1265
+ assert_template nil
1266
+ assert_equal 'text/javascript; charset=utf-8', @response.headers["Content-Type"]
1267
+ assert_match /2 people/, @response.body
1268
+ end
1269
+
1270
+ def test_yield_content_for
1271
+ assert_not_deprecated { get :yield_content_for }
1272
+ assert_equal "<title>Putting stuff in the title!</title>\n\nGreat stuff!\n", @response.body
1273
+ end
1274
+
1275
+ def test_overwritting_rendering_relative_file_with_extension
1276
+ get :hello_world_from_rxml_using_template
1277
+ assert_equal "<html>\n <p>Hello</p>\n</html>\n", @response.body
1278
+
1279
+ get :hello_world_from_rxml_using_action
1280
+ assert_equal "<html>\n <p>Hello</p>\n</html>\n", @response.body
1281
+ end
1282
+
1283
+ def test_head_with_location_header
1284
+ get :head_with_location_header
1285
+ assert @response.body.blank?
1286
+ assert_equal "/foo", @response.headers["Location"]
1287
+ assert_response :ok
1288
+ end
1289
+
1290
+ def test_head_with_custom_header
1291
+ get :head_with_custom_header
1292
+ assert @response.body.blank?
1293
+ assert_equal "something", @response.headers["X-Custom-Header"]
1294
+ assert_response :ok
1295
+ end
1296
+
1297
+ def test_head_with_symbolic_status
1298
+ get :head_with_symbolic_status, :status => "ok"
1299
+ assert_equal "200 OK", @response.status
1300
+ assert_response :ok
1301
+
1302
+ get :head_with_symbolic_status, :status => "not_found"
1303
+ assert_equal "404 Not Found", @response.status
1304
+ assert_response :not_found
1305
+
1306
+ get :head_with_symbolic_status, :status => "no_content"
1307
+ assert_equal "204 No Content", @response.status
1308
+ assert !@response.headers.include?('Content-Length')
1309
+ assert_response :no_content
1310
+
1311
+ ActionController::StatusCodes::SYMBOL_TO_STATUS_CODE.each do |status, code|
1312
+ get :head_with_symbolic_status, :status => status.to_s
1313
+ assert_equal code, @response.response_code
1314
+ assert_response status
1315
+ end
1316
+ end
1317
+
1318
+ def test_head_with_integer_status
1319
+ ActionController::StatusCodes::STATUS_CODES.each do |code, message|
1320
+ get :head_with_integer_status, :status => code.to_s
1321
+ assert_equal message, @response.message
1322
+ end
1323
+ end
1324
+
1325
+ def test_head_with_string_status
1326
+ get :head_with_string_status, :status => "404 Eat Dirt"
1327
+ assert_equal 404, @response.response_code
1328
+ assert_equal "Eat Dirt", @response.message
1329
+ assert_response :not_found
1330
+ end
1331
+
1332
+ def test_head_with_status_code_first
1333
+ get :head_with_status_code_first
1334
+ assert_equal 403, @response.response_code
1335
+ assert_equal "Forbidden", @response.message
1336
+ assert_equal "something", @response.headers["X-Custom-Header"]
1337
+ assert_response :forbidden
1338
+ end
1339
+
1340
+ def test_rendering_with_location_should_set_header
1341
+ get :render_with_location
1342
+ assert_equal "http://example.com", @response.headers["Location"]
1343
+ end
1344
+
1345
+ def test_rendering_xml_should_call_to_xml_if_possible
1346
+ get :render_with_to_xml
1347
+ assert_equal "<i-am-xml/>", @response.body
1348
+ end
1349
+
1350
+ def test_rendering_with_object_location_should_set_header_with_url_for
1351
+ ActionController::Routing::Routes.draw do |map|
1352
+ map.resources :customers
1353
+ map.connect ':controller/:action/:id'
1354
+ end
1355
+
1356
+ get :render_with_object_location
1357
+ assert_equal "http://www.nextangle.com/customers/1", @response.headers["Location"]
1358
+ end
1359
+
1360
+ def test_should_use_implicit_content_type
1361
+ get :implicit_content_type, :format => 'atom'
1362
+ assert_equal Mime::ATOM, @response.content_type
1363
+ end
1364
+
1365
+ def test_using_layout_around_block
1366
+ get :render_using_layout_around_block
1367
+ assert_equal "Before (David)\nInside from block\nAfter", @response.body
1368
+ end
1369
+
1370
+ def test_using_layout_around_block_in_main_layout_and_within_content_for_layout
1371
+ get :render_using_layout_around_block_in_main_layout_and_within_content_for_layout
1372
+ assert_equal "Before (Anthony)\nInside from first block in layout\nAfter\nBefore (David)\nInside from block\nAfter\nBefore (Ramm)\nInside from second block in layout\nAfter\n", @response.body
1373
+ end
1374
+
1375
+ def test_using_layout_around_block_with_args
1376
+ get :render_using_layout_around_block_with_args
1377
+ assert_equal "Before\narg1arg2\nAfter", @response.body
1378
+ end
1379
+
1380
+ def test_partial_only
1381
+ get :partial_only
1382
+ assert_equal "only partial", @response.body
1383
+ end
1384
+
1385
+ def test_should_render_html_formatted_partial
1386
+ get :partial
1387
+ assert_equal 'partial html', @response.body
1388
+ end
1389
+
1390
+ def test_should_render_html_partial_with_dot
1391
+ get :partial_dot_html
1392
+ assert_equal 'partial html', @response.body
1393
+ end
1394
+
1395
+ def test_should_render_html_formatted_partial_with_rjs
1396
+ xhr :get, :partial_as_rjs
1397
+ assert_equal %(Element.replace("foo", "partial html");), @response.body
1398
+ end
1399
+
1400
+ def test_should_render_html_formatted_partial_with_rjs_and_js_format
1401
+ xhr :get, :respond_to_partial_as_rjs
1402
+ assert_equal %(Element.replace("foo", "partial html");), @response.body
1403
+ end
1404
+
1405
+ def test_should_render_js_partial
1406
+ xhr :get, :partial, :format => 'js'
1407
+ assert_equal 'partial js', @response.body
1408
+ end
1409
+
1410
+ def test_should_render_with_alternate_default_render
1411
+ xhr :get, :render_alternate_default
1412
+ assert_equal %(Element.replace("foo", "partial html");), @response.body
1413
+ end
1414
+
1415
+ def test_partial_only_with_layout
1416
+ get :partial_only_with_layout
1417
+ assert_equal "<html>only partial</html>", @response.body
1418
+ end
1419
+
1420
+ def test_render_to_string_partial
1421
+ get :render_to_string_with_partial
1422
+ assert_equal "only partial", assigns(:partial_only)
1423
+ assert_equal "Hello: david", assigns(:partial_with_locals)
1424
+ end
1425
+
1426
+ def test_partial_with_counter
1427
+ get :partial_with_counter
1428
+ assert_equal "5", @response.body
1429
+ end
1430
+
1431
+ def test_partial_with_locals
1432
+ get :partial_with_locals
1433
+ assert_equal "Hello: david", @response.body
1434
+ end
1435
+
1436
+ def test_partial_with_form_builder
1437
+ get :partial_with_form_builder
1438
+ assert_match(/<label/, @response.body)
1439
+ assert_template('test/_form')
1440
+ end
1441
+
1442
+ def test_partial_with_form_builder_subclass
1443
+ get :partial_with_form_builder_subclass
1444
+ assert_match(/<label/, @response.body)
1445
+ assert_template('test/_labelling_form')
1446
+ end
1447
+
1448
+ def test_partial_collection
1449
+ get :partial_collection
1450
+ assert_equal "Hello: davidHello: mary", @response.body
1451
+ end
1452
+
1453
+ def test_partial_collection_with_as
1454
+ get :partial_collection_with_as
1455
+ assert_equal "david david davidmary mary mary", @response.body
1456
+ end
1457
+
1458
+ def test_partial_collection_with_counter
1459
+ get :partial_collection_with_counter
1460
+ assert_equal "david0mary1", @response.body
1461
+ end
1462
+
1463
+ def test_partial_collection_with_locals
1464
+ get :partial_collection_with_locals
1465
+ assert_equal "Bonjour: davidBonjour: mary", @response.body
1466
+ end
1467
+
1468
+ def test_partial_collection_with_spacer
1469
+ get :partial_collection_with_spacer
1470
+ assert_equal "Hello: davidonly partialHello: mary", @response.body
1471
+ assert_template :partial => 'test/_partial_only'
1472
+ assert_template :partial => '_customer'
1473
+ end
1474
+
1475
+ def test_partial_collection_shorthand_with_locals
1476
+ get :partial_collection_shorthand_with_locals
1477
+ assert_equal "Bonjour: davidBonjour: mary", @response.body
1478
+ assert_template :partial => 'customers/_customer', :count => 2
1479
+ assert_template :partial => '_completely_fake_and_made_up_template_that_cannot_possibly_be_rendered', :count => 0
1480
+ end
1481
+
1482
+ def test_partial_collection_shorthand_with_different_types_of_records
1483
+ get :partial_collection_shorthand_with_different_types_of_records
1484
+ assert_equal "Bonjour bad customer: mark0Bonjour good customer: craig1Bonjour bad customer: john2Bonjour good customer: zach3Bonjour good customer: brandon4Bonjour bad customer: dan5", @response.body
1485
+ assert_template :partial => 'good_customers/_good_customer', :count => 3
1486
+ assert_template :partial => 'bad_customers/_bad_customer', :count => 3
1487
+ end
1488
+
1489
+ def test_empty_partial_collection
1490
+ get :empty_partial_collection
1491
+ assert_equal " ", @response.body
1492
+ assert_template :partial => false
1493
+ end
1494
+
1495
+ def test_partial_with_hash_object
1496
+ get :partial_with_hash_object
1497
+ assert_equal "Sam\nmaS\n", @response.body
1498
+ end
1499
+
1500
+ def test_partial_with_nested_object
1501
+ get :partial_with_nested_object
1502
+ assert_equal "first", @response.body
1503
+ end
1504
+
1505
+ def test_partial_with_nested_object_shorthand
1506
+ get :partial_with_nested_object_shorthand
1507
+ assert_equal "first", @response.body
1508
+ end
1509
+
1510
+ def test_hash_partial_collection
1511
+ get :partial_hash_collection
1512
+ assert_equal "Pratik\nkitarP\nAmy\nymA\n", @response.body
1513
+ end
1514
+
1515
+ def test_partial_hash_collection_with_locals
1516
+ get :partial_hash_collection_with_locals
1517
+ assert_equal "Hola: PratikHola: Amy", @response.body
1518
+ end
1519
+
1520
+ def test_partial_with_implicit_local_assignment
1521
+ assert_deprecated do
1522
+ get :partial_with_implicit_local_assignment
1523
+ assert_equal "Hello: Marcel", @response.body
1524
+ end
1525
+ end
1526
+
1527
+ def test_render_missing_partial_template
1528
+ assert_raise(ActionView::MissingTemplate) do
1529
+ get :missing_partial
1530
+ end
1531
+ end
1532
+
1533
+ def test_render_call_to_partial_with_layout
1534
+ get :render_call_to_partial_with_layout
1535
+ assert_equal "Before (David)\nInside from partial (David)\nAfter", @response.body
1536
+ end
1537
+
1538
+ def test_render_call_to_partial_with_layout_in_main_layout_and_within_content_for_layout
1539
+ get :render_call_to_partial_with_layout_in_main_layout_and_within_content_for_layout
1540
+ assert_equal "Before (Anthony)\nInside from partial (Anthony)\nAfter\nBefore (David)\nInside from partial (David)\nAfter\nBefore (Ramm)\nInside from partial (Ramm)\nAfter", @response.body
1541
+ end
1542
+ end
1543
+
1544
+ class ExpiresInRenderTest < ActionController::TestCase
1545
+ tests TestController
1546
+
1547
+ def setup
1548
+ @request.host = "www.nextangle.com"
1549
+ end
1550
+
1551
+ def test_expires_in_header
1552
+ get :conditional_hello_with_expires_in
1553
+ assert_equal "max-age=60, private", @response.headers["Cache-Control"]
1554
+ end
1555
+
1556
+ def test_expires_in_header_with_public
1557
+ get :conditional_hello_with_expires_in_with_public
1558
+ assert_equal "max-age=60, public", @response.headers["Cache-Control"]
1559
+ end
1560
+
1561
+ def test_expires_in_header_with_additional_headers
1562
+ get :conditional_hello_with_expires_in_with_public_with_more_keys
1563
+ assert_equal "max-age=60, public, max-stale=18000", @response.headers["Cache-Control"]
1564
+ end
1565
+
1566
+ def test_expires_in_old_syntax
1567
+ get :conditional_hello_with_expires_in_with_public_with_more_keys_old_syntax
1568
+ assert_equal "max-age=60, public, max-stale=18000", @response.headers["Cache-Control"]
1569
+ end
1570
+ end
1571
+
1572
+
1573
+ class EtagRenderTest < ActionController::TestCase
1574
+ tests TestController
1575
+
1576
+ def setup
1577
+ @request.host = "www.nextangle.com"
1578
+ @expected_bang_etag = etag_for(expand_key([:foo, 123]))
1579
+ end
1580
+
1581
+ def test_render_blank_body_shouldnt_set_etag
1582
+ get :blank_response
1583
+ assert !@response.etag?
1584
+ end
1585
+
1586
+ def test_render_200_should_set_etag
1587
+ get :render_hello_world_from_variable
1588
+ assert_equal etag_for("hello david"), @response.headers['ETag']
1589
+ assert_equal "private, max-age=0, must-revalidate", @response.headers['Cache-Control']
1590
+ end
1591
+
1592
+ def test_render_against_etag_request_should_304_when_match
1593
+ @request.if_none_match = etag_for("hello david")
1594
+ get :render_hello_world_from_variable
1595
+ assert_equal "304 Not Modified", @response.status
1596
+ assert @response.body.empty?
1597
+ end
1598
+
1599
+ def test_render_against_etag_request_should_have_no_content_length_when_match
1600
+ @request.if_none_match = etag_for("hello david")
1601
+ get :render_hello_world_from_variable
1602
+ assert !@response.headers.has_key?("Content-Length"), @response.headers['Content-Length']
1603
+ end
1604
+
1605
+ def test_render_against_etag_request_should_200_when_no_match
1606
+ @request.if_none_match = etag_for("hello somewhere else")
1607
+ get :render_hello_world_from_variable
1608
+ assert_equal "200 OK", @response.status
1609
+ assert !@response.body.empty?
1610
+ end
1611
+
1612
+ def test_render_should_not_set_etag_when_last_modified_has_been_specified
1613
+ get :render_hello_world_with_last_modified_set
1614
+ assert_equal "200 OK", @response.status
1615
+ assert_not_nil @response.last_modified
1616
+ assert_nil @response.etag
1617
+ assert @response.body.present?
1618
+ end
1619
+
1620
+ def test_render_with_etag
1621
+ get :render_hello_world_from_variable
1622
+ expected_etag = etag_for('hello david')
1623
+ assert_equal expected_etag, @response.headers['ETag']
1624
+ @response = ActionController::TestResponse.new
1625
+
1626
+ @request.if_none_match = expected_etag
1627
+ get :render_hello_world_from_variable
1628
+ assert_equal "304 Not Modified", @response.status
1629
+
1630
+ @request.if_none_match = "\"diftag\""
1631
+ get :render_hello_world_from_variable
1632
+ assert_equal "200 OK", @response.status
1633
+ end
1634
+
1635
+ def render_with_404_shouldnt_have_etag
1636
+ get :render_custom_code
1637
+ assert_nil @response.headers['ETag']
1638
+ end
1639
+
1640
+ def test_etag_should_not_be_changed_when_already_set
1641
+ get :render_hello_world_with_etag_set
1642
+ assert_equal etag_for("hello_world"), @response.headers['ETag']
1643
+ end
1644
+
1645
+ def test_etag_should_govern_renders_with_layouts_too
1646
+ get :builder_layout_test
1647
+ assert_equal "<wrapper>\n<html>\n <p>Hello </p>\n<p>This is grand!</p>\n</html>\n</wrapper>\n", @response.body
1648
+ assert_equal etag_for("<wrapper>\n<html>\n <p>Hello </p>\n<p>This is grand!</p>\n</html>\n</wrapper>\n"), @response.headers['ETag']
1649
+ end
1650
+
1651
+ def test_etag_with_bang_should_set_etag
1652
+ get :conditional_hello_with_bangs
1653
+ assert_equal @expected_bang_etag, @response.headers["ETag"]
1654
+ assert_response :success
1655
+ end
1656
+
1657
+ def test_etag_with_bang_should_obey_if_none_match
1658
+ @request.if_none_match = @expected_bang_etag
1659
+ get :conditional_hello_with_bangs
1660
+ assert_response :not_modified
1661
+ end
1662
+
1663
+ def test_etag_with_public_true_should_set_header
1664
+ get :conditional_hello_with_public_header
1665
+ assert_equal "public", @response.headers['Cache-Control']
1666
+ end
1667
+
1668
+ def test_etag_with_public_true_should_set_header_and_retain_other_headers
1669
+ get :conditional_hello_with_public_header_and_expires_at
1670
+ assert_equal "max-age=60, public", @response.headers['Cache-Control']
1671
+ end
1672
+
1673
+ protected
1674
+ def etag_for(text)
1675
+ %("#{Digest::MD5.hexdigest(text)}")
1676
+ end
1677
+
1678
+ def expand_key(args)
1679
+ ActiveSupport::Cache.expand_cache_key(args)
1680
+ end
1681
+ end
1682
+
1683
+ class LastModifiedRenderTest < ActionController::TestCase
1684
+ tests TestController
1685
+
1686
+ def setup
1687
+ @request.host = "www.nextangle.com"
1688
+ @last_modified = Time.now.utc.beginning_of_day.httpdate
1689
+ end
1690
+
1691
+ def test_responds_with_last_modified
1692
+ get :conditional_hello
1693
+ assert_equal @last_modified, @response.headers['Last-Modified']
1694
+ end
1695
+
1696
+ def test_request_not_modified
1697
+ @request.if_modified_since = @last_modified
1698
+ get :conditional_hello
1699
+ assert_equal "304 Not Modified", @response.status
1700
+ assert @response.body.blank?, @response.body
1701
+ assert_equal @last_modified, @response.headers['Last-Modified']
1702
+ end
1703
+
1704
+ def test_request_not_modified_but_etag_differs
1705
+ @request.if_modified_since = @last_modified
1706
+ @request.if_none_match = "234"
1707
+ get :conditional_hello
1708
+ assert_response :success
1709
+ end
1710
+
1711
+ def test_request_modified
1712
+ @request.if_modified_since = 'Thu, 16 Jul 2008 00:00:00 GMT'
1713
+ get :conditional_hello
1714
+ assert_equal "200 OK", @response.status
1715
+ assert !@response.body.blank?
1716
+ assert_equal @last_modified, @response.headers['Last-Modified']
1717
+ end
1718
+
1719
+ def test_request_with_bang_gets_last_modified
1720
+ get :conditional_hello_with_bangs
1721
+ assert_equal @last_modified, @response.headers['Last-Modified']
1722
+ assert_response :success
1723
+ end
1724
+
1725
+ def test_request_with_bang_obeys_last_modified
1726
+ @request.if_modified_since = @last_modified
1727
+ get :conditional_hello_with_bangs
1728
+ assert_response :not_modified
1729
+ end
1730
+
1731
+ def test_last_modified_works_with_less_than_too
1732
+ @request.if_modified_since = 5.years.ago.httpdate
1733
+ get :conditional_hello_with_bangs
1734
+ assert_response :success
1735
+ end
1736
+ end
1737
+
1738
+ class RenderingLoggingTest < ActionController::TestCase
1739
+ tests TestController
1740
+
1741
+ def setup
1742
+ @request.host = "www.nextangle.com"
1743
+ end
1744
+
1745
+ def test_logger_prints_layout_and_template_rendering_info
1746
+ @controller.logger = MockLogger.new
1747
+ get :layout_test
1748
+ logged = @controller.logger.logged.find_all {|l| l =~ /render/i }
1749
+ assert_equal "Rendering template within layouts/standard", logged[0]
1750
+ assert_equal "Rendering test/hello_world", logged[1]
1751
+ end
1752
+ end