respond_to_test.rb 21.2 KB
Newer Older
1
require 'abstract_unit'
2
require "active_support/log_subscriber/test_helper"
3 4 5 6

class RespondToController < ActionController::Base
  layout :set_layout

7 8 9 10 11 12 13
  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
  }

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

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

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

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

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


  def forced_xml
    request.format = :xml

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

  def just_xml
    respond_to do |type|
66
      type.xml  { render body: "XML" }
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
    end
  end

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

  def using_defaults_with_type_list
    respond_to(:html, :xml)
  end

  def using_defaults_with_all
    respond_to do |type|
      type.html
84
      type.all{ render body: "ALL" }
85 86 87 88 89
    end
  end

  def made_for_content_type
    respond_to do |type|
90 91 92
      type.rss  { render body: "RSS"  }
      type.atom { render body: "ATOM" }
      type.all  { render body: "Nothing" }
93 94 95 96 97
    end
  end

  def custom_type_handling
    respond_to do |type|
98 99 100
      type.html { render body: "HTML"    }
      type.custom("application/crazy-xml")  { render body: "Crazy XML"  }
      type.all  { render body: "Nothing" }
101 102 103 104 105 106
    end
  end


  def custom_constant_handling
    respond_to do |type|
107 108
      type.html   { render body: "HTML"   }
      type.mobile { render body: "Mobile" }
109 110 111 112 113
    end
  end

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

  def handle_any
    respond_to do |type|
121 122
      type.html { render body: "HTML" }
      type.any(:js, :xml) { render body: "Either JS or XML" }
123 124 125 126 127
    end
  end

  def handle_any_any
    respond_to do |type|
128 129
      type.html { render body: 'HTML' }
      type.any { render body: 'Whatever you ask for, I got it' }
130 131 132 133 134 135 136 137 138
    end
  end

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

139 140 141 142 143 144
  def json_with_callback
    respond_to do |type|
      type.json { render :json => 'JS', :callback => 'alert' }
    end
  end

145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
  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|
      type.html   { @type = "Firefox"; render :action => "iphone_with_html_response_type" }
      type.iphone { @type = "iPhone" ; render :action => "iphone_with_html_response_type" }
    end
  end

Ł
Łukasz Strzałkowski 已提交
163 164 165 166 167 168 169
  def variant_with_implicit_rendering
  end

  def variant_with_format_and_custom_render
    request.variant = :mobile

    respond_to do |type|
170
      type.html { render body: "mobile" }
Ł
Łukasz Strzałkowski 已提交
171 172 173 174 175 176
    end
  end

  def multiple_variants_for_format
    respond_to do |type|
      type.html do |html|
177 178
        html.tablet { render body: "tablet" }
        html.phone  { render body: "phone" }
Ł
Łukasz Strzałkowski 已提交
179 180 181 182
      end
    end
  end

183 184 185
  def variant_plus_none_for_format
    respond_to do |format|
      format.html do |variant|
186
        variant.phone { render body: "phone" }
187
        variant.none
188 189 190 191
      end
    end
  end

Ł
Łukasz Strzałkowski 已提交
192 193
  def variant_inline_syntax
    respond_to do |format|
194 195 196
      format.js         { render body: "js"    }
      format.html.none  { render body: "none"  }
      format.html.phone { render body: "phone" }
Ł
Łukasz Strzałkowski 已提交
197 198 199 200 201 202 203 204 205 206 207
    end
  end

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

208 209 210
  def variant_any
    respond_to do |format|
      format.html do |variant|
211 212
        variant.any(:tablet, :phablet){ render body: "any" }
        variant.phone { render body: "phone" }
213 214 215 216 217 218 219
      end
    end
  end

  def variant_any_any
    respond_to do |format|
      format.html do |variant|
220 221
        variant.any   { render body: "any"   }
        variant.phone { render body: "phone" }
222 223 224 225 226 227
      end
    end
  end

  def variant_inline_any
    respond_to do |format|
228 229
      format.html.any(:tablet, :phablet){ render body: "any" }
      format.html.phone { render body: "phone" }
230 231 232 233 234
    end
  end

  def variant_inline_any_any
    respond_to do |format|
235 236
      format.html.phone { render body: "phone" }
      format.html.any   { render body: "any"   }
237 238 239 240 241 242 243 244 245 246 247 248
    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|
249
      format.html.any(:none, :phone){ render body: "none or phone" }
