message-driver 0.3.0 → 0.4.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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +18 -0
  3. data/.rubocop_todo.yml +160 -0
  4. data/.travis.yml +5 -4
  5. data/CHANGELOG.md +5 -0
  6. data/Gemfile +9 -8
  7. data/Guardfile +14 -7
  8. data/README.md +2 -0
  9. data/Rakefile +16 -10
  10. data/examples/basic_producer_and_consumer/Gemfile +2 -2
  11. data/examples/basic_producer_and_consumer/common.rb +3 -3
  12. data/examples/basic_producer_and_consumer/consumer.rb +5 -5
  13. data/examples/basic_producer_and_consumer/producer.rb +7 -7
  14. data/features/CHANGELOG.md +5 -0
  15. data/features/message_consumers/transactional_ack_consumers.feature +1 -0
  16. data/features/rabbitmq_specific_features/publisher_acknowledgements.feature +51 -0
  17. data/features/step_definitions/error_handling_steps.rb +2 -2
  18. data/features/step_definitions/logging_steps.rb +4 -4
  19. data/features/step_definitions/message_consumers_steps.rb +8 -8
  20. data/features/step_definitions/rabbitmq_specific_steps.rb +10 -0
  21. data/features/step_definitions/steps.rb +15 -15
  22. data/features/support/env.rb +3 -0
  23. data/features/support/firewall_helper.rb +5 -6
  24. data/features/support/message_table_matcher.rb +3 -4
  25. data/features/support/no_error_matcher.rb +3 -3
  26. data/features/support/test_runner.rb +11 -3
  27. data/features/support/transforms.rb +1 -1
  28. data/lib/message-driver.rb +1 -1
  29. data/lib/message_driver.rb +0 -1
  30. data/lib/message_driver/adapters/base.rb +10 -10
  31. data/lib/message_driver/adapters/bunny_adapter.rb +57 -30
  32. data/lib/message_driver/adapters/in_memory_adapter.rb +4 -5
  33. data/lib/message_driver/adapters/stomp_adapter.rb +4 -6
  34. data/lib/message_driver/broker.rb +5 -4
  35. data/lib/message_driver/client.rb +6 -6
  36. data/lib/message_driver/destination.rb +2 -2
  37. data/lib/message_driver/errors.rb +1 -4
  38. data/lib/message_driver/logging.rb +1 -1
  39. data/lib/message_driver/message.rb +2 -2
  40. data/lib/message_driver/subscription.rb +1 -1
  41. data/lib/message_driver/version.rb +1 -1
  42. data/lib/{message_driver/vendor → vendor}/.document +0 -0
  43. data/lib/vendor/nesty.rb +1 -0
  44. data/lib/vendor/nesty/nested_error.rb +28 -0
  45. data/message-driver.gemspec +15 -14
  46. data/spec/integration/bunny/amqp_integration_spec.rb +43 -43
  47. data/spec/integration/bunny/bunny_adapter_spec.rb +117 -101
  48. data/spec/integration/in_memory/in_memory_adapter_spec.rb +35 -35
  49. data/spec/integration/stomp/stomp_adapter_spec.rb +42 -42
  50. data/spec/spec_helper.rb +4 -1
  51. data/spec/support/shared/adapter_examples.rb +7 -7
  52. data/spec/support/shared/client_ack_examples.rb +6 -6
  53. data/spec/support/shared/context_examples.rb +4 -4
  54. data/spec/support/shared/destination_examples.rb +10 -10
  55. data/spec/support/shared/subscription_examples.rb +29 -29
  56. data/spec/support/shared/transaction_examples.rb +10 -10
  57. data/spec/units/message_driver/adapters/base_spec.rb +19 -19
  58. data/spec/units/message_driver/broker_spec.rb +57 -58
  59. data/spec/units/message_driver/client_spec.rb +84 -84
  60. data/spec/units/message_driver/destination_spec.rb +4 -4
  61. data/spec/units/message_driver/message_spec.rb +19 -19
  62. data/spec/units/message_driver/subscription_spec.rb +4 -4
  63. data/test_lib/broker_config.rb +2 -2
  64. metadata +27 -6
  65. data/lib/message_driver/vendor/nesty.rb +0 -1
  66. data/lib/message_driver/vendor/nesty/nested_error.rb +0 -26
