spec/client_spec.rb in stomper-0.4 vs spec/client_spec.rb in stomper-1.0.0
- old
+ new
@@ -1,180 +1,29 @@
require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
module Stomper
describe Client do
+ class MockConcreteClient
+ include Stomper::Client
+ end
+
before(:each) do
- # For the client, we want to mock the underlying connection
- @mock_connection = mock("connection")
- @mock_connection.should_receive(:disconnect).with(no_args()).at_most(:once).and_return(nil)
- Stomper::Connection.stub!(:new).and_return(@mock_connection)
- @client = Client.new("stomp:///")
+ @client = MockConcreteClient.new
end
describe "expected interface" do
it "should provide a send method" do
@client.should respond_to(:send)
- @mock_connection.should_receive(:transmit).with(an_instance_of(Stomper::Frames::Send)).twice.and_return(nil)
+ @client.should_receive(:transmit).with(an_instance_of(Stomper::Frames::Send)).twice.and_return(nil)
@client.send("/queue/to", "message body", {:additional => 'header'})
@client.send("/queue/to", "message body")
end
- it "should provide a subscribe method" do
- @client.should respond_to(:subscribe)
- @mock_connection.should_receive(:transmit).with(an_instance_of(Stomper::Frames::Subscribe)).twice.and_return(nil)
- @client.subscribe("/queue/to", {:additional => 'header'})
- @client.subscribe("/queue/to")
- end
- it "should provide an unsubscribe method" do
- @client.should respond_to(:unsubscribe)
- @mock_connection.should_receive(:transmit).with(an_instance_of(Stomper::Frames::Subscribe)).twice.and_return(nil)
- @client.subscribe("/queue/to", {:id => 'subscription-id'})
- @client.subscribe("/queue/to")
- @mock_connection.should_receive(:transmit).with(an_instance_of(Stomper::Frames::Unsubscribe)).twice.and_return(nil)
- @client.unsubscribe("/queue/to", 'subscription-id')
- @client.unsubscribe("/queue/to")
- end
it "should provide an ack method" do
@client.should respond_to(:ack)
- @mock_connection.should_receive(:transmit).with(an_instance_of(Stomper::Frames::Ack)).exactly(3).times.and_return(nil)
+ @client.should_receive(:transmit).with(an_instance_of(Stomper::Frames::Ack)).exactly(3).times.and_return(nil)
@client.ack("message-id", {:additional => "header"})
@client.ack("message-id")
@client.ack(Stomper::Frames::Message.new({:'message-id' => 'msg-001'}, "body"))
- end
- it "should provide a begin method" do
- @client.should respond_to(:begin)
- @mock_connection.should_receive(:transmit).with(an_instance_of(Stomper::Frames::Begin)).once.and_return(nil)
- @client.begin("tx-001")
- end
- it "should proivde an abort method" do
- @client.should respond_to(:abort)
- @mock_connection.should_receive(:transmit).with(an_instance_of(Stomper::Frames::Abort)).once.and_return(nil)
- @client.abort("tx-001")
- end
- it "should provide a commit method" do
- @client.should respond_to(:commit)
- @mock_connection.should_receive(:transmit).with(an_instance_of(Stomper::Frames::Commit)).once.and_return(nil)
- @client.commit("tx-001")
- end
- it "should provide a recieve method" do
- @client.should respond_to(:receive)
- end
- it "should provide a disconnect method" do
- @client.should respond_to(:disconnect)
- end
- it "should provide a close method" do
- @client.should respond_to(:close)
- end
- it "should provide a connectivity test" do
- @client.should respond_to(:connected?)
- end
- it "should provide a connect method" do
- @client.should respond_to(:connect)
- end
- end
-
- describe "threaded receiver" do
- it "should respond to start and stop" do
- @client.should respond_to(:start)
- @client.should respond_to(:stop)
- @client.should respond_to(:receiving?)
- end
- it "should only be receiving when it is started" do
- @mock_connection.stub!(:receive).and_return(nil)
- @mock_connection.should_receive(:connected?).any_number_of_times.and_return(true)
- @client.receiving?.should be_false
- @client.start
- @client.receiving?.should be_true
- @client.stop
- @client.receiving?.should be_false
- end
- it "should allow for a blocking threaded receiver" do
- @mock_connection.should_receive(:receive).with(true).at_least(:once).and_return(nil)
- @mock_connection.should_receive(:connected?).any_number_of_times.and_return(true)
- @client.receiving?.should be_false
- @client.start(:block => true)
- @client.receiving?.should be_true
- @client.stop
- @client.receiving?.should be_false
- end
-
- end
-
- describe "subscribing to queue" do
- before(:each) do
- @message_sent = Stomper::Frames::Message.new({'destination' => "/queue/test"}, "test message")
- @mock_connection.should_receive(:connected?).any_number_of_times.and_return(true)
- @mock_connection.should_receive(:transmit).with(duck_type(:to_stomp)).at_least(:once).and_return(nil)
- @mock_connection.should_receive(:receive).any_number_of_times.and_return(@message_sent)
- end
-
- it "should subscribe to a destination with a block" do
- wait_for_message = true
- @message_received = nil
- @client.start
- @client.subscribe("/queue/test") do |msg|
- @message_received = msg
- wait_for_message = false
- end
- true while wait_for_message
- @client.stop
- @message_received.should == @message_sent
- end
-
- it "should not unsubscribe from all destinations when a subscription id is provided" do
- @client.subscribe("/queue/test", { 'id' => 'subscription-1' }) do |msg|
- @message_received = msg
- end
- @client.subscribe("/queue/test") do |msg|
- @message_received = msg
- end
- @client.subscribe("/queue/test", :id => 'subscription-2') do |msg|
- @message_received = msg
- end
- @client.unsubscribe("/queue/test", 'subscription-1')
- @client.subscriptions.size.should == 2
- end
-
- it "should not unsubscribe from non-naive subscriptions when only a destination is supplied" do
- @client.subscribe("/queue/test", { 'id' => 'subscription-1' }) do |msg|
- @message_received = msg
- end
- @client.subscribe("/queue/test") do |msg|
- @message_received = msg
- end
- @client.subscribe("/queue/test") do |msg|
- @message_received = msg
- end
- @client.unsubscribe("/queue/test")
- @client.subscriptions.size.should == 1
- end
-
- # Due to the receiver running in a separate thread, this may not be correct?
- it "should unsubscribe from a destination and receive no more messages" do
- @mutex = Mutex.new
- @last_message_received = nil
- @client.start
- @client.subscribe("/queue/test") do |msg|
- @last_message_received = Time.now
- end
- true until @last_message_received
- @client.unsubscribe("/queue/test")
- @unsubscribed_at = Time.now
- @client.stop
- (@last_message_received < @unsubscribed_at).should be_true
- end
- end
-
- describe "transactions" do
- before(:each) do
- @mock_connection.should_receive(:transmit).with(duck_type(:to_stomp)).at_least(:once).and_return(nil)
- end
-
- it "should provide a transaction method that generates a new Transaction" do
- @evaluated = false
- @client.transaction do |t|
- @evaluated = true
- end
- @evaluated.should be_true
end
end
end
end
\ No newline at end of file