respond_to_test.rb 23.1 KB
Newer Older
1 2
# frozen_string_literal: true

3
require "abstract_unit"
4
require "active_support/log_subscriber/test_helper"
5 6 7 8

class RespondToController < ActionController::Base
  layout :set_layout

9 10 11 12 13 14 15
  before_action {
    case params[:v]
    when String then request.variant = params[:v].to_sym
    when Array then request.variant = params[:v].map(&:to_sym)
    end
  }

16 17
  def html_xml_or_rss
    respond_to do |type|
18 19 20 21
      type.html { render body: "HTML"    }
      type.xml  { render body: "XML"     }
      type.rss  { render body: "RSS"     }
      type.all  { render body: "Nothing" }
22 23 24 25 26
    end
  end

  def js_or_html
    respond_to do |type|
27 28 29
      type.html { render body: "HTML"    }
      type.js   { render body: "JS"      }
      type.all  { render body: "Nothing" }
30 31 32 33 34
    end
  end

  def json_or_yaml
    respond_to do |type|
35 36
      type.json { render body: "JSON" }
      type.yaml { render body: "YAML" }
37 38 39 40 41
    end
  end

  def html_or_xml
    respond_to do |type|
42 43 44
      type.html { render body: "HTML"    }
      type.xml  { render body: "XML"     }
      type.all  { render body: "Nothing" }
45 46 47 48 49
    end
  end

  def json_xml_or_html
    respond_to do |type|
50
      type.json { render body: "JSON" }
51
      type.xml { render xml: "XML" }
52
      type.html { render body: "HTML" }
53 54 55 56 57 58 59
    end
  end

  def forced_xml
    request.format = :xml

    respond_to do |type|
60 61
      type.html { render body: "HTML"    }
      type.xml  { render body: "XML"     }
62 63 64 65 66
    end
  end

  def just_xml
    respond_to do |type|
67
      type.xml  { render body: "XML" }
68 69 70 71 72 73 74 75 76 77
    end
  end

  def using_defaults
    respond_to do |type|
      type.html
      type.xml
    end
  end

78 79 80
  def missing_templates
    respond_to do |type|
      # This test requires a block that is empty
81
      type.json {}
82 83 84 85
      type.xml
    end
  end

86 87 88 89 90 91 92
  def using_defaults_with_type_list
    respond_to(:html, :xml)
  end

  def using_defaults_with_all
    respond_to do |type|
      type.html
93
      type.all { render body: "ALL" }
94 95 96 97 98
    end
  end

  def made_for_content_type
    respond_to do |type|
99 100 101
      type.rss  { render body: "RSS"  }
      type.atom { render body: "ATOM" }
      type.all  { render body: "Nothing" }
102 103 104 105 106
    end
  end

  def custom_type_handling
    respond_to do |type|
107 108 109
      type.html { render body: "HTML"    }
      type.custom("application/crazy-xml")  { render body: "Crazy XML"  }
      type.all  { render body: "Nothing" }
110 111 112 113 114
    end
  end

  def custom_constant_handling
    respond_to do |type|
115 116
      type.html   { render body: "HTML"   }
      type.mobile { render body: "Mobile" }
117 118 119 120 121
    end
  end

  def custom_constant_handling_without_block
    respond_to do |type|
122
      type.html   { render body: "HTML"   }
123 124 125 126 127 128
      type.mobile
    end
  end

  def handle_any
    respond_to do |type|
129 130
      type.html { render body: "HTML" }
      type.any(:js, :xml) { render body: "Either JS or XML" }
131 132 133 134 135
    end
  end

  def handle_any_any
    respond_to do |type|
136 137
      type.html { render body: "HTML" }
      type.any { render body: "Whatever you ask for, I got it" }
138 139 140 141 142 143 144 145 146
    end
  end

  def all_types_with_layout
    respond_to do |type|
      type.html
    end
  end

147 148
  def json_with_callback
    respond_to do |type|
149
      type.json { render json: "JS", callback: "alert" }
150 151 152
    end
  end

