You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

interceptor_spec.rb 3.8 kB

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. # frozen_string_literal: true
  2. require 'spec_helper'
  3. require 'cucumber/formatter/interceptor'
  4. module Cucumber::Formatter
  5. describe Interceptor::Pipe do
  6. let(:pipe) { instance_spy(IO) }
  7. describe '#wrap!' do
  8. it 'raises an ArgumentError if its not passed :stderr/:stdout' do
  9. expect { Interceptor::Pipe.wrap(:nonsense) }.to raise_error(ArgumentError)
  10. end
  11. context 'when passed :stderr' do
  12. before :each do
  13. @stderr = $stderr
  14. end
  15. it 'wraps $stderr' do
  16. wrapped = Interceptor::Pipe.wrap(:stderr)
  17. expect($stderr).to be_instance_of Interceptor::Pipe
  18. expect($stderr).to be wrapped
  19. end
  20. after :each do
  21. $stderr = @stderr
  22. end
  23. end
  24. context 'when passed :stdout' do
  25. before :each do
  26. @stdout = $stdout
  27. end
  28. it 'wraps $stdout' do
  29. wrapped = Interceptor::Pipe.wrap(:stdout)
  30. expect($stdout).to be_instance_of Interceptor::Pipe
  31. expect($stdout).to be wrapped
  32. end
  33. after :each do
  34. $stdout = @stdout
  35. end
  36. end
  37. end
  38. describe '#unwrap!' do
  39. before :each do
  40. @stdout = $stdout
  41. $stdout = pipe
  42. @wrapped = Interceptor::Pipe.wrap(:stdout)
  43. end
  44. it 'raises an ArgumentError if it wasn\'t passed :stderr/:stdout' do
  45. expect { Interceptor::Pipe.unwrap!(:nonsense) }.to raise_error(ArgumentError)
  46. end
  47. it 'resets $stdout when #unwrap! is called' do
  48. interceptor = Interceptor::Pipe.unwrap! :stdout
  49. expect(interceptor).to be_instance_of Interceptor::Pipe
  50. expect($stdout).not_to be interceptor
  51. end
  52. it 'noops if $stdout or $stderr has been overwritten' do
  53. $stdout = StringIO.new
  54. pipe = Interceptor::Pipe.unwrap! :stdout
  55. expect(pipe).to eq $stdout
  56. $stderr = StringIO.new
  57. pipe = Interceptor::Pipe.unwrap! :stderr
  58. expect(pipe).to eq $stderr
  59. end
  60. it 'disables the pipe bypass' do
  61. buffer = '(::)'
  62. Interceptor::Pipe.unwrap! :stdout
  63. @wrapped.write(buffer)
  64. expect(@wrapped.buffer_string).not_to end_with(buffer)
  65. end
  66. after :each do
  67. $stdout = @stdout
  68. end
  69. end
  70. describe '#write' do
  71. let(:buffer) { 'Some stupid buffer' }
  72. let(:pi) { Interceptor::Pipe.new(pipe) }
  73. it 'writes arguments to the original pipe' do
  74. expect(pipe).to receive(:write).with(buffer) { buffer.size }
  75. expect(pi.write(buffer)).to eq buffer.size
  76. end
  77. it 'adds the buffer to its stored output' do
  78. expect(pipe).to receive(:write).with(buffer)
  79. pi.write(buffer)
  80. expect(pi.buffer_string).not_to be_empty
  81. expect(pi.buffer_string).to eq buffer
  82. end
  83. end
  84. describe '#method_missing' do
  85. let(:pi) { Interceptor::Pipe.new(pipe) }
  86. it 'passes #tty? to the original pipe' do
  87. expect(pipe).to receive(:tty?) { true }
  88. expect(pi.tty?).to be true
  89. end
  90. end
  91. describe '#respond_to' do
  92. let(:pi) { Interceptor::Pipe.wrap(:stderr) }
  93. it 'responds to all methods $stderr has' do
  94. $stderr.methods.each { |m| expect(pi.respond_to?(m)).to be true }
  95. end
  96. end
  97. describe 'when calling `methods` on the stream' do
  98. it 'does not raise errors' do
  99. allow($stderr).to receive(:puts)
  100. Interceptor::Pipe.wrap(:stderr)
  101. expect { $stderr.puts('Oh, hi here !') }.not_to raise_exception(NoMethodError)
  102. end
  103. it 'does not shadow errors when method do not exist on the stream' do
  104. Interceptor::Pipe.wrap(:stderr)
  105. expect { $stderr.not_really_puts('Oh, hi here !') }.to raise_exception(NoMethodError)
  106. end
  107. end
  108. end
  109. end

No Description

Contributors (1)