test_case_test.rb 32.6 KB
Newer Older
1 2
require 'abstract_unit'
require 'controller/fake_controllers'
3
require 'active_support/json/decoding'
4
require 'rails/engine'
5

6
class TestCaseTest < ActionController::TestCase
7
  class TestController < ActionController::Base
8
    def no_op
9
      render text: 'dummy'
10 11
    end

12 13
    def set_flash
      flash["test"] = ">#{flash["test"]}<"
14
      render text: 'ignore me'
15
    end
16

17 18 19 20 21
    def delete_flash
      flash.delete("test")
      render :text => 'ignore me'
    end

22 23
    def set_flash_now
      flash.now["test_now"] = ">#{flash["test_now"]}<"
24
      render text: 'ignore me'
25 26
    end

27 28 29
    def set_session
      session['string'] = 'A wonder'
      session[:symbol] = 'it works'
30
      render text: 'Success'
31 32
    end

33 34
    def reset_the_session
      reset_session
35
      render text: 'ignore me'
36 37
    end

38
    def render_raw_post
39
      raise ActiveSupport::TestCase::Assertion, "#raw_post is blank" if request.raw_post.blank?
40
      render text: request.raw_post
41 42
    end

43
    def render_body
44
      render text: request.body.read
45 46
    end

47
    def test_params
48
      render text: params.inspect
49 50
    end

51
    def test_uri
52
      render text: request.fullpath
53
    end
54

55
    def test_format
56
      render text: request.format
57 58
    end

59
    def test_query_string
60
      render text: request.query_string
61 62
    end

A
Andrew White 已提交
63
    def test_protocol
64
      render text: request.protocol
A
Andrew White 已提交
65 66
    end

67
    def test_headers
68
      render text: request.headers.env.to_json
69 70
    end

71
    def test_html_output
72
      render text: <<HTML
73 74
<html>
  <body>
75
    <a href="/"><img src="/images/button.png" /></a>
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
    <div id="foo">
      <ul>
        <li class="item">hello</li>
        <li class="item">goodbye</li>
      </ul>
    </div>
    <div id="bar">
      <form action="/somewhere">
        Name: <input type="text" name="person[name]" id="person_name" />
      </form>
    </div>
  </body>
</html>
HTML
    end
J
Joshua Peek 已提交
91

92 93
    def test_xml_output
      response.content_type = "application/xml"
94
      render text: <<XML
95 96 97 98 99 100
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <area>area is an empty tag in HTML, raising an error if not in xml mode</area>
</root>
XML
    end
101

102
    def test_only_one_param
103
      render text: (params[:left] && params[:right]) ? "EEP, Both here!" : "OK"
104 105 106
    end

    def test_remote_addr
107
      render text: (request.remote_addr || "not specified")
108
    end
109

110
    def test_file_upload
111
      render text: params[:file].size
112
    end
113

114 115 116 117
    def test_send_file
      send_file(File.expand_path(__FILE__))
    end

118
    def redirect_to_same_controller
119
      redirect_to controller: 'test', action: 'test_uri', id: 5
120 121 122
    end

    def redirect_to_different_controller
123
      redirect_to controller: 'fail', id: 5
124 125
    end

126
    def create
127
      head :created, location: 'created resource'
128 129
    end

130 131
    def delete_cookie
      cookies.delete("foo")
132
      render nothing: true
133 134
    end

135 136
    def test_assigns
      @foo = "foo"
137
      @foo_hash = { foo: :bar }
138
      render nothing: true
139 140
    end

141 142 143 144 145 146 147 148
    def test_without_body
      render html: '<div class="foo"></div>'.html_safe
    end

    def test_with_body
      render html: '<body class="foo"></body>'.html_safe
    end

149 150 151
    private

      def generate_url(opts)
152
        url_for(opts.merge(action: "test_uri"))
153
      end
154 155 156
  end

  def setup
157
    super
158 159 160
    @controller = TestController.new
    @request    = ActionController::TestRequest.new
    @response   = ActionController::TestResponse.new
C
Carl Lerche 已提交
161
    @request.env['PATH_INFO'] = nil
162 163
    @routes = ActionDispatch::Routing::RouteSet.new.tap do |r|
      r.draw do
164
        get ':controller(/:action(/:id))'
165 166
      end
    end
167 168
  end

169 170 171
  class ViewAssignsController < ActionController::Base
    def test_assigns
      @foo = "foo"
172
      render nothing: true
173 174 175 176 177 178 179
    end

    def view_assigns
      { "bar" => "bar" }
    end
  end

180
  class DefaultUrlOptionsCachingController < ActionController::Base
181
    before_action { @dynamic_opt = 'opt' }
182 183 184 185 186 187 188 189 190 191 192 193 194 195

    def test_url_options_reset
      render text: url_for(params)
    end

    def default_url_options
      if defined?(@dynamic_opt)
        super.merge dynamic_opt: @dynamic_opt
      else
        super
      end
    end
  end

