test/connection_test.rb in backburner-1.1.0 vs test/connection_test.rb in backburner-1.2.0.pre

- old
+ new

@@ -1,27 +1,27 @@ require File.expand_path('../test_helper', __FILE__) describe "Backburner::Connection class" do describe "for initialize with single url" do before do - @connection = Backburner::Connection.new("beanstalk://localhost") + @connection = Backburner::Connection.new("beanstalk://127.0.0.1") end it "should store url in accessor" do - assert_equal "beanstalk://localhost", @connection.url + assert_equal "beanstalk://127.0.0.1", @connection.url end it "should setup beanstalk connection" do assert_kind_of Beaneater, @connection.beanstalk end end # initialize single connection describe "for initialize with url" do it "should delegate the address url correctly" do - @connection = Backburner::Connection.new("beanstalk://localhost") + @connection = Backburner::Connection.new("beanstalk://127.0.0.1") connection = @connection.beanstalk.connection - assert_equal 'localhost:11300', connection.address + assert_equal '127.0.0.1:11300', connection.address end end # initialize describe "for bad uri" do it "should raise a BadUrl" do @@ -29,15 +29,151 @@ @connection = Backburner::Connection.new("fake://foo") } end end + describe "for initialize with on_reconnect block" do + it "should store the block for use upon reconnect" do + callback = proc {} + connection = Backburner::Connection.new('beanstalk://127.0.0.1', &callback) + assert_equal callback, connection.on_reconnect + end + end + + describe "dealing with connecting and reconnecting" do + before do + @connection = Backburner::Connection.new('beanstalk://127.0.0.1') + end + + it "should know if its connection is open" do + assert_equal true, @connection.connected? + @connection.close + assert_equal false, @connection.connected? + end + + it "should be able to attempt reconnecting to beanstalk" do + @connection.close + assert_equal false, @connection.connected? + @connection.reconnect! + assert_equal true, @connection.connected? + end + + it "should allow for retryable commands" do + @result = false + @connection.close + @connection.retryable { @result = true } + assert_equal true, @result + end + + it "should provide a hook when a retryable command successfully retries" do + @result = false + @retried = false + @connection.close + callback = proc { @result = true } + @connection.retryable(:on_retry => callback) do + unless @retried + @retried = true + raise Beaneater::NotConnected.new + end + end + assert_equal true, @result + end + + it "should provide a hook when the connection successfully reconnects" do + reconnected = false + retried = false + @connection.close + @connection.on_reconnect = proc { reconnected = true } + @connection.retryable do + unless retried + retried = true + raise Beaneater::NotConnected.new + end + end + assert_equal true, reconnected + end + + it "should call the on_reconnect hook before the on_retry hook" do + @result = [] + @retried = false + @connection.close + @connection.on_reconnect = proc { @result << "reconnect" } + on_retry = proc { @result << "retry" } + @connection.retryable(:on_retry => on_retry) do + unless @retried + @retried = true + raise Beaneater::NotConnected.new + end + end + assert_equal %w(reconnect retry), @result + end + + describe "ensuring the connection is open" do + it "should reattempt the connection to beanstalk several times" do + stats = @connection.stats + simulate_disconnect(@connection) + new_connection = Beaneater.new('127.0.0.1:11300') + Beaneater.expects(:new).twice.raises(Beaneater::NotConnected).then.returns(new_connection) + @connection.tubes + assert_equal true, @connection.connected? + end + + it "should not attempt reconnecting if the current connection is open" do + assert_equal true, @connection.connected? + Beaneater.expects(:new).never + @connection.tubes + end + + describe "when reconnecting is successful" do + it "should allow for a callback" do + @result = false + simulate_disconnect(@connection) + @connection.on_reconnect = proc { @result = true } + @connection.tubes + assert_equal true, @result + end + + it "should pass self to the callback" do + result = nil + simulate_disconnect(@connection) + @connection.on_reconnect = lambda { |conn| result = conn } + @connection.tubes + assert_equal result, @connection + end + end + end + + describe "when unable to ensure its connected" do + it "should raise Beaneater::NotConnected" do + Beaneater.stubs(:new).raises(Beaneater::NotConnected) + simulate_disconnect(@connection, 1) # since we're stubbing Beaneater.new above we only to simlulate the disconnect of our current connection + assert_raises Beaneater::NotConnected do + @connection.tubes + end + end + end + + describe "when using the retryable method" do + it "should yield to the block multiple times" do + expected = 2 + retry_count = 0 + @connection.retryable(max_retries: expected) do + if retry_count < 2 + retry_count += 1 + raise Beaneater::NotConnected + end + end + assert_equal expected, retry_count + end + end + end + describe "for delegated methods" do before do - @connection = Backburner::Connection.new("beanstalk://localhost") + @connection = Backburner::Connection.new("beanstalk://127.0.0.1") end it "delegate methods to beanstalk connection" do - assert_equal "localhost", @connection.connection.host + assert_equal "127.0.0.1", @connection.connection.host end end # delegator -end # Connection \ No newline at end of file +end # Connection