250 251 252 253 254
    end
  end

  def format_any_variant_any
    respond_to do |format|
255
      format.html { render body: "HTML" }
256
      format.any(:js, :xml) do |variant|
257 258
        variant.phone{ render body: "phone" }
        variant.any(:tablet, :phablet){ render body: "tablet" }
259 260 261 262
      end
    end
  end

263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
  protected
    def set_layout
      case action_name
        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"
      end
    end
end

class RespondToControllerTest < ActionController::TestCase
  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
    assert_equal 'HTML', @response.body

    get :html_or_xml
    assert_equal 'HTML', @response.body

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

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

    get :html_or_xml
    assert_equal 'HTML', @response.body

    get :just_xml
    assert_equal 'XML', @response.body
  end

  def test_xml
    @request.accept = "application/xml"
    get :html_xml_or_rss
    assert_equal 'XML', @response.body
  end

  def test_js_or_html
    @request.accept = "text/javascript, text/html"
321
    get :js_or_html, xhr: true
322 323 324
    assert_equal 'JS', @response.body

    @request.accept = "text/javascript, text/html"
325
    get :html_or_xml, xhr: true
326 327 328 329 330
    assert_equal 'HTML', @response.body

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

    assert_raises(ActionController::UnknownFormat) do
331
      get :just_xml, xhr: true
332 333 334 335 336 337 338 339 340 341 342 343 344 345
    end
  end

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

    @request.accept = "*/* , application/json"
    get :json_xml_or_html
    assert_equal 'HTML', @response.body
  end

  def test_json_or_yaml
346
    get :json_or_yaml, xhr: true
347 348
    assert_equal 'JSON', @response.body

349
    get :json_or_yaml, format: 'json'
350 351
    assert_equal 'JSON', @response.body

352
    get :json_or_yaml, format: 'yaml'
353 354 355 356 357 358 359 360 361 362 363 364 365 366 367
    assert_equal 'YAML', @response.body

    { 'YAML' => %w(text/yaml),
      'JSON' => %w(application/json text/x-json)
    }.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, */*"
368
    get :js_or_html, xhr: true
369 370
    assert_equal 'JS', @response.body

371
    get :html_or_xml, xhr: true
372 373
    assert_equal 'HTML', @response.body

374
    get :just_xml, xhr: true
375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418
    assert_equal 'XML', @response.body
  end

  def test_using_defaults
    @request.accept = "*/*"
    get :using_defaults
    assert_equal "text/html", @response.content_type
    assert_equal 'Hello world!', @response.body

    @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
    assert_equal 'Hello world!', @response.body

    @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"
419
    get :made_for_content_type, xhr: true
420 421 422 423 424 425
    assert_equal "ATOM", @response.body
  end

  def test_with_rss_content_type
    @request.accept = ""
    @request.env["CONTENT_TYPE"] = "application/rss+xml"
426
    get :made_for_content_type, xhr: true
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484
    assert_equal "RSS", @response.body
  end

  def test_synonyms
    @request.accept = "application/javascript"
    get :js_or_html
    assert_equal 'JS', @response.body

    @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
    assert_equal 'Crazy XML', @response.body

    @request.accept = "text/html"
    get :custom_type_handling
    assert_equal "text/html", @response.content_type
    assert_equal 'HTML', @response.body
  end

  def test_xhtml_alias
    @request.accept = "application/xhtml+xml,application/xml"
    get :html_or_xml
    assert_equal 'HTML', @response.body
  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
    assert_equal 'HTML', @response.body
  end

  def test_handle_any
    @request.accept = "*/*"
    get :handle_any
    assert_equal 'HTML', @response.body

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

    @request.accept = "text/xml"
    get :handle_any
    assert_equal 'Either JS or XML', @response.body
  end

  def test_handle_any_any
    @request.accept = "*/*"
    get :handle_any_any
    assert_equal 'HTML', @response.body
  end

  def test_handle_any_any_parameter_format
485
    get :handle_any_any, format: 'html'
486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505
    assert_equal 'HTML', @response.body
  end

  def test_handle_any_any_explicit_html
    @request.accept = "text/html"
    get :handle_any_any
    assert_equal 'HTML', @response.body
  end

  def test_handle_any_any_javascript
    @request.accept = "text/javascript"
    get :handle_any_any
    assert_equal 'Whatever you ask for, I got it', @response.body
  end

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

  def test_handle_any_any_unkown_format
508
    get :handle_any_any, format: 'php'
