bunny-mock 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7ce7333898b5b71042b88715549e3aff6b578548
4
- data.tar.gz: 576392f37adb5c7baf5c85eb3074b096bf75894d
3
+ metadata.gz: d54d4507d1c57efad12f4d1525154cde983b98b7
4
+ data.tar.gz: d5986217aed023311d8ac3903627d36cbead2a10
5
5
  SHA512:
6
- metadata.gz: 9aa0f6f2ad6557edbf70a984c0277396c69a820b2f8ed43f18e8e4be6ccdd654b1cc5993cff421a510713461a5755c599b6773ab28adfb1efb3ebcf76033953d
7
- data.tar.gz: 94ea8ce5094702d17692bb653a9761313a6f6b9c0d02e9eabca040c9ca33e47bf447b8fd5cb97d02f04e1760f46cb5efd5ff8cb22395e322b90fc86b9d02bb0a
6
+ metadata.gz: 58a3e975090251bcbe4dcf40d4534e1c2382e151b50280a59d2524a20485a30c9bfff7ed34af448f3a5fbce9c481aa0fcc0f4184568c98caa73eac06bf013905
7
+ data.tar.gz: 81960ae54b49872107f122ed8c681934392940dd3698fe0c20a3736fbf3aafd8244925edae01858b3b0133af99a1cb880c3759ae730076bd7873f105f52a2208
data/.rubocop_todo.yml CHANGED
@@ -1,18 +1,18 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2016-02-24 14:28:43 -0500 using RuboCop version 0.37.2.
3
+ # on 2016-05-17 11:57:32 -0400 using RuboCop version 0.39.0.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
- # Offense count: 38
9
+ # Offense count: 45
10
10
  # Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
11
11
  # URISchemes: http, https
12
12
  Metrics/LineLength:
13
- Max: 128
13
+ Max: 145
14
14
 
15
- # Offense count: 7
15
+ # Offense count: 9
16
16
  Style/Documentation:
17
17
  Exclude:
18
18
  - 'spec/**/*'
@@ -23,4 +23,6 @@ Style/Documentation:
23
23
  - 'lib/bunny_mock/exchanges/fanout.rb'
24
24
  - 'lib/bunny_mock/exchanges/headers.rb'
25
25
  - 'lib/bunny_mock/exchanges/topic.rb'
26
+ - 'lib/bunny_mock/get_response.rb'
27
+ - 'lib/bunny_mock/message_properties.rb'
26
28
  - 'lib/bunny_mock/queue.rb'
data/.travis.yml CHANGED
@@ -5,6 +5,7 @@ rvm:
5
5
  - 2.1.8
6
6
  - 2.2.4
7
7
  - 2.3.0
8
+ - jruby-19mode
8
9
 
9
10
  branches:
10
11
  only:
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## v1.4.0
2
+
3
+ * [#19](https://github.com/arempe93/bunny-mock/pull/12): Adds support for JRuby with Bunny 1.7.0 - [@TimothyMDean](https://github.com/TimothyMDean)
4
+ * [#16](https://github.com/arempe93/bunny-mock/issues/16): Fixes wildcard implementation for topic exchanges - [@arempe93](https://github.com/arempe93)
5
+ * [#15](https://github.com/arempe93/bunny-mock/issues/15): Changes to `Queue#pop` api to match Bunny - [@arempe93](https://github.com/arempe93)
6
+
1
7
  ## v1.3.0
2
8
 
3
9
  * [#12](https://github.com/arempe93/bunny-mock/pull/12): Adds `basic_publish` functionality to `Channel` - [@podung](https://github.com/podung)
data/Gemfile CHANGED
@@ -1,5 +1,3 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'bunny', '>= 2.0'
4
-
5
3
  gemspec
data/README.md CHANGED
@@ -80,8 +80,8 @@ it 'should route messages from exchanges' do
80
80
  xchg = channel.topic 'xchg.topic'
81
81
  queue = channel.queue 'queue.test'
82
82
 
83
- queue.bind xchg
84
- xchg.publish 'Routed message', routing_key: '*.test'
83
+ queue.bind xchg, routing_key: '*.test'
84
+ xchg.publish 'Routed message', routing_key: 'foo.test'
85
85
 
86
86
  expect(queue.message_count).to eq(1)
87
87
  expect(queue.pop[:message]).to eq('Routed message')
data/UPGRADING.md CHANGED
@@ -1,6 +1,16 @@
1
1
  Upgrading BunnyMock
2
2
  ===================
3
3
 
4
+ ## Upgrading to >= 1.4.0
5
+
6
+ #### Changes to `Queue#pop` api
7
+
8
+ The implmentation of `BunnyMock::Queue#pop` has changed to support the same return value as `Bunny`. The old functionality is still enabled by default. To use the new functionality that matches `Bunny`, place the following in your `spec_helper.rb` or etc.
9
+
10
+ ```ruby
11
+ BunnyMock.use_bunny_queue_pop_api = true
12
+ ```
13
+
4
14
  ## Upgrading to >= 1.2.0
5
15
 
6
16
  #### Changes `has_binding?` to `routes_to?` in `BunnyMock::Exchange`
data/bunny-mock.gemspec CHANGED
@@ -14,9 +14,16 @@ Gem::Specification.new do |s|
14
14
  s.description = 'Easy to use mocking for testing the Bunny client for RabbitMQ'
15
15
  s.license = 'MIT'
16
16
 
17
- s.required_ruby_version = Gem::Requirement.new '>= 2.0'
17
+ s.required_ruby_version = Gem::Requirement.new '>= 1.9'
18
18
 
19
- s.add_dependency 'bunny', '~> 2.0'
19
+ # Bunny 1.7.0 is known to work with JRuby, but unsupported after that.
20
+ # Other Ruby platforms are expected to work on any 1.7.x version or later.
21
+ if RUBY_PLATFORM == 'java'
22
+ s.add_dependency 'amq-protocol', '<= 1.9.2'
23
+ s.add_dependency 'bunny', '1.7.0'
24
+ else
25
+ s.add_dependency 'bunny', '>= 1.7'
26
+ end
20
27
 
21
28
  s.add_development_dependency 'rake', '~> 10.5.0'
22
29
  s.add_development_dependency 'rubocop'
data/lib/bunny-mock.rb CHANGED
@@ -4,6 +4,9 @@ require 'bunny_mock/version'
4
4
  require 'bunny/exceptions'
5
5
  require 'amq/protocol/client'
6
6
 
7
+ require 'bunny_mock/get_response'
8
+ require 'bunny_mock/message_properties'
9
+
7
10
  require 'bunny_mock/session'
8
11
  require 'bunny_mock/channel'
9
12
  require 'bunny_mock/exchange'
@@ -24,6 +27,8 @@ module BunnyMock
24
27
  PROTOCOL_VERSION = AMQ::Protocol::PROTOCOL_VERSION
25
28
 
26
29
  class << self
30
+ attr_writer :use_bunny_queue_pop_api
31
+
27
32
  #
28
33
  # API
29
34
  #
@@ -38,6 +43,11 @@ module BunnyMock
38
43
  BunnyMock::Session.new
39
44
  end
40
45
 
46
+ # @return [Boolean] Use Bunny API for Queue#pop (default: false)
47
+ def use_bunny_queue_pop_api
48
+ @use_bunny_queue_pop_api.nil? ? false : @use_bunny_queue_pop_api
49
+ end
50
+
41
51
  # @return [String] Bunny mock version
42
52
  def version
43
53
  VERSION
@@ -114,7 +114,7 @@ module BunnyMock
114
114
  #
115
115
  def publish(payload, opts = {})
116
116
  # handle message sending, varies by type
117
- deliver payload, opts, opts.fetch(:routing_key, '')
117
+ deliver(payload, opts.merge(exchange: name), opts.fetch(:routing_key, ''))
118
118
 
119
119
  self
120
120
  end
@@ -24,21 +24,19 @@ module BunnyMock
24
24
  # @api public
25
25
  #
26
26
  def deliver(payload, opts, key)
27
- # escape periods with backslash for regex
28
- key = key.gsub('.', '\.')
27
+ delivery_routes = @routes.dup.keep_if { |route, _| key =~ route_to_regex(route) }
28
+ delivery_routes.values.each { |dest| dest.publish(payload, opts) }
29
+ end
29
30
 
30
- # replace single wildcards with regex for a single domain
31
- key = key.gsub(SINGLE_WILDCARD, '(?:\w+)')
31
+ private
32
32
 
33
- # replace multi wildcards with regex for many domains separated by '.'
33
+ # @private
34
+ def route_to_regex(key)
35
+ key = key.gsub('.', '\.')
36
+ key = key.gsub(SINGLE_WILDCARD, '(?:\w+)')
34
37
  key = key.gsub(MULTI_WILDCARD, '\w+\.?')
35
38
 
36
- # turn key into regex
37
- key = Regexp.new(key)
38
-
39
- @routes.each do |route, destination|
40
- destination.publish(payload, opts) if route =~ key
41
- end
39
+ Regexp.new(key)
42
40
  end
43
41
  end
44
42
  end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+ module BunnyMock
3
+ class GetResponse
4
+ #
5
+ # Behavior
6
+ #
7
+
8
+ include Enumerable
9
+
10
+ #
11
+ # API
12
+ #
13
+
14
+ # @return [BunnyMock::Channel] Channel the response is from
15
+ attr_reader :channel
16
+
17
+ # @private
18
+ def initialize(channel, queue, opts = {})
19
+ @channel = channel
20
+ @hash = {
21
+ delivery_tag: '',
22
+ redelivered: false,
23
+ exchange: opts.fetch(:exchange, ''),
24
+ routing_key: opts.fetch(:routing_key, queue.name)
25
+ }
26
+ end
27
+
28
+ # Iterates over the delivery properties
29
+ # @see Enumerable#each
30
+ def each(*args, &block)
31
+ @hash.each(*args, &block)
32
+ end
33
+
34
+ # Accesses delivery properties by key
35
+ # @see Hash#[]
36
+ def [](k)
37
+ @hash[k]
38
+ end
39
+
40
+ # @return [Hash] Hash representation of this delivery info
41
+ def to_hash
42
+ @hash
43
+ end
44
+
45
+ # @private
46
+ def to_s
47
+ to_hash.to_s
48
+ end
49
+
50
+ # @private
51
+ def inspect
52
+ to_hash.inspect
53
+ end
54
+
55
+ # @return [String] Delivery identifier that is used to acknowledge, reject and nack deliveries
56
+ def delivery_tag
57
+ @hash[:delivery_tag]
58
+ end
59
+
60
+ # @return [Boolean] true if this delivery is a redelivery (the message was requeued at least once)
61
+ def redelivered
62
+ @hash[:redelivered]
63
+ end
64
+ alias redelivered? redelivered
65
+
66
+ # @return [String] Name of the exchange this message was published to
67
+ def exchange
68
+ @hash[:exchange]
69
+ end
70
+
71
+ # @return [String] Routing key this message was published with
72
+ def routing_key
73
+ @hash[:routing_key]
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+ module BunnyMock
3
+ class MessageProperties
4
+ #
5
+ # Behaviors
6
+ #
7
+
8
+ include Enumerable
9
+
10
+ #
11
+ # API
12
+ #
13
+
14
+ # @private
15
+ def initialize(properties)
16
+ properties.delete :exchange
17
+ @properties = properties
18
+ end
19
+
20
+ # Iterate over the properties
21
+ # @see Enumerable#each
22
+ def each(*args, &block)
23
+ @properties.each(*args, &block)
24
+ end
25
+
26
+ # Access properties by key
27
+ # @see Hash#[]
28
+ def [](key)
29
+ @properties[key]
30
+ end
31
+
32
+ # @return [Hash] Hash of message properties
33
+ def to_hash
34
+ @properties
35
+ end
36
+
37
+ # @return [String] String representation of message properties
38
+ def to_s
39
+ to_hash.to_s
40
+ end
41
+ alias inspect to_s
42
+
43
+ # @return [String] (Optional) content type of the message, as set by the publisher
44
+ def content_type
45
+ @properties[:content_type]
46
+ end
47
+
48
+ # @return [String] (Optional) content encoding of the message, as set by the publisher
49
+ def content_encoding
50
+ @properties[:content_encoding]
51
+ end
52
+
53
+ # @return [String] Message headers
54
+ def headers
55
+ @properties[:headers]
56
+ end
57
+
58
+ # @return [Integer] Delivery mode (persistent or transient)
59
+ def delivery_mode
60
+ @properties[:delivery_mode]
61
+ end
62
+
63
+ # @return [Integer] Message priority, as set by the publisher
64
+ def priority
65
+ @properties[:priority]
66
+ end
67
+
68
+ # @return [String] What message this message is a reply to (or corresponds to), as set by the publisher
69
+ def correlation_id
70
+ @properties[:correlation_id]
71
+ end
72
+
73
+ # @return [String] (Optional) How to reply to the publisher (usually a reply queue name)
74
+ def reply_to
75
+ @properties[:reply_to]
76
+ end
77
+
78
+ # @return [String] Message expiration, as set by the publisher
79
+ def expiration
80
+ @properties[:expiration]
81
+ end
82
+
83
+ # @return [String] Message ID, as set by the publisher
84
+ def message_id
85
+ @properties[:message_id]
86
+ end
87
+
88
+ # @return [Time] Message timestamp, as set by the publisher
89
+ def timestamp
90
+ @properties[:timestamp]
91
+ end
92
+
93
+ # @return [String] Message type, as set by the publisher
94
+ def type
95
+ @properties[:type]
96
+ end
97
+
98
+ # @return [String] Publishing user, as set by the publisher
99
+ def user_id
100
+ @properties[:user_id]
101
+ end
102
+
103
+ # @return [String] Publishing application, as set by the publisher
104
+ def app_id
105
+ @properties[:app_id]
106
+ end
107
+
108
+ # @return [String] Cluster ID, as set by the publisher
109
+ def cluster_id
110
+ @properties[:cluster_id]
111
+ end
112
+ end
113
+ end
@@ -160,9 +160,15 @@ module BunnyMock
160
160
  # @return [Hash] Message data
161
161
  # @api public
162
162
  #
163
- def pop
164
- @messages.shift
163
+ def pop(opts = { manual_ack: false }, &block)
164
+ if BunnyMock.use_bunny_queue_pop_api
165
+ bunny_pop(opts, &block)
166
+ else
167
+ warn '[DEPRECATED] This behavior is deprecated - please set `BunnyMock::use_bunny_queue_pop_api` to true to use Bunny Queue#pop behavior'
168
+ @messages.shift
169
+ end
165
170
  end
171
+ alias get pop
166
172
 
167
173
  ##
168
174
  # Clear all messages in queue
@@ -171,6 +177,8 @@ module BunnyMock
171
177
  #
172
178
  def purge
173
179
  @messages = []
180
+
181
+ self
174
182
  end
175
183
 
176
184
  ##
@@ -193,9 +201,27 @@ module BunnyMock
193
201
  @deleted = true
194
202
  end
195
203
 
204
+ private
205
+
196
206
  # @private
197
207
  def check_queue_deleted!
198
208
  raise 'Queue has been deleted' if @deleted
199
209
  end
210
+
211
+ # @private
212
+ def bunny_pop(*)
213
+ response = pop_response(@messages.shift)
214
+ block_given? ? yield(*response) : response
215
+ end
216
+
217
+ # @private
218
+ def pop_response(message)
219
+ return [nil, nil, nil] unless message
220
+
221
+ di = GetResponse.new(@channel, self, message[:options])
222
+ mp = MessageProperties.new(message[:options])
223
+
224
+ [di, mp, message[:message]]
225
+ end
200
226
  end
201
227
  end
@@ -3,5 +3,5 @@
3
3
 
4
4
  module BunnyMock
5
5
  # @return [String] Version of the library
6
- VERSION = '1.3.0'
6
+ VERSION = '1.4.0'
7
7
  end
@@ -0,0 +1,71 @@
1
+ describe BunnyMock::Queue, '#pop' do
2
+ let(:queue) { @channel.queue('test.q') }
3
+ let(:exchange) { @channel.topic('test.exchange') }
4
+ let(:options) { { priority: 1, persistent: true, routing_key: 'test.q' } }
5
+
6
+ before { queue.bind(exchange, routing_key: '*.q') }
7
+
8
+ context 'when published through an exchange' do
9
+ before do
10
+ exchange.publish('Message', options)
11
+ @di, @mp, @pl = queue.pop
12
+ end
13
+
14
+ it 'should have exchange name set in delivery info' do
15
+ expect(@di.exchange).to eql exchange.name
16
+ end
17
+
18
+ it 'should have message properties persisted' do
19
+ expect(@mp.to_hash).to eql options
20
+ end
21
+
22
+ it 'should have routing key set in delivery info' do
23
+ expect(@di.routing_key).to eql options[:routing_key]
24
+ end
25
+ end
26
+
27
+ context 'when published through many exchanges' do
28
+ let(:options) { { priority: 1, persistent: true, routing_key: 'test.q' } }
29
+
30
+ before do
31
+ exchange2 = @channel.topic 'test.exchange2'
32
+ exchange.bind(exchange2, routing_key: 'test.*')
33
+
34
+ exchange2.publish('Message', options)
35
+ @di, @mp, @pl = queue.pop
36
+ end
37
+
38
+ it 'should have last exchange name set in delivery info' do
39
+ expect(@di.exchange).to eql exchange.name
40
+ end
41
+
42
+ it 'should have message properties persisted' do
43
+ expect(@mp.to_hash).to eql options
44
+ end
45
+
46
+ it 'should have routing key set in delivery info' do
47
+ expect(@di.routing_key).to eql options[:routing_key]
48
+ end
49
+ end
50
+
51
+ context 'when published directly' do
52
+ let(:options) { { priority: 1, persistent: true, routing_key: 'something.random' } }
53
+
54
+ before do
55
+ queue.publish('Message', options)
56
+ @di, @mp, @pl = queue.pop
57
+ end
58
+
59
+ it 'should not have exchange name set in delivery info' do
60
+ expect(@di.exchange).to eql ''
61
+ end
62
+
63
+ it 'should have message properties persisted' do
64
+ expect(@mp.to_hash).to eql options
65
+ end
66
+
67
+ it 'should have routing key set in delivery info' do
68
+ expect(@di.routing_key).to eql options[:routing_key]
69
+ end
70
+ end
71
+ end
data/spec/spec_helper.rb CHANGED
@@ -10,6 +10,7 @@ require 'coveralls'
10
10
  Coveralls.wear!
11
11
 
12
12
  require 'bunny-mock'
13
+ BunnyMock.use_bunny_queue_pop_api = true
13
14
 
14
15
  RSpec.configure do |config|
15
16
 
@@ -135,19 +135,19 @@ describe BunnyMock::Channel do
135
135
  it 'should publish to the exchange' do
136
136
  @channel.basic_publish(data, xchg_name, key)
137
137
 
138
- expect(queue.pop[:message]).to eq data
138
+ expect(queue.pop[2]).to eq data
139
139
  end
140
140
 
141
141
  it 'accepts exchange object for exchange param' do
142
142
  @channel.basic_publish(data, xchg, key)
143
143
 
144
- expect(queue.pop[:message]).to eq data
144
+ expect(queue.pop[2]).to eq data
145
145
  end
146
146
 
147
147
  it 'passes opts down to exchange' do
148
148
  @channel.basic_publish(data, xchg, key, extra: 'opts')
149
149
 
150
- expect(queue.pop[:options]).to include(extra: 'opts')
150
+ expect(queue.pop[1].to_hash).to include(extra: 'opts')
151
151
  end
152
152
 
153
153
  it 'creates exchange if it does not exist' do
@@ -21,7 +21,7 @@ describe BunnyMock::Exchanges::Direct do
21
21
  expect(@third.message_count).to eq(0)
22
22
 
23
23
  expect(@second.message_count).to eq(1)
24
- expect(@second.pop[:message]).to eq('Testing message')
24
+ expect(@second.pop[2]).to eq('Testing message')
25
25
  end
26
26
  end
27
27
  end
@@ -18,13 +18,13 @@ describe BunnyMock::Exchanges::Fanout do
18
18
  @source.publish 'Testing message', routing_key: 'queue.second'
19
19
 
20
20
  expect(@first.message_count).to eq(1)
21
- expect(@first.pop[:message]).to eq('Testing message')
21
+ expect(@first.pop[2]).to eq('Testing message')
22
22
 
23
23
  expect(@second.message_count).to eq(1)
24
- expect(@second.pop[:message]).to eq('Testing message')
24
+ expect(@second.pop[2]).to eq('Testing message')
25
25
 
26
26
  expect(@third.message_count).to eq(1)
27
- expect(@third.pop[:message]).to eq('Testing message')
27
+ expect(@third.pop[2]).to eq('Testing message')
28
28
  end
29
29
  end
30
30
  end
@@ -1,72 +1,39 @@
1
1
  describe BunnyMock::Exchanges::Topic do
2
+ context '#deliver' do
3
+ before do
4
+ @source = @channel.topic 'xchg.source'
2
5
 
3
- context '#deliver' do
6
+ @first = @channel.queue 'queue.#'
7
+ @second = @channel.queue 'queue.*.sub'
8
+ @third = @channel.queue 'queue.*.sub.#'
4
9
 
5
- before do
6
- @source = @channel.topic 'xchg.source'
7
-
8
- @first = @channel.queue 'queue.category.sub.first'
9
- @second = @channel.queue 'queue.category.second'
10
- @third = @channel.queue 'queue.topic.sub.third'
11
-
12
- @first.bind @source
13
- @second.bind @source
14
- @third.bind @source
15
- end
16
-
17
- it 'should deliver with no wildcards' do
18
- @source.publish 'Testing message', routing_key: 'queue.category.second'
19
-
20
- expect(@first.message_count).to eq(0)
21
- expect(@third.message_count).to eq(0)
22
-
23
- expect(@second.message_count).to eq(1)
24
- expect(@second.pop[:message]).to eq('Testing message')
25
- end
26
-
27
- it 'does not modify the routing key' do
28
- @source.publish 'Testing message',
29
- routing_key: 'queue.category.sub.first'.freeze
30
- expect(message = @first.pop).to_not be_nil
31
- expect(message[:options][:routing_key]).to eq('queue.category.sub.first')
10
+ @first.bind @source
11
+ @second.bind @source
12
+ @third.bind @source
32
13
  end
33
14
 
34
- context 'should deliver with wildcards' do
35
- it 'for single wildcards' do
36
- @source.publish 'Testing message', routing_key: 'queue.*.sub.*'
37
-
38
- expect(@second.message_count).to eq(0)
15
+ it 'should deliver to multiple wildcard' do
16
+ @source.publish 'Test', routing_key: 'queue.anything.after.here'
39
17
 
40
- expect(@first.message_count).to eq(1)
41
- expect(@first.pop[:message]).to eq('Testing message')
42
-
43
- expect(@third.message_count).to eq(1)
44
- expect(@third.pop[:message]).to eq('Testing message')
45
- end
46
-
47
- it 'for multiple wildcards' do
48
- @source.publish 'Testing message', routing_key: 'queue.category.#'
49
-
50
- expect(@third.message_count).to eq(0)
51
-
52
- expect(@first.message_count).to eq(1)
53
- expect(@first.pop[:message]).to eq('Testing message')
54
-
55
- expect(@second.message_count).to eq(1)
56
- expect(@second.pop[:message]).to eq('Testing message')
57
- end
18
+ expect(@first.message_count).to eql 1
19
+ expect(@second.message_count).to eql 0
20
+ expect(@third.message_count).to eql 0
21
+ end
58
22
 
59
- it 'for a mixed wildcards' do
60
- @source.publish 'Testing message', routing_key: '#.sub.*'
23
+ it 'should deliver to single wildcards' do
24
+ @source.publish 'Test', routing_key: 'queue.category.sub'
61
25
 
62
- expect(@second.message_count).to eq(0)
26
+ expect(@first.message_count).to eql 1
27
+ expect(@second.message_count).to eql 1
28
+ expect(@third.message_count).to eql 0
29
+ end
63
30
 
64
- expect(@first.message_count).to eq(1)
65
- expect(@first.pop[:message]).to eq('Testing message')
31
+ it 'should deliver for mixed wildcards' do
32
+ @source.publish 'Test', routing_key: 'queue.category.sub.third'
66
33
 
67
- expect(@third.message_count).to eq(1)
68
- expect(@third.pop[:message]).to eq('Testing message')
69
- end
70
- end
71
- end
34
+ expect(@first.message_count).to eql 1
35
+ expect(@second.message_count).to eql 1
36
+ expect(@third.message_count).to eql 1
37
+ end
38
+ end
72
39
  end
@@ -10,7 +10,7 @@ describe BunnyMock::Queue do
10
10
  @queue.publish 'This is a test message'
11
11
 
12
12
  expect(@queue.message_count).to eq(1)
13
- expect(@queue.pop[:message]).to eq('This is a test message')
13
+ expect(@queue.pop[2]).to eq('This is a test message')
14
14
  expect(@queue.message_count).to eq(0)
15
15
  end
16
16
  end
@@ -120,12 +120,47 @@ describe BunnyMock::Queue do
120
120
  end
121
121
 
122
122
  context '#pop' do
123
+ context 'when using old api' do
124
+ before { BunnyMock::use_bunny_queue_pop_api = false }
125
+ after { BunnyMock::use_bunny_queue_pop_api = true }
123
126
 
124
- it 'should return oldest message in queue' do
125
- @queue.publish 'First'
126
- @queue.publish 'Second'
127
+ it 'should return a Hash' do
128
+ @queue.publish 'First', priority: 1
129
+ response = @queue.pop
130
+
131
+ expect(response[:message]).to eql 'First'
132
+ expect(response[:options][:priority]).to eql 1
133
+ end
134
+
135
+ it 'should output a deprecation warning' do
136
+ expect { @queue.pop }.to output(/DEPRECATED/).to_stderr
137
+ end
138
+ end
127
139
 
128
- expect(@queue.pop[:message]).to eq('First')
140
+ context 'when using Bunny api' do
141
+ before { BunnyMock::use_bunny_queue_pop_api = true }
142
+ after { BunnyMock::use_bunny_queue_pop_api = false }
143
+
144
+ context 'when queue if empty' do
145
+ it 'should return a nil triplet' do
146
+ expect(@queue.pop).to eql [nil, nil, nil]
147
+ end
148
+ end
149
+
150
+ context 'when queue has messages' do
151
+ before { @queue.publish('First') }
152
+
153
+ it 'should return triplet of GetResponse, MessageProperties, and payload' do
154
+ response = @queue.pop
155
+ expect(response.map(&:class)).to eql [BunnyMock::GetResponse, BunnyMock::MessageProperties, String]
156
+ end
157
+ end
158
+
159
+ context 'when using block' do
160
+ it 'should yield' do
161
+ expect { |b| @queue.pop(&b) }.to yield_control
162
+ end
163
+ end
129
164
  end
130
165
  end
131
166
 
@@ -1,14 +1,11 @@
1
1
  describe BunnyMock do
2
-
3
2
  context '::new' do
4
-
5
3
  it 'should return a new session' do
6
4
  expect(BunnyMock.new.class).to eq(BunnyMock::Session)
7
5
  end
8
6
  end
9
7
 
10
8
  context '::version' do
11
-
12
9
  it 'should return the current version' do
13
10
  expect(BunnyMock::VERSION).to_not be_nil
14
11
  expect(BunnyMock.version).to_not be_nil
@@ -16,20 +13,9 @@ describe BunnyMock do
16
13
  end
17
14
 
18
15
  context '::protocol_version' do
19
-
20
16
  it 'should return the current amq protocol version' do
21
17
  expect(BunnyMock::PROTOCOL_VERSION).to eq('0.9.1')
22
18
  expect(BunnyMock.protocol_version).to eq('0.9.1')
23
19
  end
24
20
  end
25
-
26
- it 'should route messages from exchanges' do
27
- channel = BunnyMock.new.start.channel
28
-
29
- xchg = channel.topic 'xchg.topic'
30
- queue = channel.queue 'queue.test'
31
-
32
- queue.bind xchg
33
- xchg.publish('Routed message', routing_key: '*.test')
34
- end
35
21
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bunny-mock
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.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: 2016-05-13 00:00:00.000000000 Z
11
+ date: 2016-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bunny
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
19
+ version: '1.7'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '2.0'
26
+ version: '1.7'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -123,9 +123,12 @@ files:
123
123
  - lib/bunny_mock/exchanges/fanout.rb
124
124
  - lib/bunny_mock/exchanges/headers.rb
125
125
  - lib/bunny_mock/exchanges/topic.rb
126
+ - lib/bunny_mock/get_response.rb
127
+ - lib/bunny_mock/message_properties.rb
126
128
  - lib/bunny_mock/queue.rb
127
129
  - lib/bunny_mock/session.rb
128
130
  - lib/bunny_mock/version.rb
131
+ - spec/integration/queue_pop_spec.rb
129
132
  - spec/spec_helper.rb
130
133
  - spec/unit/bunny_mock/channel_spec.rb
131
134
  - spec/unit/bunny_mock/exchange_spec.rb
@@ -147,7 +150,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
147
150
  requirements:
148
151
  - - ">="
149
152
  - !ruby/object:Gem::Version
150
- version: '2.0'
153
+ version: '1.9'
151
154
  required_rubygems_version: !ruby/object:Gem::Requirement
152
155
  requirements:
153
156
  - - ">="
@@ -160,6 +163,7 @@ signing_key:
160
163
  specification_version: 4
161
164
  summary: Mocking for the popular Bunny client for RabbitMQ
162
165
  test_files:
166
+ - spec/integration/queue_pop_spec.rb
163
167
  - spec/spec_helper.rb
164
168
  - spec/unit/bunny_mock/channel_spec.rb
165
169
  - spec/unit/bunny_mock/exchange_spec.rb