196 197 198 199 200 201 202 203 204 205 206 207 208
  def test_assert_select_without_body
    get :test_without_body

    assert_select 'body', 0
    assert_select 'div.foo'
  end

  def test_assert_select_with_body
    get :test_with_body

    assert_select 'body.foo'
  end

209 210 211 212 213 214 215
  def test_url_options_reset
    @controller = DefaultUrlOptionsCachingController.new
    get :test_url_options_reset
    assert_nil @request.params['dynamic_opt']
    assert_match(/dynamic_opt=opt/, @response.body)
  end

216
  def test_raw_post_handling
217
    params = Hash[:page, { name: 'page name' }, 'some key', 123]
218
    post :render_raw_post, params: params.dup
219

220 221 222 223
    assert_equal params.to_query, @response.body
  end

  def test_body_stream
224
    params = Hash[:page, { name: 'page name' }, 'some key', 123]
225

226 227 228 229 230 231 232 233 234
    post :render_body, params: params.dup

    assert_equal params.to_query, @response.body
  end

  def test_deprecated_body_stream
    params = Hash[:page, { name: 'page name' }, 'some key', 123]

    assert_deprecated { post :render_body, params.dup }
235 236

    assert_equal params.to_query, @response.body
237
  end
238

239
  def test_document_body_and_params_with_post
240 241
    post :test_params, params: { id: 1 }
    assert_equal(%({"id"=>"1", "controller"=>"test_case_test/test", "action"=>"test_params"}), @response.body)
242
  end
243

244
  def test_document_body_with_post
245 246 247 248 249 250
    post :render_body, body: "document body"
    assert_equal "document body", @response.body
  end

  def test_deprecated_document_body_with_post
    assert_deprecated { post :render_body, "document body" }
251 252
    assert_equal "document body", @response.body
  end
253

254
  def test_document_body_with_put
255 256 257 258 259 260
    put :render_body, body: "document body"
    assert_equal "document body", @response.body
  end

  def test_deprecated_document_body_with_put
    assert_deprecated { put :render_body, "document body" }
261 262
    assert_equal "document body", @response.body
  end
263

264 265 266 267 268
  def test_head
    head :test_params
    assert_equal 200, @response.status
  end

269 270
  def test_process_without_flash
    process :set_flash
271
    assert_equal '><', flash['test']
272 273
  end

274 275 276 277 278
  def test_deprecated_process_with_flash
    assert_deprecated { process :set_flash, "GET", nil, nil, { "test" => "value" } }
    assert_equal '>value<', flash['test']
  end

279
  def test_process_with_flash
280 281 282
    process :set_flash,
      method: "GET",
      flash: { "test" => "value" }
283
    assert_equal '>value<', flash['test']
284
  end
285

286 287 288 289 290
  def test_deprecated_process_with_flash_now
    assert_deprecated { process :set_flash_now, "GET", nil, nil, { "test_now" => "value_now" } }
    assert_equal '>value_now<', flash['test_now']
  end

291
  def test_process_with_flash_now
292 293 294
    process :set_flash_now,
      method: "GET",
      flash: { "test_now" => "value_now" }
295 296 297
    assert_equal '>value_now<', flash['test_now']
  end

298 299 300 301 302 303 304
  def test_process_delete_flash
    process :set_flash
    process :delete_flash
    assert_empty flash
    assert_empty session
  end

305 306 307 308 309 310 311 312 313
  def test_process_with_session
    process :set_session
    assert_equal 'A wonder', session['string'], "A value stored in the session should be available by string key"
    assert_equal 'A wonder', session[:string], "Test session hash should allow indifferent access"
    assert_equal 'it works', session['symbol'], "Test session hash should allow indifferent access"
    assert_equal 'it works', session[:symbol], "Test session hash should allow indifferent access"
  end

  def test_process_with_session_arg
314 315 316 317 318 319 320 321 322
    assert_deprecated { process :no_op, "GET", nil, { 'string' => 'value1', symbol: 'value2' } }
    assert_equal 'value1', session['string']
    assert_equal 'value1', session[:string]
    assert_equal 'value2', session['symbol']
    assert_equal 'value2', session[:symbol]
  end

  def test_process_with_session_kwarg
    process :no_op, method: "GET", session: { 'string' => 'value1', symbol: 'value2' }
323 324 325 326 327 328
    assert_equal 'value1', session['string']
    assert_equal 'value1', session[:string]
    assert_equal 'value2', session['symbol']
    assert_equal 'value2', session[:symbol]
  end

329 330 331 332 333 334 335 336 337
  def test_deprecated_process_merges_session_arg
    session[:foo] = 'bar'
    assert_deprecated {
      get :no_op, nil, { bar: 'baz' }
    }
    assert_equal 'bar', session[:foo]
    assert_equal 'baz', session[:bar]
  end

338 339
  def test_process_merges_session_arg
    session[:foo] = 'bar'
340
    get :no_op, session: { bar: 'baz' }
341 342 343 344
    assert_equal 'bar', session[:foo]
    assert_equal 'baz', session[:bar]
  end