@@ -7,33 +7,33 @@ module MessageDriver::Adapters
7
7
 
8
8
  let(:valid_connection_attrs) { BrokerConfig.config }
9
9
 
10
- describe "#initialize" do
11
- context "differing bunny versions" do
12
- let(:broker) { double("broker") }
13
- shared_examples "raises an error" do
14
- it "raises an error" do
15
- stub_const("Bunny::VERSION", version)
10
+ describe '#initialize' do
11
+ context 'differing bunny versions' do
12
+ let(:broker) { double('broker') }
13
+ shared_examples 'raises an error' do
14
+ it 'raises an error' do
15
+ stub_const('Bunny::VERSION', version)
16
16
  expect {
17
17
  described_class.new(broker, valid_connection_attrs)
18
- }.to raise_error MessageDriver::Error, "bunny 1.1.3 or later is required for the bunny adapter"
18
+ }.to raise_error MessageDriver::Error, 'bunny 1.2.2 or later is required for the bunny adapter'
19
19
  end
20
20
  end
21
21
  shared_examples "doesn't raise an error" do
22
22
  it "doesn't raise an an error" do
23
- stub_const("Bunny::VERSION", version)
23
+ stub_const('Bunny::VERSION', version)
24
24
  adapter = nil
25
25
  expect {
26
26
  adapter = described_class.new(broker, valid_connection_attrs)
27
27
  }.to_not raise_error
28
28
  end
29
29
  end
30
- %w(0.8.0 0.9.0.pre11 0.9.0.rc1 0.9.0 0.9.8 0.10.7 1.0.3 1.1.2).each do |v|
30
+ %w(0.8.0 0.9.0 0.9.8 0.10.7 1.0.3 1.1.2 1.2.1).each do |v|
31
31
  context "bunny version #{v}" do
32
32
  let(:version) { v }
33
- include_examples "raises an error"
33
+ include_examples 'raises an error'
34
34
  end
35
35
  end
36
- %w(1.1.3 1.1.5).each do |v|
36
+ %w(1.2.2 1.3.2 1.4.0).each do |v|
37
37
  context "bunny version #{v}" do
38
38
  let(:version) { v }
39
39
  include_examples "doesn't raise an error"
@@ -41,7 +41,7 @@ module MessageDriver::Adapters
41
41
  end
42
42
  end
43
43
 
44
- it "connects to the rabbit broker" do
44
+ it 'connects to the rabbit broker' do
45
45
  broker = double(:broker)
46
46
  adapter = described_class.new(broker, valid_connection_attrs)
47
47
 
@@ -49,7 +49,7 @@ module MessageDriver::Adapters
49
49
  expect(adapter.connection).to be_open
50
50
  end
51
51
 
52
- it "connects to the rabbit broker lazily" do
52
+ it 'connects to the rabbit broker lazily' do
53
53
  broker = double(:broker)
54
54
  adapter = described_class.new(broker, valid_connection_attrs)
55
55
 
@@ -57,7 +57,7 @@ module MessageDriver::Adapters
57
57
  end
58
58
  end
59
59
 
60
- shared_context "a connected bunny adapter" do
60
+ shared_context 'a connected bunny adapter' do
61
61
  let(:broker) { MessageDriver::Broker.configure(valid_connection_attrs) }
62
62
  subject(:adapter) { broker.adapter }
63
63
  let(:connection) { adapter.connection }
@@ -67,43 +67,47 @@ module MessageDriver::Adapters
67
67
  end
68
68
  end
69
69
 
70
- shared_context "with a queue" do
71
- include_context "a connected bunny adapter"
70
+ shared_context 'with a queue' do
71
+ include_context 'a connected bunny adapter'
72
72
 
