bunny-mock 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.coveralls.yml +1 -0
- data/.gitignore +1 -0
- data/CHANGELOG +8 -0
- data/Gemfile +1 -1
- data/README.md +43 -7
- data/lib/bunny-mock.rb +2 -0
- data/lib/bunny_mock/channel.rb +26 -40
- data/lib/bunny_mock/exceptions.rb +16 -0
- data/lib/bunny_mock/exchange.rb +3 -0
- data/lib/bunny_mock/queue.rb +3 -0
- data/lib/bunny_mock/session.rb +68 -0
- data/lib/bunny_mock/version.rb +1 -1
- data/spec/spec_helper.rb +3 -0
- data/spec/unit/bunny_mock/channel_spec.rb +2 -2
- data/spec/unit/bunny_mock/exchange_spec.rb +27 -0
- data/spec/unit/bunny_mock/queue_spec.rb +27 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1a5612c89a3f3570ab35b3bf6b56edb8e898ba11
|
4
|
+
data.tar.gz: e9d0d142ca7ef7bdd3ef2eb193097118550d2b62
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee490d3e0ec271a295f8c802d34d568e9f8b17bdc702c083b3ab84943cfcbbd5b98fe278f0f79e432609abac19e0f8264986a043cce62f7cd182dd7ebb7c4fbe
|
7
|
+
data.tar.gz: ee1bdd4f57f0f8b8b7c7a4cf8a8e48857c63251e4d35ddd9207fc473ccafcc651d3d2089aed61c1d83053a570c12527497b3e2117e0648fdc8f5652952eb6cbe
|
data/.coveralls.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
service_name: travis-ci
|
data/.gitignore
CHANGED
data/CHANGELOG
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -2,16 +2,15 @@ Bunny Mock
|
|
2
2
|
==========
|
3
3
|
|
4
4
|
[![Build Status](https://travis-ci.org/arempe93/bunny-mock.svg?branch=master)](https://travis-ci.org/arempe93/bunny-mock)
|
5
|
+
[![Gem Version](https://badge.fury.io/rb/bunny-mock.svg)](https://rubygems.org/gems/bunny-mock)
|
6
|
+
[![Coverage Status](https://coveralls.io/repos/arempe93/bunny-mock/badge.svg?branch=master&service=github)](https://coveralls.io/github/arempe93/bunny-mock?branch=master)
|
7
|
+
[![Documentation](http://inch-ci.org/github/arempe93/bunny-mock.svg?branch=master)](http://www.rubydoc.info/github/arempe93/bunny-mock)
|
5
8
|
|
6
9
|
A mock client for RabbitMQ, modeled after the popular [Bunny client](https://github.com/ruby-amqp/bunny). It currently supports basic usage of Bunny for managing exchanges and queues, with the goal of being able to handle and test all Bunny use cases.
|
7
10
|
|
8
11
|
## Usage
|
9
12
|
|
10
|
-
BunnyMock can be injected into your RabbitMQ application in place of Bunny for testing.
|
11
|
-
|
12
|
-
### Example
|
13
|
-
|
14
|
-
Consider the following example of an RabibtMQ helper module, in Rails
|
13
|
+
BunnyMock can be injected into your RabbitMQ application in place of Bunny for testing. Consider the following example of an RabibtMQ helper module, in Rails
|
15
14
|
|
16
15
|
```ruby
|
17
16
|
require 'bunny'
|
@@ -54,7 +53,31 @@ end
|
|
54
53
|
|
55
54
|
In this case, to set up your tests, you can simply set `AMQP::Factory.connection = BunnyMock.new.start` to inject the mock library. Then you can use the mock helpers in your tests.
|
56
55
|
|
57
|
-
|
56
|
+
## Examples
|
57
|
+
|
58
|
+
#### Declaration
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
it 'should create queues and exchanges' do
|
62
|
+
|
63
|
+
session = BunnyMock.new.start
|
64
|
+
channel = session.channel
|
65
|
+
|
66
|
+
queue = channel.queue 'queue.test'
|
67
|
+
expect(session.queue_exists?('queue.test')).to be_truthy
|
68
|
+
|
69
|
+
queue.delete
|
70
|
+
expect(session.queue_exists?('queue.test')).to be_falsey
|
71
|
+
|
72
|
+
xchg = channel.exchange 'xchg.test'
|
73
|
+
expect(session.exchange_exists?('exchange.test')).to be_truthy
|
74
|
+
|
75
|
+
xchg.delete
|
76
|
+
expect(session.exchange_exists?('exchange.test')).to be_falsey
|
77
|
+
end
|
78
|
+
```
|
79
|
+
|
80
|
+
#### Publishing
|
58
81
|
|
59
82
|
```ruby
|
60
83
|
it 'should publish messages to queues' do
|
@@ -72,9 +95,22 @@ it 'should publish messages to queues' do
|
|
72
95
|
expect(payload[:message]).to eq('Testing message')
|
73
96
|
expect(payload[:options][:priority]).to eq(5)
|
74
97
|
end
|
98
|
+
|
99
|
+
it 'should route messages from exchanges' do
|
100
|
+
|
101
|
+
channel = BunnyMock.new.start.channel
|
102
|
+
|
103
|
+
xchg = channel.topic 'xchg.topic'
|
104
|
+
queue = channel.queue 'queue.test'
|
105
|
+
|
106
|
+
xchg.publish 'Routed message', routing_key: '*.test'
|
107
|
+
|
108
|
+
expect(queue.message_count).to eq(1)
|
109
|
+
expect(queue.pop[:message]).to eq('Routed message')
|
110
|
+
end
|
75
111
|
```
|
76
112
|
|
77
|
-
|
113
|
+
#### Binding
|
78
114
|
|
79
115
|
```ruby
|
80
116
|
it 'should bind queues to exchanges' do
|
data/lib/bunny-mock.rb
CHANGED
data/lib/bunny_mock/channel.rb
CHANGED
@@ -14,12 +14,6 @@ module BunnyMock
|
|
14
14
|
# @return [Symbol] Current channel state
|
15
15
|
attr_reader :status
|
16
16
|
|
17
|
-
# @return [Hash<String, BunnyMock::Exchange>] Exchanges created by this channel
|
18
|
-
attr_reader :exchanges
|
19
|
-
|
20
|
-
# @return [Hash<String, BunnyMock::Queue>] Queues created by this channel
|
21
|
-
attr_reader :queues
|
22
|
-
|
23
17
|
##
|
24
18
|
# Create a new {BunnyMock::Channel} instance
|
25
19
|
#
|
@@ -106,9 +100,9 @@ module BunnyMock
|
|
106
100
|
#
|
107
101
|
def exchange(name, opts = {})
|
108
102
|
|
109
|
-
xchg = find_exchange(name) || Exchange.declare(self, name, opts)
|
103
|
+
xchg = @connection.find_exchange(name) || Exchange.declare(self, name, opts)
|
110
104
|
|
111
|
-
register_exchange xchg
|
105
|
+
@connection.register_exchange xchg
|
112
106
|
end
|
113
107
|
|
114
108
|
##
|
@@ -204,9 +198,9 @@ module BunnyMock
|
|
204
198
|
#
|
205
199
|
def queue(name = '', opts = {})
|
206
200
|
|
207
|
-
queue = find_queue(name) || Queue.new(self, name, opts)
|
201
|
+
queue = @connection.find_queue(name) || Queue.new(self, name, opts)
|
208
202
|
|
209
|
-
register_queue queue
|
203
|
+
@connection.register_queue queue
|
210
204
|
end
|
211
205
|
|
212
206
|
##
|
@@ -230,24 +224,21 @@ module BunnyMock
|
|
230
224
|
#
|
231
225
|
|
232
226
|
# @private
|
233
|
-
def
|
234
|
-
@
|
235
|
-
end
|
236
|
-
|
237
|
-
# @private
|
238
|
-
def register_queue(queue)
|
239
|
-
@queues[queue.name] = queue
|
227
|
+
def deregister_queue(queue)
|
228
|
+
@connection.deregister_queue queue.name
|
240
229
|
end
|
241
230
|
|
242
231
|
# @private
|
243
|
-
def
|
244
|
-
@
|
232
|
+
def deregister_exchange(xchg)
|
233
|
+
@connection.deregister_exchange xchg.name
|
245
234
|
end
|
246
235
|
|
247
236
|
# @private
|
248
237
|
def queue_bind(queue, key, xchg)
|
249
238
|
|
250
|
-
exchange = @
|
239
|
+
exchange = @connection.find_exchange xchg
|
240
|
+
|
241
|
+
raise NotFound.new "Exchange '#{xchg}' was not found" unless exchange
|
251
242
|
|
252
243
|
exchange.add_route key, queue
|
253
244
|
end
|
@@ -255,7 +246,9 @@ module BunnyMock
|
|
255
246
|
# @private
|
256
247
|
def queue_unbind(key, xchg)
|
257
248
|
|
258
|
-
exchange = @
|
249
|
+
exchange = @connection.find_exchange xchg
|
250
|
+
|
251
|
+
raise NotFound.new "Exchange '#{xchg}' was not found" unless exchange
|
259
252
|
|
260
253
|
exchange.remove_route key
|
261
254
|
end
|
@@ -263,7 +256,9 @@ module BunnyMock
|
|
263
256
|
# @private
|
264
257
|
def xchg_bound_to?(receiver, key, name)
|
265
258
|
|
266
|
-
source = @
|
259
|
+
source = @connection.find_exchange name
|
260
|
+
|
261
|
+
raise NotFound.new "Exchange '#{name}' was not found" unless source
|
267
262
|
|
268
263
|
source.has_binding? receiver, routing_key: key
|
269
264
|
end
|
@@ -271,30 +266,19 @@ module BunnyMock
|
|
271
266
|
# @private
|
272
267
|
def xchg_has_binding?(key, xchg)
|
273
268
|
|
274
|
-
exchange = @
|
275
|
-
|
276
|
-
exchange.has_binding? key
|
277
|
-
end
|
278
|
-
|
279
|
-
# @private
|
280
|
-
def find_exchange(name)
|
281
|
-
@exchanges[name]
|
282
|
-
end
|
269
|
+
exchange = @connection.find_exchange xchg
|
283
270
|
|
284
|
-
|
285
|
-
def register_exchange(xchg)
|
286
|
-
@exchanges[xchg.name] = xchg
|
287
|
-
end
|
271
|
+
raise NotFound.new "Exchange '#{xchg}' was not found" unless exchange
|
288
272
|
|
289
|
-
|
290
|
-
def deregister_exchange(xchg)
|
291
|
-
@exchanges.delete xchg.name
|
273
|
+
exchange.has_binding? key
|
292
274
|
end
|
293
275
|
|
294
276
|
# @private
|
295
277
|
def xchg_bind(receiver, routing_key, name)
|
296
278
|
|
297
|
-
source = @
|
279
|
+
source = @connection.find_exchange name
|
280
|
+
|
281
|
+
raise NotFound.new "Exchange '#{name}' was not found" unless source
|
298
282
|
|
299
283
|
source.add_route routing_key, receiver
|
300
284
|
end
|
@@ -302,7 +286,9 @@ module BunnyMock
|
|
302
286
|
# @private
|
303
287
|
def xchg_unbind(routing_key, name)
|
304
288
|
|
305
|
-
source = @
|
289
|
+
source = @connection.find_exchange name
|
290
|
+
|
291
|
+
raise NotFound.new "Exchange '#{name}' was not found" unless source
|
306
292
|
|
307
293
|
source.remove_route routing_key
|
308
294
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module BunnyMock
|
2
|
+
|
3
|
+
##
|
4
|
+
# Base class for all exceptions
|
5
|
+
#
|
6
|
+
# @api public
|
7
|
+
#
|
8
|
+
class Exception < ::StandardError; end
|
9
|
+
|
10
|
+
##
|
11
|
+
# Raised when a queue or exchange is not found
|
12
|
+
#
|
13
|
+
# @api public
|
14
|
+
#
|
15
|
+
class NotFound < Exception; end
|
16
|
+
end
|
data/lib/bunny_mock/exchange.rb
CHANGED
data/lib/bunny_mock/queue.rb
CHANGED
data/lib/bunny_mock/session.rb
CHANGED
@@ -9,6 +9,12 @@ module BunnyMock
|
|
9
9
|
# @return [Symbol] Current session status
|
10
10
|
attr_reader :status
|
11
11
|
|
12
|
+
# @return [Hash<String, BunnyMock::Exchange>] Exchanges created by this channel
|
13
|
+
attr_reader :exchanges
|
14
|
+
|
15
|
+
# @return [Hash<String, BunnyMock::Queue>] Queues created by this channel
|
16
|
+
attr_reader :queues
|
17
|
+
|
12
18
|
##
|
13
19
|
# Creates a new {BunnyMock::Session} instance
|
14
20
|
#
|
@@ -20,6 +26,10 @@ module BunnyMock
|
|
20
26
|
|
21
27
|
# create channel hash
|
22
28
|
@channels = Hash.new
|
29
|
+
|
30
|
+
# create storage for queues and exchanges
|
31
|
+
@queues = Hash.new
|
32
|
+
@exchanges = Hash.new
|
23
33
|
end
|
24
34
|
|
25
35
|
##
|
@@ -81,5 +91,63 @@ module BunnyMock
|
|
81
91
|
@channels[n] = channel
|
82
92
|
end
|
83
93
|
alias channel create_channel
|
94
|
+
|
95
|
+
##
|
96
|
+
# Test if queue exists in channel cache
|
97
|
+
#
|
98
|
+
# @param [String] name Name of queue
|
99
|
+
#
|
100
|
+
# @return [Boolean] true if queue exists, false otherwise
|
101
|
+
# @api public
|
102
|
+
#
|
103
|
+
def queue_exists?(name)
|
104
|
+
!!find_queue(name)
|
105
|
+
end
|
106
|
+
|
107
|
+
##
|
108
|
+
# Test if exchange exists in channel cache
|
109
|
+
#
|
110
|
+
# @param [String] name Name of exchange
|
111
|
+
#
|
112
|
+
# @return [Boolean] true if exchange exists, false otherwise
|
113
|
+
# @api public
|
114
|
+
#
|
115
|
+
def exchange_exists?(name)
|
116
|
+
!!find_exchange(name)
|
117
|
+
end
|
118
|
+
|
119
|
+
#
|
120
|
+
# Implementation
|
121
|
+
#
|
122
|
+
|
123
|
+
# @private
|
124
|
+
def find_queue(name)
|
125
|
+
@queues[name]
|
126
|
+
end
|
127
|
+
|
128
|
+
# @private
|
129
|
+
def register_queue(queue)
|
130
|
+
@queues[queue.name] = queue
|
131
|
+
end
|
132
|
+
|
133
|
+
# @private
|
134
|
+
def deregister_queue(queue)
|
135
|
+
@queues.delete queue
|
136
|
+
end
|
137
|
+
|
138
|
+
# @private
|
139
|
+
def find_exchange(name)
|
140
|
+
@exchanges[name]
|
141
|
+
end
|
142
|
+
|
143
|
+
# @private
|
144
|
+
def register_exchange(xchg)
|
145
|
+
@exchanges[xchg.name] = xchg
|
146
|
+
end
|
147
|
+
|
148
|
+
# @private
|
149
|
+
def deregister_exchange(xchg)
|
150
|
+
@exchanges.delete xchg
|
151
|
+
end
|
84
152
|
end
|
85
153
|
end
|
data/lib/bunny_mock/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -94,7 +94,7 @@ describe BunnyMock::Channel do
|
|
94
94
|
|
95
95
|
xchg = @channel.exchange 'testing.xchg', type: :fanout
|
96
96
|
|
97
|
-
expect(@
|
97
|
+
expect(@session.exchange_exists?('testing.xchg')).to be_truthy
|
98
98
|
end
|
99
99
|
end
|
100
100
|
|
@@ -161,7 +161,7 @@ describe BunnyMock::Channel do
|
|
161
161
|
|
162
162
|
q = @channel.queue 'testing.q'
|
163
163
|
|
164
|
-
expect(@
|
164
|
+
expect(@session.queue_exists?('testing.q')).to be_truthy
|
165
165
|
end
|
166
166
|
end
|
167
167
|
|
@@ -50,6 +50,11 @@ describe BunnyMock::Exchange do
|
|
50
50
|
expect(@receiver.bound_to?(@source)).to be_truthy
|
51
51
|
expect(@source.has_binding?(@receiver)).to be_truthy
|
52
52
|
end
|
53
|
+
|
54
|
+
it 'should raise error when exchange does not exists' do
|
55
|
+
|
56
|
+
expect { @receiver.bind('this.xchg.does.not.exist') }.to raise_exception(BunnyMock::NotFound)
|
57
|
+
end
|
53
58
|
end
|
54
59
|
|
55
60
|
context '#unbind' do
|
@@ -76,6 +81,11 @@ describe BunnyMock::Exchange do
|
|
76
81
|
expect(@receiver.bound_to?(@source)).to be_falsey
|
77
82
|
expect(@source.has_binding?(@receiver)).to be_falsey
|
78
83
|
end
|
84
|
+
|
85
|
+
it 'should raise error when exchange does not exists' do
|
86
|
+
|
87
|
+
expect { @receiver.unbind('this.xchg.does.not.exist') }.to raise_exception(BunnyMock::NotFound)
|
88
|
+
end
|
79
89
|
end
|
80
90
|
|
81
91
|
context '#bound_to?' do
|
@@ -114,6 +124,11 @@ describe BunnyMock::Exchange do
|
|
114
124
|
|
115
125
|
expect(@receiver.bound_to?(@source)).to be_falsey
|
116
126
|
end
|
127
|
+
|
128
|
+
it 'should raise error when exchange does not exists' do
|
129
|
+
|
130
|
+
expect { @receiver.bound_to?('this.xchg.does.not.exist') }.to raise_exception(BunnyMock::NotFound)
|
131
|
+
end
|
117
132
|
end
|
118
133
|
|
119
134
|
context '#has_binding?' do
|
@@ -142,4 +157,16 @@ describe BunnyMock::Exchange do
|
|
142
157
|
end
|
143
158
|
end
|
144
159
|
|
160
|
+
context '#delete' do
|
161
|
+
|
162
|
+
before do
|
163
|
+
@exchange = @channel.direct 'xchg.direct'
|
164
|
+
@exchange.delete
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'should remove exchange from session' do
|
168
|
+
|
169
|
+
expect(@session.exchange_exists?(@exchange.name)).to be_falsey
|
170
|
+
end
|
171
|
+
end
|
145
172
|
end
|
@@ -38,6 +38,11 @@ describe BunnyMock::Queue do
|
|
38
38
|
expect(@receiver.bound_to?(@source)).to be_truthy
|
39
39
|
expect(@source.has_binding?(@receiver)).to be_truthy
|
40
40
|
end
|
41
|
+
|
42
|
+
it 'should raise error when exchange does not exists' do
|
43
|
+
|
44
|
+
expect { @receiver.bind('this.xchg.does.not.exist') }.to raise_exception(BunnyMock::NotFound)
|
45
|
+
end
|
41
46
|
end
|
42
47
|
|
43
48
|
context '#unbind' do
|
@@ -64,6 +69,11 @@ describe BunnyMock::Queue do
|
|
64
69
|
expect(@receiver.bound_to?(@source)).to be_falsey
|
65
70
|
expect(@source.has_binding?(@receiver)).to be_falsey
|
66
71
|
end
|
72
|
+
|
73
|
+
it 'should raise error when exchange does not exists' do
|
74
|
+
|
75
|
+
expect { @receiver.unbind('this.xchg.does.not.exist') }.to raise_exception(BunnyMock::NotFound)
|
76
|
+
end
|
67
77
|
end
|
68
78
|
|
69
79
|
context '#bound_to?' do
|
@@ -102,6 +112,11 @@ describe BunnyMock::Queue do
|
|
102
112
|
|
103
113
|
expect(@receiver.bound_to?(@source)).to be_falsey
|
104
114
|
end
|
115
|
+
|
116
|
+
it 'should raise error when exchange does not exists' do
|
117
|
+
|
118
|
+
expect { @receiver.bound_to?('this.xchg.does.not.exist') }.to raise_exception(BunnyMock::NotFound)
|
119
|
+
end
|
105
120
|
end
|
106
121
|
|
107
122
|
context '#message_count' do
|
@@ -142,4 +157,16 @@ describe BunnyMock::Queue do
|
|
142
157
|
expect(@queue.message_count).to eq(0)
|
143
158
|
end
|
144
159
|
end
|
160
|
+
|
161
|
+
context '#delete' do
|
162
|
+
|
163
|
+
before do
|
164
|
+
@queue.delete
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'should remove queue from session' do
|
168
|
+
|
169
|
+
expect(@session.queue_exists?(@queue.name)).to be_falsey
|
170
|
+
end
|
171
|
+
end
|
145
172
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bunny-mock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Rempe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: amq-protocol
|
@@ -33,16 +33,19 @@ extensions: []
|
|
33
33
|
extra_rdoc_files:
|
34
34
|
- README.md
|
35
35
|
files:
|
36
|
+
- ".coveralls.yml"
|
36
37
|
- ".gitignore"
|
37
38
|
- ".rspec"
|
38
39
|
- ".travis.yml"
|
39
40
|
- ".yardopts"
|
41
|
+
- CHANGELOG
|
40
42
|
- Gemfile
|
41
43
|
- LICENSE
|
42
44
|
- README.md
|
43
45
|
- bunny-mock.gemspec
|
44
46
|
- lib/bunny-mock.rb
|
45
47
|
- lib/bunny_mock/channel.rb
|
48
|
+
- lib/bunny_mock/exceptions.rb
|
46
49
|
- lib/bunny_mock/exchange.rb
|
47
50
|
- lib/bunny_mock/exchanges/direct.rb
|
48
51
|
- lib/bunny_mock/exchanges/fanout.rb
|