message-driver 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. data/.gitignore +20 -0
  2. data/.rbenv-version +1 -0
  3. data/.relish +2 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +23 -0
  6. data/CHANGELOG.md +17 -0
  7. data/Gemfile +20 -0
  8. data/Guardfile +39 -0
  9. data/LICENSE.txt +22 -0
  10. data/README.md +36 -0
  11. data/Rakefile +23 -0
  12. data/features/.nav +12 -0
  13. data/features/CHANGELOG.md +17 -0
  14. data/features/README.md +1 -0
  15. data/features/Rails.md +1 -0
  16. data/features/amqp_specific_features/README.md +3 -0
  17. data/features/amqp_specific_features/binding_amqp_destinations.feature +50 -0
  18. data/features/amqp_specific_features/declaring_amqp_exchanges.feature +22 -0
  19. data/features/amqp_specific_features/server_named_destinations.feature +35 -0
  20. data/features/destination_metadata.feature +33 -0
  21. data/features/dynamic_destinations.feature +41 -0
  22. data/features/error_handling.feature +47 -0
  23. data/features/getting_started.md +1 -0
  24. data/features/publishing_a_message.feature +19 -0
  25. data/features/publishing_with_transactions.feature +36 -0
  26. data/features/step_definitions/dynamic_destinations_steps.rb +12 -0
  27. data/features/step_definitions/error_handling_steps.rb +11 -0
  28. data/features/step_definitions/steps.rb +41 -0
  29. data/features/support/env.rb +7 -0
  30. data/features/support/firewall_helper.rb +59 -0
  31. data/features/support/message_table_matcher.rb +11 -0
  32. data/features/support/no_error_matcher.rb +13 -0
  33. data/features/support/test_runner.rb +50 -0
  34. data/features/support/transforms.rb +17 -0
  35. data/lib/message-driver.rb +1 -0
  36. data/lib/message_driver/adapters/base.rb +29 -0
  37. data/lib/message_driver/adapters/bunny_adapter.rb +270 -0
  38. data/lib/message_driver/adapters/in_memory_adapter.rb +58 -0
  39. data/lib/message_driver/broker.rb +95 -0
  40. data/lib/message_driver/destination.rb +31 -0
  41. data/lib/message_driver/exceptions.rb +18 -0
  42. data/lib/message_driver/message.rb +13 -0
  43. data/lib/message_driver/message_publisher.rb +15 -0
  44. data/lib/message_driver/version.rb +5 -0
  45. data/lib/message_driver.rb +18 -0
  46. data/message-driver.gemspec +27 -0
  47. data/spec/integration/amqp_integration_spec.rb +146 -0
  48. data/spec/integration/message_driver/adapters/bunny_adapter_spec.rb +301 -0
  49. data/spec/spec_helper.rb +20 -0
  50. data/spec/support/shared/destination_examples.rb +41 -0
  51. data/spec/units/message_driver/adapters/base_spec.rb +44 -0
  52. data/spec/units/message_driver/adapters/in_memory_adapter_spec.rb +43 -0
  53. data/spec/units/message_driver/broker_spec.rb +98 -0
  54. data/spec/units/message_driver/destination_spec.rb +11 -0
  55. data/spec/units/message_driver/message_publisher_spec.rb +65 -0
  56. data/spec/units/message_driver/message_spec.rb +19 -0
  57. data/test_lib/broker_config.rb +25 -0
  58. metadata +203 -0
