2009-05-12 19:21:34 -04:00
|
|
|
require 'abstract_unit'
|
2008-01-05 08:32:06 -05:00
|
|
|
require 'controller/fake_models'
|
2009-04-25 02:17:15 -04:00
|
|
|
require 'pathname'
|
2004-11-23 20:04:44 -05:00
|
|
|
|
2012-08-29 16:06:30 -04:00
|
|
|
class TestControllerWithExtraEtags < ActionController::Base
|
|
|
|
etag { nil }
|
|
|
|
etag { 'ab' }
|
|
|
|
etag { :cde }
|
|
|
|
etag { [:f] }
|
|
|
|
etag { nil }
|
|
|
|
|
|
|
|
def fresh
|
2014-08-16 18:06:20 -04:00
|
|
|
render text: "stale" if stale?(etag: '123', template: false)
|
2012-08-29 16:06:30 -04:00
|
|
|
end
|
2013-05-07 08:37:20 -04:00
|
|
|
|
|
|
|
def array
|
2014-08-16 18:06:20 -04:00
|
|
|
render text: "stale" if stale?(etag: %w(1 2 3), template: false)
|
|
|
|
end
|
|
|
|
|
|
|
|
def with_template
|
|
|
|
if stale? template: 'test/hello_world'
|
|
|
|
render text: 'stale'
|
|
|
|
end
|
2013-05-07 08:37:20 -04:00
|
|
|
end
|
2012-08-29 16:06:30 -04:00
|
|
|
end
|
|
|
|
|
2005-02-14 20:45:35 -05:00
|
|
|
class TestController < ActionController::Base
|
2008-12-25 14:28:08 -05:00
|
|
|
protect_from_forgery
|
|
|
|
|
2012-12-07 14:46:06 -05:00
|
|
|
before_action :set_variable_for_layout
|
2011-12-20 07:37:20 -05:00
|
|
|
|
2008-08-29 14:25:21 -04:00
|
|
|
class LabellingFormBuilder < ActionView::Helpers::FormBuilder
|
|
|
|
end
|
|
|
|
|
2005-02-14 20:45:35 -05:00
|
|
|
layout :determine_layout
|
2004-11-23 20:04:44 -05:00
|
|
|
|
2010-03-18 18:52:43 -04:00
|
|
|
def name
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
|
|
|
|
private :name
|
|
|
|
helper_method :name
|
|
|
|
|
2005-02-14 20:45:35 -05:00
|
|
|
def hello_world
|
|
|
|
end
|
2004-11-23 20:04:44 -05:00
|
|
|
|
2008-07-16 07:32:15 -04:00
|
|
|
def conditional_hello
|
2008-10-20 20:30:13 -04:00
|
|
|
if stale?(:last_modified => Time.now.utc.beginning_of_day, :etag => [:foo, 123])
|
2008-08-08 02:43:12 -04:00
|
|
|
render :action => 'hello_world'
|
|
|
|
end
|
2008-07-16 07:32:15 -04:00
|
|
|
end
|
2009-12-08 17:52:26 -05:00
|
|
|
|
2011-12-01 13:09:22 -05:00
|
|
|
def conditional_hello_with_record
|
2011-12-01 14:45:47 -05:00
|
|
|
record = Struct.new(:updated_at, :cache_key).new(Time.now.utc.beginning_of_day, "foo/123")
|
2012-01-14 15:25:11 -05:00
|
|
|
|
2011-12-01 13:09:22 -05:00
|
|
|
if stale?(record)
|
2013-08-05 17:58:20 -04:00
|
|
|
render :action => 'hello_world'
|
2008-08-29 14:25:21 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def conditional_hello_with_expires_in
|
|
|
|
expires_in 60.1.seconds
|
|
|
|
render :action => 'hello_world'
|
2008-08-29 14:25:21 -04:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def conditional_hello_with_expires_in_with_public
|
|
|
|
expires_in 1.minute, :public => true
|
|
|
|
render :action => 'hello_world'
|
2008-08-29 14:25:21 -04:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def conditional_hello_with_expires_in_with_must_revalidate
|
|
|
|
expires_in 1.minute, :must_revalidate => true
|
|
|
|
render :action => 'hello_world'
|
2008-07-16 07:32:15 -04:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def conditional_hello_with_expires_in_with_public_and_must_revalidate
|
|
|
|
expires_in 1.minute, :public => true, :must_revalidate => true
|
|
|
|
render :action => 'hello_world'
|
2012-03-26 16:37:36 -04:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def conditional_hello_with_expires_in_with_public_with_more_keys
|
|
|
|
expires_in 1.minute, :public => true, 's-maxage' => 5.hours
|
|
|
|
render :action => 'hello_world'
|
2008-07-16 07:32:15 -04:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def conditional_hello_with_expires_in_with_public_with_more_keys_old_syntax
|
|
|
|
expires_in 1.minute, :public => true, :private => nil, 's-maxage' => 5.hours
|
|
|
|
render :action => 'hello_world'
|
2008-08-29 14:25:21 -04:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def conditional_hello_with_expires_now
|
|
|
|
expires_now
|
|
|
|
render :action => 'hello_world'
|
2012-03-17 10:08:49 -04:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def conditional_hello_with_cache_control_headers
|
|
|
|
response.headers['Cache-Control'] = 'no-transform'
|
|
|
|
expires_now
|
|
|
|
render :action => 'hello_world'
|
2012-03-17 10:08:49 -04:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def conditional_hello_with_bangs
|
|
|
|
render :action => 'hello_world'
|
2012-03-17 10:08:49 -04:00
|
|
|
end
|
2013-08-05 17:58:20 -04:00
|
|
|
before_action :handle_last_modified_and_etags, :only=>:conditional_hello_with_bangs
|
2012-03-17 10:08:49 -04:00
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def handle_last_modified_and_etags
|
|
|
|
fresh_when(:last_modified => Time.now.utc.beginning_of_day, :etag => [ :foo, 123 ])
|
2008-08-29 14:25:21 -04:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def head_created
|
|
|
|
head :created
|
2008-08-29 14:25:21 -04:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def head_created_with_application_json_content_type
|
|
|
|
head :created, :content_type => "application/json"
|
2012-10-04 14:55:02 -04:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def head_ok_with_image_png_content_type
|
|
|
|
head :ok, :content_type => "image/png"
|
2008-08-29 14:25:21 -04:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def head_with_location_header
|
|
|
|
head :location => "/foo"
|
2012-11-13 16:02:41 -05:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def head_with_location_object
|
|
|
|
head :location => Customer.new("david", 1)
|
2008-08-29 14:25:21 -04:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def head_with_symbolic_status
|
|
|
|
head :status => params[:status].intern
|
2008-08-29 14:25:21 -04:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def head_with_integer_status
|
|
|
|
head :status => params[:status].to_i
|
2008-08-29 14:25:21 -04:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def head_with_string_status
|
|
|
|
head :status => params[:status]
|
2008-08-29 14:25:21 -04:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def head_with_custom_header
|
|
|
|
head :x_custom_header => "something"
|
2009-03-07 15:05:18 -05:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def head_with_www_authenticate_header
|
|
|
|
head 'WWW-Authenticate' => 'something'
|
2009-03-07 15:05:18 -05:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def head_with_status_code_first
|
|
|
|
head :forbidden, :x_custom_header => "something"
|
2008-08-29 14:25:21 -04:00
|
|
|
end
|
|
|
|
|
2014-12-31 06:21:55 -05:00
|
|
|
def head_with_no_content
|
|
|
|
# Fill in the headers with dummy data to make
|
|
|
|
# sure they get removed during the testing
|
|
|
|
response.headers["Content-Type"] = "dummy"
|
|
|
|
response.headers["Content-Length"] = 42
|
|
|
|
|
|
|
|
head 204
|
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
private
|
2008-08-29 14:25:21 -04:00
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def set_variable_for_layout
|
|
|
|
@variable_for_layout = nil
|
2008-08-29 14:25:21 -04:00
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def determine_layout
|
|
|
|
case action_name
|
|
|
|
when "hello_world", "layout_test", "rendering_without_layout",
|
|
|
|
"rendering_nothing_on_layout", "render_text_hello_world",
|
|
|
|
"render_text_hello_world_with_layout",
|
|
|
|
"hello_world_with_layout_false",
|
|
|
|
"partial_only", "accessing_params_in_template",
|
|
|
|
"accessing_params_in_template_with_layout",
|
|
|
|
"render_with_explicit_template",
|
|
|
|
"render_with_explicit_string_template",
|
|
|
|
"update_page", "update_page_with_instance_variables"
|
|
|
|
|
|
|
|
"layouts/standard"
|
|
|
|
when "action_talk_to_layout", "layout_overriding_layout"
|
|
|
|
"layouts/talk_from_action"
|
|
|
|
when "render_implicit_html_template_from_xhr_request"
|
|
|
|
(request.xhr? ? 'layouts/xhr' : 'layouts/standard')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class MetalTestController < ActionController::Metal
|
|
|
|
include AbstractController::Rendering
|
|
|
|
include ActionView::Rendering
|
|
|
|
include ActionController::Rendering
|
2014-06-05 15:31:35 -04:00
|
|
|
include ActionController::RackDelegation
|
|
|
|
|
2008-08-29 14:25:21 -04:00
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def accessing_logger_in_template
|
|
|
|
render :inline => "<%= logger.class %>"
|
2008-07-18 21:14:12 -04:00
|
|
|
end
|
2008-07-16 07:32:15 -04:00
|
|
|
end
|
|
|
|
|
2009-02-27 13:24:52 -05:00
|
|
|
class ExpiresInRenderTest < ActionController::TestCase
|
|
|
|
tests TestController
|
|
|
|
|
|
|
|
def test_expires_in_header
|
|
|
|
get :conditional_hello_with_expires_in
|
|
|
|
assert_equal "max-age=60, private", @response.headers["Cache-Control"]
|
|
|
|
end
|
2009-12-08 17:52:26 -05:00
|
|
|
|
2009-03-06 04:17:20 -05:00
|
|
|
def test_expires_in_header_with_public
|
2009-02-27 13:24:52 -05:00
|
|
|
get :conditional_hello_with_expires_in_with_public
|
|
|
|
assert_equal "max-age=60, public", @response.headers["Cache-Control"]
|
|
|
|
end
|
2009-12-08 17:52:26 -05:00
|
|
|
|
2012-02-17 08:16:58 -05:00
|
|
|
def test_expires_in_header_with_must_revalidate
|
|
|
|
get :conditional_hello_with_expires_in_with_must_revalidate
|
|
|
|
assert_equal "max-age=60, private, must-revalidate", @response.headers["Cache-Control"]
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_expires_in_header_with_public_and_must_revalidate
|
|
|
|
get :conditional_hello_with_expires_in_with_public_and_must_revalidate
|
|
|
|
assert_equal "max-age=60, public, must-revalidate", @response.headers["Cache-Control"]
|
|
|
|
end
|
|
|
|
|
2009-02-27 13:24:52 -05:00
|
|
|
def test_expires_in_header_with_additional_headers
|
|
|
|
get :conditional_hello_with_expires_in_with_public_with_more_keys
|
2012-03-02 05:40:57 -05:00
|
|
|
assert_equal "max-age=60, public, s-maxage=18000", @response.headers["Cache-Control"]
|
2009-02-27 13:24:52 -05:00
|
|
|
end
|
2009-12-08 17:52:26 -05:00
|
|
|
|
2009-02-27 13:24:52 -05:00
|
|
|
def test_expires_in_old_syntax
|
|
|
|
get :conditional_hello_with_expires_in_with_public_with_more_keys_old_syntax
|
2012-03-02 05:40:57 -05:00
|
|
|
assert_equal "max-age=60, public, s-maxage=18000", @response.headers["Cache-Control"]
|
2009-02-27 13:24:52 -05:00
|
|
|
end
|
2009-10-26 20:32:42 -04:00
|
|
|
|
|
|
|
def test_expires_now
|
|
|
|
get :conditional_hello_with_expires_now
|
|
|
|
assert_equal "no-cache", @response.headers["Cache-Control"]
|
|
|
|
end
|
2011-10-31 05:24:03 -04:00
|
|
|
|
2012-06-21 07:30:19 -04:00
|
|
|
def test_expires_now_with_cache_control_headers
|
Ensure that cache-control headers are merged
There are several aspects to this commit, that don't well fit into broken down
commits, so they are detailed here:
* When a user uses response.headers['Cache-Control'] = some_value, then the
documented convention in ConditionalGet is not adhered to, in this case,
response.cache_control is ignored due to `return if
self[CACHE_CONTROL].present?`
* When a middleware sets cache-control headers that would clobber, they're
converted to symbols directly, without underscores. This would lead to bugs.
* Items that would live in :extras if set through expires_in, are placed
directly in the @cache_control hash, and not respected in many cases
(somewhat adhering to the aforementioned documentation).
* Although quite useless, any directive named 'extras' would be ignored.
The general convention applied is that expires_* take precedence, but no longer
overwrite everything and expires_* are ALWAYS applied, even if the header is
set.
I am still unhappy about the contents of this commit, and the code in general.
Ideally it should be refactored to no longer use :extras. I'd likely recommend
expanding @cache_control into a class, and giving it the power to handle the
merge in a more efficient fashion. Such a commit would be a larger change that
could have additional semantic changes for other libraries unless they utilize
expires_in in very standard ways.
2012-06-18 19:49:03 -04:00
|
|
|
get :conditional_hello_with_cache_control_headers
|
2012-06-21 07:30:19 -04:00
|
|
|
assert_match(/no-cache/, @response.headers["Cache-Control"])
|
|
|
|
assert_match(/no-transform/, @response.headers["Cache-Control"])
|
Ensure that cache-control headers are merged
There are several aspects to this commit, that don't well fit into broken down
commits, so they are detailed here:
* When a user uses response.headers['Cache-Control'] = some_value, then the
documented convention in ConditionalGet is not adhered to, in this case,
response.cache_control is ignored due to `return if
self[CACHE_CONTROL].present?`
* When a middleware sets cache-control headers that would clobber, they're
converted to symbols directly, without underscores. This would lead to bugs.
* Items that would live in :extras if set through expires_in, are placed
directly in the @cache_control hash, and not respected in many cases
(somewhat adhering to the aforementioned documentation).
* Although quite useless, any directive named 'extras' would be ignored.
The general convention applied is that expires_* take precedence, but no longer
overwrite everything and expires_* are ALWAYS applied, even if the header is
set.
I am still unhappy about the contents of this commit, and the code in general.
Ideally it should be refactored to no longer use :extras. I'd likely recommend
expanding @cache_control into a class, and giving it the power to handle the
merge in a more efficient fashion. Such a commit would be a larger change that
could have additional semantic changes for other libraries unless they utilize
expires_in in very standard ways.
2012-06-18 19:49:03 -04:00
|
|
|
end
|
|
|
|
|
2011-10-31 05:24:03 -04:00
|
|
|
def test_date_header_when_expires_in
|
|
|
|
time = Time.mktime(2011,10,30)
|
|
|
|
Time.stubs(:now).returns(time)
|
|
|
|
get :conditional_hello_with_expires_in
|
|
|
|
assert_equal Time.now.httpdate, @response.headers["Date"]
|
|
|
|
end
|
2009-02-27 13:24:52 -05:00
|
|
|
end
|
|
|
|
|
2008-11-07 15:42:34 -05:00
|
|
|
class LastModifiedRenderTest < ActionController::TestCase
|
|
|
|
tests TestController
|
2007-04-24 13:52:03 -04:00
|
|
|
|
2008-11-07 15:42:34 -05:00
|
|
|
def setup
|
2009-04-08 20:33:06 -04:00
|
|
|
super
|
2008-07-16 07:32:15 -04:00
|
|
|
@last_modified = Time.now.utc.beginning_of_day.httpdate
|
2007-06-05 12:51:49 -04:00
|
|
|
end
|
|
|
|
|
2008-07-16 07:32:15 -04:00
|
|
|
def test_responds_with_last_modified
|
|
|
|
get :conditional_hello
|
|
|
|
assert_equal @last_modified, @response.headers['Last-Modified']
|
2007-05-14 23:15:36 -04:00
|
|
|
end
|
|
|
|
|
2008-07-16 07:32:15 -04:00
|
|
|
def test_request_not_modified
|
2008-08-08 05:31:12 -04:00
|
|
|
@request.if_modified_since = @last_modified
|
2008-07-16 07:32:15 -04:00
|
|
|
get :conditional_hello
|
2009-05-11 15:04:43 -04:00
|
|
|
assert_equal 304, @response.status.to_i
|
2013-01-05 11:59:36 -05:00
|
|
|
assert @response.body.blank?
|
2008-07-16 07:32:15 -04:00
|
|
|
assert_equal @last_modified, @response.headers['Last-Modified']
|
2007-10-25 02:38:01 -04:00
|
|
|
end
|
|
|
|
|
2008-10-20 20:30:13 -04:00
|
|
|
def test_request_not_modified_but_etag_differs
|
|
|
|
@request.if_modified_since = @last_modified
|
|
|
|
@request.if_none_match = "234"
|
|
|
|
get :conditional_hello
|
|
|
|
assert_response :success
|
|
|
|
end
|
|
|
|
|
2008-07-16 07:32:15 -04:00
|
|
|
def test_request_modified
|
2008-08-08 05:31:12 -04:00
|
|
|
@request.if_modified_since = 'Thu, 16 Jul 2008 00:00:00 GMT'
|
2008-07-16 07:32:15 -04:00
|
|
|
get :conditional_hello
|
2009-05-11 15:04:43 -04:00
|
|
|
assert_equal 200, @response.status.to_i
|
2013-01-05 11:59:36 -05:00
|
|
|
assert @response.body.present?
|
2008-07-16 07:32:15 -04:00
|
|
|
assert_equal @last_modified, @response.headers['Last-Modified']
|
2007-12-09 17:11:37 -05:00
|
|
|
end
|
2008-11-17 23:09:22 -05:00
|
|
|
|
2011-12-01 13:09:22 -05:00
|
|
|
|
|
|
|
def test_responds_with_last_modified_with_record
|
|
|
|
get :conditional_hello_with_record
|
|
|
|
assert_equal @last_modified, @response.headers['Last-Modified']
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_request_not_modified_with_record
|
|
|
|
@request.if_modified_since = @last_modified
|
|
|
|
get :conditional_hello_with_record
|
|
|
|
assert_equal 304, @response.status.to_i
|
2013-01-05 11:59:36 -05:00
|
|
|
assert @response.body.blank?
|
2011-12-01 13:09:22 -05:00
|
|
|
assert_equal @last_modified, @response.headers['Last-Modified']
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_request_not_modified_but_etag_differs_with_record
|
|
|
|
@request.if_modified_since = @last_modified
|
|
|
|
@request.if_none_match = "234"
|
|
|
|
get :conditional_hello_with_record
|
|
|
|
assert_response :success
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_request_modified_with_record
|
|
|
|
@request.if_modified_since = 'Thu, 16 Jul 2008 00:00:00 GMT'
|
|
|
|
get :conditional_hello_with_record
|
|
|
|
assert_equal 200, @response.status.to_i
|
2013-01-05 11:59:36 -05:00
|
|
|
assert @response.body.present?
|
2011-12-01 13:09:22 -05:00
|
|
|
assert_equal @last_modified, @response.headers['Last-Modified']
|
|
|
|
end
|
|
|
|
|
2008-09-30 11:00:38 -04:00
|
|
|
def test_request_with_bang_gets_last_modified
|
|
|
|
get :conditional_hello_with_bangs
|
|
|
|
assert_equal @last_modified, @response.headers['Last-Modified']
|
|
|
|
assert_response :success
|
|
|
|
end
|
2008-11-17 23:09:22 -05:00
|
|
|
|
2008-09-30 11:00:38 -04:00
|
|
|
def test_request_with_bang_obeys_last_modified
|
|
|
|
@request.if_modified_since = @last_modified
|
|
|
|
get :conditional_hello_with_bangs
|
|
|
|
assert_response :not_modified
|
|
|
|
end
|
2008-10-07 15:09:07 -04:00
|
|
|
|
|
|
|
def test_last_modified_works_with_less_than_too
|
|
|
|
@request.if_modified_since = 5.years.ago.httpdate
|
|
|
|
get :conditional_hello_with_bangs
|
2008-10-20 20:30:13 -04:00
|
|
|
assert_response :success
|
2008-10-07 15:09:07 -04:00
|
|
|
end
|
2010-05-16 03:34:46 -04:00
|
|
|
end
|
2012-06-15 16:52:22 -04:00
|
|
|
|
2012-08-29 16:06:30 -04:00
|
|
|
class EtagRenderTest < ActionController::TestCase
|
|
|
|
tests TestControllerWithExtraEtags
|
|
|
|
|
|
|
|
def test_multiple_etags
|
2013-05-07 08:37:20 -04:00
|
|
|
@request.if_none_match = etag(["123", 'ab', :cde, [:f]])
|
2012-08-29 16:06:30 -04:00
|
|
|
get :fresh
|
|
|
|
assert_response :not_modified
|
|
|
|
|
|
|
|
@request.if_none_match = %("nomatch")
|
|
|
|
get :fresh
|
|
|
|
assert_response :success
|
|
|
|
end
|
2013-05-07 08:37:20 -04:00
|
|
|
|
|
|
|
def test_array
|
|
|
|
@request.if_none_match = etag([%w(1 2 3), 'ab', :cde, [:f]])
|
|
|
|
get :array
|
|
|
|
assert_response :not_modified
|
|
|
|
|
|
|
|
@request.if_none_match = %("nomatch")
|
|
|
|
get :array
|
|
|
|
assert_response :success
|
|
|
|
end
|
|
|
|
|
2014-08-16 18:06:20 -04:00
|
|
|
def test_etag_reflects_template_digest
|
|
|
|
get :with_template
|
|
|
|
assert_response :ok
|
|
|
|
assert_not_nil etag = @response.etag
|
|
|
|
|
|
|
|
request.if_none_match = etag
|
|
|
|
get :with_template
|
|
|
|
assert_response :not_modified
|
|
|
|
|
|
|
|
# Modify the template digest
|
|
|
|
path = File.expand_path('../../fixtures/test/hello_world.erb', __FILE__)
|
|
|
|
old = File.read(path)
|
|
|
|
|
|
|
|
begin
|
|
|
|
File.write path, 'foo'
|
|
|
|
ActionView::Digestor.cache.clear
|
|
|
|
|
|
|
|
request.if_none_match = etag
|
|
|
|
get :with_template
|
|
|
|
assert_response :ok
|
|
|
|
assert_not_equal etag, @response.etag
|
|
|
|
ensure
|
|
|
|
File.write path, old
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-05-07 08:37:20 -04:00
|
|
|
def etag(record)
|
|
|
|
Digest::MD5.hexdigest(ActiveSupport::Cache.expand_cache_key(record)).inspect
|
|
|
|
end
|
2012-08-29 16:06:30 -04:00
|
|
|
end
|
|
|
|
|
2012-06-15 16:52:22 -04:00
|
|
|
class MetalRenderTest < ActionController::TestCase
|
|
|
|
tests MetalTestController
|
|
|
|
|
|
|
|
def test_access_to_logger_in_view
|
|
|
|
get :accessing_logger_in_template
|
|
|
|
assert_equal "NilClass", @response.body
|
|
|
|
end
|
|
|
|
end
|
2013-08-05 17:58:20 -04:00
|
|
|
|
|
|
|
class HeadRenderTest < ActionController::TestCase
|
|
|
|
tests TestController
|
|
|
|
|
|
|
|
def setup
|
|
|
|
@request.host = "www.nextangle.com"
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_head_created
|
|
|
|
post :head_created
|
|
|
|
assert @response.body.blank?
|
|
|
|
assert_response :created
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_head_created_with_application_json_content_type
|
|
|
|
post :head_created_with_application_json_content_type
|
|
|
|
assert @response.body.blank?
|
|
|
|
assert_equal "application/json", @response.header["Content-Type"]
|
|
|
|
assert_response :created
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_head_ok_with_image_png_content_type
|
|
|
|
post :head_ok_with_image_png_content_type
|
|
|
|
assert @response.body.blank?
|
|
|
|
assert_equal "image/png", @response.header["Content-Type"]
|
|
|
|
assert_response :ok
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_head_with_location_header
|
|
|
|
get :head_with_location_header
|
|
|
|
assert @response.body.blank?
|
|
|
|
assert_equal "/foo", @response.headers["Location"]
|
|
|
|
assert_response :ok
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_head_with_location_object
|
|
|
|
with_routing do |set|
|
|
|
|
set.draw do
|
|
|
|
resources :customers
|
|
|
|
get ':controller/:action'
|
|
|
|
end
|
|
|
|
|
|
|
|
get :head_with_location_object
|
|
|
|
assert @response.body.blank?
|
|
|
|
assert_equal "http://www.nextangle.com/customers/1", @response.headers["Location"]
|
|
|
|
assert_response :ok
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_head_with_custom_header
|
|
|
|
get :head_with_custom_header
|
|
|
|
assert @response.body.blank?
|
|
|
|
assert_equal "something", @response.headers["X-Custom-Header"]
|
|
|
|
assert_response :ok
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_head_with_www_authenticate_header
|
|
|
|
get :head_with_www_authenticate_header
|
|
|
|
assert @response.body.blank?
|
|
|
|
assert_equal "something", @response.headers["WWW-Authenticate"]
|
|
|
|
assert_response :ok
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_head_with_symbolic_status
|
|
|
|
get :head_with_symbolic_status, :status => "ok"
|
|
|
|
assert_equal 200, @response.status
|
|
|
|
assert_response :ok
|
|
|
|
|
|
|
|
get :head_with_symbolic_status, :status => "not_found"
|
|
|
|
assert_equal 404, @response.status
|
|
|
|
assert_response :not_found
|
|
|
|
|
|
|
|
get :head_with_symbolic_status, :status => "no_content"
|
|
|
|
assert_equal 204, @response.status
|
|
|
|
assert !@response.headers.include?('Content-Length')
|
|
|
|
assert_response :no_content
|
|
|
|
|
|
|
|
Rack::Utils::SYMBOL_TO_STATUS_CODE.each do |status, code|
|
|
|
|
get :head_with_symbolic_status, :status => status.to_s
|
|
|
|
assert_equal code, @response.response_code
|
|
|
|
assert_response status
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_head_with_integer_status
|
|
|
|
Rack::Utils::HTTP_STATUS_CODES.each do |code, message|
|
|
|
|
get :head_with_integer_status, :status => code.to_s
|
|
|
|
assert_equal message, @response.message
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-12-31 06:21:55 -05:00
|
|
|
def test_head_with_no_content
|
|
|
|
get :head_with_no_content
|
|
|
|
|
|
|
|
assert_equal 204, @response.status
|
|
|
|
assert_nil @response.headers["Content-Type"]
|
|
|
|
assert_nil @response.headers["Content-Length"]
|
|
|
|
end
|
|
|
|
|
2013-08-05 17:58:20 -04:00
|
|
|
def test_head_with_string_status
|
|
|
|
get :head_with_string_status, :status => "404 Eat Dirt"
|
|
|
|
assert_equal 404, @response.response_code
|
|
|
|
assert_equal "Not Found", @response.message
|
|
|
|
assert_response :not_found
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_head_with_status_code_first
|
|
|
|
get :head_with_status_code_first
|
|
|
|
assert_equal 403, @response.response_code
|
|
|
|
assert_equal "Forbidden", @response.message
|
|
|
|
assert_equal "something", @response.headers["X-Custom-Header"]
|
|
|
|
assert_response :forbidden
|
|
|
|
end
|
2013-12-04 20:13:04 -05:00
|
|
|
end
|