153 154 155 156 157 158 159 160 161 162 163 164 165
  def iphone_with_html_response_type
    request.format = :iphone if request.env["HTTP_ACCEPT"] == "text/iphone"

    respond_to do |type|
      type.html   { @type = "Firefox" }
      type.iphone { @type = "iPhone"  }
    end
  end

  def iphone_with_html_response_type_without_layout
    request.format = "iphone" if request.env["HTTP_ACCEPT"] == "text/iphone"

    respond_to do |type|
166 167
      type.html   { @type = "Firefox"; render action: "iphone_with_html_response_type" }
      type.iphone { @type = "iPhone" ; render action: "iphone_with_html_response_type" }
168 169 170
    end
  end

171 172 173 174 175 176 177 178
  def variant_with_implicit_template_rendering
    # This has exactly one variant template defined in the file system (+mobile.html.erb),
    # which raises the regular MissingTemplate error for other variants.
  end

  def variant_without_implicit_template_rendering
    # This differs from the above in that it does not have any templates defined in the file
    # system, which triggers the ImplicitRender (204 No Content) behavior.
Ł
Łukasz Strzałkowski 已提交
179 180 181 182 183 184
  end

  def variant_with_format_and_custom_render
    request.variant = :mobile

    respond_to do |type|
185
      type.html { render body: "mobile" }
Ł
Łukasz Strzałkowski 已提交
186 187 188 189 190 191
    end
  end

  def multiple_variants_for_format
    respond_to do |type|
      type.html do |html|
192 193
        html.tablet { render body: "tablet" }
        html.phone  { render body: "phone" }
Ł
Łukasz Strzałkowski 已提交
194 195 196 197
      end
    end
  end

198 199 200
  def variant_plus_none_for_format
    respond_to do |format|
      format.html do |variant|
201
        variant.phone { render body: "phone" }
202
        variant.none
203 204 205 206
      end
    end
  end

Ł
Łukasz Strzałkowski 已提交
207 208
  def variant_inline_syntax
    respond_to do |format|
209 210 211
      format.js         { render body: "js"    }
      format.html.none  { render body: "none"  }
      format.html.phone { render body: "phone" }
Ł
Łukasz Strzałkowski 已提交
212 213 214 215 216 217 218 219 220 221 222
    end
  end

  def variant_inline_syntax_without_block
    respond_to do |format|
      format.js
      format.html.none
      format.html.phone
    end
  end

223 224 225
  def variant_any
    respond_to do |format|
      format.html do |variant|
226
        variant.any(:tablet, :phablet) { render body: "any" }
227
        variant.phone { render body: "phone" }
228 229 230 231 232 233 234
      end
    end
  end

  def variant_any_any
    respond_to do |format|
      format.html do |variant|
235 236
        variant.any   { render body: "any"   }
        variant.phone { render body: "phone" }
237 238 239 240 241 242
      end
    end
  end

  def variant_inline_any
    respond_to do |format|
243
      format.html.any(:tablet, :phablet) { render body: "any" }
244
      format.html.phone { render body: "phone" }
245 246 247 248 249
    end
  end

  def variant_inline_any_any
    respond_to do |format|
250 251
      format.html.phone { render body: "phone" }
      format.html.any   { render body: "any"   }
252 253 254 255 256 257 258 259 260 261 262 263
    end
  end

  def variant_any_implicit_render
    respond_to do |format|
      format.html.phone
      format.html.any(:tablet, :phablet)
    end
  end

  def variant_any_with_none
    respond_to do |format|
264
      format.html.any(:none, :phone) { render body: "none or phone" }
265 266 267 268 269
    end
  end

  def format_any_variant_any
    respond_to do |format|
270
      format.html { render body: "HTML" }
271
      format.any(:js, :xml) do |variant|
272 273
        variant.phone { render body: "phone" }
        variant.any(:tablet, :phablet) { render body: "tablet" }
274 275 276 277
      end
    end
  end

278
  private
279 280
    def set_layout
      case action_name
