提交 d4658d86 编写于 作者: A Andrew White

Refactor ActionController::TestCase cookies

Assigning cookies for test cases should now use cookies[], e.g:

  cookies[:email] = 'user@example.com'
  get :index
  assert_equal 'user@example.com', cookies[:email]

To clear the cookies, use clear, e.g:

  cookies.clear
  get :index
  assert_nil cookies[:email]

We now no longer write out HTTP_COOKIE and the cookie jar is
persistent between requests so if you need to manipulate the environment
for your test you need to do it before the cookie jar is created.
上级 64325a82
*Rails 3.1.0 (unreleased)*
* Refactor ActionController::TestCase cookies [Andrew White]
Assigning cookies for test cases should now use cookies[], e.g:
cookies[:email] = 'user@example.com'
get :index
assert_equal 'user@example.com', cookies[:email]
To clear the cookies, use clear, e.g:
cookies.clear
get :index
assert_nil cookies[:email]
We now no longer write out HTTP_COOKIE and the cookie jar is
persistent between requests so if you need to manipulate the environment
for your test you need to do it before the cookie jar is created.
* Added 'ActionView::Helpers::FormHelper.fields_for_with_index', similar to fields_for but allows to have access to the current iteration index [Jorge Bejar]
* Warn if we cannot verify CSRF token authenticity [José Valim]
......
......@@ -175,10 +175,6 @@ def assign_parameters(routes, controller_path, action, parameters = {})
end
def recycle!
write_cookies!
@env.delete('HTTP_COOKIE') if @cookies.blank?
@env.delete('action_dispatch.cookies')
@cookies = nil
@formats = nil
@env.delete_if { |k, v| k =~ /^(action_dispatch|rack)\.request/ }
@env.delete_if { |k, v| k =~ /^action_dispatch\.rescue/ }
......@@ -186,6 +182,7 @@ def recycle!
@method = @request_method = nil
@fullpath = @ip = @remote_ip = nil
@env['action_dispatch.request.query_parameters'] = {}
cookie_jar.reset!
end
end
......@@ -301,18 +298,17 @@ def exists?
# For redirects within the same controller, you can even call follow_redirect and the redirect will be followed, triggering another
# action call which can then be asserted against.
#
# == Manipulating the request collections
# == Manipulating session and cookie variables
#
# The collections described above link to the response, so you can test if what the actions were expected to do happened. But
# sometimes you also want to manipulate these collections in the incoming request. This is really only relevant for sessions
# and cookies, though. For sessions, you just do:
# Sometimes you need to set up the session and cookie variables for a test.
# To do this just assign a value to the session or cookie collection:
#
# @request.session[:key] = "value"
# @request.cookies[:key] = "value"
# session[:key] = "value"
# cookies[:key] = "value"
#
# To clear the cookies for a test just clear the request's cookies hash:
# To clear the cookies for a test just clear the cookie collection:
#
# @request.cookies.clear
# cookies.clear
#
# == \Testing named routes
#
......@@ -450,7 +446,6 @@ def process(action, parameters = nil, session = nil, flash = nil, http_method =
@controller.process_with_new_base_test(@request, @response)
@assigns = @controller.respond_to?(:view_assigns) ? @controller.view_assigns : {}
@request.session.delete('flash') if @request.session['flash'].blank?
@request.cookies.merge!(@response.cookies)
@response
end
......
......@@ -185,6 +185,11 @@ def delete(key, options = {})
value
end
# Removes all cookies on the client machine by calling <tt>delete</tt> for each cookie
def clear(options = {})
@cookies.each_key{ |k| delete(k, options) }
end
# Returns a jar that'll automatically set the assigned cookies to have an expiration date 20 years from now. Example:
#
# cookies.permanent[:prefers_open_id] = true
......@@ -222,6 +227,11 @@ def write(headers)
@delete_cookies.each { |k, v| ::Rack::Utils.delete_cookie_header!(headers, k, v) }
end
def reset! #:nodoc:
@set_cookies.clear
@delete_cookies.clear
end
private
def write_cookie?(cookie)
......
......@@ -22,7 +22,7 @@ def flash
end
def cookies
@request.cookies.merge(@response.cookies).with_indifferent_access
@request.cookie_jar
end
def redirect_to_url
......
......@@ -20,12 +20,6 @@ def initialize(env = {})
self.user_agent = 'Rails Testing'
end
def env
write_cookies!
delete_nil_values!
super
end
def request_method=(method)
@env['REQUEST_METHOD'] = method.to_s.upcase
end
......@@ -70,24 +64,5 @@ def accept=(mime_types)
@env.delete('action_dispatch.request.accepts')
@env['HTTP_ACCEPT'] = Array(mime_types).collect { |mime_type| mime_type.to_s }.join(",")
end
def cookies
@cookies ||= super
end
private
def write_cookies!
unless @cookies.blank?
@env['HTTP_COOKIE'] = @cookies.map { |name, value| escape_cookie(name, value) }.join('; ')
end
end
def escape_cookie(name, value)
"#{Rack::Utils.escape(name)}=#{Rack::Utils.escape(value)}"
end
def delete_nil_values!
@env.delete_if { |k, v| v.nil? }
end
end
end
......@@ -593,13 +593,13 @@ def test_symbolized_path_params_reset_after_request
end
def test_should_have_knowledge_of_client_side_cookie_state_even_if_they_are_not_set
@request.cookies['foo'] = 'bar'
cookies['foo'] = 'bar'
get :no_op
assert_equal 'bar', cookies['foo']
end
def test_should_detect_if_cookie_is_deleted
@request.cookies['foo'] = 'bar'
cookies['foo'] = 'bar'
get :delete_cookie
assert_nil cookies['foo']
end
......
......@@ -430,54 +430,48 @@ def test_cookies_hash_is_indifferent_access
def test_setting_request_cookies_is_indifferent_access
@request.cookies.clear
@request.cookies[:user_name] = "andrew"
cookies.clear
cookies[:user_name] = "andrew"
get :string_key_mock
assert_equal "david", cookies[:user_name]
assert_equal "david", cookies['user_name']
@request.cookies.clear
@request.cookies['user_name'] = "andrew"
cookies.clear
cookies['user_name'] = "andrew"
get :symbol_key_mock
assert_equal "david", cookies['user_name']
assert_equal "david", cookies[:user_name]
end
def test_cookies_retained_across_requests
get :symbol_key
assert_equal "user_name=david; path=/", @response.headers["Set-Cookie"]
assert_cookie_header "user_name=david; path=/"
assert_equal "david", cookies[:user_name]
get :noop
assert_nil @response.headers["Set-Cookie"]
assert_equal "user_name=david", @request.env['HTTP_COOKIE']
assert_equal "david", cookies[:user_name]
get :noop
assert_nil @response.headers["Set-Cookie"]
assert_equal "user_name=david", @request.env['HTTP_COOKIE']
assert_equal "david", cookies[:user_name]
end
def test_cookies_can_be_cleared
get :symbol_key
assert_equal "user_name=david; path=/", @response.headers["Set-Cookie"]
assert_equal "david", cookies[:user_name]
@request.cookies.clear
cookies.clear
get :noop
assert_nil @response.headers["Set-Cookie"]
assert_nil @request.env['HTTP_COOKIE']
assert_nil cookies[:user_name]
get :symbol_key
assert_equal "user_name=david; path=/", @response.headers["Set-Cookie"]
assert_equal "david", cookies[:user_name]
end
def test_cookies_are_escaped
@request.cookies[:user_ids] = '1;2'
def test_can_set_http_cookie_header
@request.env['HTTP_COOKIE'] = "user_name=david"
get :noop
assert_equal "user_ids=1%3B2", @request.env['HTTP_COOKIE']
assert_equal "1;2", cookies[:user_ids]
assert_equal 'david', cookies['user_name']
assert_equal 'david', cookies[:user_name]
end
private
......
......@@ -34,12 +34,15 @@ class TestRequestTest < ActiveSupport::TestCase
assert_equal({}, req.cookies)
assert_equal nil, req.env["HTTP_COOKIE"]
req.cookies["user_name"] = "david"
assert_equal({"user_name" => "david"}, req.cookies)
assert_equal "user_name=david", req.env["HTTP_COOKIE"]
req.cookie_jar["user_name"] = "david"
assert_cookies({"user_name" => "david"}, req.cookie_jar)
req.cookies["login"] = "XJ-122"
assert_equal({"user_name" => "david", "login" => "XJ-122"}, req.cookies)
assert_equal %w(login=XJ-122 user_name=david), req.env["HTTP_COOKIE"].split(/; /).sort
req.cookie_jar["login"] = "XJ-122"
assert_cookies({"user_name" => "david", "login" => "XJ-122"}, req.cookie_jar)
end
private
def assert_cookies(expected, cookie_jar)
assert_equal(expected, cookie_jar.instance_variable_get("@cookies"))
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册