73
73
  let(:channel) { connection.create_channel }
74
- let(:tmp_queue_name) { "my_temp_queue" }
74
+ let(:tmp_queue_name) { 'my_temp_queue' }
75
75
  let(:tmp_queue) { channel.queue(tmp_queue_name, exclusive: true) }
76
76
  end
77
77
 
78
- it_behaves_like "an adapter" do
79
- include_context "a connected bunny adapter"
78
+ it_behaves_like 'an adapter' do
79
+ include_context 'a connected bunny adapter'
80
80
  end
81
81
 
82
- describe "#new_context" do
83
- include_context "a connected bunny adapter"
82
+ describe '#new_context' do
83
+ include_context 'a connected bunny adapter'
84
84
 
85
- it "returns a BunnyAdapter::BunnyContext" do
85
+ it 'returns a BunnyAdapter::BunnyContext' do
86
86
  expect(subject.new_context).to be_a BunnyAdapter::BunnyContext
87
87
  end
88
88
  end
89
89
 
90
90
  describe BunnyAdapter::BunnyContext do
91
- include_context "a connected bunny adapter"
91
+ include_context 'a connected bunny adapter'
92
92
  subject(:adapter_context) { adapter.new_context }
93
+ around(:each) do |ex|
94
+ MessageDriver::Client.with_adapter_context(adapter_context) do
95
+ ex.run
96
+ end
97
+ end
93
98
 
94
- it_behaves_like "an adapter context"
95
- it_behaves_like "transactions are supported"
96
- it_behaves_like "client acks are supported"
97
- it_behaves_like "subscriptions are supported", BunnyAdapter::Subscription
99
+ it_behaves_like 'an adapter context'
100
+ it_behaves_like 'transactions are supported'
101
+ it_behaves_like 'client acks are supported'
102
+ it_behaves_like 'subscriptions are supported', BunnyAdapter::Subscription
98
103
 
99
- describe "#pop_message" do
100
- include_context "with a queue"
101
- it "needs some real tests"
104
+ describe '#pop_message' do
105
+ include_context 'with a queue'
106
+ it 'needs some real tests'
102
107
  end
103
108
 
104
-
105
- describe "#invalidate" do
106
- it "closes the channel" do
109
+ describe '#invalidate' do
110
+ it 'closes the channel' do
107
111
  subject.with_channel(false) do |ch|
108
112
  expect(ch).to be_open
109
113
  end
@@ -112,26 +116,36 @@ module MessageDriver::Adapters
112
116
  end
113
117
  end
114
118
 
115
- describe "#create_destination" do
119
+ describe '#create_destination' do
116
120
 
117
- context "with defaults" do
118
- context "the resulting destination" do
119
- let(:dest_name) { "my_dest" }
121
+ context 'with defaults' do
122
+ context 'the resulting destination' do
123
+ let(:dest_name) { 'my_dest' }
120
124
  subject(:result) { adapter_context.create_destination(dest_name, exclusive: true) }
121
125
 
122
126
  it { should be_a BunnyAdapter::QueueDestination }
123
127
  end
124
128
  end
125
129
 
126
- context "the type is queue" do
127
- context "and there is no destination name given" do
128
- subject(:destination) { adapter_context.create_destination("", type: :queue, exclusive: true) }
130
+ shared_examples 'supports publisher confirmations' do
131
+ let(:properties) { {persistent: false, confirm: true} }
132
+ it 'switches the channel to confirms mode' do
133
+ expect(adapter_context.channel.using_publisher_confirms?).to eq(true)
134
+ end
135
+ it 'waits until the confirm comes in' do
136
+ expect(adapter_context.channel.unconfirmed_set).to be_empty
137
+ end
138
+ end
139
+
140
+ context 'the type is queue' do
141
+ context 'and there is no destination name given' do
142
+ subject(:destination) { adapter_context.create_destination('', type: :queue, exclusive: true) }
129
143
  it { should be_a BunnyAdapter::QueueDestination }