281 282 283 284
      when "all_types_with_layout", "iphone_with_html_response_type"
        "respond_to/layouts/standard"
      when "iphone_with_html_response_type_without_layout"
        "respond_to/layouts/missing"
285 286 287 288 289
      end
    end
end

class RespondToControllerTest < ActionController::TestCase
290 291
  NO_CONTENT_WARNING = "No template found for RespondToController#variant_without_implicit_template_rendering, rendering head :no_content"

292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307
  def setup
    super
    @request.host = "www.example.com"
    Mime::Type.register_alias("text/html", :iphone)
    Mime::Type.register("text/x-mobile", :mobile)
  end

  def teardown
    super
    Mime::Type.unregister(:iphone)
    Mime::Type.unregister(:mobile)
  end

  def test_html
    @request.accept = "text/html"
    get :js_or_html
308
    assert_equal "HTML", @response.body
309 310

    get :html_or_xml
311
    assert_equal "HTML", @response.body
312 313 314 315 316 317 318 319 320

    assert_raises(ActionController::UnknownFormat) do
      get :just_xml
    end
  end

  def test_all
    @request.accept = "*/*"
    get :js_or_html
321
    assert_equal "HTML", @response.body # js is not part of all
322 323

    get :html_or_xml
324
    assert_equal "HTML", @response.body
325 326

    get :just_xml
327
    assert_equal "XML", @response.body
328 329 330 331 332
  end

  def test_xml
    @request.accept = "application/xml"
    get :html_xml_or_rss
333
    assert_equal "XML", @response.body
334 335 336 337
  end

  def test_js_or_html
    @request.accept = "text/javascript, text/html"
338
    get :js_or_html, xhr: true
339
    assert_equal "JS", @response.body
340 341

    @request.accept = "text/javascript, text/html"
342
    get :html_or_xml, xhr: true
343
    assert_equal "HTML", @response.body
344 345 346 347

    @request.accept = "text/javascript, text/html"

    assert_raises(ActionController::UnknownFormat) do
348
      get :just_xml, xhr: true
349 350 351 352 353 354
    end
  end

  def test_json_or_yaml_with_leading_star_star
    @request.accept = "*/*, application/json"
    get :json_xml_or_html
355
    assert_equal "HTML", @response.body
356 357 358

    @request.accept = "*/* , application/json"
    get :json_xml_or_html
359
    assert_equal "HTML", @response.body
360 361 362
  end

  def test_json_or_yaml
363
    get :json_or_yaml, xhr: true
364
    assert_equal "JSON", @response.body
365

366 367
    get :json_or_yaml, format: "json"
    assert_equal "JSON", @response.body
368

369 370
    get :json_or_yaml, format: "yaml"
    assert_equal "YAML", @response.body
371

372 373
    { "YAML" => %w(text/yaml),
      "JSON" => %w(application/json text/x-json)
374 375 376 377 378 379 380 381 382 383 384
    }.each do |body, content_types|
      content_types.each do |content_type|
        @request.accept = content_type
        get :json_or_yaml
        assert_equal body, @response.body
      end
    end
  end

  def test_js_or_anything
    @request.accept = "text/javascript, */*"
385
    get :js_or_html, xhr: true
386
    assert_equal "JS", @response.body
387

388
    get :html_or_xml, xhr: true
389
    assert_equal "HTML", @response.body
390

391
    get :just_xml, xhr: true
392
    assert_equal "XML", @response.body
393 394 395 396 397 398
  end

  def test_using_defaults
    @request.accept = "*/*"
    get :using_defaults
    assert_equal "text/html", @response.content_type
399
    assert_equal "Hello world!", @response.body
400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424

    @request.accept = "application/xml"
    get :using_defaults
    assert_equal "application/xml", @response.content_type
    assert_equal "<p>Hello world!</p>\n", @response.body
  end

  def test_using_defaults_with_all
    @request.accept = "*/*"
    get :using_defaults_with_all
    assert_equal "HTML!", @response.body.strip

    @request.accept = "text/html"
    get :using_defaults_with_all
    assert_equal "HTML!", @response.body.strip

    @request.accept = "application/json"
    get :using_defaults_with_all
    assert_equal "ALL", @response.body
  end

  def test_using_defaults_with_type_list
    @request.accept = "*/*"
    get :using_defaults_with_type_list
    assert_equal "text/html", @response.content_type
