Merged updates from trunk into stable branch
[feedcatcher.git] / vendor / rails / actionpack / test / controller / mime_responds_test.rb
1 require 'abstract_unit'
2
3 class RespondToController < ActionController::Base
4 layout :set_layout
5
6 def html_xml_or_rss
7 respond_to do |type|
8 type.html { render :text => "HTML" }
9 type.xml { render :text => "XML" }
10 type.rss { render :text => "RSS" }
11 type.all { render :text => "Nothing" }
12 end
13 end
14
15 def js_or_html
16 respond_to do |type|
17 type.html { render :text => "HTML" }
18 type.js { render :text => "JS" }
19 type.all { render :text => "Nothing" }
20 end
21 end
22
23 def json_or_yaml
24 respond_to do |type|
25 type.json { render :text => "JSON" }
26 type.yaml { render :text => "YAML" }
27 end
28 end
29
30 def html_or_xml
31 respond_to do |type|
32 type.html { render :text => "HTML" }
33 type.xml { render :text => "XML" }
34 type.all { render :text => "Nothing" }
35 end
36 end
37
38 def forced_xml
39 request.format = :xml
40
41 respond_to do |type|
42 type.html { render :text => "HTML" }
43 type.xml { render :text => "XML" }
44 end
45 end
46
47 def just_xml
48 respond_to do |type|
49 type.xml { render :text => "XML" }
50 end
51 end
52
53 def using_defaults
54 respond_to do |type|
55 type.html
56 type.js
57 type.xml
58 end
59 end
60
61 def using_defaults_with_type_list
62 respond_to(:html, :js, :xml)
63 end
64
65 def made_for_content_type
66 respond_to do |type|
67 type.rss { render :text => "RSS" }
68 type.atom { render :text => "ATOM" }
69 type.all { render :text => "Nothing" }
70 end
71 end
72
73 def custom_type_handling
74 respond_to do |type|
75 type.html { render :text => "HTML" }
76 type.custom("application/crazy-xml") { render :text => "Crazy XML" }
77 type.all { render :text => "Nothing" }
78 end
79 end
80
81 def custom_constant_handling
82 Mime::Type.register("text/x-mobile", :mobile)
83
84 respond_to do |type|
85 type.html { render :text => "HTML" }
86 type.mobile { render :text => "Mobile" }
87 end
88 ensure
89 Mime.module_eval { remove_const :MOBILE if const_defined?(:MOBILE) }
90 end
91
92 def custom_constant_handling_without_block
93 Mime::Type.register("text/x-mobile", :mobile)
94
95 respond_to do |type|
96 type.html { render :text => "HTML" }
97 type.mobile
98 end
99
100 ensure
101 Mime.module_eval { remove_const :MOBILE if const_defined?(:MOBILE) }
102 end
103
104 def handle_any
105 respond_to do |type|
106 type.html { render :text => "HTML" }
107 type.any(:js, :xml) { render :text => "Either JS or XML" }
108 end
109 end
110
111 def handle_any_any
112 respond_to do |type|
113 type.html { render :text => 'HTML' }
114 type.any { render :text => 'Whatever you ask for, I got it' }
115 end
116 end
117
118 def all_types_with_layout
119 respond_to do |type|
120 type.html
121 type.js
122 end
123 end
124
125 def iphone_with_html_response_type
126 Mime::Type.register_alias("text/html", :iphone)
127 request.format = :iphone if request.env["HTTP_ACCEPT"] == "text/iphone"
128
129 respond_to do |type|
130 type.html { @type = "Firefox" }
131 type.iphone { @type = "iPhone" }
132 end
133
134 ensure
135 Mime.module_eval { remove_const :IPHONE if const_defined?(:IPHONE) }
136 end
137
138 def iphone_with_html_response_type_without_layout
139 Mime::Type.register_alias("text/html", :iphone)
140 request.format = "iphone" if request.env["HTTP_ACCEPT"] == "text/iphone"
141
142 respond_to do |type|
143 type.html { @type = "Firefox"; render :action => "iphone_with_html_response_type" }
144 type.iphone { @type = "iPhone" ; render :action => "iphone_with_html_response_type" }
145 end
146
147 ensure
148 Mime.module_eval { remove_const :IPHONE if const_defined?(:IPHONE) }
149 end
150
151 def rescue_action(e)
152 raise
153 end
154
155 protected
156 def set_layout
157 if ["all_types_with_layout", "iphone_with_html_response_type"].include?(action_name)
158 "respond_to/layouts/standard"
159 elsif action_name == "iphone_with_html_response_type_without_layout"
160 "respond_to/layouts/missing"
161 end
162 end
163 end
164
165 class MimeControllerTest < ActionController::TestCase
166 tests RespondToController
167
168 def setup
169 ActionController::Base.use_accept_header = true
170 @request.host = "www.example.com"
171 end
172
173 def teardown
174 ActionController::Base.use_accept_header = false
175 end
176
177 def test_html
178 @request.accept = "text/html"
179 get :js_or_html
180 assert_equal 'HTML', @response.body
181
182 get :html_or_xml
183 assert_equal 'HTML', @response.body
184
185 get :just_xml
186 assert_response 406
187 end
188
189 def test_all
190 @request.accept = "*/*"
191 get :js_or_html
192 assert_equal 'HTML', @response.body # js is not part of all
193
194 get :html_or_xml
195 assert_equal 'HTML', @response.body
196
197 get :just_xml
198 assert_equal 'XML', @response.body
199 end
200
201 def test_xml
202 @request.accept = "application/xml"
203 get :html_xml_or_rss
204 assert_equal 'XML', @response.body
205 end
206
207 def test_js_or_html
208 @request.accept = "text/javascript, text/html"
209 get :js_or_html
210 assert_equal 'JS', @response.body
211
212 get :html_or_xml
213 assert_equal 'HTML', @response.body
214
215 get :just_xml
216 assert_response 406
217 end
218
219 def test_json_or_yaml
220 get :json_or_yaml
221 assert_equal 'JSON', @response.body
222
223 get :json_or_yaml, :format => 'json'
224 assert_equal 'JSON', @response.body
225
226 get :json_or_yaml, :format => 'yaml'
227 assert_equal 'YAML', @response.body
228
229 { 'YAML' => %w(text/yaml),
230 'JSON' => %w(application/json text/x-json)
231 }.each do |body, content_types|
232 content_types.each do |content_type|
233 @request.accept = content_type
234 get :json_or_yaml
235 assert_equal body, @response.body
236 end
237 end
238 end
239
240 def test_js_or_anything
241 @request.accept = "text/javascript, */*"
242 get :js_or_html
243 assert_equal 'JS', @response.body
244
245 get :html_or_xml
246 assert_equal 'HTML', @response.body
247
248 get :just_xml
249 assert_equal 'XML', @response.body
250 end
251
252 def test_using_defaults
253 @request.accept = "*/*"
254 get :using_defaults
255 assert_equal "text/html", @response.content_type
256 assert_equal 'Hello world!', @response.body
257
258 @request.accept = "text/javascript"
259 get :using_defaults
260 assert_equal "text/javascript", @response.content_type
261 assert_equal '$("body").visualEffect("highlight");', @response.body
262
263 @request.accept = "application/xml"
264 get :using_defaults
265 assert_equal "application/xml", @response.content_type
266 assert_equal "<p>Hello world!</p>\n", @response.body
267 end
268
269 def test_using_defaults_with_type_list
270 @request.accept = "*/*"
271 get :using_defaults_with_type_list
272 assert_equal "text/html", @response.content_type
273 assert_equal 'Hello world!', @response.body
274
275 @request.accept = "text/javascript"
276 get :using_defaults_with_type_list
277 assert_equal "text/javascript", @response.content_type
278 assert_equal '$("body").visualEffect("highlight");', @response.body
279
280 @request.accept = "application/xml"
281 get :using_defaults_with_type_list
282 assert_equal "application/xml", @response.content_type
283 assert_equal "<p>Hello world!</p>\n", @response.body
284 end
285
286 def test_with_atom_content_type
287 @request.env["CONTENT_TYPE"] = "application/atom+xml"
288 get :made_for_content_type
289 assert_equal "ATOM", @response.body
290 end
291
292 def test_with_rss_content_type
293 @request.env["CONTENT_TYPE"] = "application/rss+xml"
294 get :made_for_content_type
295 assert_equal "RSS", @response.body
296 end
297
298 def test_synonyms
299 @request.accept = "application/javascript"
300 get :js_or_html
301 assert_equal 'JS', @response.body
302
303 @request.accept = "application/x-xml"
304 get :html_xml_or_rss
305 assert_equal "XML", @response.body
306 end
307
308 def test_custom_types
309 @request.accept = "application/crazy-xml"
310 get :custom_type_handling
311 assert_equal "application/crazy-xml", @response.content_type
312 assert_equal 'Crazy XML', @response.body
313
314 @request.accept = "text/html"
315 get :custom_type_handling
316 assert_equal "text/html", @response.content_type
317 assert_equal 'HTML', @response.body
318 end
319
320 def test_xhtml_alias
321 @request.accept = "application/xhtml+xml,application/xml"
322 get :html_or_xml
323 assert_equal 'HTML', @response.body
324 end
325
326 def test_firefox_simulation
327 @request.accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"
328 get :html_or_xml
329 assert_equal 'HTML', @response.body
330 end
331
332 def test_handle_any
333 @request.accept = "*/*"
334 get :handle_any
335 assert_equal 'HTML', @response.body
336
337 @request.accept = "text/javascript"
338 get :handle_any
339 assert_equal 'Either JS or XML', @response.body
340
341 @request.accept = "text/xml"
342 get :handle_any
343 assert_equal 'Either JS or XML', @response.body
344 end
345
346 def test_handle_any_any
347 @request.accept = "*/*"
348 get :handle_any_any
349 assert_equal 'HTML', @response.body
350 end
351
352 def test_handle_any_any_parameter_format
353 get :handle_any_any, {:format=>'html'}
354 assert_equal 'HTML', @response.body
355 end
356
357 def test_handle_any_any_explicit_html
358 @request.accept = "text/html"
359 get :handle_any_any
360 assert_equal 'HTML', @response.body
361 end
362
363 def test_handle_any_any_javascript
364 @request.accept = "text/javascript"
365 get :handle_any_any
366 assert_equal 'Whatever you ask for, I got it', @response.body
367 end
368
369 def test_handle_any_any_xml
370 @request.accept = "text/xml"
371 get :handle_any_any
372 assert_equal 'Whatever you ask for, I got it', @response.body
373 end
374
375 def test_rjs_type_skips_layout
376 @request.accept = "text/javascript"
377 get :all_types_with_layout
378 assert_equal 'RJS for all_types_with_layout', @response.body
379 end
380
381 def test_html_type_with_layout
382 @request.accept = "text/html"
383 get :all_types_with_layout
384 assert_equal '<html><div id="html">HTML for all_types_with_layout</div></html>', @response.body
385 end
386
387 def test_xhr
388 xhr :get, :js_or_html
389 assert_equal 'JS', @response.body
390
391 xhr :get, :using_defaults
392 assert_equal '$("body").visualEffect("highlight");', @response.body
393 end
394
395 def test_custom_constant
396 get :custom_constant_handling, :format => "mobile"
397 assert_equal "text/x-mobile", @response.content_type
398 assert_equal "Mobile", @response.body
399 end
400
401 def test_custom_constant_handling_without_block
402 get :custom_constant_handling_without_block, :format => "mobile"
403 assert_equal "text/x-mobile", @response.content_type
404 assert_equal "Mobile", @response.body
405 end
406
407 def test_forced_format
408 get :html_xml_or_rss
409 assert_equal "HTML", @response.body
410
411 get :html_xml_or_rss, :format => "html"
412 assert_equal "HTML", @response.body
413
414 get :html_xml_or_rss, :format => "xml"
415 assert_equal "XML", @response.body
416
417 get :html_xml_or_rss, :format => "rss"
418 assert_equal "RSS", @response.body
419 end
420
421 def test_internally_forced_format
422 get :forced_xml
423 assert_equal "XML", @response.body
424
425 get :forced_xml, :format => "html"
426 assert_equal "XML", @response.body
427 end
428
429 def test_extension_synonyms
430 get :html_xml_or_rss, :format => "xhtml"
431 assert_equal "HTML", @response.body
432 end
433
434 def test_render_action_for_html
435 @controller.instance_eval do
436 def render(*args)
437 unless args.empty?
438 @action = args.first[:action]
439 end
440 response.body = "#{@action} - #{@template.template_format}"
441 end
442 end
443
444 get :using_defaults
445 assert_equal "using_defaults - html", @response.body
446
447 get :using_defaults, :format => "xml"
448 assert_equal "using_defaults - xml", @response.body
449 end
450
451 def test_format_with_custom_response_type
452 get :iphone_with_html_response_type
453 assert_equal '<html><div id="html">Hello future from Firefox!</div></html>', @response.body
454
455 get :iphone_with_html_response_type, :format => "iphone"
456 assert_equal "text/html", @response.content_type
457 assert_equal '<html><div id="iphone">Hello iPhone future from iPhone!</div></html>', @response.body
458 end
459
460 def test_format_with_custom_response_type_and_request_headers
461 @request.accept = "text/iphone"
462 get :iphone_with_html_response_type
463 assert_equal '<html><div id="iphone">Hello iPhone future from iPhone!</div></html>', @response.body
464 assert_equal "text/html", @response.content_type
465 end
466
467 def test_format_with_custom_response_type_and_request_headers_with_only_one_layout_present
468 get :iphone_with_html_response_type_without_layout
469 assert_equal '<html><div id="html_missing">Hello future from Firefox!</div></html>', @response.body
470
471 @request.accept = "text/iphone"
472 assert_raise(ActionView::MissingTemplate) { get :iphone_with_html_response_type_without_layout }
473 end
474 end
475
476 class AbstractPostController < ActionController::Base
477 self.view_paths = File.dirname(__FILE__) + "/../fixtures/post_test/"
478 end
479
480 # For testing layouts which are set automatically
481 class PostController < AbstractPostController
482 around_filter :with_iphone
483
484 def index
485 respond_to do |type|
486 type.html
487 type.iphone
488 end
489 end
490
491 protected
492 def with_iphone
493 Mime::Type.register_alias("text/html", :iphone)
494 request.format = "iphone" if request.env["HTTP_ACCEPT"] == "text/iphone"
495 yield
496 ensure
497 Mime.module_eval { remove_const :IPHONE if const_defined?(:IPHONE) }
498 end
499 end
500
501 class SuperPostController < PostController
502 def index
503 respond_to do |type|
504 type.html
505 type.iphone
506 end
507 end
508 end
509
510 class MimeControllerLayoutsTest < ActionController::TestCase
511 tests PostController
512
513 def setup
514 @request.host = "www.example.com"
515 end
516
517 def test_missing_layout_renders_properly
518 get :index
519 assert_equal '<html><div id="html">Hello Firefox</div></html>', @response.body
520
521 @request.accept = "text/iphone"
522 get :index
523 assert_equal 'Hello iPhone', @response.body
524 end
525
526 def test_format_with_inherited_layouts
527 @controller = SuperPostController.new
528
529 get :index
530 assert_equal 'Super Firefox', @response.body
531
532 @request.accept = "text/iphone"
533 get :index
534 assert_equal '<html><div id="super_iphone">Super iPhone</div></html>', @response.body
535 end
536 end