509 510
    assert_equal 'Whatever you ask for, I got it', @response.body
  end
511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527

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

    @request.accept = "application/json, application/xml, */*"
    get :json_xml_or_html
    assert_equal 'HTML', @response.body
  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

528 529 530
  def test_json_with_callback_sets_javascript_content_type
    @request.accept = 'application/json'
    get :json_with_callback
531
    assert_equal '/**/alert(JS)', @response.body
532 533 534
    assert_equal 'text/javascript', @response.content_type
  end

535
  def test_xhr
536
    get :js_or_html, xhr: true
537 538 539 540
    assert_equal 'JS', @response.body
  end

  def test_custom_constant
541
    get :custom_constant_handling, format: "mobile"
542 543 544 545 546
    assert_equal "text/x-mobile", @response.content_type
    assert_equal "Mobile", @response.body
  end

  def test_custom_constant_handling_without_block
547
    get :custom_constant_handling_without_block, format: "mobile"
548 549 550 551 552 553 554 555
    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

556
    get :html_xml_or_rss, format: "html"
557 558
    assert_equal "HTML", @response.body

559
    get :html_xml_or_rss, format: "xml"
560 561
    assert_equal "XML", @response.body

562
    get :html_xml_or_rss, format: "rss"
563 564 565 566 567 568 569
    assert_equal "RSS", @response.body
  end

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

570
    get :forced_xml, format: "html"
571 572 573 574
    assert_equal "XML", @response.body
  end

  def test_extension_synonyms
575
    get :html_xml_or_rss, format: "xhtml"
576 577 578 579 580 581 582 583 584 585 586 587 588 589
    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
590
    assert_equal "using_defaults - #{[:html]}", @response.body
591

592
    get :using_defaults, format: "xml"
593
    assert_equal "using_defaults - #{[:xml]}", @response.body
594 595 596 597 598 599
  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

600
    get :iphone_with_html_response_type, format: "iphone"
601 602 603 604 605 606 607 608 609 610 611 612 613
    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
614
      get :using_defaults, format: "invalidformat"
615 616
    end
  end
Ł
Łukasz Strzałkowski 已提交
617 618

  def test_invalid_variant
619 620 621
    logger = ActiveSupport::LogSubscriber::TestHelper::MockLogger.new
    old_logger, ActionController::Base.logger = ActionController::Base.logger, logger

622
    get :variant_with_implicit_rendering, params: { v: :invalid }
623 624 625 626
    assert_response :no_content
    assert_equal 1, logger.logged(:info).select{ |s| s =~ /No template found/ }.size, "Implicit head :no_content not logged"
  ensure
    ActionController::Base.logger = old_logger
Ł
Łukasz Strzałkowski 已提交
627 628 629
  end

  def test_variant_not_set_regular_template_missing
630 631
    get :variant_with_implicit_rendering
    assert_response :no_content
Ł
Łukasz Strzałkowski 已提交
632 633 634
  end

  def test_variant_with_implicit_rendering
635
    get :variant_with_implicit_rendering, params: { v: :implicit }
636 637 638 639
    assert_response :no_content
  end

  def test_variant_with_implicit_template_rendering
640
    get :variant_with_implicit_rendering, params: { v: :mobile }
Ł
Łukasz Strzałkowski 已提交
641 642 643 644 645
    assert_equal "text/html", @response.content_type
    assert_equal "mobile", @response.body
  end

  def test_variant_with_format_and_custom_render
646
    get :variant_with_format_and_custom_render, params: { v: :phone }
Ł
Łukasz Strzałkowski 已提交
647 648 649 650 651
    assert_equal "text/html", @response.content_type
    assert_equal "mobile", @response.body
  end

  def test_multiple_variants_for_format
652
    get :multiple_variants_for_format, params: { v: :tablet }
Ł
Łukasz Strzałkowski 已提交
653 654 655
    assert_equal "text/html", @response.content_type
    assert_equal "tablet", @response.body
  end
656 657 658 659 660 661

  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 已提交
662 663 664 665 666 667 668 669 670 671

  def test_variant_inline_syntax
    get :variant_inline_syntax, format: :js
    assert_equal "text/javascript", @response.content_type
    assert_equal "js", @response.body

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

672
    get :variant_inline_syntax, params: { v: :phone }
Ł
Łukasz Strzałkowski 已提交
673 674 675 676 677
    assert_equal "text/html", @response.content_type
    assert_equal "phone", @response.body
  end

  def test_variant_inline_syntax_without_block