425
    assert_equal "Hello world!", @response.body
426 427 428 429 430 431 432 433 434 435

    @request.accept = "application/xml"
    get :using_defaults_with_type_list
    assert_equal "application/xml", @response.content_type
    assert_equal "<p>Hello world!</p>\n", @response.body
  end

  def test_with_atom_content_type
    @request.accept = ""
    @request.env["CONTENT_TYPE"] = "application/atom+xml"
436
    get :made_for_content_type, xhr: true
437 438 439 440 441 442
    assert_equal "ATOM", @response.body
  end

  def test_with_rss_content_type
    @request.accept = ""
    @request.env["CONTENT_TYPE"] = "application/rss+xml"
443
    get :made_for_content_type, xhr: true
444 445 446 447 448 449
    assert_equal "RSS", @response.body
  end

  def test_synonyms
    @request.accept = "application/javascript"
    get :js_or_html
450
    assert_equal "JS", @response.body
451 452 453 454 455 456 457 458 459 460

    @request.accept = "application/x-xml"
    get :html_xml_or_rss
    assert_equal "XML", @response.body
  end

  def test_custom_types
    @request.accept = "application/crazy-xml"
    get :custom_type_handling
    assert_equal "application/crazy-xml", @response.content_type
461
    assert_equal "Crazy XML", @response.body
462 463 464 465

    @request.accept = "text/html"
    get :custom_type_handling
    assert_equal "text/html", @response.content_type
466
    assert_equal "HTML", @response.body
467 468 469 470 471
  end

  def test_xhtml_alias
    @request.accept = "application/xhtml+xml,application/xml"
    get :html_or_xml
472
    assert_equal "HTML", @response.body
473 474 475 476 477
  end

  def test_firefox_simulation
    @request.accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"
    get :html_or_xml
478
    assert_equal "HTML", @response.body
479 480 481 482 483
  end

  def test_handle_any
    @request.accept = "*/*"
    get :handle_any
484
    assert_equal "HTML", @response.body
485 486 487

    @request.accept = "text/javascript"
    get :handle_any
488
    assert_equal "Either JS or XML", @response.body
489 490 491

    @request.accept = "text/xml"
    get :handle_any
492
    assert_equal "Either JS or XML", @response.body
493 494 495 496 497
  end

  def test_handle_any_any
    @request.accept = "*/*"
    get :handle_any_any
498
    assert_equal "HTML", @response.body
499 500 501
  end

  def test_handle_any_any_parameter_format
502 503
    get :handle_any_any, format: "html"
    assert_equal "HTML", @response.body
504 505 506 507 508
  end

  def test_handle_any_any_explicit_html
    @request.accept = "text/html"
    get :handle_any_any
509
    assert_equal "HTML", @response.body
510 511 512 513 514
  end

  def test_handle_any_any_javascript
    @request.accept = "text/javascript"
    get :handle_any_any
515
    assert_equal "Whatever you ask for, I got it", @response.body
516 517 518 519 520
  end

  def test_handle_any_any_xml
    @request.accept = "text/xml"
    get :handle_any_any
521
    assert_equal "Whatever you ask for, I got it", @response.body
522
  end
523

B
Benjamin Fleischer 已提交
524
  def test_handle_any_any_unknown_format
525 526
    get :handle_any_any, format: "php"
    assert_equal "Whatever you ask for, I got it", @response.body
527
  end
528 529 530 531

  def test_browser_check_with_any_any
    @request.accept = "application/json, application/xml"
    get :json_xml_or_html
532
    assert_equal "JSON", @response.body
533 534 535

    @request.accept = "application/json, application/xml, */*"
    get :json_xml_or_html
536
    assert_equal "HTML", @response.body