345 346 347 348 349 350 351 352 353
  def test_deprecated_merged_session_arg_is_retained_across_requests
    assert_deprecated {
      get :no_op, nil, { foo: 'bar' }
    }
    assert_equal 'bar', session[:foo]
    get :no_op
    assert_equal 'bar', session[:foo]
  end

354
  def test_merged_session_arg_is_retained_across_requests
355
    get :no_op, session: { foo: 'bar' }
356 357 358 359 360 361 362
    assert_equal 'bar', session[:foo]
    get :no_op
    assert_equal 'bar', session[:foo]
  end

  def test_process_overwrites_existing_session_arg
    session[:foo] = 'bar'
363
    get :no_op, session: { foo: 'baz' }
364 365 366
    assert_equal 'baz', session[:foo]
  end

367 368 369 370 371 372 373 374 375 376 377 378
  def test_session_is_cleared_from_controller_after_reset_session
    process :set_session
    process :reset_the_session
    assert_equal Hash.new, @controller.session.to_hash
  end

  def test_session_is_cleared_from_request_after_reset_session
    process :set_session
    process :reset_the_session
    assert_equal Hash.new, @request.session.to_hash
  end

379 380 381 382 383 384
  def test_response_and_request_have_nice_accessors
    process :no_op
    assert_equal @response, response
    assert_equal @request, request
  end

385 386
  def test_process_with_request_uri_with_no_params
    process :test_uri
387
    assert_equal "/test_case_test/test/test_uri", @response.body
388 389
  end

390 391 392 393 394 395
  def test_process_with_symbol_method
    process :test_uri, method: :get
    assert_equal "/test_case_test/test/test_uri", @response.body
  end

  def test_deprecated_process_with_request_uri_with_params
396
    assert_deprecated { process :test_uri, "GET", id: 7 }
397 398 399
    assert_equal "/test_case_test/test/test_uri/7", @response.body
  end

400
  def test_process_with_request_uri_with_params
401 402 403 404
    process :test_uri,
      method: "GET",
      params: { id: 7 }

405
    assert_equal "/test_case_test/test/test_uri/7", @response.body
406
  end
407

408 409 410 411 412 413
  def test_deprecated_process_with_request_uri_with_params_with_explicit_uri
    @request.env['PATH_INFO'] = "/explicit/uri"
    assert_deprecated { process :test_uri, "GET", id: 7 }
    assert_equal "/explicit/uri", @response.body
  end

414
  def test_process_with_request_uri_with_params_with_explicit_uri
C
Carl Lerche 已提交
415
    @request.env['PATH_INFO'] = "/explicit/uri"
416
    process :test_uri, method: "GET", params: { id: 7 }
417
    assert_equal "/explicit/uri", @response.body
418 419
  end

420
  def test_process_with_query_string
421 422 423
    process :test_query_string,
      method: "GET",
      params: { q: 'test' }
424 425 426 427
    assert_equal "q=test", @response.body
  end

  def test_process_with_query_string_with_explicit_uri
C
Carl Lerche 已提交
428 429
    @request.env['PATH_INFO'] = '/explicit/uri'
    @request.env['QUERY_STRING'] = 'q=test?extra=question'
430 431 432 433
    process :test_query_string
    assert_equal "q=test?extra=question", @response.body
  end

434
  def test_multiple_calls
435
    process :test_only_one_param, method: "GET", params: { left: true }
436
    assert_equal "OK", @response.body
437
    process :test_only_one_param, method: "GET", params: { right: true }
438
    assert_equal "OK", @response.body
439
  end
440

441 442 443 444 445 446 447 448 449
  def test_assigns
    process :test_assigns
    # assigns can be accessed using assigns(key)
    # or assigns[key], where key is a string or
    # a symbol
    assert_equal "foo", assigns(:foo)
    assert_equal "foo", assigns("foo")
    assert_equal "foo", assigns[:foo]
    assert_equal "foo", assigns["foo"]
450 451

    # but the assigned variable should not have its own keys stringified
452
    expected_hash = { foo: :bar }
453
    assert_equal expected_hash, assigns(:foo_hash)
454 455
  end

456 457 458 459 460 461 462 463 464
  def test_view_assigns
    @controller = ViewAssignsController.new
    process :test_assigns
    assert_equal nil, assigns(:foo)
    assert_equal nil, assigns[:foo]
    assert_equal "bar", assigns(:bar)
    assert_equal "bar", assigns[:bar]
  end

465 466 467 468 469 470 471 472 473 474 475 476 477
  def test_should_not_impose_childless_html_tags_in_xml
    process :test_xml_output

    begin
      $stderr = StringIO.new
      assert_select 'area' #This will cause a warning if content is processed as HTML
      $stderr.rewind && err = $stderr.read
    ensure
      $stderr = STDERR
    end

    assert err.empty?
  end
478

479
  def test_assert_generates
480
    assert_generates 'controller/action/5', controller: 'controller', action: 'action', id: '5'
