~michaelforrest/use-case-mapper/trunk

« back to all changes in this revision

Viewing changes to vendor/rails/actionpack/test/controller/mime_responds_test.rb

  • Committer: Richard Lee (Canonical)
  • Date: 2010-10-15 15:17:58 UTC
  • mfrom: (190.1.3 use-case-mapper)
  • Revision ID: richard.lee@canonical.com-20101015151758-wcvmfxrexsongf9d
Merge

Show diffs side-by-side

added added

removed removed

Lines of Context:
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