data/.gitignore ADDED
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .rvmrc
7
+ .ruby-version
8
+ Gemfile.lock
9
+ InstalledFiles
10
+ _yardoc
11
+ coverage
12
+ doc/
13
+ lib/bundler/man
14
+ pkg
15
+ rdoc
16
+ spec/reports
17
+ test/tmp
18
+ test/version_tmp
19
+ tmp
20
+ .adapter_under_test
data/.rbenv-version ADDED
@@ -0,0 +1 @@
1
+ 1.9.3-p327
data/.relish ADDED
@@ -0,0 +1,2 @@
1
+ ---
2
+ project: message-driver/message-driver
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/.travis.yml ADDED
@@ -0,0 +1,23 @@
1
+ language: ruby
2
+ bundler_args: --without tools darwin
3
+ services:
4
+ - rabbitmq
5
+ before_script:
6
+ - sudo rabbitmqctl add_vhost message-driver-test
7
+ - sudo rabbitmqctl set_permissions -p message-driver-test guest ".*" ".*" ".*"
8
+ rvm:
9
+ - 1.9.2
10
+ - 1.9.3
11
+ - 2.0.0
12
+ - jruby-19mode
13
+ - ruby-head
14
+ - jruby-head
15
+ - rbx-19mode
16
+ env:
17
+ - ADAPTER=in_memory
18
+ - ADAPTER=bunny
19
+ matrix:
20
+ allow_failures:
21
+ - rvm: ruby-head
22
+ - rvm: jruby-head
23
+ - rvm: rbx-19mode
data/CHANGELOG.md ADDED
@@ -0,0 +1,17 @@
1
+ # Change Log
2
+
3
+ ## 0.1.0
4
+
5
+ Initial Release
6
+
7
+ * Features
8
+ * Publish a message
9
+ * Broker transactions for publishing
10
+ * Pop a message
11
+ * named and dynamic destinations
12
+ * message_count for destinations
13
+ * Adapters
14
+ * InMemory
15
+ * #reset_after_test method for clearing out queues
16
+ * Bunny (amqp 0.9)
17
+ * handle connection and channel errors transparently
data/Gemfile ADDED
@@ -0,0 +1,20 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in message-driver.gemspec
4
+ gemspec
5
+
6
+ group :tools do
7
+ gem 'guard'
8
+ gem 'guard-bundler'
9
+ gem 'guard-rspec'
10
+ gem 'guard-cucumber'
11
+ gem 'pry'
12
+ platform :ruby do
13
+ gem 'pry-debugger'
14
+ end
15
+ group :darwin do
16
+ gem 'ruby_gntp'
17
+ gem 'rb-fsevent'
18
+ gem 'relish'
19
+ end
20
+ end
data/Guardfile ADDED
@@ -0,0 +1,39 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ require File.join(File.dirname(__FILE__), 'test_lib', 'broker_config')
5
+
6
+ guard 'bundler' do
7
+ watch('Gemfile')
8
+ watch(/^.+\.gemspec/)
9
+ end
10
+
11
+ unit_spec_opts = {spec_paths: ["spec/units"], cli: '-f doc', run_all: {cli: ''}}
12
+ acceptance_spec_opts = {spec_paths: ["spec/integration"], cli: '-f doc -t all_adapters', run_all: {cli: '-t all_adapters'}}
13
+
14
+ group 'specs' do
15
+ guard 'rspec', unit_spec_opts do
16
+ watch(%r{^spec/units/.+_spec\.rb$})
17
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/units/#{m[1]}_spec.rb" }
18
+ watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
19
+ watch('spec/spec_helper.rb') { "spec" }
20
+ end
21
+ end
22
+
23
+ group 'integration' do
24
+ guard 'rspec', acceptance_spec_opts do
25
+ watch(%r{^spec/integration/.+_spec\.rb$})
26
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/integration/#{m[1]}_spec.rb" }
27
+ watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
28
+ watch('spec/spec_helper.rb') { "spec" }
29
+ end
30
+
31
+ cucumber_cli = "--no-profile --color --format progress --strict --tag @all_adapters,@#{BrokerConfig.current_adapter} --tag ~@wip"
32
+ guard 'cucumber', change_format: 'pretty', cli: cucumber_cli do
33
+ watch(%r{^features/.+\.feature$})
34
+ watch(%r{^features/support/.+$}) { 'features' }
35
+ watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' }
36
+ end
37
+ end
38
+
39
+
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Matt Campbell
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # Message::Driver
2
+
3
+ Easy message queues for ruby
4
+
5
+ [![Build Status](https://travis-ci.org/soupmatt/message-driver.png?branch=master)](https://travis-ci.org/soupmatt/message-driver)
6
+
7
+ [![Dependency Status](https://gemnasium.com/soupmatt/message-driver.png)](https://gemnasium.com/soupmatt/message-driver)
8
+
9
+ [![Code Climate](https://codeclimate.com/github/soupmatt/message-driver.png)](https://codeclimate.com/github/soupmatt/message-driver)
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ gem 'message-driver'
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install message-driver
24
+
25
+ ## Usage
26
+
27
+ TODO: Write usage instructions here
28
+
29
+ ## Contributing
30
+
31
+ 1. Fork it
32
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
33
+ 3. Write your code with tests
34
+ 4. Commit your changes (`git commit -am 'Add some feature'`)
35
+ 5. Push to the branch (`git push origin my-new-feature`)
36
+ 6. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,23 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'rspec/core/rake_task'
4
+ require 'cucumber/rake/task'
5
+
6
+ require File.join(File.dirname(__FILE__), 'test_lib', 'broker_config')
7
+
8
+ RSpec::Core::RakeTask.new(:spec) do |t|
9
+ t.pattern = "./spec/units{,/*/**}/*_spec.rb"
10
+ end
11
+
12
+ RSpec::Core::RakeTask.new(:integrations) do |t|
13
+ t.rspec_opts = "--tag all_adapters"
14
+ t.pattern = "./spec/integration{,/*/**}/*_spec.rb"
15
+ end
16
+
17
+ cucumber_opts = "--format progress --tag @all_adapters,@#{BrokerConfig.current_adapter} --tag ~@wip"
18
+ cucumber_opts += " --tag ~@no_travis" if ENV['TRAVIS']=='true' && ENV['ADAPTER']=='bunny'
19
+ Cucumber::Rake::Task.new do |t|
20
+ t.cucumber_opts = cucumber_opts
21
+ end
22
+
23
+ task :default => [:spec, :integrations, :cucumber]
data/features/.nav ADDED
@@ -0,0 +1,12 @@
1
+ - getting_started.md (Getting Started)
2
+ - CHANGELOG.md (Changelog)
3
+ - publishing_a_message.feature
4
+ - publishing_with_transactions.feature
5
+ - dynamic_destinations.feature
6
+ - destination_metadata.feature
7
+ - amqp_specific_features (AMQP-Specific Features):
8
+ - declaring_amqp_destinations.feature
9
+ - binding_amqp_destinations.feature
10
+ - server_named_desitnations.feature
11
+ - error_handling.feature
12
+ - Rails.md
@@ -0,0 +1,17 @@
1
+ # Change Log
2
+
3
+ ## 0.1.0
4
+
5
+ Initial Release
6
+
7
+ * Features
8
+ * Publish a message
9
+ * Broker transactions for publishing
10
+ * Pop a message
11
+ * named and dynamic destinations
12
+ * message_count for destinations
13
+ * Adapters
14
+ * InMemory
15
+ * #reset_after_test method for clearing out queues
16
+ * Bunny (amqp 0.9)
17
+ * handle connection and channel errors transparently
@@ -0,0 +1 @@
1
+ Welcome to MessageDriver! Easy message queues for ruby.
data/features/Rails.md ADDED
@@ -0,0 +1 @@
1
+ Instructions for getting rails going
@@ -0,0 +1,3 @@
1
+ Here are some extensions to the MessageDriver API that allow you to
2
+ leverage some of the advanced features of AMQP and RabbitMQ when using
3
+ the bunny driver.
@@ -0,0 +1,50 @@
1
+ @bunny
2
+ Feature: Binding AMQP destinations to exchanges
3
+ Background:
4
+ Given the following broker configuration:
5
+ """ruby
6
+ MessageDriver::Broker.define do |b|
7
+ b.destination :direct_exchange, "amq.direct", type: :exchange
8
+ end
9
+ """
10
+
11
+ Scenario: Binding a queue to an exchange
12
+ When I execute the following code:
13
+ """ruby
14
+ MessageDriver::Broker.define do |b|
15
+ b.destination :my_queue, "my_queue", exclusive: true, bindings: [
16
+ {source: "amq.direct", args: {routing_key: "test_binding"}},
17
+ {source: "amq.direct", args: {routing_key: "spec_binding"}}
18
+ ]
19
+ end
20
+
21
+ publish(:direct_exchange, "Test Message", {}, {routing_key: "test_binding"})
22
+ publish(:direct_exchange, "Spec Message", {}, {routing_key: "spec_binding"})
23
+ """
24
+
25
+ Then I expect to find 2 messages on :my_queue with:
26
+ | body |
27
+ | Test Message |
28
+ | Spec Message |
29
+
30
+ Scenario: Binding an exchange to an exchange
31
+ RabbitMQ's AMQP 0.9 extenstions support binding exchanges to exchanges
32
+
33
+ When I execute the following code:
34
+ """ruby
35
+ MessageDriver::Broker.define do |b|
36
+ b.destination :fanout, "amq.fanout", type: :exchange, bindings: [
37
+ {source: "amq.direct", args: {routing_key: "test_binding"}},
38
+ {source: "amq.direct", args: {routing_key: "spec_binding"}}
39
+ ]
40
+ b.destination :my_queue, "my_queue", exclusive: true, bindings: [{source: "amq.fanout"}]
41
+ end
42
+
43
+ publish(:direct_exchange, "Test Message", {}, {routing_key: "test_binding"})
44
+ publish(:direct_exchange, "Spec Message", {}, {routing_key: "spec_binding"})
45
+ """
46
+
47
+ Then I expect to find 2 messages on :my_queue with:
48
+ | body |
49
+ | Test Message |
50
+ | Spec Message |
@@ -0,0 +1,22 @@
1
+ @bunny
2
+ Feature: Declaring AMQP exchanges
3
+ If you want to create an exchange that doesn't exist on the broker, you can do so by adding
4
+ the "declare" option to your destination.
5
+
6
+ Background:
7
+ Given I am connected to the broker
8
+
9
+ Scenario: Declaring a direct exchange
10
+ When I execute the following code:
11
+ """ruby
12
+ MessageDriver::Broker.define do |b|
13
+ b.destination :my_exchange, "my_exchange", type: :exchange, declare: {type: :direct, auto_delete: true}
14
+ b.destination :my_queue, "my_queue", exclusive: true, bindings: [{source: "my_exchange", routing_key: "my_queue"}]
15
+ end
16
+
17
+ publish(:my_exchange, "Test My New Exchange", routing_key: "my_queue")
18
+ """
19
+
20
+ Then I expect to find 1 message on :my_queue with:
21
+ | body |
22
+ | Test My New Exchange |
@@ -0,0 +1,35 @@
1
+ @bunny
2
+ Feature: Server-Named Destinations
3
+ AMQP brokers allow you to create queues that are named by the server. Here's
4
+ how you do it with message_driver.
5
+
6
+ Background:
7
+ Given I am connected to the broker
8
+
9
+ Scenario: Creating a server-named queue
10
+ I expect my destination to have the queue name given to it by the server
11
+
12
+ When I execute the following code:
13
+ """ruby
14
+ destination = MessageDriver::Broker.dynamic_destination("", exclusive: true)
15
+ expect(destination.name).to_not be_empty
16
+ """
17
+
18
+ Then I expect to have no errors
19
+
20
+ Scenario: sending and receiving messages through a server-named queue
21
+ Given the following broker configuration:
22
+ """ruby
23
+ MessageDriver::Broker.define do |b|
24
+ b.destination :my_queue, "my_queue", exclusive: true
25
+ end
26
+ """
27
+
28
+ When I execute the following code:
29
+ """ruby
30
+ publish(:my_queue, "server-named queue message")
31
+ """
32
+
33
+ Then I expect to find 1 message on :my_queue with:
34
+ | body |
35
+ | server-named queue message |
@@ -0,0 +1,33 @@
1
+ @bunny
2
+ @in_memory
3
+ Feature: Destination Metadata
4
+ Background:
5
+ Given the following broker configuration:
6
+ """ruby
7
+ MessageDriver::Broker.define do |b|
8
+ b.destination :my_queue, "my_queue", exclusive: true
9
+ end
10
+ """
11
+
12
+ Scenario: Checking the message count when the queue is empty
13
+ When I execute the following code:
14
+ """ruby
15
+ destination = MessageDriver::Broker.find_destination(:my_queue)
16
+ expect(destination.message_count).to eq(0)
17
+ """
18
+
19
+ Then I expect to have no errors
20
+ And I expect to find no messages on :my_queue
21
+
22
+ @no_travis
23
+ Scenario: Checking the message count when the queue has messages
24
+ When I execute the following code:
25
+ """ruby
26
+ publish(:my_queue, "test message 1")
27
+ publish(:my_queue, "test message 2")
28
+ destination = MessageDriver::Broker.find_destination(:my_queue)
29
+ expect(destination.message_count).to eq(2)
30
+ """
31
+
32
+ Then I expect to have no errors
33
+ And I expect to find 2 messages on :my_queue
@@ -0,0 +1,41 @@
1
+ @all_adapters
2
+ Feature: Dynamic Destinations
3
+ Sometime you want to connect to a queue that has some of it's characteristics
4
+ determined at runtime. Dynamic destinations allow you to do with without
5
+ leaking tons of destination definitions.
6
+
7
+ Background:
8
+ Given I am connected to the broker
9
+
10
+ Scenario: Sending to a dynamic destination
11
+ When I execute the following code:
12
+ """ruby
13
+ my_new_destination = MessageDriver::Broker.dynamic_destination("temp_queue", exclusive: true)
14
+ my_new_destination.publish("Test Message")
15
+ """
16
+
17
+ Then I expect to find 1 message on the dynamic destination "temp_queue" with:
18
+ | body |
19
+ | Test Message |
20
+
21
+ Scenario: Poping messages off a dynamic destination
22
+ Given I have a dynamic destination "temp_queue" with the following messages on it:
23
+ | body |
24
+ | Test Message 1 |
25
+ | Test Message 2 |
26
+
27
+ When I execute the following code:
28
+ """ruby
29
+ my_new_destination = MessageDriver::Broker.dynamic_destination("temp_queue", exclusive: true)
30
+
31
+ msg1 = my_new_destination.pop_message
32
+ expect(msg1.body).to eq("Test Message 1")
33
+
34
+ msg2 = my_new_destination.pop_message
35
+ expect(msg2.body).to eq("Test Message 2")
36
+
37
+ msg3 = my_new_destination.pop_message
38
+ expect(msg3).to be_nil
39
+ """
40
+
41
+ Then I expect to have no errors
@@ -0,0 +1,47 @@
1
+ Feature: Error Handling
2
+
3
+ Background:
4
+ Given I am connected to the broker
5
+
6
+ @bunny
7
+ Scenario: Queue isn't found on the broker
8
+ When I execute the following code:
9
+ """ruby
10
+ MessageDriver::Broker.dynamic_destination("missing_queue", passive: true)
11
+ """
12
+
13
+ Then I expect it to raise a MessageDriver::QueueNotFound error
14
+
15
+ @no_travis
16
+ @bunny
17
+ Scenario: The broker goes down
18
+ Given the following broker configuration:
19
+ """ruby
20
+ MessageDriver::Broker.define do |b|
21
+ b.destination :my_queue, "broker_down_queue", arguments: {:'x-expires' => 10000 }
22
+ end
23
+ """
24
+
25
+ When I execute the following code:
26
+ """ruby
27
+ publish(:my_queue, "Test Message 1")
28
+ """
29
+ And the broker goes down
30
+ And I execute the following code:
31
+ """ruby
32
+ publish(:my_queue, "Test Message 2")
33
+ """
34
+ Then I expect it to raise a MessageDriver::ConnectionException error
35
+
36
+ When the broker comes up
37
+ And I execute the following code:
38
+ """ruby
39
+ publish(:my_queue, "Test Message 3")
40
+ """
41
+
42
+ Then I expect to have no errors
43
+ And I expect to find 2 messages on :my_queue with:
44
+ | body |
45
+ | Test Message 1 |
46
+ | Test Message 3 |
47
+
@@ -0,0 +1 @@
1
+ Here's how to get started!
@@ -0,0 +1,19 @@
1
+ @all_adapters
2
+ Feature: Publishing A Message
3
+ Background:
4
+ Given the following broker configuration:
5
+ """ruby
6
+ MessageDriver::Broker.define do |b|
7
+ b.destination :my_queue, "my_queue", exclusive: true
8
+ end
9
+ """
10
+
11
+ Scenario: Running within a with_message_transaction block
12
+ When I execute the following code:
13
+ """ruby
14
+ publish(:my_queue, "Test Message")
15
+ """
16
+
17
+ Then I expect to find 1 message on :my_queue with:
18
+ | body |
19
+ | Test Message |
@@ -0,0 +1,36 @@
1
+ @bunny
2
+ Feature: Publishing a Message within a Transaction
3
+ Background:
4
+ Given the following broker configuration:
5
+ """ruby
6
+ MessageDriver::Broker.define do |b|
7
+ b.destination :my_queue, "my_queue", exclusive: true
8
+ end
9
+ """
10
+
11
+ Scenario: The block completes successfully
12
+ When I execute the following code:
13
+ """ruby
14
+ with_message_transaction do
15
+ publish(:my_queue, "Transacted Message 1")
16
+ publish(:my_queue, "Transacted Message 2")
17
+ end
18
+ """
19
+
20
+ Then I expect to find 2 messages on :my_queue with:
21
+ | body |
22
+ | Transacted Message 1 |
23
+ | Transacted Message 2 |
24
+
25
+ Scenario: An error is raised inside the block
26
+ When I execute the following code:
27
+ """ruby
28
+ with_message_transaction do
29
+ publish(:my_queue, "Transacted Message 1")
30
+ raise "an error that causes a rollback"
31
+ publish(:my_queue, "Transacted Message 2")
32
+ end
33
+ """
34
+
35
+ Then I expect it to raise "an error that causes a rollback"
36
+ And I expect to find no messages on :my_queue
@@ -0,0 +1,12 @@
1
+ Given(/^I have a dynamic destination "(#{STRING_OR_SYM})" with the following messages on it:$/) do |destination, table|
2
+ dest = MessageDriver::Broker.dynamic_destination(destination, exclusive: true)
3
+ test_runner.publish_table_to_destination(dest, table)
4
+ end
5
+
6
+ Then(/^I expect to find (#{NUMBER}) messages? on the dynamic destination "(#{STRING_OR_SYM})" with:$/) do |count, destination, table|
7
+ expect(test_runner).to have_no_errors
8
+ dest = MessageDriver::Broker.dynamic_destination(destination, passive: true)
9
+ messages = test_runner.fetch_messages(dest)
10
+ expect(messages).to have(count).items
11
+ expect(messages).to match_message_table(table)
12
+ end
@@ -0,0 +1,11 @@
1
+ When "the broker goes down" do
2
+ result = block_broker_port
3
+ end
4
+
5
+ When "the broker comes up" do
6
+ result = unblock_broker_port
7
+ end
8
+
9
+ After do
10
+ unblock_broker_port
11
+ end
@@ -0,0 +1,41 @@
1
+ Given "I am connected to the broker" do
2
+ MessageDriver.configure(BrokerConfig.config)
3
+ end
4
+
5
+ Given "the following broker configuration:" do |src|
6
+ step "I am connected to the broker"
7
+ test_runner.config_broker(src)
8
+ end
9
+
10
+ When "I execute the following code:" do |src|
11
+ test_runner.run_test_code(src)
12
+ end
13
+
14
+ Then(/^I expect to find (#{NUMBER}) messages? on (#{STRING_OR_SYM})$/) do |count, destination|
15
+ expect(test_runner).to have_no_errors
16
+ messages = test_runner.fetch_messages(destination)
17
+ expect(messages).to have(count).items
18
+ end
19
+
20
+ Then(/^I expect to find (#{NUMBER}) messages? on (#{STRING_OR_SYM}) with:$/) do |count, destination, table|
21
+ expect(test_runner).to have_no_errors
22
+ messages = test_runner.fetch_messages(destination)
23
+ expect(messages).to have(count).items
24
+ expect(messages).to match_message_table(table)
25
+ end
26
+
27
+ Then(/^I expect it to raise "(.*?)"$/) do |error_msg|
28
+ expect(test_runner.raised_error).to_not be_nil
29
+ expect(test_runner.raised_error.to_s).to match error_msg
30
+ test_runner.raised_error = nil
31
+ end
32
+
33
+ Then(/^I expect it to raise a (.*?) error$/) do |error_type|
34
+ expect(test_runner.raised_error).to_not be_nil
35
+ expect(test_runner.raised_error.class.to_s).to match error_type
36
+ test_runner.raised_error = nil
37
+ end
38
+
39
+ Then "I expect to have no errors" do
40
+ expect(test_runner).to have_no_errors
41
+ end
@@ -0,0 +1,7 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'test_lib', 'broker_config')
2
+
3
+ require 'message_driver'
4
+
5
+ After do
6
+ MessageDriver.stop
7
+ end