481 482 483 484
    assert_generates 'controller/action/7', { id: "7" }, { controller: "controller", action: "action" }
    assert_generates 'controller/action/5', { controller: "controller", action: "action", id: "5", name: "bob" }, {}, { name: "bob" }
    assert_generates 'controller/action/7', { id: "7", name: "bob" }, { controller: "controller", action: "action" }, { name: "bob" }
    assert_generates 'controller/action/7', { id: "7" }, { controller: "controller", action: "action", name: "bob" }, {}
485
  end
486

487
  def test_assert_routing
488
    assert_routing 'content', controller: 'content', action: 'index'
489 490
  end

491 492
  def test_assert_routing_with_method
    with_routing do |set|
493
      set.draw { resources(:content) }
494
      assert_routing({ method: 'post', path: 'content' }, { controller: 'content', action: 'create' })
495 496 497
    end
  end

498
  def test_assert_routing_in_module
499 500 501
    with_routing do |set|
      set.draw do
        namespace :admin do
502
          get 'user' => 'user#index'
503 504 505
        end
      end

506
      assert_routing 'admin/user', controller: 'admin/user', action: 'index'
507
    end
508
  end
509

510 511
  def test_assert_routing_with_glob
    with_routing do |set|
512
      set.draw { get('*path' => "pages#show") }
513
      assert_routing('/company/about', { controller: 'pages', action: 'show', path: 'company/about' })
514 515
    end
  end
516

517 518
  def test_deprecated_params_passing
    assert_deprecated {
519
      get :test_params, page: { name: "Page name", month: '4', year: '2004', day: '6' }
520 521 522
    }
    parsed_params = eval(@response.body)
    assert_equal(
523 524 525 526
      {
        'controller' => 'test_case_test/test', 'action' => 'test_params',
        'page' => { 'name' => "Page name", 'month' => '4', 'year' => '2004', 'day' => '6' }
      },
527 528 529 530
      parsed_params
    )
  end

531
  def test_params_passing
532 533 534 535 536 537 538 539 540 541
    get :test_params, params: {
      page: {
        name: "Page name",
        month: '4',
        year: '2004',
        day: '6'
      }
    }
    parsed_params = eval(@response.body)
    assert_equal(
542 543 544 545
      {
        'controller' => 'test_case_test/test', 'action' => 'test_params',
        'page' => { 'name' => "Page name", 'month' => '4', 'year' => '2004', 'day' => '6' }
      },
546 547 548 549 550 551 552 553 554 555 556 557 558 559
      parsed_params
    )
  end

  def test_kwarg_params_passing_with_session_and_flash
    get :test_params, params: {
      page: {
        name: "Page name",
        month: '4',
        year: '2004',
        day: '6'
      }
    }, session: { 'foo' => 'bar' }, flash: { notice: 'created' }

560 561
    parsed_params = eval(@response.body)
    assert_equal(
562
      {'controller' => 'test_case_test/test', 'action' => 'test_params',
563
       'page' => {'name' => "Page name", 'month' => '4', 'year' => '2004', 'day' => '6'}},
564 565
      parsed_params
    )
566 567 568

    assert_equal 'bar', session[:foo]
    assert_equal 'created', flash[:notice]
569 570 571
  end

  def test_params_passing_with_fixnums
572 573 574
    get :test_params, params: {
      page: { name: "Page name", month: 4, year: 2004, day: 6 }
    }
575 576
    parsed_params = eval(@response.body)
    assert_equal(
577
      {'controller' => 'test_case_test/test', 'action' => 'test_params',
578
       'page' => {'name' => "Page name", 'month' => '4', 'year' => '2004', 'day' => '6'}},
579 580 581 582
      parsed_params
    )
  end

583
  def test_params_passing_with_fixnums_when_not_html_request
584
    get :test_params, params: { format: 'json', count: 999 }
585 586 587 588 589 590 591 592 593
    parsed_params = eval(@response.body)
    assert_equal(
      {'controller' => 'test_case_test/test', 'action' => 'test_params',
       'format' => 'json', 'count' => 999 },
      parsed_params
    )
  end

  def test_params_passing_path_parameter_is_string_when_not_html_request
594 595 596 597 598 599 600 601 602 603 604
    get :test_params, params: { format: 'json', id: 1 }
    parsed_params = eval(@response.body)
    assert_equal(
      {'controller' => 'test_case_test/test', 'action' => 'test_params',
       'format' => 'json', 'id' => '1' },
      parsed_params
    )
  end

  def test_deprecated_params_passing_path_parameter_is_string_when_not_html_request
    assert_deprecated { get :test_params, format: 'json', id: 1 }
605 606 607 608 609 610 611 612
    parsed_params = eval(@response.body)
    assert_equal(
      {'controller' => 'test_case_test/test', 'action' => 'test_params',
       'format' => 'json', 'id' => '1' },
      parsed_params
    )
  end

613 614
  def test_params_passing_with_frozen_values
    assert_nothing_raised do