130
144
  its(:name) { should be_a String }
131
145
  its(:name) { should_not be_empty }
132
146
  end
133
- context "the resulting destination" do
134
- let(:dest_name) { "my_dest" }
147
+ context 'the resulting destination' do
148
+ let(:dest_name) { 'my_dest' }
135
149
  subject(:destination) { adapter_context.create_destination(dest_name, type: :queue, exclusive: true) }
136
150
  before do
137
151
  destination
@@ -141,83 +155,84 @@ module MessageDriver::Adapters
141
155
  its(:name) { should be_a String }
142
156
  its(:name) { should eq(dest_name) }
143
157
 
144
- include_examples "supports #message_count"
158
+ include_examples 'supports #message_count'
145
159
 
146
160
  it "strips off the type so it isn't set on the destination" do
147
161
  expect(subject.dest_options).to_not have_key :type
148
162
  end
149
- it "ensures the queue is declared" do
163
+ it 'ensures the queue is declared' do
150
164
  expect {
151
165
  connection.with_channel do |ch|
152
166
  ch.queue(dest_name, passive: true)
153
167
  end
154
168
  }.to_not raise_error
155
169
  end
156
- context "publishing a message" do
157
- let(:body) { "Testing the QueueDestination" }
158
- let(:headers) { {"foo" => "bar"} }
170
+ context 'publishing a message' do
171
+ let(:body) { 'Testing the QueueDestination' }
172
+ let(:headers) { {'foo' => 'bar'} }
159
173
  let(:properties) { {persistent: false} }
160
174
  before do
161
175
  subject.publish(body, headers, properties)
162
176
  end
163
- it "publishes via the default exchange" do
177
+ it 'publishes via the default exchange' do
164
178
  msg = subject.pop_message
165
179
  expect(msg.body).to eq(body)
166
180
  expect(msg.headers).to eq(headers)
167
181
  expect(msg.properties[:delivery_mode]).to eq(1)
168
- expect(msg.delivery_info.exchange).to eq("")
182
+ expect(msg.delivery_info.exchange).to eq('')
169
183
  expect(msg.delivery_info.routing_key).to eq(subject.name)
170
184
  end
185
+ include_examples 'supports publisher confirmations'
171
186
  end
172
- it_behaves_like "a destination"
187
+ it_behaves_like 'a destination'
173
188
  end
174
- context "and bindings are provided" do
175
- let(:dest_name) { "binding_test_queue" }
176
- let(:exchange) { adapter_context.create_destination("amq.direct", type: :exchange) }
189
+ context 'and bindings are provided' do
190
+ let(:dest_name) { 'binding_test_queue' }
191
+ let(:exchange) { adapter_context.create_destination('amq.direct', type: :exchange) }
177
192
 
178
193
  it "raises an exception if you don't provide a source" do
179
194
  expect {
180
- adapter_context.create_destination("bad_bind_queue", type: :queue, exclusive: true, bindings: [{args: {routing_key: "test_exchange_bind"}}])
195
+ adapter_context.create_destination('bad_bind_queue', type: :queue, exclusive: true, bindings: [{args: {routing_key: 'test_exchange_bind'}}])
181
196
  }.to raise_error MessageDriver::Error, /must provide a source/
182
197
  end
183
198
 
184
- it "routes message to the queue through the exchange" do
185
- destination = adapter_context.create_destination(dest_name, type: :queue, exclusive: true, bindings: [{source: "amq.direct", args: {routing_key: "test_queue_bind"}}])
186
- exchange.publish("test queue bindings", {}, {routing_key: "test_queue_bind"})
199
+ it 'routes message to the queue through the exchange' do
200
+ destination = adapter_context.create_destination(dest_name, type: :queue, exclusive: true, bindings: [{source: 'amq.direct', args: {routing_key: 'test_queue_bind'}}])
201
+ exchange.publish('test queue bindings', {}, routing_key: 'test_queue_bind')
187
202
  message = destination.pop_message
