spec/cucumber/pro/web_socket/worker_spec.rb in cucumber-pro-0.0.11 vs spec/cucumber/pro/web_socket/worker_spec.rb in cucumber-pro-0.0.12
- old
+ new
@@ -1,79 +1,103 @@
require 'cucumber/pro/web_socket/session'
require 'logger'
-module Cucumber::Pro::WebSocket
+module Cucumber::Pro
+ module WebSocket
- describe Worker do
- let(:good_data) { double('good data') }
- let(:logger) { Logger.new(STDOUT) }
- let(:socket) { FakeSocket.new }
- let(:worker) { Worker.new(self.method(:create_fake_socket), logger, logger) }
+ describe Worker do
+ let(:good_data) { double('good data') }
+ let(:error_handler) { double('error handler') }
+ let(:logger) { Logger.new(ENV['CUCUMBER_PRO_LOG_PATH'] || STDOUT) }
+ let!(:socket) { SpySocket.new }
+ let(:worker) { Worker.new(self.method(:create_fake_socket), logger, error_handler, timeout: 0.5) }
- before { logger.level = Logger::DEBUG }
+ before { logger.level = Logger::DEBUG }
- it "closes once all messages have been acknowledged (but not before)" do
- worker.send(good_data)
- worker.close
- eventually do
- socket.data.last.should == good_data
+ it "closes once all messages have been acknowledged (but not before)" do
+ worker.send(good_data)
+ worker.close
+ eventually do
+ socket.data.last.should == good_data
+ end
+ eventually do
+ expect( worker ).to_not be_closed
+ end
+ socket.send_ack
+ eventually do
+ expect( worker ).to be_closed
+ end
end
- eventually do
- expect( worker ).to_not be_closed
+
+ it "throws an error and closes if all messages are not acknowledged within a timeout period" do
+ expect( error_handler ).to receive(:error).with(Error::Timeout.new)
+ worker.send(good_data)
+ worker.close
+ eventually do
+ expect( worker ).to be_closed
+ end
end
- socket.send_ack
- eventually do
- expect( worker ).to be_closed
+
+ it "throws an error if the server responds with an error"
+
+ def create_fake_socket(worker)
+ socket.worker = worker
+ EM.next_tick {
+ worker.method(:on_open).call(double('ws event'))
+ }
+ socket
end
- end
- def create_fake_socket(worker)
- socket.worker = worker
- EM.next_tick {
- worker.method(:on_open).call(double('ws event'))
- }
- socket
- end
+ class SpySocket
+ include RSpec::Mocks::ExampleMethods
- class FakeSocket
- include RSpec::Mocks::ExampleMethods
+ attr_accessor :worker
+ attr_reader :data
- attr_accessor :worker
- attr_reader :data
+ def initialize
+ @q = Queue.new
+ end
- def initialize
- @data = []
- end
+ def close
+ worker.method(:on_close).call(ws_event(1000))
+ end
- def close
- worker.method(:on_close).call(ws_event(1000))
- end
+ def send(data)
+ @q << data
+ self
+ end
- def send(data)
- @data << data
- end
+ def send_ack
+ event = ws_event(1000, { 'type' => 'metadata_saved' })
+ worker.method(:on_message).call(event)
+ end
- def send_ack
- event = ws_event(1000, { 'type' => 'metadata_saved' })
- worker.method(:on_message).call(event)
- end
+ def data
+ @data ||= []
+ while !@q.empty?
+ @data << @q.pop
+ end
+ @data
+ end
- private
+ private
- def ws_event(code, data = {})
- double('ws event', code: 1000, data: data)
+ def ws_event(code, data = {})
+ double('ws event', code: 1000, data: data)
+ end
+
end
- end
- require 'anticipate'
- include Anticipate
- def eventually(&block)
- result = nil
- sleeping(0.1).seconds.between_tries.failing_after(30).tries do
- result = block.call
+ require 'anticipate'
+ include Anticipate
+ def eventually(&block)
+ result = nil
+ sleeping(0.1).seconds.between_tries.failing_after(50).tries do
+ result = block.call
+ end
+ result
end
- result
end
- end
+ end
end