cookies_test.rb 19.9 KB
Newer Older
1
require 'abstract_unit'
2 3
# FIXME remove DummyKeyGenerator and this require in 4.1
require 'active_support/key_generator'
D
Initial  
David Heinemeier Hansson 已提交
4

5
class CookiesTest < ActionController::TestCase
D
Initial  
David Heinemeier Hansson 已提交
6
  class TestController < ActionController::Base
7 8
    def authenticate
      cookies["user_name"] = "david"
J
Jeremy Kemper 已提交
9
      head :ok
10 11
    end

12 13
    def set_with_with_escapable_characters
      cookies["that & guy"] = "foo & bar => baz"
J
Jeremy Kemper 已提交
14
      head :ok
15 16
    end

17
    def authenticate_for_fourteen_days
F
Frederick Cheung 已提交
18
      cookies["user_name"] = { "value" => "david", "expires" => Time.utc(2005, 10, 10,5) }
J
Jeremy Kemper 已提交
19
      head :ok
20 21
    end

22
    def authenticate_for_fourteen_days_with_symbols
F
Frederick Cheung 已提交
23
      cookies[:user_name] = { :value => "david", :expires => Time.utc(2005, 10, 10,5) }
J
Jeremy Kemper 已提交
24
      head :ok
25 26
    end

27
    def set_multiple_cookies
F
Frederick Cheung 已提交
28
      cookies["user_name"] = { "value" => "david", "expires" => Time.utc(2005, 10, 10,5) }
29
      cookies["login"]     = "XJ-122"
J
Jeremy Kemper 已提交
30
      head :ok
31
    end
J
Joshua Peek 已提交
32

33
    def access_frozen_cookies
J
Jeremy Kemper 已提交
34
      cookies["will"] = "work"
J
Jeremy Kemper 已提交
35
      head :ok
36 37
    end

38 39
    def logout
      cookies.delete("user_name")
J
Jeremy Kemper 已提交
40
      head :ok
41 42
    end

43 44
    alias delete_cookie logout

45 46
    def delete_cookie_with_path
      cookies.delete("user_name", :path => '/beaten')
J
Jeremy Kemper 已提交
47
      head :ok
48 49
    end

50
    def authenticate_with_http_only
51
      cookies["user_name"] = { :value => "david", :httponly => true }
J
Jeremy Kemper 已提交
52
      head :ok
53
    end
54

55 56 57 58
    def authenticate_with_secure
      cookies["user_name"] = { :value => "david", :secure => true }
      head :ok
    end
59 60 61 62 63

    def set_permanent_cookie
      cookies.permanent[:user_name] = "Jamie"
      head :ok
    end
J
Joshua Peek 已提交
64

65 66 67 68
    def set_signed_cookie
      cookies.signed[:user_id] = 45
      head :ok
    end
J
Joshua Peek 已提交
69

70 71 72 73 74
    def set_encrypted_cookie
      cookies.encrypted[:foo] = 'bar'
      head :ok
    end

75 76 77 78 79
    def set_invalid_encrypted_cookie
      cookies[:invalid_cookie] = 'invalid--9170e00a57cfc27083363b5c75b835e477bd90cf'
      head :ok
    end

80 81 82 83 84 85 86 87 88 89 90
    def raise_data_overflow
      cookies.signed[:foo] = 'bye!' * 1024
      head :ok
    end

    def tampered_cookies
      cookies[:tampered] = "BAh7BjoIZm9vIghiYXI%3D--123456780"
      cookies.signed[:tampered]
      head :ok
    end

91 92 93 94
    def set_permanent_signed_cookie
      cookies.permanent.signed[:remember_me] = 100
      head :ok
    end
95 96 97 98 99 100

    def delete_and_set_cookie
      cookies.delete :user_name
      cookies[:user_name] = { :value => "david", :expires => Time.utc(2005, 10, 10,5) }
      head :ok
    end
101 102 103 104 105 106 107 108 109 110

    def set_cookie_with_domain
      cookies[:user_name] = {:value => "rizwanreza", :domain => :all}
      head :ok
    end

    def delete_cookie_with_domain
      cookies.delete(:user_name, :domain => :all)
      head :ok
    end
