cookies_test.rb 26.1 KB
Newer Older
1
require 'abstract_unit'
2 3 4 5 6 7 8 9

begin
  require 'openssl'
  OpenSSL::PKCS5
rescue LoadError, NameError
  $stderr.puts "Skipping KeyGenerator test: broken OpenSSL install"
else

10 11
# FIXME remove DummyKeyGenerator and this require in 4.1
require 'active_support/key_generator'
12
require 'active_support/message_verifier'
D
Initial  
David Heinemeier Hansson 已提交
13

14
class CookiesTest < ActionController::TestCase
D
Initial  
David Heinemeier Hansson 已提交
15
  class TestController < ActionController::Base
16 17
    def authenticate
      cookies["user_name"] = "david"
J
Jeremy Kemper 已提交
18
      head :ok
19 20
    end

21 22
    def set_with_with_escapable_characters
      cookies["that & guy"] = "foo & bar => baz"
J
Jeremy Kemper 已提交
23
      head :ok
24 25
    end

26
    def authenticate_for_fourteen_days
F
Frederick Cheung 已提交
27
      cookies["user_name"] = { "value" => "david", "expires" => Time.utc(2005, 10, 10,5) }
J
Jeremy Kemper 已提交
28
      head :ok
29 30
    end

31
    def authenticate_for_fourteen_days_with_symbols
F
Frederick Cheung 已提交
32
      cookies[:user_name] = { :value => "david", :expires => Time.utc(2005, 10, 10,5) }
J
Jeremy Kemper 已提交
33
      head :ok
34 35
    end

36
    def set_multiple_cookies
F
Frederick Cheung 已提交
37
      cookies["user_name"] = { "value" => "david", "expires" => Time.utc(2005, 10, 10,5) }
38
      cookies["login"]     = "XJ-122"
J
Jeremy Kemper 已提交
39
      head :ok
40
    end
J
Joshua Peek 已提交
41

42
    def access_frozen_cookies
J
Jeremy Kemper 已提交
43
      cookies["will"] = "work"
J
Jeremy Kemper 已提交
44
      head :ok
45 46
    end

47 48
    def logout
      cookies.delete("user_name")
J
Jeremy Kemper 已提交
49
      head :ok
50 51
    end

52 53
    alias delete_cookie logout

54 55
    def delete_cookie_with_path
      cookies.delete("user_name", :path => '/beaten')
J
Jeremy Kemper 已提交
56
      head :ok
57 58
    end

59
    def authenticate_with_http_only
60
      cookies["user_name"] = { :value => "david", :httponly => true }
J
Jeremy Kemper 已提交
61
      head :ok
62
    end
63

64 65 66 67
    def authenticate_with_secure
      cookies["user_name"] = { :value => "david", :secure => true }
      head :ok
    end
68 69 70 71 72

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

74 75 76 77
    def set_signed_cookie
      cookies.signed[:user_id] = 45
      head :ok
    end
J
Joshua Peek 已提交
78

79 80 81 82 83
    def get_signed_cookie
      cookies.signed[:user_id]
      head :ok
    end

84 85 86 87 88
    def set_encrypted_cookie
      cookies.encrypted[:foo] = 'bar'
      head :ok
    end

89 90 91 92 93
    def get_encrypted_cookie
      cookies.encrypted[:foo]
      head :ok
    end

94 95 96 97 98
    def set_invalid_encrypted_cookie
      cookies[:invalid_cookie] = 'invalid--9170e00a57cfc27083363b5c75b835e477bd90cf'
      head :ok
    end

99 100 101 102 103 104 105 106 107 108 109
    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

110 111 112 113
    def set_permanent_signed_cookie
      cookies.permanent.signed[:remember_me] = 100
      head :ok
    end
114 115 116 117 118 119

    def delete_and_set_cookie
      cookies.delete :user_name
      cookies[:user_name] = { :value => "david", :expires => Time.utc(2005, 10, 10,5) }
      head :ok
    end
120 121 122 123 124 125 126 127 128 129

    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
130

131 132 133 134 135 136 137 138 139 140
    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

141 142 143 144 145 146 147 148 149 150
    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

151 152 153 154 155 156
    def symbol_key
      cookies[:user_name] = "david"
      head :ok
    end

    def string_key
S
steve 已提交
157
      cookies['user_name'] = "dhh"
158 159
      head :ok
    end
160 161 162 163 164 165 166 167 168 169 170 171 172 173

    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 已提交
174 175
  end

176
  tests TestController
D
Initial  
David Heinemeier Hansson 已提交
177

178
  def setup
179
    super
180 181 182 183
    @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 已提交
184 185 186
    @request.host = "www.nextangle.com"
  end

A
Aaron Patterson 已提交
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
  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

217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
  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

