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
Ryan T. Hosford b43158afba Fixes #23964
- Adds #each_chunk to ActionDispatch::Response. it's a method which
    will be called by ActionDispatch::Response#each.
  - Make Response#each a proper method instead of delegating to @stream
  - In Live, instead of overriding #each, override #each_chunk.
  - `#each` should just spit out @str_body if it's already set
  - Adds #test_set_header_after_read_body_during_action
    to prove this fixes #23964
  - Adds #test_each_isnt_called_if_str_body_is_written to
    ensure #each_chunk is not called when @str_body is available
  - Call `@response.sent!` in AC::TestCase's #perform so a test response
    acts a bit more like a real response. Makes test that call  `#assert_stream_closed`
    pass again.
  - Additionally assert `#committed?` in `#assert_stream_closed`
  - Make test that was calling @response.stream.each pass again by
    calling @response.each instead.
2016-03-13 19:51:49 -05:00

96 lines
2.6 KiB
Ruby

require 'abstract_unit'
require 'concurrent/atomic/count_down_latch'
module ActionController
module Live
class ResponseTest < ActiveSupport::TestCase
def setup
@response = Live::Response.new
@response.request = ActionDispatch::Request.empty
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 = Concurrent::CountDownLatch.new
t = Thread.new {
@response.stream.write 'foo'
latch.wait
@response.stream.close
}
@response.await_commit
@response.each do |part|
assert_equal 'foo', part
latch.count_down
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 = Concurrent::CountDownLatch.new
t = Thread.new {
@response.each do
latch.count_down
end
}
latch.wait
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
# we can add data until it's actually written, which happens on `each`
@response.each { |x| }
e = assert_raises(ActionDispatch::IllegalStateError) do
@response.headers['Content-Length'] = "zomg"
end
assert_equal 'header already sent', e.message
end
end
end
end