111

112 113 114 115 116 117 118 119 120 121
    def set_cookie_with_domain_and_tld
      cookies[:user_name] = {:value => "rizwanreza", :domain => :all, :tld_length => 2}
      head :ok
    end

    def delete_cookie_with_domain_and_tld
      cookies.delete(:user_name, :domain => :all, :tld_length => 2)
      head :ok
    end

122 123 124 125 126 127 128 129 130 131
    def set_cookie_with_domains
      cookies[:user_name] = {:value => "rizwanreza", :domain => %w(example1.com example2.com .example3.com)}
      head :ok
    end

    def delete_cookie_with_domains
      cookies.delete(:user_name, :domain => %w(example1.com example2.com .example3.com))
      head :ok
    end

132 133 134 135 136 137
    def symbol_key
      cookies[:user_name] = "david"
      head :ok
    end

    def string_key
S
steve 已提交
138
      cookies['user_name'] = "dhh"
139 140
      head :ok
    end
141 142 143 144 145 146 147 148 149 150 151 152 153 154

    def symbol_key_mock
      cookies[:user_name] = "david" if cookies[:user_name] == "andrew"
      head :ok
    end

    def string_key_mock
      cookies['user_name'] = "david" if cookies['user_name'] == "andrew"
      head :ok
    end

    def noop
      head :ok
    end
D
Initial  
David Heinemeier Hansson 已提交
155 156
  end

157
  tests TestController
D
Initial  
David Heinemeier Hansson 已提交
158

159
  def setup
160
    super
161 162 163 164
    @request.env["action_dispatch.key_generator"] = ActiveSupport::KeyGenerator.new("b3c631c314c0bbca50c1b2843150fe33")
    @request.env["action_dispatch.signed_cookie_salt"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.encrypted_cookie_salt"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.encrypted_signed_cookie_salt"] = "b3c631c314c0bbca50c1b2843150fe33"
D
Initial  
David Heinemeier Hansson 已提交
165 166 167
    @request.host = "www.nextangle.com"
  end

A
Aaron Patterson 已提交
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
  def test_fetch
    x = Object.new
    assert_not request.cookie_jar.key?('zzzzzz')
    assert_equal x, request.cookie_jar.fetch('zzzzzz', x)
    assert_not request.cookie_jar.key?('zzzzzz')
  end

  def test_fetch_exists
    x = Object.new
    request.cookie_jar['foo'] = 'bar'
    assert_equal 'bar', request.cookie_jar.fetch('foo', x)
  end

  def test_fetch_block
    x = Object.new
    assert_not request.cookie_jar.key?('zzzzzz')
    assert_equal x, request.cookie_jar.fetch('zzzzzz') { x }
  end

  def test_key_is_to_s
    request.cookie_jar['foo'] = 'bar'
    assert_equal 'bar', request.cookie_jar.fetch(:foo)
  end

  def test_fetch_type_error
    assert_raises(KeyError) do
      request.cookie_jar.fetch(:omglolwut)
    end
  end

198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
  def test_each
    request.cookie_jar['foo'] = :bar
    list = []
    request.cookie_jar.each do |k,v|
      list << [k, v]
    end

    assert_equal [['foo', :bar]], list
  end

  def test_enumerable
    request.cookie_jar['foo'] = :bar
    actual = request.cookie_jar.map { |k,v| [k.to_s, v.to_s] }
    assert_equal [['foo', 'bar']], actual
  end

214 215 216 217 218 219 220 221 222
  def test_key_methods
    assert !request.cookie_jar.key?(:foo)
    assert !request.cookie_jar.has_key?("foo")

    request.cookie_jar[:foo] = :bar
    assert request.cookie_jar.key?(:foo)
    assert request.cookie_jar.has_key?("foo")
  end

D
Initial  
David Heinemeier Hansson 已提交
223
  def test_setting_cookie
224
    get :authenticate
J
Jeremy Kemper 已提交
225
    assert_cookie_header "user_name=david; path=/"
