Skip to content

Commit 47ca8b1

Browse files
ihabadhamclaude
andcommitted
Improve client disconnect tests: add Errno::EPIPE coverage
- Reorganize disconnect tests under "client disconnect handling" describe block - Add test for Errno::EPIPE (broken pipe) in addition to IOError - Simplify test names: "stops writing on IOError/Errno::EPIPE" - Clean up comments and remove redundant assertions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
1 parent 3ae39e5 commit 47ca8b1

File tree

1 file changed

+48
-27
lines changed

1 file changed

+48
-27
lines changed

react_on_rails_pro/spec/react_on_rails_pro/stream_spec.rb

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -491,40 +491,61 @@ def setup_stream_test(component_count: 2)
491491
expect(gaps.all? { |gap| gap >= 0.04 }).to be true
492492
end
493493

494-
it "stops writing when client disconnects" do
495-
queues, controller, stream = setup_stream_test(component_count: 1)
494+
describe "client disconnect handling" do
495+
it "stops writing on IOError" do
496+
queues, controller, stream = setup_stream_test(component_count: 1)
496497

497-
written_chunks = []
498-
write_count = 0
498+
written_chunks = []
499+
write_count = 0
499500

500-
# Simulate client disconnect: IOError on third write
501-
allow(stream).to receive(:write) do |chunk|
502-
write_count += 1
503-
raise IOError, "client disconnected" if write_count == 3
501+
allow(stream).to receive(:write) do |chunk|
502+
write_count += 1
503+
raise IOError, "client disconnected" if write_count == 3
504504

505-
written_chunks << chunk
506-
end
505+
written_chunks << chunk
506+
end
507507

508-
# closed? stub required by setup but not used by StreamController's simple enqueue logic
509-
allow(stream).to receive(:closed?).and_return(false)
508+
run_stream(controller) do |_parent|
509+
queues[0].enqueue("Chunk1")
510+
sleep 0.05
511+
queues[0].enqueue("Chunk2")
512+
sleep 0.05
513+
queues[0].enqueue("Chunk3")
514+
sleep 0.05
515+
queues[0].enqueue("Chunk4")
516+
queues[0].close
517+
sleep 0.1
518+
end
510519

511-
run_stream(controller) do |_parent|
512-
queues[0].enqueue("Chunk1")
513-
sleep 0.05
514-
queues[0].enqueue("Chunk2")
515-
sleep 0.05
516-
queues[0].enqueue("Chunk3") # This write will raise IOError
517-
sleep 0.05
518-
queues[0].enqueue("Chunk4") # Should not be written
519-
queues[0].close
520-
sleep 0.1
520+
# Write 1: TEMPLATE, Write 2: Chunk1, Write 3: Chunk2 (raises IOError)
521+
expect(written_chunks).to eq(%w[TEMPLATE Chunk1])
521522
end
522523

523-
# Writer catches IOError and stops - only successful writes recorded
524-
# Write 1: TEMPLATE (success), Write 2: Chunk1 (success), Write 3: Chunk2 (IOError)
525-
expect(written_chunks.length).to eq(2)
526-
expect(written_chunks).to include("TEMPLATE")
527-
expect(written_chunks).to include("Chunk1")
524+
it "stops writing on Errno::EPIPE" do
525+
queues, controller, stream = setup_stream_test(component_count: 1)
526+
527+
written_chunks = []
528+
write_count = 0
529+
530+
allow(stream).to receive(:write) do |chunk|
531+
write_count += 1
532+
raise Errno::EPIPE, "broken pipe" if write_count == 3
533+
534+
written_chunks << chunk
535+
end
536+
537+
run_stream(controller) do |_parent|
538+
queues[0].enqueue("Chunk1")
539+
sleep 0.05
540+
queues[0].enqueue("Chunk2")
541+
sleep 0.05
542+
queues[0].enqueue("Chunk3")
543+
queues[0].close
544+
sleep 0.1
545+
end
546+
547+
expect(written_chunks).to eq(%w[TEMPLATE Chunk1])
548+
end
528549
end
529550
end
530551
end

0 commit comments

Comments
 (0)