537 538 539 540 541 542 543 544
  end

  def test_html_type_with_layout
    @request.accept = "text/html"
    get :all_types_with_layout
    assert_equal '<html><div id="html">HTML for all_types_with_layout</div></html>', @response.body
  end

545
  def test_json_with_callback_sets_javascript_content_type
546
    @request.accept = "application/json"
547
    get :json_with_callback
548 549
    assert_equal "/**/alert(JS)", @response.body
    assert_equal "text/javascript", @response.content_type
550 551
  end

552
  def test_xhr
553
    get :js_or_html, xhr: true
554
    assert_equal "JS", @response.body
555 556 557
  end

  def test_custom_constant
558
    get :custom_constant_handling, format: "mobile"
559 560 561 562 563
    assert_equal "text/x-mobile", @response.content_type
    assert_equal "Mobile", @response.body
  end

  def test_custom_constant_handling_without_block
564
    get :custom_constant_handling_without_block, format: "mobile"
565 566 567 568 569 570 571 572
    assert_equal "text/x-mobile", @response.content_type
    assert_equal "Mobile", @response.body
  end

  def test_forced_format
    get :html_xml_or_rss
    assert_equal "HTML", @response.body

573
    get :html_xml_or_rss, format: "html"
574 575
    assert_equal "HTML", @response.body

576
    get :html_xml_or_rss, format: "xml"
577 578
    assert_equal "XML", @response.body

579
    get :html_xml_or_rss, format: "rss"
580 581 582 583 584 585 586
    assert_equal "RSS", @response.body
  end

  def test_internally_forced_format
    get :forced_xml
    assert_equal "XML", @response.body

587
    get :forced_xml, format: "html"
588 589 590 591
    assert_equal "XML", @response.body
  end

  def test_extension_synonyms
592
    get :html_xml_or_rss, format: "xhtml"
593 594 595 596 597 598 599 600 601 602 603 604 605 606
    assert_equal "HTML", @response.body
  end

  def test_render_action_for_html
    @controller.instance_eval do
      def render(*args)
        @action = args.first[:action] unless args.empty?
        @action ||= action_name

        response.body = "#{@action} - #{formats}"
      end
    end

    get :using_defaults
607
    assert_equal "using_defaults - #{[:html]}", @response.body
608

609
    get :using_defaults, format: "xml"
610
    assert_equal "using_defaults - #{[:xml]}", @response.body
611 612 613 614 615 616
  end

  def test_format_with_custom_response_type
    get :iphone_with_html_response_type
    assert_equal '<html><div id="html">Hello future from Firefox!</div></html>', @response.body

617
    get :iphone_with_html_response_type, format: "iphone"
618 619 620 621 622 623 624 625 626 627 628 629 630
    assert_equal "text/html", @response.content_type
    assert_equal '<html><div id="iphone">Hello iPhone future from iPhone!</div></html>', @response.body
  end

  def test_format_with_custom_response_type_and_request_headers
    @request.accept = "text/iphone"
    get :iphone_with_html_response_type
    assert_equal '<html><div id="iphone">Hello iPhone future from iPhone!</div></html>', @response.body
    assert_equal "text/html", @response.content_type
  end

  def test_invalid_format
    assert_raises(ActionController::UnknownFormat) do
631
      get :using_defaults, format: "invalidformat"
632 633
    end
  end
Ł
Łukasz Strzałkowski 已提交
634

635 636 637 638 639 640 641
  def test_missing_templates
    get :missing_templates, format: :json
    assert_response :no_content
    get :missing_templates, format: :xml
    assert_response :no_content
  end

Ł
Łukasz Strzałkowski 已提交
642
  def test_invalid_variant