615 616 617
      get :test_params, params: {
        frozen: 'icy'.freeze, frozens: ['icy'.freeze].freeze, deepfreeze: { frozen: 'icy'.freeze }.freeze
      }
618 619 620
    end
    parsed_params = eval(@response.body)
    assert_equal(
621
      {'controller' => 'test_case_test/test', 'action' => 'test_params',
622
       'frozen' => 'icy', 'frozens' => ['icy'], 'deepfreeze' => { 'frozen' => 'icy' }},
623 624 625 626
      parsed_params
    )
  end

627
  def test_params_passing_doesnt_modify_in_place
628
    page = { name: "Page name", month: 4, year: 2004, day: 6 }
629
    get :test_params, params: { page: page }
630 631 632
    assert_equal 2004, page[:year]
  end

633 634 635 636
  test "set additional HTTP headers" do
    @request.headers['Referer'] = "http://nohost.com/home"
    @request.headers['Content-Type'] = "application/rss+xml"
    get :test_headers
637
    parsed_env = ActiveSupport::JSON.decode(@response.body)
638 639 640 641 642 643 644 645
    assert_equal "http://nohost.com/home", parsed_env["HTTP_REFERER"]
    assert_equal "application/rss+xml", parsed_env["CONTENT_TYPE"]
  end

  test "set additional env variables" do
    @request.headers['HTTP_REFERER'] = "http://example.com/about"
    @request.headers['CONTENT_TYPE'] = "application/json"
    get :test_headers
646
    parsed_env = ActiveSupport::JSON.decode(@response.body)
647 648 649 650
    assert_equal "http://example.com/about", parsed_env["HTTP_REFERER"]
    assert_equal "application/json", parsed_env["CONTENT_TYPE"]
  end

651
  def test_id_converted_to_string
652 653 654 655 656 657 658 659
    get :test_params, params: {
      id: 20, foo: Object.new
    }
    assert_kind_of String, @request.path_parameters[:id]
  end

  def test_deprecared_id_converted_to_string
    assert_deprecated { get :test_params, id: 20, foo: Object.new}
660
    assert_kind_of String, @request.path_parameters[:id]
661 662 663 664
  end

  def test_array_path_parameter_handled_properly
    with_routing do |set|
665
      set.draw do
666
        get 'file/*path', to: 'test_case_test/test#test_params'
667
        get ':controller/:action'
668
      end
669

670
      get :test_params, params: { path: ['hello', 'world'] }
671 672
      assert_equal ['hello', 'world'], @request.path_parameters[:path]
      assert_equal 'hello/world', @request.path_parameters[:path].to_param
673 674 675 676
    end
  end

  def test_assert_realistic_path_parameters
677
    get :test_params, params: { id: 20, foo: Object.new }
678

679
    # All elements of path_parameters should use Symbol keys
680
    @request.path_parameters.each_key do |key|
681
      assert_kind_of Symbol, key
682 683 684 685
    end
  end

  def test_with_routing_places_routes_back
J
Joshua Peek 已提交
686 687
    assert @routes
    routes_id = @routes.object_id
688

689 690 691 692
    begin
      with_routing { raise 'fail' }
      fail 'Should not be here.'
    rescue RuntimeError
693
    end
694

J
Joshua Peek 已提交
695 696
    assert @routes
    assert_equal routes_id, @routes.object_id
697
  end
698 699 700 701 702 703 704 705 706

  def test_remote_addr
    get :test_remote_addr
    assert_equal "0.0.0.0", @response.body

    @request.remote_addr = "192.0.0.1"
    get :test_remote_addr
    assert_equal "192.0.0.1", @response.body
  end
707

708
  def test_header_properly_reset_after_remote_http_request
709
    get :test_params, xhr: true
710
    assert_nil @request.env['HTTP_X_REQUESTED_WITH']
G
Guo Xiang Tan 已提交
711
    assert_nil @request.env['HTTP_ACCEPT']
712 713
  end

714 715 716 717 718 719
  def test_deprecated_xhr_with_params
    assert_deprecated { xhr :get, :test_params, params: { id: 1 } }

    assert_equal(%({"id"=>"1", "controller"=>"test_case_test/test", "action"=>"test_params"}), @response.body)
  end

720
  def test_xhr_with_params
721
    get :test_params, params: { id: 1 }, xhr: true
722 723 724 725 726

    assert_equal(%({"id"=>"1", "controller"=>"test_case_test/test", "action"=>"test_params"}), @response.body)
  end

  def test_xhr_with_session
727 728 729 730 731 732 733 734 735 736
    get :set_session, xhr: true

    assert_equal 'A wonder', session['string'], "A value stored in the session should be available by string key"
    assert_equal 'A wonder', session[:string], "Test session hash should allow indifferent access"
    assert_equal 'it works', session['symbol'], "Test session hash should allow indifferent access"
    assert_equal 'it works', session[:symbol], "Test session hash should allow indifferent access"
  end

  def test_deprecated_xhr_with_session
    assert_deprecated { xhr :get, :set_session }
