message-driver 0.1.0 → 0.2.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.travis.yml +18 -7
- data/CHANGELOG.md +12 -2
- data/Gemfile +17 -0
- data/Guardfile +8 -4
- data/README.md +14 -5
- data/Rakefile +44 -11
- data/examples/basic_producer_and_consumer/Gemfile +5 -0
- data/examples/basic_producer_and_consumer/common.rb +17 -0
- data/examples/basic_producer_and_consumer/consumer.rb +24 -0
- data/examples/basic_producer_and_consumer/producer.rb +33 -0
- data/features/.nav +8 -0
- data/features/CHANGELOG.md +12 -2
- data/features/amqp_specific_features/binding_amqp_destinations.feature +7 -7
- data/features/amqp_specific_features/declaring_amqp_exchanges.feature +3 -3
- data/features/amqp_specific_features/nack_redelivered_messages.feature +92 -0
- data/features/amqp_specific_features/requeueing_on_nack.feature +44 -0
- data/features/amqp_specific_features/server_named_destinations.feature +5 -5
- data/features/client_acks.feature +92 -0
- data/features/destination_metadata.feature +9 -11
- data/features/dynamic_destinations.feature +7 -7
- data/features/error_handling.feature +11 -9
- data/features/logging.feature +14 -0
- data/features/message_consumers/auto_ack_consumers.feature +79 -0
- data/features/message_consumers/manual_ack_consumers.feature +95 -0
- data/features/message_consumers/transactional_ack_consumers.feature +77 -0
- data/features/message_consumers.feature +54 -0
- data/features/publishing_a_message.feature +6 -10
- data/features/publishing_with_transactions.feature +10 -14
- data/features/rabbitmq_specific_features/dead_letter_queueing.feature +116 -0
- data/features/step_definitions/dynamic_destinations_steps.rb +3 -3
- data/features/step_definitions/error_handling_steps.rb +4 -2
- data/features/step_definitions/logging_steps.rb +28 -0
- data/features/step_definitions/message_consumers_steps.rb +29 -0
- data/features/step_definitions/steps.rb +60 -9
- data/features/support/broker_config_helper.rb +19 -0
- data/features/support/env.rb +1 -0
- data/features/support/firewall_helper.rb +8 -11
- data/features/support/message_table_matcher.rb +21 -5
- data/features/support/test_runner.rb +39 -16
- data/lib/message_driver/adapters/base.rb +51 -4
- data/lib/message_driver/adapters/bunny_adapter.rb +251 -127
- data/lib/message_driver/adapters/in_memory_adapter.rb +97 -18
- data/lib/message_driver/adapters/stomp_adapter.rb +127 -0
- data/lib/message_driver/broker.rb +23 -24
- data/lib/message_driver/client.rb +157 -0
- data/lib/message_driver/destination.rb +7 -4
- data/lib/message_driver/errors.rb +27 -0
- data/lib/message_driver/logging.rb +11 -0
- data/lib/message_driver/message.rb +8 -0
- data/lib/message_driver/subscription.rb +18 -0
- data/lib/message_driver/vendor/.document +0 -0
- data/lib/message_driver/vendor/nesty/nested_error.rb +26 -0
- data/lib/message_driver/vendor/nesty.rb +1 -0
- data/lib/message_driver/version.rb +1 -1
- data/lib/message_driver.rb +4 -2
- data/message-driver.gemspec +4 -4
- data/spec/integration/{amqp_integration_spec.rb → bunny/amqp_integration_spec.rb} +29 -28
- data/spec/integration/bunny/bunny_adapter_spec.rb +339 -0
- data/spec/integration/in_memory/in_memory_adapter_spec.rb +126 -0
- data/spec/integration/stomp/stomp_adapter_spec.rb +142 -0
- data/spec/spec_helper.rb +5 -2
- data/spec/support/shared/adapter_examples.rb +17 -0
- data/spec/support/shared/client_ack_examples.rb +18 -0
- data/spec/support/shared/context_examples.rb +14 -0
- data/spec/support/shared/destination_examples.rb +4 -5
- data/spec/support/shared/subscription_examples.rb +146 -0
- data/spec/support/shared/transaction_examples.rb +43 -0
- data/spec/support/utils.rb +14 -0
- data/spec/units/message_driver/adapters/base_spec.rb +38 -19
- data/spec/units/message_driver/broker_spec.rb +71 -18
- data/spec/units/message_driver/client_spec.rb +375 -0
- data/spec/units/message_driver/destination_spec.rb +9 -0
- data/spec/units/message_driver/logging_spec.rb +18 -0
- data/spec/units/message_driver/message_spec.rb +36 -0
- data/spec/units/message_driver/subscription_spec.rb +24 -0
- data/test_lib/broker_config.rb +50 -20
- metadata +83 -45
- data/.rbenv-version +0 -1
- data/lib/message_driver/exceptions.rb +0 -18
- data/lib/message_driver/message_publisher.rb +0 -15
- data/spec/integration/message_driver/adapters/bunny_adapter_spec.rb +0 -301
- data/spec/units/message_driver/adapters/in_memory_adapter_spec.rb +0 -43
- data/spec/units/message_driver/message_publisher_spec.rb +0 -65
metadata
CHANGED
@@ -1,89 +1,79 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: message-driver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.0.rc1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Matt Campbell
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-09-23 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rake
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rspec
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ~>
|
36
32
|
- !ruby/object:Gem::Version
|
37
|
-
version: 2.
|
33
|
+
version: 2.14.0
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ~>
|
44
39
|
- !ruby/object:Gem::Version
|
45
|
-
version: 2.
|
40
|
+
version: 2.14.0
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: cucumber
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
|
-
name:
|
56
|
+
name: aruba
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - '>='
|
68
60
|
- !ruby/object:Gem::Version
|
69
|
-
version: 0
|
61
|
+
version: '0'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - '>='
|
76
67
|
- !ruby/object:Gem::Version
|
77
|
-
version: 0
|
68
|
+
version: '0'
|
78
69
|
description: Easy message queues for ruby using AMQ, STOMP and others
|
79
70
|
email:
|
80
|
-
-
|
71
|
+
- message-driver@soupmatt.com
|
81
72
|
executables: []
|
82
73
|
extensions: []
|
83
74
|
extra_rdoc_files: []
|
84
75
|
files:
|
85
76
|
- .gitignore
|
86
|
-
- .rbenv-version
|
87
77
|
- .relish
|
88
78
|
- .rspec
|
89
79
|
- .travis.yml
|
@@ -93,6 +83,10 @@ files:
|
|
93
83
|
- LICENSE.txt
|
94
84
|
- README.md
|
95
85
|
- Rakefile
|
86
|
+
- examples/basic_producer_and_consumer/Gemfile
|
87
|
+
- examples/basic_producer_and_consumer/common.rb
|
88
|
+
- examples/basic_producer_and_consumer/consumer.rb
|
89
|
+
- examples/basic_producer_and_consumer/producer.rb
|
96
90
|
- features/.nav
|
97
91
|
- features/CHANGELOG.md
|
98
92
|
- features/README.md
|
@@ -100,16 +94,28 @@ files:
|
|
100
94
|
- features/amqp_specific_features/README.md
|
101
95
|
- features/amqp_specific_features/binding_amqp_destinations.feature
|
102
96
|
- features/amqp_specific_features/declaring_amqp_exchanges.feature
|
97
|
+
- features/amqp_specific_features/nack_redelivered_messages.feature
|
98
|
+
- features/amqp_specific_features/requeueing_on_nack.feature
|
103
99
|
- features/amqp_specific_features/server_named_destinations.feature
|
100
|
+
- features/client_acks.feature
|
104
101
|
- features/destination_metadata.feature
|
105
102
|
- features/dynamic_destinations.feature
|
106
103
|
- features/error_handling.feature
|
107
104
|
- features/getting_started.md
|
105
|
+
- features/logging.feature
|
106
|
+
- features/message_consumers.feature
|
107
|
+
- features/message_consumers/auto_ack_consumers.feature
|
108
|
+
- features/message_consumers/manual_ack_consumers.feature
|
109
|
+
- features/message_consumers/transactional_ack_consumers.feature
|
108
110
|
- features/publishing_a_message.feature
|
109
111
|
- features/publishing_with_transactions.feature
|
112
|
+
- features/rabbitmq_specific_features/dead_letter_queueing.feature
|
110
113
|
- features/step_definitions/dynamic_destinations_steps.rb
|
111
114
|
- features/step_definitions/error_handling_steps.rb
|
115
|
+
- features/step_definitions/logging_steps.rb
|
116
|
+
- features/step_definitions/message_consumers_steps.rb
|
112
117
|
- features/step_definitions/steps.rb
|
118
|
+
- features/support/broker_config_helper.rb
|
113
119
|
- features/support/env.rb
|
114
120
|
- features/support/firewall_helper.rb
|
115
121
|
- features/support/message_table_matcher.rb
|
@@ -121,51 +127,62 @@ files:
|
|
121
127
|
- lib/message_driver/adapters/base.rb
|
122
128
|
- lib/message_driver/adapters/bunny_adapter.rb
|
123
129
|
- lib/message_driver/adapters/in_memory_adapter.rb
|
130
|
+
- lib/message_driver/adapters/stomp_adapter.rb
|
124
131
|
- lib/message_driver/broker.rb
|
132
|
+
- lib/message_driver/client.rb
|
125
133
|
- lib/message_driver/destination.rb
|
126
|
-
- lib/message_driver/
|
134
|
+
- lib/message_driver/errors.rb
|
135
|
+
- lib/message_driver/logging.rb
|
127
136
|
- lib/message_driver/message.rb
|
128
|
-
- lib/message_driver/
|
137
|
+
- lib/message_driver/subscription.rb
|
138
|
+
- lib/message_driver/vendor/.document
|
139
|
+
- lib/message_driver/vendor/nesty.rb
|
140
|
+
- lib/message_driver/vendor/nesty/nested_error.rb
|
129
141
|
- lib/message_driver/version.rb
|
130
142
|
- message-driver.gemspec
|
131
|
-
- spec/integration/amqp_integration_spec.rb
|
132
|
-
- spec/integration/
|
143
|
+
- spec/integration/bunny/amqp_integration_spec.rb
|
144
|
+
- spec/integration/bunny/bunny_adapter_spec.rb
|
145
|
+
- spec/integration/in_memory/in_memory_adapter_spec.rb
|
146
|
+
- spec/integration/stomp/stomp_adapter_spec.rb
|
133
147
|
- spec/spec_helper.rb
|
148
|
+
- spec/support/shared/adapter_examples.rb
|
149
|
+
- spec/support/shared/client_ack_examples.rb
|
150
|
+
- spec/support/shared/context_examples.rb
|
134
151
|
- spec/support/shared/destination_examples.rb
|
152
|
+
- spec/support/shared/subscription_examples.rb
|
153
|
+
- spec/support/shared/transaction_examples.rb
|
154
|
+
- spec/support/utils.rb
|
135
155
|
- spec/units/message_driver/adapters/base_spec.rb
|
136
|
-
- spec/units/message_driver/adapters/in_memory_adapter_spec.rb
|
137
156
|
- spec/units/message_driver/broker_spec.rb
|
157
|
+
- spec/units/message_driver/client_spec.rb
|
138
158
|
- spec/units/message_driver/destination_spec.rb
|
139
|
-
- spec/units/message_driver/
|
159
|
+
- spec/units/message_driver/logging_spec.rb
|
140
160
|
- spec/units/message_driver/message_spec.rb
|
161
|
+
- spec/units/message_driver/subscription_spec.rb
|
141
162
|
- test_lib/broker_config.rb
|
142
|
-
homepage: https://github.com/
|
163
|
+
homepage: https://github.com/message-driver/message-driver
|
143
164
|
licenses:
|
144
165
|
- MIT
|
166
|
+
metadata: {}
|
145
167
|
post_install_message:
|
146
168
|
rdoc_options: []
|
147
169
|
require_paths:
|
148
170
|
- lib
|
149
171
|
required_ruby_version: !ruby/object:Gem::Requirement
|
150
|
-
none: false
|
151
172
|
requirements:
|
152
|
-
- -
|
173
|
+
- - '>='
|
153
174
|
- !ruby/object:Gem::Version
|
154
175
|
version: 1.9.2
|
155
176
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
156
|
-
none: false
|
157
177
|
requirements:
|
158
|
-
- -
|
178
|
+
- - '>'
|
159
179
|
- !ruby/object:Gem::Version
|
160
|
-
version:
|
161
|
-
segments:
|
162
|
-
- 0
|
163
|
-
hash: 1747639069992114351
|
180
|
+
version: 1.3.1
|
164
181
|
requirements: []
|
165
182
|
rubyforge_project:
|
166
|
-
rubygems_version:
|
183
|
+
rubygems_version: 2.0.3
|
167
184
|
signing_key:
|
168
|
-
specification_version:
|
185
|
+
specification_version: 4
|
169
186
|
summary: Easy message queues for ruby
|
170
187
|
test_files:
|
171
188
|
- features/.nav
|
@@ -175,29 +192,50 @@ test_files:
|
|
175
192
|
- features/amqp_specific_features/README.md
|
176
193
|
- features/amqp_specific_features/binding_amqp_destinations.feature
|
177
194
|
- features/amqp_specific_features/declaring_amqp_exchanges.feature
|
195
|
+
- features/amqp_specific_features/nack_redelivered_messages.feature
|
196
|
+
- features/amqp_specific_features/requeueing_on_nack.feature
|
178
197
|
- features/amqp_specific_features/server_named_destinations.feature
|
198
|
+
- features/client_acks.feature
|
179
199
|
- features/destination_metadata.feature
|
180
200
|
- features/dynamic_destinations.feature
|
181
201
|
- features/error_handling.feature
|
182
202
|
- features/getting_started.md
|
203
|
+
- features/logging.feature
|
204
|
+
- features/message_consumers.feature
|
205
|
+
- features/message_consumers/auto_ack_consumers.feature
|
206
|
+
- features/message_consumers/manual_ack_consumers.feature
|
207
|
+
- features/message_consumers/transactional_ack_consumers.feature
|
183
208
|
- features/publishing_a_message.feature
|
184
209
|
- features/publishing_with_transactions.feature
|
210
|
+
- features/rabbitmq_specific_features/dead_letter_queueing.feature
|
185
211
|
- features/step_definitions/dynamic_destinations_steps.rb
|
186
212
|
- features/step_definitions/error_handling_steps.rb
|
213
|
+
- features/step_definitions/logging_steps.rb
|
214
|
+
- features/step_definitions/message_consumers_steps.rb
|
187
215
|
- features/step_definitions/steps.rb
|
216
|
+
- features/support/broker_config_helper.rb
|
188
217
|
- features/support/env.rb
|
189
218
|
- features/support/firewall_helper.rb
|
190
219
|
- features/support/message_table_matcher.rb
|
191
220
|
- features/support/no_error_matcher.rb
|
192
221
|
- features/support/test_runner.rb
|
193
222
|
- features/support/transforms.rb
|
194
|
-
- spec/integration/amqp_integration_spec.rb
|
195
|
-
- spec/integration/
|
223
|
+
- spec/integration/bunny/amqp_integration_spec.rb
|
224
|
+
- spec/integration/bunny/bunny_adapter_spec.rb
|
225
|
+
- spec/integration/in_memory/in_memory_adapter_spec.rb
|
226
|
+
- spec/integration/stomp/stomp_adapter_spec.rb
|
196
227
|
- spec/spec_helper.rb
|
228
|
+
- spec/support/shared/adapter_examples.rb
|
229
|
+
- spec/support/shared/client_ack_examples.rb
|
230
|
+
- spec/support/shared/context_examples.rb
|
197
231
|
- spec/support/shared/destination_examples.rb
|
232
|
+
- spec/support/shared/subscription_examples.rb
|
233
|
+
- spec/support/shared/transaction_examples.rb
|
234
|
+
- spec/support/utils.rb
|
198
235
|
- spec/units/message_driver/adapters/base_spec.rb
|
199
|
-
- spec/units/message_driver/adapters/in_memory_adapter_spec.rb
|
200
236
|
- spec/units/message_driver/broker_spec.rb
|
237
|
+
- spec/units/message_driver/client_spec.rb
|
201
238
|
- spec/units/message_driver/destination_spec.rb
|
202
|
-
- spec/units/message_driver/
|
239
|
+
- spec/units/message_driver/logging_spec.rb
|
203
240
|
- spec/units/message_driver/message_spec.rb
|
241
|
+
- spec/units/message_driver/subscription_spec.rb
|
data/.rbenv-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
1.9.3-p327
|
@@ -1,18 +0,0 @@
|
|
1
|
-
module MessageDriver
|
2
|
-
class Exception < ::Exception; end
|
3
|
-
|
4
|
-
class WrappedException < Exception
|
5
|
-
attr_reader :other
|
6
|
-
|
7
|
-
def initialize(other, msg=nil)
|
8
|
-
super(msg || other.to_s)
|
9
|
-
@other = other
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
class QueueNotFound < WrappedException; end
|
14
|
-
|
15
|
-
class ConnectionException < WrappedException; end
|
16
|
-
|
17
|
-
class TransactionRollbackOnly < Exception; end
|
18
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
module MessageDriver
|
2
|
-
module MessagePublisher
|
3
|
-
def publish(destination, body, headers={}, properties={})
|
4
|
-
Broker.publish(destination, body, headers, properties)
|
5
|
-
end
|
6
|
-
|
7
|
-
def pop_message(destination, options={})
|
8
|
-
Broker.pop_message(destination, options)
|
9
|
-
end
|
10
|
-
|
11
|
-
def with_message_transaction(options={}, &block)
|
12
|
-
Broker.with_transaction(options, &block)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,301 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
require 'message_driver/adapters/bunny_adapter'
|
4
|
-
|
5
|
-
module MessageDriver::Adapters
|
6
|
-
describe BunnyAdapter, :bunny, type: :integration do
|
7
|
-
|
8
|
-
let(:valid_connection_attrs) { BrokerConfig.config }
|
9
|
-
|
10
|
-
describe "#initialize" do
|
11
|
-
context "differing bunny versions" do
|
12
|
-
shared_examples "raises an error" do
|
13
|
-
it "raises an error" do
|
14
|
-
stub_const("Bunny::VERSION", version)
|
15
|
-
expect {
|
16
|
-
described_class.new(valid_connection_attrs)
|
17
|
-
}.to raise_error MessageDriver::Exception, "bunny 0.9.0.pre7 or later is required for the bunny adapter"
|
18
|
-
end
|
19
|
-
end
|
20
|
-
shared_examples "doesn't raise an error" do
|
21
|
-
it "doesn't raise an an error" do
|
22
|
-
stub_const("Bunny::VERSION", version)
|
23
|
-
adapter = nil
|
24
|
-
expect {
|
25
|
-
adapter = described_class.new(valid_connection_attrs)
|
26
|
-
}.to_not raise_error
|
27
|
-
end
|
28
|
-
end
|
29
|
-
%w(0.8.0 0.9.0.pre6).each do |v|
|
30
|
-
context "bunny version #{v}" do
|
31
|
-
let(:version) { v }
|
32
|
-
include_examples "raises an error"
|
33
|
-
end
|
34
|
-
end
|
35
|
-
%w(0.9.0.pre7 0.9.0.rc1 0.9.0 0.9.1).each do |v|
|
36
|
-
context "bunny version #{v}" do
|
37
|
-
let(:version) { v }
|
38
|
-
include_examples "doesn't raise an error"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
it "connects to the rabbit broker" do
|
44
|
-
adapter = described_class.new(valid_connection_attrs)
|
45
|
-
|
46
|
-
expect(adapter.connection).to be_a Bunny::Session
|
47
|
-
expect(adapter.connection).to be_open
|
48
|
-
end
|
49
|
-
|
50
|
-
it "connects to the rabbit broker lazily" do
|
51
|
-
adapter = described_class.new(valid_connection_attrs)
|
52
|
-
|
53
|
-
expect(adapter.connection(false)).to_not be_open
|
54
|
-
end
|
55
|
-
|
56
|
-
it "forces bunny into non-threaded mode" do
|
57
|
-
#FIXME can be changed once ruby-amqp/bunny#112 is fixed
|
58
|
-
adapter = described_class.new(valid_connection_attrs)
|
59
|
-
expect(adapter.connection(false).threaded).to be_false
|
60
|
-
|
61
|
-
adapter = described_class.new(valid_connection_attrs.merge(threaded: true))
|
62
|
-
expect(adapter.connection(false).threaded).to be_false
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
shared_context "a connected adapter" do
|
67
|
-
let(:adapter) { described_class.new(valid_connection_attrs) }
|
68
|
-
let(:connection) { adapter.connection }
|
69
|
-
|
70
|
-
after do
|
71
|
-
connection.close
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
shared_context "with a queue" do
|
76
|
-
include_context "a connected adapter"
|
77
|
-
|
78
|
-
let(:channel) { connection.create_channel }
|
79
|
-
let(:tmp_queue_name) { "my_temp_queue" }
|
80
|
-
let(:tmp_queue) { channel.queue(tmp_queue_name, exclusive: true) }
|
81
|
-
end
|
82
|
-
|
83
|
-
describe "#pop_message" do
|
84
|
-
include_context "with a queue"
|
85
|
-
it "needs some real tests"
|
86
|
-
end
|
87
|
-
|
88
|
-
describe "#create_destination" do
|
89
|
-
include_context "a connected adapter"
|
90
|
-
|
91
|
-
context "with defaults" do
|
92
|
-
context "the resulting destination" do
|
93
|
-
let(:dest_name) { "my_dest" }
|
94
|
-
subject(:result) { adapter.create_destination(dest_name, exclusive: true) }
|
95
|
-
|
96
|
-
it { should be_a BunnyAdapter::QueueDestination }
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
context "the type is queue" do
|
101
|
-
context "and there is no destination name given" do
|
102
|
-
subject(:destination) { adapter.create_destination("", type: :queue, exclusive: true) }
|
103
|
-
it { should be_a BunnyAdapter::QueueDestination }
|
104
|
-
its(:name) { should be_a String }
|
105
|
-
its(:name) { should_not be_empty }
|
106
|
-
end
|
107
|
-
context "the resulting destination" do
|
108
|
-
let(:dest_name) { "my_dest" }
|
109
|
-
subject(:destination) { adapter.create_destination(dest_name, type: :queue, exclusive: true) }
|
110
|
-
before do
|
111
|
-
destination
|
112
|
-
end
|
113
|
-
|
114
|
-
it { should be_a BunnyAdapter::QueueDestination }
|
115
|
-
its(:name) { should be_a String }
|
116
|
-
its(:name) { should eq(dest_name) }
|
117
|
-
|
118
|
-
include_examples "supports #message_count"
|
119
|
-
|
120
|
-
it "strips off the type so it isn't set on the destination" do
|
121
|
-
expect(subject.dest_options).to_not have_key :type
|
122
|
-
end
|
123
|
-
it "ensures the queue is declared" do
|
124
|
-
expect {
|
125
|
-
connection.with_channel do |ch|
|
126
|
-
ch.queue(dest_name, passive: true)
|
127
|
-
end
|
128
|
-
}.to_not raise_error
|
129
|
-
end
|
130
|
-
context "publishing a message" do
|
131
|
-
let(:body) { "Testing the QueueDestination" }
|
132
|
-
let(:headers) { {"foo" => "bar"} }
|
133
|
-
let(:properties) { {persistent: false} }
|
134
|
-
before do
|
135
|
-
subject.publish(body, headers, properties)
|
136
|
-
end
|
137
|
-
it "publishes via the default exchange" do
|
138
|
-
msg = subject.pop_message
|
139
|
-
expect(msg.body).to eq(body)
|
140
|
-
expect(msg.headers).to eq(headers)
|
141
|
-
expect(msg.properties[:delivery_mode]).to eq(1)
|
142
|
-
expect(msg.delivery_info.exchange).to eq("")
|
143
|
-
expect(msg.delivery_info.routing_key).to eq(subject.name)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
it_behaves_like "a destination"
|
147
|
-
end
|
148
|
-
context "and bindings are provided" do
|
149
|
-
let(:dest_name) { "binding_test_queue" }
|
150
|
-
let(:exchange) { adapter.create_destination("amq.direct", type: :exchange) }
|
151
|
-
|
152
|
-
it "raises an exception if you don't provide a source" do
|
153
|
-
expect {
|
154
|
-
adapter.create_destination("bad_bind_queue", type: :queue, exclusive: true, bindings: [{args: {routing_key: "test_exchange_bind"}}])
|
155
|
-
}.to raise_error MessageDriver::Exception, /must provide a source/
|
156
|
-
end
|
157
|
-
|
158
|
-
it "routes message to the queue through the exchange" do
|
159
|
-
destination = adapter.create_destination(dest_name, type: :queue, exclusive: true, bindings: [{source: "amq.direct", args: {routing_key: "test_queue_bind"}}])
|
160
|
-
exchange.publish("test queue bindings", {}, {routing_key: "test_queue_bind"})
|
161
|
-
message = destination.pop_message
|
162
|
-
expect(message).to_not be_nil
|
163
|
-
expect(message.body).to eq("test queue bindings")
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
context "we are not yet connected to the broker and :no_declare is provided" do
|
168
|
-
it "doesn't cause a connection to the broker" do
|
169
|
-
connection.stop
|
170
|
-
adapter.create_destination("test_queue", no_declare: true, type: :queue, exclusive: true)
|
171
|
-
expect(adapter.connection(false)).to_not be_open
|
172
|
-
end
|
173
|
-
|
174
|
-
context "with a server-named queue" do
|
175
|
-
it "raises an error" do
|
176
|
-
expect {
|
177
|
-
adapter.create_destination("", no_declare: true, type: :queue, exclusive: true)
|
178
|
-
}.to raise_error MessageDriver::Exception, "server-named queues must be declared, but you provided :no_declare => true"
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
context "with bindings" do
|
183
|
-
it "raises an error" do
|
184
|
-
expect {
|
185
|
-
adapter.create_destination("tmp_queue", no_declare: true, bindings: [{source: "amq.fanout"}], type: :queue, exclusive: true)
|
186
|
-
}.to raise_error MessageDriver::Exception, "queues with bindings must be declared, but you provided :no_declare => true"
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
context "the type is exchange" do
|
193
|
-
context "the resulting destination" do
|
194
|
-
let(:dest_name) { "my_dest" }
|
195
|
-
subject(:destination) { adapter.create_destination(dest_name, type: :exchange) }
|
196
|
-
|
197
|
-
it { should be_a BunnyAdapter::ExchangeDestination }
|
198
|
-
include_examples "doesn't support #message_count"
|
199
|
-
|
200
|
-
it "strips off the type so it isn't set on the destination" do
|
201
|
-
expect(subject.dest_options).to_not have_key :type
|
202
|
-
end
|
203
|
-
|
204
|
-
it "raises an error when pop_message is called" do
|
205
|
-
expect {
|
206
|
-
subject.pop_message(dest_name)
|
207
|
-
}.to raise_error MessageDriver::Exception, "You can't pop a message off an exchange"
|
208
|
-
end
|
209
|
-
|
210
|
-
context "publishing a message" do
|
211
|
-
let(:body) { "Testing the ExchangeDestination" }
|
212
|
-
let(:headers) { {"foo" => "bar"} }
|
213
|
-
let(:properties) { {persistent: false} }
|
214
|
-
before { connection.with_channel { |ch| ch.fanout(dest_name, auto_delete: true) } }
|
215
|
-
let!(:queue) do
|
216
|
-
q = nil
|
217
|
-
connection.with_channel do |ch|
|
218
|
-
q = ch.queue("", exclusive: true)
|
219
|
-
q.bind(dest_name)
|
220
|
-
end
|
221
|
-
q
|
222
|
-
end
|
223
|
-
before do
|
224
|
-
subject.publish(body, headers, properties)
|
225
|
-
end
|
226
|
-
|
227
|
-
it "publishes to the specified exchange" do
|
228
|
-
connection.with_channel do |ch|
|
229
|
-
q = ch.queue(queue.name, passive: true)
|
230
|
-
msg = q.pop
|
231
|
-
expect(msg[2]).to eq(body)
|
232
|
-
expect(msg[0].exchange).to eq(dest_name)
|
233
|
-
expect(msg[1][:headers]).to eq(headers)
|
234
|
-
expect(msg[1][:delivery_mode]).to eq(1)
|
235
|
-
end
|
236
|
-
end
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
context "declaring an exchange on the broker" do
|
241
|
-
let(:dest_name) { "my.cool.exchange" }
|
242
|
-
|
243
|
-
it "creates the exchange if you include 'declare' in the options" do
|
244
|
-
exchange = adapter.create_destination(dest_name, type: :exchange, declare: {type: :fanout, auto_delete: true})
|
245
|
-
queue = adapter.create_destination("", type: :queue, exclusive: true, bindings: [{source: dest_name}])
|
246
|
-
exchange.publish("test declaring exchange")
|
247
|
-
message = queue.pop_message
|
248
|
-
expect(message).to_not be_nil
|
249
|
-
expect(message.body).to eq("test declaring exchange")
|
250
|
-
end
|
251
|
-
|
252
|
-
it "raises an error if you don't provide a type" do
|
253
|
-
expect {
|
254
|
-
adapter.create_destination(dest_name, type: :exchange, declare: {auto_delete: true})
|
255
|
-
}.to raise_error MessageDriver::Exception, /you must provide a valid exchange type/
|
256
|
-
end
|
257
|
-
|
258
|
-
end
|
259
|
-
|
260
|
-
context "and bindings are provided" do
|
261
|
-
let(:dest_name) { "binding_exchange_queue" }
|
262
|
-
let(:exchange) { adapter.create_destination("amq.direct", type: :exchange) }
|
263
|
-
|
264
|
-
it "raises an exception if you don't provide a source" do
|
265
|
-
expect {
|
266
|
-
adapter.create_destination("amq.fanout", type: :exchange, bindings: [{args: {routing_key: "test_exchange_bind"}}])
|
267
|
-
}.to raise_error MessageDriver::Exception, /must provide a source/
|
268
|
-
end
|
269
|
-
|
270
|
-
it "routes message to the queue through the exchange" do
|
271
|
-
adapter.create_destination("amq.fanout", type: :exchange, bindings: [{source: "amq.direct", args: {routing_key: "test_exchange_bind"}}])
|
272
|
-
destination = adapter.create_destination(dest_name, type: :queue, exclusive: true, bindings: [{source: "amq.fanout"}])
|
273
|
-
exchange.publish("test exchange bindings", {}, {routing_key: "test_exchange_bind"})
|
274
|
-
message = destination.pop_message
|
275
|
-
expect(message).to_not be_nil
|
276
|
-
expect(message.body).to eq("test exchange bindings")
|
277
|
-
end
|
278
|
-
end
|
279
|
-
|
280
|
-
context "we are not yet connected to the broker" do
|
281
|
-
before do
|
282
|
-
connection.stop
|
283
|
-
end
|
284
|
-
|
285
|
-
it "doesn't cause a connection to the broker" do
|
286
|
-
adapter.create_destination("amq.fanout", type: :exchange)
|
287
|
-
expect(adapter.connection(false)).to_not be_open
|
288
|
-
end
|
289
|
-
end
|
290
|
-
end
|
291
|
-
|
292
|
-
context "the type is invalid" do
|
293
|
-
it "raises in an error" do
|
294
|
-
expect {
|
295
|
-
adapter.create_destination("my_dest", type: :foo_bar)
|
296
|
-
}.to raise_error MessageDriver::Exception, "invalid destination type #{:foo_bar}"
|
297
|
-
end
|
298
|
-
end
|
299
|
-
end
|
300
|
-
end
|
301
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
require 'message_driver/adapters/in_memory_adapter'
|
4
|
-
|
5
|
-
module MessageDriver::Adapters
|
6
|
-
describe InMemoryAdapter do
|
7
|
-
let(:adapter) { described_class.new }
|
8
|
-
|
9
|
-
describe "#create_destination" do
|
10
|
-
describe "the resulting destination" do
|
11
|
-
let!(:destination) { adapter.create_destination("my_test_dest") }
|
12
|
-
it_behaves_like "a destination"
|
13
|
-
|
14
|
-
subject { destination }
|
15
|
-
|
16
|
-
it { should be_a InMemoryAdapter::Destination }
|
17
|
-
|
18
|
-
include_examples "supports #message_count"
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
describe "#reset_after_tests" do
|
23
|
-
#make some destinations
|
24
|
-
# throw some messages on it
|
25
|
-
# assert the messages are in the destinations
|
26
|
-
# empty the queues on each destination via method
|
27
|
-
# assert destinations are empty
|
28
|
-
|
29
|
-
it "empties all the destination queues" do
|
30
|
-
destinations = (1..3).map(&adapter.method(:create_destination))
|
31
|
-
destinations.each do |destination|
|
32
|
-
destination.publish("There's always money in the banana stand!", {}, {})
|
33
|
-
end
|
34
|
-
|
35
|
-
adapter.reset_after_tests
|
36
|
-
|
37
|
-
destinations.each do |destination|
|
38
|
-
expect(destination.pop_message).to be_nil
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|