226
    assert_equal({"user_name" => "david"}, @response.cookies)
D
Initial  
David Heinemeier Hansson 已提交
227 228
  end

229 230 231 232 233 234 235 236 237
  def test_setting_the_same_value_to_cookie
    request.cookies[:user_name] = 'david'
    get :authenticate
    assert response.cookies.empty?
  end

  def test_setting_the_same_value_to_permanent_cookie
    request.cookies[:user_name] = 'Jamie'
    get :set_permanent_cookie
238
    assert_equal response.cookies, 'user_name' => 'Jamie'
239 240
  end

241 242
  def test_setting_with_escapable_characters
    get :set_with_with_escapable_characters
J
Jeremy Kemper 已提交
243
    assert_cookie_header "that+%26+guy=foo+%26+bar+%3D%3E+baz; path=/"
244 245 246
    assert_equal({"that & guy" => "foo & bar => baz"}, @response.cookies)
  end

247
  def test_setting_cookie_for_fourteen_days
248
    get :authenticate_for_fourteen_days
249
    assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000"
250
    assert_equal({"user_name" => "david"}, @response.cookies)
251
  end
252

253
  def test_setting_cookie_for_fourteen_days_with_symbols
P
Pratik Naik 已提交
254
    get :authenticate_for_fourteen_days_with_symbols
255
    assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000"
256
    assert_equal({"user_name" => "david"}, @response.cookies)
257 258
  end

259 260
  def test_setting_cookie_with_http_only
    get :authenticate_with_http_only
J
Jeremy Kemper 已提交
261
    assert_cookie_header "user_name=david; path=/; HttpOnly"
262
    assert_equal({"user_name" => "david"}, @response.cookies)
263
  end
264

265
  def test_setting_cookie_with_secure
266
    @request.env["HTTPS"] = "on"
267 268 269 270
    get :authenticate_with_secure
    assert_cookie_header "user_name=david; path=/; secure"
    assert_equal({"user_name" => "david"}, @response.cookies)
  end
271

L
lest 已提交
272 273
  def test_setting_cookie_with_secure_when_always_write_cookie_is_true
    ActionDispatch::Cookies::CookieJar.any_instance.stubs(:always_write_cookie).returns(true)
274 275 276 277 278 279 280 281 282 283 284
    get :authenticate_with_secure
    assert_cookie_header "user_name=david; path=/; secure"
    assert_equal({"user_name" => "david"}, @response.cookies)
  end

  def test_not_setting_cookie_with_secure
    get :authenticate_with_secure
    assert_not_cookie_header "user_name=david; path=/; secure"
    assert_not_equal({"user_name" => "david"}, @response.cookies)
  end

285
  def test_multiple_cookies
286 287
    get :set_multiple_cookies
    assert_equal 2, @response.cookies.size
288
    assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000\nlogin=XJ-122; path=/"
289
    assert_equal({"login" => "XJ-122", "user_name" => "david"}, @response.cookies)
290
  end
291

292
  def test_setting_test_cookie
293 294
    assert_nothing_raised { get :access_frozen_cookies }
  end
J
Joshua Peek 已提交
295

296
  def test_expiring_cookie
297
    request.cookies[:user_name] = 'Joe'
298
    get :logout
299
    assert_cookie_header "user_name=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
300
    assert_equal({"user_name" => nil}, @response.cookies)
301
  end
J
Joshua Peek 已提交
302

303
  def test_delete_cookie_with_path
304
    request.cookies[:user_name] = 'Joe'
305
    get :delete_cookie_with_path
306
    assert_cookie_header "user_name=; path=/beaten; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
307
  end
J
Jeremy Kemper 已提交
308

309 310 311 312 313 314
  def test_delete_unexisting_cookie
    request.cookies.clear
    get :delete_cookie
    assert @response.cookies.empty?
  end

315
  def test_deleted_cookie_predicate
316
    cookies[:user_name] = 'Joe'
317 318 319 320 321 322
    cookies.delete("user_name")
    assert cookies.deleted?("user_name")
    assert_equal false, cookies.deleted?("another")
  end

  def test_deleted_cookie_predicate_with_mismatching_options