737 738 739 740 741 742 743

    assert_equal 'A wonder', session['string'], "A value stored in the session should be available by string key"
    assert_equal 'A wonder', session[:string], "Test session hash should allow indifferent access"
    assert_equal 'it works', session['symbol'], "Test session hash should allow indifferent access"
    assert_equal 'it works', session[:symbol], "Test session hash should allow indifferent access"
  end

J
Joshua Peek 已提交
744
  def test_header_properly_reset_after_get_request
745 746 747 748 749
    get :test_params
    @request.recycle!
    assert_nil @request.instance_variable_get("@request_method")
  end

750 751 752 753 754 755 756 757
  def test_deprecated_params_reset_between_post_requests
    assert_deprecated { post :no_op, foo: "bar" }
    assert_equal "bar", @request.params[:foo]

    post :no_op
    assert @request.params[:foo].blank?
  end

G
Guo Xiang Tan 已提交
758
  def test_params_reset_between_post_requests
759
    post :no_op, params: { foo: "bar" }
760
    assert_equal "bar", @request.params[:foo]
G
Guo Xiang Tan 已提交
761

762
    post :no_op
763
    assert @request.params[:foo].blank?
764 765
  end

766
  def test_filtered_parameters_reset_between_requests
767
    get :no_op, params: { foo: "bar" }
768 769
    assert_equal "bar", @request.filtered_parameters[:foo]

770
    get :no_op, params: { foo: "baz" }
771 772 773
    assert_equal "baz", @request.filtered_parameters[:foo]
  end

G
Guo Xiang Tan 已提交
774
  def test_path_params_reset_between_request
775
    get :test_params, params: { id: "foo" }
776
    assert_equal "foo", @request.path_parameters[:id]
G
Guo Xiang Tan 已提交
777

778
    get :test_params
779
    assert_nil @request.path_parameters[:id]
780 781
  end

A
Andrew White 已提交
782 783 784 785 786 787 788 789 790 791 792 793 794
  def test_request_protocol_is_reset_after_request
    get :test_protocol
    assert_equal "http://", @response.body

    @request.env["HTTPS"] = "on"
    get :test_protocol
    assert_equal "https://", @response.body

    @request.env.delete("HTTPS")
    get :test_protocol
    assert_equal "http://", @response.body
  end

795
  def test_request_format
796
    get :test_format, params: { format: 'html' }
797 798
    assert_equal 'text/html', @response.body

799
    get :test_format, params: { format: 'json' }
800 801
    assert_equal 'application/json', @response.body

802
    get :test_format, params: { format: 'xml' }
803 804 805 806 807 808
    assert_equal 'application/xml', @response.body

    get :test_format
    assert_equal 'text/html', @response.body
  end

809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827
  def test_request_format_kwarg
    get :test_format, format: 'html'
    assert_equal 'text/html', @response.body

    get :test_format, format: 'json'
    assert_equal 'application/json', @response.body

    get :test_format, format: 'xml'
    assert_equal 'application/xml', @response.body

    get :test_format
    assert_equal 'text/html', @response.body
  end

  def test_request_format_kwarg_overrides_params
    get :test_format, format: 'json', params: { format: 'html' }
    assert_equal 'application/json', @response.body
  end

828
  def test_should_have_knowledge_of_client_side_cookie_state_even_if_they_are_not_set
829
    cookies['foo'] = 'bar'
830 831 832 833 834
    get :no_op
    assert_equal 'bar', cookies['foo']
  end

  def test_should_detect_if_cookie_is_deleted
835
    cookies['foo'] = 'bar'
836 837 838 839
    get :delete_cookie
    assert_nil cookies['foo']
  end

840 841 842 843 844 845 846 847
  %w(controller response request).each do |variable|
    %w(get post put delete head process).each do |method|
      define_method("test_#{variable}_missing_for_#{method}_raises_error") do
        remove_instance_variable "@#{variable}"
        begin
          send(method, :test_remote_addr)
          assert false, "expected RuntimeError, got nothing"
        rescue RuntimeError => error