188
203
  expect(message).to_not be_nil
189
- expect(message.body).to eq("test queue bindings")
204
+ expect(message.body).to eq('test queue bindings')
190
205
  end
191
206
  end
192
207
 
193
- context "we are not yet connected to the broker and :no_declare is provided" do
208
+ context 'we are not yet connected to the broker and :no_declare is provided' do
194
209
  it "doesn't cause a connection to the broker" do
195
210
  connection.stop
196
- adapter_context.create_destination("test_queue", no_declare: true, type: :queue, exclusive: true)
211
+ adapter_context.create_destination('test_queue', no_declare: true, type: :queue, exclusive: true)
197
212
  expect(adapter.connection(false)).to_not be_open
198
213
  end
199
214
 
200
- context "with a server-named queue" do
201
- it "raises an error" do
215
+ context 'with a server-named queue' do
216
+ it 'raises an error' do
202
217
  expect {
203
- adapter_context.create_destination("", no_declare: true, type: :queue, exclusive: true)
204
- }.to raise_error MessageDriver::Error, "server-named queues must be declared, but you provided :no_declare => true"
218
+ adapter_context.create_destination('', no_declare: true, type: :queue, exclusive: true)
219
+ }.to raise_error MessageDriver::Error, 'server-named queues must be declared, but you provided :no_declare => true'
205
220
  end
206
221
  end
207
222
 
208
- context "with bindings" do
209
- it "raises an error" do
223
+ context 'with bindings' do
224
+ it 'raises an error' do
210
225
  expect {
211
- adapter_context.create_destination("tmp_queue", no_declare: true, bindings: [{source: "amq.fanout"}], type: :queue, exclusive: true)
212
- }.to raise_error MessageDriver::Error, "queues with bindings must be declared, but you provided :no_declare => true"
226
+ adapter_context.create_destination('tmp_queue', no_declare: true, bindings: [{source: 'amq.fanout'}], type: :queue, exclusive: true)
227
+ }.to raise_error MessageDriver::Error, 'queues with bindings must be declared, but you provided :no_declare => true'
213
228
  end
214
229
  end
215
230
  end
216
231
  end
217
232
 
218
- context "the type is exchange" do
219
- context "the resulting destination" do
220
- let(:dest_name) { "my_dest" }
233
+ context 'the type is exchange' do
234
+ context 'the resulting destination' do
235
+ let(:dest_name) { 'my_dest' }
221
236
  subject(:destination) { adapter_context.create_destination(dest_name, type: :exchange) }
222
237
 
223
238
  it { should be_a BunnyAdapter::ExchangeDestination }
@@ -227,21 +242,21 @@ module MessageDriver::Adapters
227
242
  expect(subject.dest_options).to_not have_key :type
228
243
  end
229
244
 
230
- it "raises an error when pop_message is called" do
245
+ it 'raises an error when pop_message is called' do
231
246
  expect {
232
247
  subject.pop_message(dest_name)
233
248
  }.to raise_error MessageDriver::Error, "You can't pop a message off an exchange"
234
249
  end
235
250
 
236
- context "publishing a message" do
237
- let(:body) { "Testing the ExchangeDestination" }
238
- let(:headers) { {"foo" => "bar"} }
251
+ context 'publishing a message' do
252
+ let(:body) { 'Testing the ExchangeDestination' }
253
+ let(:headers) { {'foo' => 'bar'} }
239
254
  let(:properties) { {persistent: false} }
240
255
  before { connection.with_channel { |ch| ch.fanout(dest_name, auto_delete: true) } }
241
256
  let!(:queue) do
242
257
  q = nil
243
258
  connection.with_channel do |ch|
244
- q = ch.queue("", exclusive: true)
259
+ q = ch.queue('', exclusive: true)
245
260
  q.bind(dest_name)
246
261
  end
247
262
  q