323
    cookies[:user_name] = 'Joe'
324 325 326 327
    cookies.delete("user_name", :path => "/path")
    assert_equal false, cookies.deleted?("user_name", :path => "/different")
  end

328
  def test_cookies_persist_throughout_request
Y
Yehuda Katz 已提交
329 330
    response = get :authenticate
    assert response.headers["Set-Cookie"] =~ /user_name=david/
331
  end
332 333 334

  def test_permanent_cookie
    get :set_permanent_cookie
335 336
    assert_match(/Jamie/, @response.headers["Set-Cookie"])
    assert_match(%r(#{20.years.from_now.utc.year}), @response.headers["Set-Cookie"])
337
  end
J
Joshua Peek 已提交
338

339 340 341 342
  def test_signed_cookie
    get :set_signed_cookie
    assert_equal 45, @controller.send(:cookies).signed[:user_id]
  end
J
Joshua Peek 已提交
343

344 345 346 347 348
  def test_accessing_nonexistant_signed_cookie_should_not_raise_an_invalid_signature
    get :set_signed_cookie
    assert_nil @controller.send(:cookies).signed[:non_existant_attribute]
  end

349 350 351 352 353 354 355 356 357 358
  def test_encrypted_cookie
    get :set_encrypted_cookie
    cookies = @controller.send :cookies
    assert_not_equal 'bar', cookies[:foo]
    assert_raises TypeError do
      cookies.signed[:foo]
    end
    assert_equal 'bar', cookies.encrypted[:foo]
  end

359 360 361 362 363 364 365 366
  def test_accessing_nonexistant_encrypted_cookie_should_not_raise_invalid_message
    get :set_encrypted_cookie
    assert_nil @controller.send(:cookies).encrypted[:non_existant_attribute]
  end

  def test_setting_invalid_encrypted_cookie_should_return_nil_when_accessing_it
    get :set_invalid_encrypted_cookie
    assert_nil @controller.send(:cookies).encrypted[:invalid_cookie]
367 368
  end

369 370
  def test_permanent_signed_cookie
    get :set_permanent_signed_cookie
371
    assert_match(%r(#{20.years.from_now.utc.year}), @response.headers["Set-Cookie"])
372 373 374
    assert_equal 100, @controller.send(:cookies).signed[:remember_me]
  end

375
  def test_delete_and_set_cookie
376
    request.cookies[:user_name] = 'Joe'
377
    get :delete_and_set_cookie
378
    assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000"
379 380
    assert_equal({"user_name" => "david"}, @response.cookies)
  end
J
Joshua Peek 已提交
381

382 383 384 385 386 387 388 389 390 391 392 393 394 395 396
  def test_raise_data_overflow
    assert_raise(ActionDispatch::Cookies::CookieOverflow) do
      get :raise_data_overflow
    end
  end

  def test_tampered_cookies
    assert_nothing_raised do
      get :tampered_cookies
      assert_response :success
    end
  end

  def test_raises_argument_error_if_missing_secret
    assert_raise(ArgumentError, nil.inspect) {
397
      @request.env["action_dispatch.key_generator"] = ActiveSupport::DummyKeyGenerator.new(nil)
398 399 400 401
      get :set_signed_cookie
    }

    assert_raise(ArgumentError, ''.inspect) {
402
      @request.env["action_dispatch.key_generator"] = ActiveSupport::DummyKeyGenerator.new("")
403 404 405 406 407 408
      get :set_signed_cookie
    }
  end

  def test_raises_argument_error_if_secret_is_probably_insecure
    assert_raise(ArgumentError, "password".inspect) {
409
      @request.env["action_dispatch.key_generator"] = ActiveSupport::DummyKeyGenerator.new("password")
410 411 412 413
      get :set_signed_cookie
    }

    assert_raise(ArgumentError, "secret".inspect) {
414
      @request.env["action_dispatch.key_generator"] = ActiveSupport::DummyKeyGenerator.new("secret")
415 416 417 418
      get :set_signed_cookie
    }

    assert_raise(ArgumentError, "12345678901234567890123456789".inspect) {
419
      @request.env["action_dispatch.key_generator"] = ActiveSupport::DummyKeyGenerator.new("12345678901234567890123456789")
420 421 422 423
      get :set_signed_cookie
    }
  end

424 425 426 427 428 429
  def test_cookie_with_all_domain_option
    get :set_cookie_with_domain
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=.nextangle.com; path=/"
  end

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
  def test_cookie_with_all_domain_option_using_a_non_standard_tld
    @request.host = "two.subdomains.nextangle.local"
    get :set_cookie_with_domain
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=.nextangle.local; path=/"
  end

  def test_cookie_with_all_domain_option_using_australian_style_tld
    @request.host = "nextangle.com.au"
    get :set_cookie_with_domain
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=.nextangle.com.au; path=/"
  end

  def test_cookie_with_all_domain_option_using_uk_style_tld
    @request.host = "nextangle.co.uk"
    get :set_cookie_with_domain
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=.nextangle.co.uk; path=/"
  end

  def test_cookie_with_all_domain_option_using_host_with_port
    @request.host = "nextangle.local:3000"
    get :set_cookie_with_domain
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=.nextangle.local; path=/"
  end

458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478
  def test_cookie_with_all_domain_option_using_localhost
    @request.host = "localhost"
    get :set_cookie_with_domain
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; path=/"
  end

  def test_cookie_with_all_domain_option_using_ipv4_address
    @request.host = "192.168.1.1"
    get :set_cookie_with_domain
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; path=/"
  end

  def test_cookie_with_all_domain_option_using_ipv6_address
    @request.host = "2001:0db8:85a3:0000:0000:8a2e:0370:7334"
    get :set_cookie_with_domain
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; path=/"
  end

479
  def test_deleting_cookie_with_all_domain_option
480
    request.cookies[:user_name] = 'Joe'
481 482
    get :delete_cookie_with_domain
    assert_response :success
483
    assert_cookie_header "user_name=; domain=.nextangle.com; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
484 485
  end

486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506
  def test_cookie_with_all_domain_option_and_tld_length
    get :set_cookie_with_domain_and_tld
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=.nextangle.com; path=/"
  end

  def test_cookie_with_all_domain_option_using_a_non_standard_tld_and_tld_length
    @request.host = "two.subdomains.nextangle.local"
    get :set_cookie_with_domain_and_tld
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=.nextangle.local; path=/"
  end

  def test_cookie_with_all_domain_option_using_host_with_port_and_tld_length
    @request.host = "nextangle.local:3000"
    get :set_cookie_with_domain_and_tld
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=.nextangle.local; path=/"
  end

  def test_deleting_cookie_with_all_domain_option_and_tld_length
507
    request.cookies[:user_name] = 'Joe'
508 509
    get :delete_cookie_with_domain_and_tld
    assert_response :success
510
    assert_cookie_header "user_name=; domain=.nextangle.com; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
511 512
  end

513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535
  def test_cookie_with_several_preset_domains_using_one_of_these_domains
    @request.host = "example1.com"
    get :set_cookie_with_domains
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=example1.com; path=/"
  end

  def test_cookie_with_several_preset_domains_using_other_domain
    @request.host = "other-domain.com"
    get :set_cookie_with_domains
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; path=/"
  end

  def test_cookie_with_several_preset_domains_using_shared_domain
    @request.host = "example3.com"
    get :set_cookie_with_domains
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=.example3.com; path=/"
  end

  def test_deletings_cookie_with_several_preset_domains_using_one_of_these_domains
    @request.host = "example2.com"
536
    request.cookies[:user_name] = 'Joe'
537 538
    get :delete_cookie_with_domains
    assert_response :success
539
    assert_cookie_header "user_name=; domain=example2.com; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
540 541 542 543
  end

  def test_deletings_cookie_with_several_preset_domains_using_other_domain
    @request.host = "other-domain.com"
544
    request.cookies[:user_name] = 'Joe'
545 546
    get :delete_cookie_with_domains
    assert_response :success
547
    assert_cookie_header "user_name=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
548 549
  end

550
  def test_cookies_hash_is_indifferent_access
551 552 553 554 555 556
    get :symbol_key
    assert_equal "david", cookies[:user_name]
    assert_equal "david", cookies['user_name']
    get :string_key
    assert_equal "dhh", cookies[:user_name]
    assert_equal "dhh", cookies['user_name']
557 558
  end

S
steve 已提交
559 560


561
  def test_setting_request_cookies_is_indifferent_access
562 563
    cookies.clear
    cookies[:user_name] = "andrew"
564
    get :string_key_mock
565
    assert_equal "david", cookies['user_name']
566

567 568
    cookies.clear
    cookies['user_name'] = "andrew"
569
    get :symbol_key_mock
570
    assert_equal "david", cookies[:user_name]
571 572 573 574
  end

  def test_cookies_retained_across_requests
    get :symbol_key
575
    assert_cookie_header "user_name=david; path=/"
576 577 578 579 580 581 582 583 584 585 586 587 588 589 590
    assert_equal "david", cookies[:user_name]

    get :noop
    assert_nil @response.headers["Set-Cookie"]
    assert_equal "david", cookies[:user_name]

    get :noop
    assert_nil @response.headers["Set-Cookie"]
    assert_equal "david", cookies[:user_name]
  end

  def test_cookies_can_be_cleared
    get :symbol_key
    assert_equal "david", cookies[:user_name]

591
    cookies.clear
592 593 594 595 596 597 598
    get :noop
    assert_nil cookies[:user_name]

    get :symbol_key
    assert_equal "david", cookies[:user_name]
  end

599
  def test_can_set_http_cookie_header
600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647
    @request.env['HTTP_COOKIE'] = 'user_name=david'
    get :noop
    assert_equal 'david', cookies['user_name']
    assert_equal 'david', cookies[:user_name]

    get :noop
    assert_equal 'david', cookies['user_name']
    assert_equal 'david', cookies[:user_name]

    @request.env['HTTP_COOKIE'] = 'user_name=andrew'
    get :noop
    assert_equal 'andrew', cookies['user_name']
    assert_equal 'andrew', cookies[:user_name]
  end

  def test_can_set_request_cookies
    @request.cookies['user_name'] = 'david'
    get :noop
    assert_equal 'david', cookies['user_name']
    assert_equal 'david', cookies[:user_name]

    get :noop
    assert_equal 'david', cookies['user_name']
    assert_equal 'david', cookies[:user_name]

    @request.cookies[:user_name] = 'andrew'
    get :noop
    assert_equal 'andrew', cookies['user_name']
    assert_equal 'andrew', cookies[:user_name]
  end

  def test_cookies_precedence_over_http_cookie
    @request.env['HTTP_COOKIE'] = 'user_name=andrew'
    get :authenticate
    assert_equal 'david', cookies['user_name']
    assert_equal 'david', cookies[:user_name]

    get :noop
    assert_equal 'david', cookies['user_name']
    assert_equal 'david', cookies[:user_name]
  end

  def test_cookies_precedence_over_request_cookies
    @request.cookies['user_name'] = 'andrew'
    get :authenticate
    assert_equal 'david', cookies['user_name']
    assert_equal 'david', cookies[:user_name]

648
    get :noop
649 650
    assert_equal 'david', cookies['user_name']
    assert_equal 'david', cookies[:user_name]
651 652
  end

J
Jeremy Kemper 已提交
653 654 655 656
  private
    def assert_cookie_header(expected)
      header = @response.headers["Set-Cookie"]
      if header.respond_to?(:to_str)
657
        assert_equal expected.split("\n").sort, header.split("\n").sort
J
Jeremy Kemper 已提交
658 659 660 661
      else
        assert_equal expected.split("\n"), header
      end
    end
662 663 664 665 666 667 668 669 670

    def assert_not_cookie_header(expected)
      header = @response.headers["Set-Cookie"]
      if header.respond_to?(:to_str)
        assert_not_equal expected.split("\n").sort, header.split("\n").sort
      else
        assert_not_equal expected.split("\n"), header
      end
    end
671
end