678
    get :variant_inline_syntax_without_block, params: { v: :phone }
Ł
Łukasz Strzałkowski 已提交
679 680 681
    assert_equal "text/html", @response.content_type
    assert_equal "phone", @response.body
  end
682 683

  def test_variant_any
684
    get :variant_any, params: { v: :phone }
685 686 687
    assert_equal "text/html", @response.content_type
    assert_equal "phone", @response.body

688
    get :variant_any, params: { v: :tablet }
689 690 691
    assert_equal "text/html", @response.content_type
    assert_equal "any", @response.body

692
    get :variant_any, params: { v: :phablet }
693 694 695 696 697
    assert_equal "text/html", @response.content_type
    assert_equal "any", @response.body
  end

  def test_variant_any_any
698 699 700 701
    get :variant_any_any
    assert_equal "text/html", @response.content_type
    assert_equal "any", @response.body

702
    get :variant_any_any, params: { v: :phone }
703 704 705
    assert_equal "text/html", @response.content_type
    assert_equal "phone", @response.body

706
    get :variant_any_any, params: { v: :yolo }
707 708 709 710 711
    assert_equal "text/html", @response.content_type
    assert_equal "any", @response.body
  end

  def test_variant_inline_any
712
    get :variant_any, params: { v: :phone }
713 714 715
    assert_equal "text/html", @response.content_type
    assert_equal "phone", @response.body

716
    get :variant_inline_any, params: { v: :tablet }
717 718 719
    assert_equal "text/html", @response.content_type
    assert_equal "any", @response.body

720
    get :variant_inline_any, params: { v: :phablet }
721 722 723 724 725
    assert_equal "text/html", @response.content_type
    assert_equal "any", @response.body
  end

  def test_variant_inline_any_any
726
    get :variant_inline_any_any, params: { v: :phone }
727 728 729
    assert_equal "text/html", @response.content_type
    assert_equal "phone", @response.body

730
    get :variant_inline_any_any, params: { v: :yolo }
731 732 733 734 735
    assert_equal "text/html", @response.content_type
    assert_equal "any", @response.body
  end

  def test_variant_any_implicit_render
736
    get :variant_any_implicit_render, params: { v: :tablet }
737 738 739
    assert_equal "text/html", @response.content_type
    assert_equal "tablet", @response.body

740
    get :variant_any_implicit_render, params: { v: :phablet }
741 742 743 744 745 746 747 748 749
    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

750
    get :variant_any_with_none, params: { v: :phone }
751 752 753 754 755
    assert_equal "text/html", @response.content_type
    assert_equal "none or phone", @response.body
  end

  def test_format_any_variant_any
756
    get :format_any_variant_any, format: :js, params: { v: :tablet }
757 758 759
    assert_equal "text/javascript", @response.content_type
    assert_equal "tablet", @response.body
  end
L
Lukasz Strzalkowski 已提交
760 761

  def test_variant_negotiation_inline_syntax
762
    get :variant_inline_syntax_without_block, params: { v: [:tablet, :phone] }
L
Lukasz Strzalkowski 已提交
763 764 765 766 767
    assert_equal "text/html", @response.content_type
    assert_equal "phone", @response.body
  end

  def test_variant_negotiation_block_syntax
768
    get :variant_plus_none_for_format, params: { v: [:tablet, :phone] }
L
Lukasz Strzalkowski 已提交
769 770 771 772 773
    assert_equal "text/html", @response.content_type
    assert_equal "phone", @response.body
  end

  def test_variant_negotiation_without_block
774
    get :variant_inline_syntax_without_block, params: { v: [:tablet, :phone] }
L
Lukasz Strzalkowski 已提交
775 776 777
    assert_equal "text/html", @response.content_type
    assert_equal "phone", @response.body
  end
778
end
779 780 781 782

class RespondToWithBlockOnDefaultRenderController < ActionController::Base
  def show
    default_render do
783
      render body: 'default_render yielded'
784 785 786 787 788 789 790 791 792 793 794 795 796
    end
  end
end

class RespondToWithBlockOnDefaultRenderControllerTest < ActionController::TestCase
  def setup
    super
    @request.host = "www.example.com"
  end

  def test_default_render_uses_block_when_no_template_exists
    get :show
    assert_equal "default_render yielded", @response.body
797
    assert_equal "text/plain", @response.content_type
798 799
  end
end