@@ -250,7 +265,7 @@ module MessageDriver::Adapters
250
265
  subject.publish(body, headers, properties)
251
266
  end
252
267
 
253
- it "publishes to the specified exchange" do
268
+ it 'publishes to the specified exchange' do
254
269
  connection.with_channel do |ch|
255
270
  q = ch.queue(queue.name, passive: true)
256
271
  msg = q.pop
@@ -260,19 +275,20 @@ module MessageDriver::Adapters
260
275
  expect(msg[1][:delivery_mode]).to eq(1)
261
276
  end
262
277
  end
278
+ include_examples 'supports publisher confirmations'
263
279
  end
264
280
  end
265
281
 
266
- context "declaring an exchange on the broker" do
267
- let(:dest_name) { "my.cool.exchange" }
282
+ context 'declaring an exchange on the broker' do
283
+ let(:dest_name) { 'my.cool.exchange' }
268
284
 
269
285
  it "creates the exchange if you include 'declare' in the options" do
270
286
  exchange = adapter_context.create_destination(dest_name, type: :exchange, declare: {type: :fanout, auto_delete: true})
271
- queue = adapter_context.create_destination("", type: :queue, exclusive: true, bindings: [{source: dest_name}])
272
- exchange.publish("test declaring exchange")
287
+ queue = adapter_context.create_destination('', type: :queue, exclusive: true, bindings: [{source: dest_name}])
288
+ exchange.publish('test declaring exchange')
273
289
  message = queue.pop_message
274
290
  expect(message).to_not be_nil
275
- expect(message.body).to eq("test declaring exchange")
291
+ expect(message.body).to eq('test declaring exchange')
276
292
  end
277
293
 
278
294
  it "raises an error if you don't provide a type" do
@@ -283,51 +299,51 @@ module MessageDriver::Adapters
283
299
 
284
300
  end
285
301
 
286
- context "and bindings are provided" do
287
- let(:dest_name) { "binding_exchange_queue" }
288
- let(:exchange) { adapter_context.create_destination("amq.direct", type: :exchange) }
302
+ context 'and bindings are provided' do
303
+ let(:dest_name) { 'binding_exchange_queue' }
304
+ let(:exchange) { adapter_context.create_destination('amq.direct', type: :exchange) }
289
305
 
290
306
  it "raises an exception if you don't provide a source" do
291
307
  expect {
292
- adapter_context.create_destination("amq.fanout", type: :exchange, bindings: [{args: {routing_key: "test_exchange_bind"}}])
308
+ adapter_context.create_destination('amq.fanout', type: :exchange, bindings: [{args: {routing_key: 'test_exchange_bind'}}])
293
309
  }.to raise_error MessageDriver::Error, /must provide a source/
294
310
  end
295
311
 
296
- it "routes message to the queue through the exchange" do
297
- adapter_context.create_destination("amq.fanout", type: :exchange, bindings: [{source: "amq.direct", args: {routing_key: "test_exchange_bind"}}])
298
- destination = adapter_context.create_destination(dest_name, type: :queue, exclusive: true, bindings: [{source: "amq.fanout"}])
299
- exchange.publish("test exchange bindings", {}, {routing_key: "test_exchange_bind"})
312
+ it 'routes message to the queue through the exchange' do
313
+ adapter_context.create_destination('amq.fanout', type: :exchange, bindings: [{source: 'amq.direct', args: {routing_key: 'test_exchange_bind'}}])
314
+ destination = adapter_context.create_destination(dest_name, type: :queue, exclusive: true, bindings: [{source: 'amq.fanout'}])
315
+ exchange.publish('test exchange bindings', {}, routing_key: 'test_exchange_bind')
300
316
  message = destination.pop_message
301
317
  expect(message).to_not be_nil
302
- expect(message.body).to eq("test exchange bindings")
318
+ expect(message.body).to eq('test exchange bindings')
303
319
  end
304
320
  end
305
321
 
306
- context "we are not yet connected to the broker" do
322
+ context 'we are not yet connected to the broker' do
307
323
  it "doesn't cause a connection to the broker" do
