Skip to content

Commit e9dd3ee

Browse files
Add test for client disconnect cleanup behavior
Verifies that when a client disconnects during streaming: - IOError is properly propagated - Stream cleanup (close) still executes via ensure block - No chunks are written after the disconnect This test confirms that the error propagation + ensure block pattern (from commits 25c0ae2 and f9d493b) correctly handles cleanup without explicit rescue blocks for IOError/ClientDisconnected. Co-authored-by: Ihab Adham <ihabadham@users.noreply.github.com>
1 parent 38377bc commit e9dd3ee

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed

react_on_rails_pro/spec/react_on_rails_pro/stream_spec.rb

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,5 +485,61 @@ def setup_stream_test(component_count: 2)
485485
gaps = write_timestamps.each_cons(2).map { |a, b| b - a }
486486
expect(gaps.all? { |gap| gap >= 0.04 }).to be true
487487
end
488+
489+
it "properly cleans up when client disconnects" do
490+
queues, controller, stream = setup_stream_test(component_count: 2)
491+
492+
chunks_written = []
493+
cleanup_checks = {
494+
stream_close_called: false,
495+
queue_closed: false,
496+
writer_stopped: false
497+
}
498+
499+
# Simulate client disconnect after 3 chunks
500+
allow(stream).to receive(:write) do |chunk|
501+
chunks_written << chunk
502+
if chunks_written.length == 3
503+
# Simulate client disconnect
504+
raise IOError, "client disconnected"
505+
end
506+
end
507+
508+
allow(stream).to receive(:close) do
509+
cleanup_checks[:stream_close_called] = true
510+
end
511+
512+
# This should raise IOError but still clean up properly
513+
expect do
514+
run_stream(controller) do |_parent|
515+
# Enqueue chunks from both components
516+
queues[0].enqueue("A1")
517+
queues[0].enqueue("A2")
518+
queues[0].enqueue("A3")
519+
queues[1].enqueue("B1")
520+
queues[1].enqueue("B2")
521+
queues[1].enqueue("B3")
522+
523+
sleep 0.1
524+
525+
# Close queues
526+
queues[0].close
527+
queues[1].close
528+
529+
sleep 0.2
530+
end
531+
end.to raise_error(IOError, /client disconnected/)
532+
533+
# Verify cleanup happened
534+
expect(cleanup_checks[:stream_close_called]).to be true
535+
536+
# Verify exactly 3 chunks were written before disconnect
537+
expect(chunks_written.length).to eq(3)
538+
539+
# The test verifies that:
540+
# 1. The IOError was raised (error propagation works)
541+
# 2. Stream close was still called (ensure block executed)
542+
# 3. No more chunks were written after disconnect
543+
end
488544
end
489545
end

0 commit comments

Comments
 (0)