643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672
    assert_raises(ActionController::UnknownFormat) do
      get :variant_with_implicit_template_rendering, params: { v: :invalid }
    end
  end

  def test_variant_not_set_regular_unknown_format
    assert_raises(ActionController::UnknownFormat) do
      get :variant_with_implicit_template_rendering
    end
  end

  def test_variant_with_implicit_template_rendering
    get :variant_with_implicit_template_rendering, params: { v: :mobile }
    assert_equal "text/html", @response.content_type
    assert_equal "mobile", @response.body
  end

  def test_variant_without_implicit_rendering_from_browser
    assert_raises(ActionController::UnknownFormat) do
      get :variant_without_implicit_template_rendering, params: { v: :does_not_matter }
    end
  end

  def test_variant_variant_not_set_and_without_implicit_rendering_from_browser
    assert_raises(ActionController::UnknownFormat) do
      get :variant_without_implicit_template_rendering
    end
  end

  def test_variant_without_implicit_rendering_from_xhr
673 674 675
    logger = ActiveSupport::LogSubscriber::TestHelper::MockLogger.new
    old_logger, ActionController::Base.logger = ActionController::Base.logger, logger

676
    get :variant_without_implicit_template_rendering, xhr: true, params: { v: :does_not_matter }
677
    assert_response :no_content
678

679
    assert_equal 1, logger.logged(:info).select { |s| s == NO_CONTENT_WARNING }.size, "Implicit head :no_content not logged"
680 681
  ensure
    ActionController::Base.logger = old_logger
Ł
Łukasz Strzałkowski 已提交
682 683
  end

684 685 686 687
  def test_variant_without_implicit_rendering_from_api
    logger = ActiveSupport::LogSubscriber::TestHelper::MockLogger.new
    old_logger, ActionController::Base.logger = ActionController::Base.logger, logger

688
    get :variant_without_implicit_template_rendering, format: "json", params: { v: :does_not_matter }
689
    assert_response :no_content
690

691
    assert_equal 1, logger.logged(:info).select { |s| s == NO_CONTENT_WARNING }.size, "Implicit head :no_content not logged"
692 693
  ensure
    ActionController::Base.logger = old_logger
Ł
Łukasz Strzałkowski 已提交
694 695
  end

696 697 698 699 700
  def test_variant_variant_not_set_and_without_implicit_rendering_from_xhr
    logger = ActiveSupport::LogSubscriber::TestHelper::MockLogger.new
    old_logger, ActionController::Base.logger = ActionController::Base.logger, logger

    get :variant_without_implicit_template_rendering, xhr: true
701 702
    assert_response :no_content

703 704 705
    assert_equal 1, logger.logged(:info).select { |s| s == NO_CONTENT_WARNING }.size, "Implicit head :no_content not logged"
  ensure
    ActionController::Base.logger = old_logger
Ł
Łukasz Strzałkowski 已提交
706 707 708
  end

  def test_variant_with_format_and_custom_render
709
    get :variant_with_format_and_custom_render, params: { v: :phone }
Ł
Łukasz Strzałkowski 已提交
710 711 712 713 714
    assert_equal "text/html", @response.content_type
    assert_equal "mobile", @response.body
  end

  def test_multiple_variants_for_format
715
    get :multiple_variants_for_format, params: { v: :tablet }
Ł
Łukasz Strzałkowski 已提交
716 717 718
    assert_equal "text/html", @response.content_type
    assert_equal "tablet", @response.body
  end
719 720 721 722 723 724

  def test_no_variant_in_variant_setup
    get :variant_plus_none_for_format
    assert_equal "text/html", @response.content_type
    assert_equal "none", @response.body
  end
Ł
Łukasz Strzałkowski 已提交
725 726 727 728 729 730

  def test_variant_inline_syntax
    get :variant_inline_syntax
    assert_equal "text/html", @response.content_type
    assert_equal "none", @response.body

731
    get :variant_inline_syntax, params: { v: :phone }
Ł
Łukasz Strzałkowski 已提交
732 733 734 735
    assert_equal "text/html", @response.content_type
    assert_equal "phone", @response.body
  end

736 737 738 739 740 741
  def test_variant_inline_syntax_with_format
    get :variant_inline_syntax, format: :js
    assert_equal "text/javascript", @response.content_type
    assert_equal "js", @response.body
  end

Ł
Łukasz Strzałkowski 已提交
742
  def test_variant_inline_syntax_without_block