233 234 235 236 237 238 239 240 241
  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 已提交
242
  def test_setting_cookie
243
    get :authenticate
J
Jeremy Kemper 已提交
244
    assert_cookie_header "user_name=david; path=/"
245
    assert_equal({"user_name" => "david"}, @response.cookies)
D
Initial  
David Heinemeier Hansson 已提交
246 247
  end

248 249 250 251 252 253 254 255 256
  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
257
    assert_equal response.cookies, 'user_name' => 'Jamie'
258 259
  end

260 261
  def test_setting_with_escapable_characters
    get :set_with_with_escapable_characters
J
Jeremy Kemper 已提交
262
    assert_cookie_header "that+%26+guy=foo+%26+bar+%3D%3E+baz; path=/"
263 264 265
    assert_equal({"that & guy" => "foo & bar => baz"}, @response.cookies)
  end

266
  def test_setting_cookie_for_fourteen_days
267
    get :authenticate_for_fourteen_days
268
    assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000"
269
    assert_equal({"user_name" => "david"}, @response.cookies)
270
  end
271

272
  def test_setting_cookie_for_fourteen_days_with_symbols
P
Pratik Naik 已提交
273
    get :authenticate_for_fourteen_days_with_symbols
274
    assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000"
275
    assert_equal({"user_name" => "david"}, @response.cookies)
276 277
  end

278 279
  def test_setting_cookie_with_http_only
    get :authenticate_with_http_only
J
Jeremy Kemper 已提交
280
    assert_cookie_header "user_name=david; path=/; HttpOnly"
281
    assert_equal({"user_name" => "david"}, @response.cookies)
282
  end
283

284
  def test_setting_cookie_with_secure
285
    @request.env["HTTPS"] = "on"
286 287 288 289
    get :authenticate_with_secure
    assert_cookie_header "user_name=david; path=/; secure"
    assert_equal({"user_name" => "david"}, @response.cookies)
  end
290

L
lest 已提交
291 292
  def test_setting_cookie_with_secure_when_always_write_cookie_is_true
    ActionDispatch::Cookies::CookieJar.any_instance.stubs(:always_write_cookie).returns(true)
293 294 295 296 297 298 299 300 301 302 303
    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

304
  def test_multiple_cookies
305 306
    get :set_multiple_cookies
    assert_equal 2, @response.cookies.size
307
    assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000\nlogin=XJ-122; path=/"
308
    assert_equal({"login" => "XJ-122", "user_name" => "david"}, @response.cookies)
309
  end
310

311
  def test_setting_test_cookie
312 313
    assert_nothing_raised { get :access_frozen_cookies }
  end
J
Joshua Peek 已提交
314

315
  def test_expiring_cookie
316
    request.cookies[:user_name] = 'Joe'
317
    get :logout
318
    assert_cookie_header "user_name=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
319
    assert_equal({"user_name" => nil}, @response.cookies)
320
  end
J
Joshua Peek 已提交
321

322
  def test_delete_cookie_with_path
323
    request.cookies[:user_name] = 'Joe'
324
    get :delete_cookie_with_path
325
    assert_cookie_header "user_name=; path=/beaten; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
326
  end
J
Jeremy Kemper 已提交
327

328 329 330 331 332 333
  def test_delete_unexisting_cookie
    request.cookies.clear
    get :delete_cookie
    assert @response.cookies.empty?
  end

334
  def test_deleted_cookie_predicate
335
    cookies[:user_name] = 'Joe'
336 337 338 339 340 341
    cookies.delete("user_name")
    assert cookies.deleted?("user_name")
    assert_equal false, cookies.deleted?("another")
  end

  def test_deleted_cookie_predicate_with_mismatching_options
342
    cookies[:user_name] = 'Joe'
343 344 345 346
    cookies.delete("user_name", :path => "/path")
    assert_equal false, cookies.deleted?("user_name", :path => "/different")
  end

347
  def test_cookies_persist_throughout_request
Y
Yehuda Katz 已提交
348 349
    response = get :authenticate
    assert response.headers["Set-Cookie"] =~ /user_name=david/
350
  end
351 352 353

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

358 359 360 361
  def test_signed_cookie
    get :set_signed_cookie
    assert_equal 45, @controller.send(:cookies).signed[:user_id]
  end
J
Joshua Peek 已提交
362

363 364 365 366 367
  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

368 369 370 371 372 373 374 375 376 377
  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

378 379 380 381 382 383 384 385
  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]
386 387
  end

388 389
  def test_permanent_signed_cookie
    get :set_permanent_signed_cookie