308
324
  connection.stop
309
- adapter_context.create_destination("amq.fanout", type: :exchange)
325
+ adapter_context.create_destination('amq.fanout', type: :exchange)
310
326
  expect(adapter.connection(false)).to_not be_open
311
327
  end
312
328
  end
313
329
  end
314
330
 
315
- context "the type is invalid" do
316
- it "raises in an error" do
331
+ context 'the type is invalid' do
332
+ it 'raises in an error' do
317
333
  expect {
318
- adapter_context.create_destination("my_dest", type: :foo_bar)
334
+ adapter_context.create_destination('my_dest', type: :foo_bar)
319
335
  }.to raise_error MessageDriver::Error, "invalid destination type #{:foo_bar}"
320
336
  end
321
337
  end
322
338
  end
323
339
 
324
- describe "#subscribe" do
325
- context "the destination is an ExchangeDestination" do
326
- let(:dest_name) { "my_dest" }
340
+ describe '#subscribe' do
341
+ context 'the destination is an ExchangeDestination' do
342
+ let(:dest_name) { 'my_dest' }
327
343
  let(:destination) { adapter_context.create_destination(dest_name, type: :exchange) }
328
- let(:consumer) { lambda do |m|; end }
344
+ let(:consumer) { lambda do |_|; end }
329
345
 
330
- it "raises an error" do
346
+ it 'raises an error' do
331
347
  expect {
332
348
  adapter_context.subscribe(destination, &consumer)
333
349
  }.to raise_error MessageDriver::Error, /QueueDestination/
@@ -4,39 +4,39 @@ require 'message_driver/adapters/in_memory_adapter'
4
4
 
5
5
  module MessageDriver::Adapters
6
6
  describe InMemoryAdapter, :in_memory, type: :integration do
7
- let(:broker) { double("broker") }
7
+ let(:broker) { double('broker') }
8
8
  subject(:adapter) { described_class.new(broker) }
9
9
 
10
- describe "#new_context" do
11
- it "returns a InMemoryAdapter::InMemoryContext" do
10
+ describe '#new_context' do
11
+ it 'returns a InMemoryAdapter::InMemoryContext' do
12
12
  expect(subject.new_context).to be_a InMemoryAdapter::InMemoryContext
13
13
  end
14
14
  end
15
15
 
16
- it_behaves_like "an adapter"
16
+ it_behaves_like 'an adapter'
17
17
 
18
18
  describe InMemoryAdapter::InMemoryContext do
19
19
  subject(:adapter_context) { adapter.new_context }
20
20
 
21
- it_behaves_like "an adapter context"
22
- it_behaves_like "transactions are not supported"
23
- it_behaves_like "client acks are not supported"
24
- it_behaves_like "subscriptions are supported", InMemoryAdapter::Subscription
21
+ it_behaves_like 'an adapter context'
22
+ it_behaves_like 'transactions are not supported'
23
+ it_behaves_like 'client acks are not supported'
24
+ it_behaves_like 'subscriptions are supported', InMemoryAdapter::Subscription
25
25
  end
26
26
 
27
- describe "#create_destination" do
28
- describe "the resulting destination" do
29
- subject(:destination) { adapter.create_destination("my_test_dest") }
27
+ describe '#create_destination' do
28
+ describe 'the resulting destination' do
29
+ subject(:destination) { adapter.create_destination('my_test_dest') }
30
30
 
31
31
  it { should be_a InMemoryAdapter::Destination }
32
32
 
33
- it_behaves_like "a destination"
34
- include_examples "supports #message_count"
33
+ it_behaves_like 'a destination'
34
+ include_examples 'supports #message_count'
35
35
  end
36
36
 
37
- context "when creating two destinations for the same queue" do
38
- it "creates seperate destination instances" do
39
- queue_name = "my_queue"
37
+ context 'when creating two destinations for the same queue' do
38
+ it 'creates seperate destination instances' do
39
+ queue_name = 'my_queue'
40
40
  dest1 = adapter.create_destination(queue_name)