743
    get :variant_inline_syntax_without_block, params: { v: :phone }
Ł
Łukasz Strzałkowski 已提交
744 745 746
    assert_equal "text/html", @response.content_type
    assert_equal "phone", @response.body
  end
747 748

  def test_variant_any
749
    get :variant_any, params: { v: :phone }
750 751 752
    assert_equal "text/html", @response.content_type
    assert_equal "phone", @response.body

753
    get :variant_any, params: { v: :tablet }
754 755 756
    assert_equal "text/html", @response.content_type
    assert_equal "any", @response.body

757
    get :variant_any, params: { v: :phablet }
758 759 760 761 762
    assert_equal "text/html", @response.content_type
    assert_equal "any", @response.body
  end

  def test_variant_any_any
763 764 765 766
    get :variant_any_any
    assert_equal "text/html", @response.content_type
    assert_equal "any", @response.body

767
    get :variant_any_any, params: { v: :phone }
768 769 770
    assert_equal "text/html", @response.content_type
    assert_equal "phone", @response.body

771
    get :variant_any_any, params: { v: :yolo }
772 773 774 775 776
    assert_equal "text/html", @response.content_type
    assert_equal "any", @response.body
  end

  def test_variant_inline_any
777
    get :variant_any, params: { v: :phone }
778 779 780
    assert_equal "text/html", @response.content_type
    assert_equal "phone", @response.body

781
    get :variant_inline_any, params: { v: :tablet }
782 783 784
    assert_equal "text/html", @response.content_type
    assert_equal "any", @response.body

785
    get :variant_inline_any, params: { v: :phablet }
786 787 788 789 790
    assert_equal "text/html", @response.content_type
    assert_equal "any", @response.body
  end

  def test_variant_inline_any_any
791
    get :variant_inline_any_any, params: { v: :phone }
792 793 794
    assert_equal "text/html", @response.content_type
    assert_equal "phone", @response.body

795
    get :variant_inline_any_any, params: { v: :yolo }
796 797 798 799 800
    assert_equal "text/html", @response.content_type
    assert_equal "any", @response.body
  end

  def test_variant_any_implicit_render
801
    get :variant_any_implicit_render, params: { v: :tablet }
802 803 804
    assert_equal "text/html", @response.content_type
    assert_equal "tablet", @response.body

805
    get :variant_any_implicit_render, params: { v: :phablet }
806 807 808 809 810 811 812 813 814
    assert_equal "text/html", @response.content_type
    assert_equal "phablet", @response.body
  end

  def test_variant_any_with_none
    get :variant_any_with_none
    assert_equal "text/html", @response.content_type
    assert_equal "none or phone", @response.body

815
    get :variant_any_with_none, params: { v: :phone }
816 817 818 819 820
    assert_equal "text/html", @response.content_type
    assert_equal "none or phone", @response.body
  end

  def test_format_any_variant_any
821
    get :format_any_variant_any, format: :js, params: { v: :tablet }
822 823 824
    assert_equal "text/javascript", @response.content_type
    assert_equal "tablet", @response.body
  end
L
Lukasz Strzalkowski 已提交
825 826

  def test_variant_negotiation_inline_syntax
827
    get :variant_inline_syntax_without_block, params: { v: [:tablet, :phone] }
L
Lukasz Strzalkowski 已提交
828 829 830 831 832
    assert_equal "text/html", @response.content_type
    assert_equal "phone", @response.body
  end

  def test_variant_negotiation_block_syntax
833
    get :variant_plus_none_for_format, params: { v: [:tablet, :phone] }
L
Lukasz Strzalkowski 已提交
834 835 836 837 838
    assert_equal "text/html", @response.content_type
    assert_equal "phone", @response.body
  end

  def test_variant_negotiation_without_block
839
    get :variant_inline_syntax_without_block, params: { v: [:tablet, :phone] }
L
Lukasz Strzalkowski 已提交
840 841 842
    assert_equal "text/html", @response.content_type
    assert_equal "phone", @response.body
  end
843
end