390
    assert_match(%r(#{20.years.from_now.utc.year}), @response.headers["Set-Cookie"])
391 392 393
    assert_equal 100, @controller.send(:cookies).signed[:remember_me]
  end

394
  def test_delete_and_set_cookie
395
    request.cookies[:user_name] = 'Joe'
396
    get :delete_and_set_cookie
397
    assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000"
398 399
    assert_equal({"user_name" => "david"}, @response.cookies)
  end
J
Joshua Peek 已提交
400

401 402 403 404 405 406 407 408 409 410 411 412 413 414 415
  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) {
416
      @request.env["action_dispatch.key_generator"] = ActiveSupport::DummyKeyGenerator.new(nil)
417 418 419 420
      get :set_signed_cookie
    }

    assert_raise(ArgumentError, ''.inspect) {
421
      @request.env["action_dispatch.key_generator"] = ActiveSupport::DummyKeyGenerator.new("")
422 423 424 425 426 427
      get :set_signed_cookie
    }
  end

  def test_raises_argument_error_if_secret_is_probably_insecure
    assert_raise(ArgumentError, "password".inspect) {
428
      @request.env["action_dispatch.key_generator"] = ActiveSupport::DummyKeyGenerator.new("password")
429 430 431 432
      get :set_signed_cookie
    }

    assert_raise(ArgumentError, "secret".inspect) {
433
      @request.env["action_dispatch.key_generator"] = ActiveSupport::DummyKeyGenerator.new("secret")
434 435 436 437
      get :set_signed_cookie
    }

    assert_raise(ArgumentError, "12345678901234567890123456789".inspect) {
438
      @request.env["action_dispatch.key_generator"] = ActiveSupport::DummyKeyGenerator.new("12345678901234567890123456789")
439 440 441 442
      get :set_signed_cookie
    }
  end

443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463
  def test_signed_uses_signed_cookie_jar_if_only_secret_token_is_set
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = nil
    get :set_signed_cookie
    assert_kind_of ActionDispatch::Cookies::SignedCookieJar, cookies.signed
  end

  def test_signed_uses_signed_cookie_jar_if_only_secret_key_base_is_set
    @request.env["action_dispatch.secret_token"] = nil
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"
    get :set_signed_cookie
    assert_kind_of ActionDispatch::Cookies::SignedCookieJar, cookies.signed
  end

  def test_signed_uses_upgrade_legacy_signed_cookie_jar_if_both_secret_token_and_secret_key_base_are_set
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"
    get :set_signed_cookie
    assert_kind_of ActionDispatch::Cookies::UpgradeLegacySignedCookieJar, cookies.signed
  end

464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499
  def test_signed_or_encrypted_uses_signed_cookie_jar_if_only_secret_token_is_set
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = nil
    get :get_encrypted_cookie
    assert_kind_of ActionDispatch::Cookies::SignedCookieJar, cookies.signed_or_encrypted
  end

  def test_signed_or_encrypted_uses_encrypted_cookie_jar_if_only_secret_key_base_is_set
    @request.env["action_dispatch.secret_token"] = nil
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"
    get :get_encrypted_cookie
    assert_kind_of ActionDispatch::Cookies::EncryptedCookieJar, cookies.signed_or_encrypted
  end

  def test_signed_or_encrypted_uses_upgrade_legacy_encrypted_cookie_jar_if_both_secret_token_and_secret_key_base_are_set
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"
    get :get_encrypted_cookie
    assert_kind_of ActionDispatch::Cookies::UpgradeLegacyEncryptedCookieJar, cookies.signed_or_encrypted
  end

  def test_encrypted_uses_encrypted_cookie_jar_if_only_secret_key_base_is_set
    @request.env["action_dispatch.secret_token"] = nil
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"
    get :get_encrypted_cookie
    assert_kind_of ActionDispatch::Cookies::EncryptedCookieJar, cookies.encrypted
  end

  def test_encrypted_uses_upgrade_legacy_encrypted_cookie_jar_if_both_secret_token_and_secret_key_base_are_set
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"
    get :get_encrypted_cookie
    assert_kind_of ActionDispatch::Cookies::UpgradeLegacyEncryptedCookieJar, cookies.encrypted
  end

  def test_legacy_signed_cookie_is_read_and_transparently_upgraded_by_signed_cookie_jar_if_both_secret_token_and_secret_key_base_are_set
500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"

    legacy_value = ActiveSupport::MessageVerifier.new("b3c631c314c0bbca50c1b2843150fe33").generate(45)

    @request.headers["Cookie"] = "user_id=#{legacy_value}"
    get :get_signed_cookie

    assert_equal 45, @controller.send(:cookies).signed[:user_id]

    key_generator = @request.env["action_dispatch.key_generator"]
    secret = key_generator.generate_key(@request.env["action_dispatch.signed_cookie_salt"])
    verifier = ActiveSupport::MessageVerifier.new(secret)
    assert_equal 45, verifier.verify(@response.cookies["user_id"])
  end

516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536
  def test_legacy_signed_cookie_is_read_and_transparently_encrypted_by_encrypted_cookie_jar_if_both_secret_token_and_secret_key_base_are_set
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"
    @request.env["action_dispatch.encrypted_cookie_salt"] = "4433796b79d99a7735553e316522acee"
    @request.env["action_dispatch.encrypted_signed_cookie_salt"] = "00646eb40062e1b1deff205a27cd30f9"

    legacy_value = ActiveSupport::MessageVerifier.new("b3c631c314c0bbca50c1b2843150fe33").generate('bar')

    @request.headers["Cookie"] = "foo=#{legacy_value}"
    get :get_encrypted_cookie

    assert_equal 'bar', @controller.send(:cookies).encrypted[:foo]

    key_generator = @request.env["action_dispatch.key_generator"]
    secret = key_generator.generate_key(@request.env["action_dispatch.encrypted_cookie_salt"])
    sign_secret = key_generator.generate_key(@request.env["action_dispatch.encrypted_signed_cookie_salt"])
    encryptor = ActiveSupport::MessageEncryptor.new(secret, sign_secret)
    assert_equal 'bar', encryptor.decrypt_and_verify(@response.cookies["foo"])
  end

  def test_legacy_signed_cookie_is_treated_as_nil_by_signed_cookie_jar_if_tampered
537 538 539 540 541 542 543 544 545 546
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"

    @request.headers["Cookie"] = "user_id=45"
    get :get_signed_cookie

    assert_equal nil, @controller.send(:cookies).signed[:user_id]
    assert_equal nil, @response.cookies["user_id"]
  end

547 548 549 550 551 552 553 554 555 556 557
  def test_legacy_signed_cookie_is_treated_as_nil_by_encrypted_cookie_jar_if_tampered
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"

    @request.headers["Cookie"] = "foo=baz"
    get :get_encrypted_cookie

    assert_equal nil, @controller.send(:cookies).encrypted[:foo]
    assert_equal nil, @response.cookies["foo"]
  end

558 559 560 561 562 563
  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

564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591
  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

592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612
  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

613
  def test_deleting_cookie_with_all_domain_option
614
    request.cookies[:user_name] = 'Joe'
615 616
    get :delete_cookie_with_domain
    assert_response :success
617
    assert_cookie_header "user_name=; domain=.nextangle.com; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
618 619
  end

620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640
  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
641
    request.cookies[:user_name] = 'Joe'
642 643
    get :delete_cookie_with_domain_and_tld
    assert_response :success
644
    assert_cookie_header "user_name=; domain=.nextangle.com; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
645 646
  end

647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669
  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"
670
    request.cookies[:user_name] = 'Joe'
671 672
    get :delete_cookie_with_domains
    assert_response :success
673
    assert_cookie_header "user_name=; domain=example2.com; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
674 675 676 677
  end

  def test_deletings_cookie_with_several_preset_domains_using_other_domain
    @request.host = "other-domain.com"
678
    request.cookies[:user_name] = 'Joe'
679 680
    get :delete_cookie_with_domains
    assert_response :success
681
    assert_cookie_header "user_name=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
682 683
  end

684
  def test_cookies_hash_is_indifferent_access
685 686 687 688 689 690
    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']
691 692
  end

S
steve 已提交
693 694


695
  def test_setting_request_cookies_is_indifferent_access
696 697
    cookies.clear
    cookies[:user_name] = "andrew"
698
    get :string_key_mock
699
    assert_equal "david", cookies['user_name']
700

701 702
    cookies.clear
    cookies['user_name'] = "andrew"
703
    get :symbol_key_mock
704
    assert_equal "david", cookies[:user_name]
705 706 707 708
  end

  def test_cookies_retained_across_requests
    get :symbol_key
709
    assert_cookie_header "user_name=david; path=/"
710 711 712 713 714 715 716 717 718 719 720 721 722 723 724
    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]

725
    cookies.clear
726 727 728 729 730 731 732
    get :noop
    assert_nil cookies[:user_name]

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

733
  def test_can_set_http_cookie_header
734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781
    @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]

782
    get :noop
783 784
    assert_equal 'david', cookies['user_name']
    assert_equal 'david', cookies[:user_name]
785 786
  end

J
Jeremy Kemper 已提交
787 788 789 790
  private
    def assert_cookie_header(expected)
      header = @response.headers["Set-Cookie"]
      if header.respond_to?(:to_str)
791
        assert_equal expected.split("\n").sort, header.split("\n").sort
J
Jeremy Kemper 已提交
792 793 794 795
      else
        assert_equal expected.split("\n"), header
      end
    end
796 797 798 799 800 801 802 803 804

    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
805
end
806 807

end