41
41
  dest2 = adapter.create_destination(queue_name)
42
42
  expect(dest1).to_not be(dest2)
@@ -44,8 +44,8 @@ module MessageDriver::Adapters
44
44
  end
45
45
  end
46
46
 
47
- describe "#reset_after_tests" do
48
- it "empties all the destination queues" do
47
+ describe '#reset_after_tests' do
48
+ it 'empties all the destination queues' do
49
49
  destinations = (1..3).map(&adapter.method(:create_destination))
50
50
  destinations.each do |destination|
51
51
  destination.publish("There's always money in the banana stand!", {}, {})
@@ -58,9 +58,9 @@ module MessageDriver::Adapters
58
58
  end
59
59
  end
60
60
 
61
- it "removes any existing subscriptions" do
61
+ it 'removes any existing subscriptions' do
62
62
  destinations = (1..3).map(&adapter.method(:create_destination))
63
- consumer = lambda do |m| end
63
+ consumer = lambda do |_| end
64
64
  destinations.each do |destination|
65
65
  destination.subscribe(&consumer)
66
66
  end
@@ -74,43 +74,43 @@ module MessageDriver::Adapters
74
74
  end
75
75
  end
76
76
 
77
- describe "accessing the same queue from two destinations" do
78
- let(:queue_name) { "my_queue" }
77
+ describe 'accessing the same queue from two destinations' do
78
+ let(:queue_name) { 'my_queue' }
79
79
  let(:dest1) { adapter.create_destination(queue_name) }
80
80
  let(:dest2) { adapter.create_destination(queue_name) }
81
81
 
82
- context "when I have a consumer on one destination" do
83
- let(:consumer) { lambda do |m| end }
82
+ context 'when I have a consumer on one destination' do
83
+ let(:consumer) { lambda do |_| end }
84
84
  before do
85
85
  dest1.subscribe(&consumer)
86
86
  end
87
- it "is the same consumer on the other destination" do
87
+ it 'is the same consumer on the other destination' do
88
88
  expect(dest2.subscription.consumer).to be(consumer)
89
89
  end
90
90
  end
91
91
 
92
- context "when I publish a message to one destination" do
93
- it "changes the message_count on the other" do
92
+ context 'when I publish a message to one destination' do
93
+ it 'changes the message_count on the other' do
94
94
  expect {
95
- dest1.publish("my test message")
95
+ dest1.publish('my test message')
96
96
  }.to change{dest2.message_count}.from(0).to(1)
97
97
  end
98
98
 
99
- it "can be popped off the other" do
100
- dest1.publish("my test message")
99
+ it 'can be popped off the other' do
100
+ dest1.publish('my test message')
101
101
  msg = dest2.pop_message
102
102
  expect(msg).to_not be_nil
103
- expect(msg.body).to eq("my test message")
103
+ expect(msg.body).to eq('my test message')
104
104
  end
105
105
  end
106
106
 
107
- context "when I pop a message off one destination" do
108
- let(:message_body) { "test popping a message" }
107
+ context 'when I pop a message off one destination' do
108
+ let(:message_body) { 'test popping a message' }
109
109
  before do
110
110
  dest2.publish(message_body)
111
111
  end
112
112
 
113
- it "changes the message_count on the other" do
113
+ it 'changes the message_count on the other' do
114
114
  expect {
115
115
  dest1.pop_message
116
116
  }.to change{dest2.message_count}.from(1).to(0)
@@ -118,7 +118,7 @@ module MessageDriver::Adapters
118
118
  end
119
119
  end
120
120
 
121
- describe "subscribing a consumer" do
121
+ describe 'subscribing a consumer' do
122
122
  let(:destination) { adapter.create_destination(:my_queue) }
123
123
 
124
124
  let(:subscription_type) { MessageDriver::Adapters::InMemoryAdapter::Subscription }