848
          assert_match(%r{@#{variable} is nil}, error.message)
849 850 851 852 853 854
        rescue => error
          assert false, "expected RuntimeError, got #{error.class}"
        end
      end
    end
  end
855

856
  FILES_DIR = File.dirname(__FILE__) + '/../fixtures/multipart'
857

858 859
  READ_BINARY = 'rb:binary'
  READ_PLAIN = 'r:binary'
860

861 862 863 864
  def test_test_uploaded_file
    filename = 'mona_lisa.jpg'
    path = "#{FILES_DIR}/#{filename}"
    content_type = 'image/png'
865
    expected = File.read(path)
866
    expected.force_encoding(Encoding::BINARY)
867

J
Joshua Peek 已提交
868
    file = Rack::Test::UploadedFile.new(path, content_type)
869 870 871
    assert_equal filename, file.original_filename
    assert_equal content_type, file.content_type
    assert_equal file.path, file.local_path
872
    assert_equal expected, file.read
873 874 875 876 877

    new_content_type = "new content_type"
    file.content_type = new_content_type
    assert_equal new_content_type, file.content_type

878
  end
J
Joshua Peek 已提交
879

880
  def test_fixture_path_is_accessed_from_self_instead_of_active_support_test_case
881
    TestCaseTest.stubs(:fixture_path).returns(FILES_DIR)
882 883 884 885 886

    uploaded_file = fixture_file_upload('/mona_lisa.jpg', 'image/png')
    assert_equal File.open("#{FILES_DIR}/mona_lisa.jpg", READ_PLAIN).read, uploaded_file.read
  end

887 888 889 890
  def test_test_uploaded_file_with_binary
    filename = 'mona_lisa.jpg'
    path = "#{FILES_DIR}/#{filename}"
    content_type = 'image/png'
J
Joshua Peek 已提交
891

J
Joshua Peek 已提交
892
    binary_uploaded_file = Rack::Test::UploadedFile.new(path, content_type, :binary)
893
    assert_equal File.open(path, READ_BINARY).read, binary_uploaded_file.read
J
Joshua Peek 已提交
894

J
Joshua Peek 已提交
895
    plain_uploaded_file = Rack::Test::UploadedFile.new(path, content_type)
896
    assert_equal File.open(path, READ_PLAIN).read, plain_uploaded_file.read
897 898 899 900 901 902
  end

  def test_fixture_file_upload_with_binary
    filename = 'mona_lisa.jpg'
    path = "#{FILES_DIR}/#{filename}"
    content_type = 'image/jpg'
J
Joshua Peek 已提交
903

904
    binary_file_upload = fixture_file_upload(path, content_type, :binary)
905
    assert_equal File.open(path, READ_BINARY).read, binary_file_upload.read
J
Joshua Peek 已提交
906

907
    plain_file_upload = fixture_file_upload(path, content_type)
908
    assert_equal File.open(path, READ_PLAIN).read, plain_file_upload.read
909
  end
910

911
  def test_fixture_file_upload
912 913 914 915
    post :test_file_upload,
      params: {
        file: fixture_file_upload(FILES_DIR + "/mona_lisa.jpg", "image/jpg")
      }
J
Jeremy Kemper 已提交
916
    assert_equal '159528', @response.body
917
  end
918

919 920 921 922 923 924 925 926 927 928 929 930
  def test_fixture_file_upload_relative_to_fixture_path
    TestCaseTest.stubs(:fixture_path).returns(FILES_DIR)
    uploaded_file = fixture_file_upload("mona_lisa.jpg", "image/jpg")
    assert_equal File.open("#{FILES_DIR}/mona_lisa.jpg", READ_PLAIN).read, uploaded_file.read
  end

  def test_fixture_file_upload_ignores_nil_fixture_path
    TestCaseTest.stubs(:fixture_path).returns(nil)
    uploaded_file = fixture_file_upload("#{FILES_DIR}/mona_lisa.jpg", "image/jpg")
    assert_equal File.open("#{FILES_DIR}/mona_lisa.jpg", READ_PLAIN).read, uploaded_file.read
  end

931 932 933 934 935 936 937 938 939
  def test_deprecated_action_dispatch_uploaded_file_upload
    filename = 'mona_lisa.jpg'
    path = "#{FILES_DIR}/#{filename}"
    assert_deprecated {
      post :test_file_upload, file: ActionDispatch::Http::UploadedFile.new(filename: path, type: "image/jpg", tempfile: File.open(path))
    }
    assert_equal '159528', @response.body
  end

940 941 942
  def test_action_dispatch_uploaded_file_upload
    filename = 'mona_lisa.jpg'
    path = "#{FILES_DIR}/#{filename}"
943 944 945
    post :test_file_upload, params: {
      file: ActionDispatch::Http::UploadedFile.new(filename: path, type: "image/jpg", tempfile: File.open(path))
    }
946 947 948
    assert_equal '159528', @response.body
  end

949
  def test_test_uploaded_file_exception_when_file_doesnt_exist
J
Joshua Peek 已提交
950
    assert_raise(RuntimeError) { Rack::Test::UploadedFile.new('non_existent_file') }
951
  end
952

953 954 955 956 957 958 959 960 961
  def test_redirect_url_only_cares_about_location_header
    get :create
    assert_response :created

    # Redirect url doesn't care that it wasn't a :redirect response.
    assert_equal 'created resource', @response.redirect_url
    assert_equal @response.redirect_url, redirect_to_url

    # Must be a :redirect response.
962
    assert_raise(ActiveSupport::TestCase::Assertion) do
963 964 965
      assert_redirected_to 'created resource'
    end
  end
966
end
967

968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013
class ResponseDefaultHeadersTest < ActionController::TestCase
  class TestController < ActionController::Base
    def remove_header
      headers.delete params[:header]
      head :ok, 'C' => '3'
    end
  end

  setup do
    @original = ActionDispatch::Response.default_headers
    @defaults = { 'A' => '1', 'B' => '2' }
    ActionDispatch::Response.default_headers = @defaults
  end

  teardown do
    ActionDispatch::Response.default_headers = @original
  end

  def setup
    super
    @controller = TestController.new
    @request    = ActionController::TestRequest.new
    @response   = ActionController::TestResponse.new
    @request.env['PATH_INFO'] = nil
    @routes = ActionDispatch::Routing::RouteSet.new.tap do |r|
      r.draw do
        get ':controller(/:action(/:id))'
      end
    end
  end

  test "response contains default headers" do
    # Response headers start out with the defaults
    assert_equal @defaults, response.headers

    get :remove_header, params: { header: 'A' }
    assert_response :ok

    # After a request, the response in the test case doesn't have the
    # defaults merged on top again.
    assert_not_includes response.headers, 'A'
    assert_includes response.headers, 'B'
    assert_includes response.headers, 'C'
  end
end

1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024
module EngineControllerTests
  class Engine < ::Rails::Engine
    isolate_namespace EngineControllerTests

    routes.draw do
      get '/' => 'bar#index'
    end
  end

  class BarController < ActionController::Base
    def index
1025
      render text: 'bar'
1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051
    end
  end

  class BarControllerTest < ActionController::TestCase
    tests BarController

    def test_engine_controller_route
      get :index
      assert_equal @response.body, 'bar'
    end
  end

  class BarControllerTestWithExplicitRouteSet < ActionController::TestCase
    tests BarController

    def setup
      @routes = Engine.routes
    end

    def test_engine_controller_route
      get :index
      assert_equal @response.body, 'bar'
    end
  end
end

1052
class InferringClassNameTest < ActionController::TestCase
1053 1054 1055 1056 1057
  def test_determine_controller_class
    assert_equal ContentController, determine_class("ContentControllerTest")
  end

  def test_determine_controller_class_with_nonsense_name
1058
    assert_nil determine_class("HelloGoodBye")
1059 1060 1061
  end

  def test_determine_controller_class_with_sensible_name_where_no_controller_exists
1062
    assert_nil determine_class("NoControllerWithThisNameTest")
1063 1064 1065 1066 1067 1068 1069 1070 1071 1072
  end

  private
    def determine_class(name)
      ActionController::TestCase.determine_default_controller_class(name)
    end
end

class CrazyNameTest < ActionController::TestCase
  tests ContentController
1073

1074 1075 1076 1077
  def test_controller_class_can_be_set_manually_not_just_inferred
    assert_equal ContentController, self.class.controller_class
  end
end
1078

1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094
class CrazySymbolNameTest < ActionController::TestCase
  tests :content

  def test_set_controller_class_using_symbol
    assert_equal ContentController, self.class.controller_class
  end
end

class CrazyStringNameTest < ActionController::TestCase
  tests 'content'

  def test_set_controller_class_using_string
    assert_equal ContentController, self.class.controller_class
  end
end

1095 1096
class NamedRoutesControllerTest < ActionController::TestCase
  tests ContentController
J
Joshua Peek 已提交
1097

1098 1099
  def test_should_be_able_to_use_named_routes_before_a_request_is_done
    with_routing do |set|
1100
      set.draw { resources :contents }
1101
      assert_equal 'http://test.host/contents/new', new_content_url
1102
      assert_equal 'http://test.host/contents/1', content_url(id: 1)
1103 1104 1105
    end
  end
end
A
Andrew White 已提交
1106 1107 1108 1109 1110

class AnonymousControllerTest < ActionController::TestCase
  def setup
    @controller = Class.new(ActionController::Base) do
      def index
1111
        render text: params[:controller]
A
Andrew White 已提交
1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125
      end
    end.new

    @routes = ActionDispatch::Routing::RouteSet.new.tap do |r|
      r.draw do
        get ':controller(/:action(/:id))'
      end
    end
  end

  def test_controller_name
    get :index
    assert_equal 'anonymous', @response.body
  end
1126
end
1127 1128 1129 1130 1131

class RoutingDefaultsTest < ActionController::TestCase
  def setup
    @controller = Class.new(ActionController::Base) do
      def post
1132
        render text: request.fullpath
1133 1134 1135
      end

      def project
1136
        render text: request.fullpath
1137 1138 1139 1140 1141
      end
    end.new

    @routes = ActionDispatch::Routing::RouteSet.new.tap do |r|
      r.draw do
1142 1143
        get '/posts/:id', to: 'anonymous#post', bucket_type: 'post'
        get '/projects/:id', to: 'anonymous#project', defaults: { bucket_type: 'project' }
1144 1145 1146 1147 1148
      end
    end
  end

  def test_route_option_can_be_passed_via_process
1149
    get :post, params: { id: 1, bucket_type: 'post'}
1150 1151 1152 1153
    assert_equal '/posts/1', @response.body
  end

  def test_route_default_is_not_required_for_building_request_uri
1154
    get :project, params: { id: 2 }
1155 1156 1157
    assert_equal '/projects/2', @response.body
  end
end