1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/actionpack/test/dispatch/live_response_test.rb
Aaron Patterson 3df07d093a use the body proxy to freeze headers
avoid freezing the headers until the web server has actually read data
from the body proxy.  Once the webserver has read data, then we should
throw an error if someone tries to set a header
2014-03-12 17:40:08 -07:00

94 lines
2.5 KiB
Ruby

require 'abstract_unit'
require 'active_support/concurrency/latch'
module ActionController
module Live
class ResponseTest < ActiveSupport::TestCase
def setup
@response = Live::Response.new
@response.request = ActionDispatch::Request.new({}) #yolo
end
def test_header_merge
header = @response.header.merge('Foo' => 'Bar')
assert_kind_of(ActionController::Live::Response::Header, header)
assert_not_equal header, @response.header
end
def test_initialize_with_default_headers
r = Class.new(Live::Response) do
def self.default_headers
{ 'omg' => 'g' }
end
end
header = r.new.header
assert_kind_of(ActionController::Live::Response::Header, header)
end
def test_parallel
latch = ActiveSupport::Concurrency::Latch.new
t = Thread.new {
@response.stream.write 'foo'
latch.await
@response.stream.close
}
@response.await_commit
@response.each do |part|
assert_equal 'foo', part
latch.release
end
assert t.join
end
def test_setting_body_populates_buffer
@response.body = 'omg'
@response.close
assert_equal ['omg'], @response.body_parts
end
def test_cache_control_is_set
@response.stream.write 'omg'
assert_equal 'no-cache', @response.headers['Cache-Control']
end
def test_content_length_is_removed
@response.headers['Content-Length'] = "1234"
@response.stream.write 'omg'
assert_nil @response.headers['Content-Length']
end
def test_headers_cannot_be_written_after_webserver_reads
@response.stream.write 'omg'
latch = ActiveSupport::Concurrency::Latch.new
t = Thread.new {
@response.stream.each do |chunk|
latch.release
end
}
latch.await
assert @response.headers.frozen?
e = assert_raises(ActionDispatch::IllegalStateError) do
@response.headers['Content-Length'] = "zomg"
end
assert_equal 'header already sent', e.message
@response.stream.close
t.join
end
def test_headers_cannot_be_written_after_close
@response.stream.close
e = assert_raises(ActionDispatch::IllegalStateError) do
@response.headers['Content-Length'] = "zomg"
end
assert_equal 'header already sent', e.message
end
end
end
end