bunny-mock 1.0.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.
@@ -0,0 +1,85 @@
1
+ module BunnyMock
2
+ # Mocks Bunny::Session
3
+ class Session
4
+
5
+ #
6
+ # API
7
+ #
8
+
9
+ # @return [Symbol] Current session status
10
+ attr_reader :status
11
+
12
+ ##
13
+ # Creates a new {BunnyMock::Session} instance
14
+ #
15
+ # @api public
16
+ def initialize(*args)
17
+
18
+ # not connected until {BunnyMock::Session#start} is called
19
+ @status = :not_connected
20
+
21
+ # create channel hash
22
+ @channels = Hash.new
23
+ end
24
+
25
+ ##
26
+ # Sets status to connected
27
+ #
28
+ # @return [BunnyMock::Session] self
29
+ # @api public
30
+ def start
31
+
32
+ @status = :connected
33
+
34
+ self
35
+ end
36
+
37
+ ##
38
+ # Sets status to closed
39
+ #
40
+ # @return [BunnyMock::Session] self
41
+ # @api public
42
+ def stop
43
+
44
+ @status = :closed
45
+
46
+ self
47
+ end
48
+ alias close stop
49
+
50
+ ##
51
+ # Tests if connection is available
52
+ #
53
+ # @return [Boolean] true if status is connected, false otherwise
54
+ # @api public
55
+ def open?
56
+
57
+ @status == :connected
58
+ end
59
+
60
+ ##
61
+ # Creates a new {BunnyMock::Channel} instance
62
+ #
63
+ # @param [Integer] n Channel identifier
64
+ # @param [Integer] pool_size Work pool size (insignificant)
65
+ #
66
+ # @return [BunnyMock::Channel] Channel instance
67
+ # @api public
68
+ def create_channel(n = nil, pool_size = 1)
69
+
70
+ # raise same error as {Bunny::Session#create_channel}
71
+ raise ArgumentError, "channel number 0 is reserved in the protocol and cannot be used" if n == 0
72
+
73
+ # return cached channel if exists
74
+ return @channels[n] if n and @channels.key?(n)
75
+
76
+ # create and open channel
77
+ channel = Channel.new self, n
78
+ channel.open
79
+
80
+ # return channel
81
+ @channels[n] = channel
82
+ end
83
+ alias channel create_channel
84
+ end
85
+ end
@@ -0,0 +1,7 @@
1
+ # encoding: UTF-8
2
+
3
+ module BunnyMock
4
+
5
+ # @return [String] Version of the library
6
+ VERSION = "1.0.0"
7
+ end
@@ -0,0 +1,17 @@
1
+ require 'rspec'
2
+
3
+ $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
4
+
5
+ require 'bundler'
6
+ Bundler.setup :default, :test
7
+ Bundler.require
8
+
9
+ require 'bunny-mock'
10
+
11
+ RSpec.configure do |config|
12
+
13
+ config.before :each do
14
+ @session = BunnyMock::Session.new
15
+ @channel = @session.channel
16
+ end
17
+ end
@@ -0,0 +1,175 @@
1
+ describe BunnyMock::Channel do
2
+
3
+ context '::new' do
4
+
5
+ before do
6
+ @channel = BunnyMock::Channel.new @session, 1
7
+ end
8
+
9
+ it 'should store connection' do
10
+
11
+ expect(@channel.connection).to eq(@session)
12
+ end
13
+
14
+ it 'should store channel identifier' do
15
+
16
+ expect(@channel.id).to eq(1)
17
+ end
18
+
19
+ it 'should set status to opening' do
20
+
21
+ expect(@channel.status).to eq(:opening)
22
+ end
23
+ end
24
+
25
+ context '#open' do
26
+
27
+ it 'should set status to open' do
28
+
29
+ expect(@channel.open.status).to eq(:open)
30
+ end
31
+ end
32
+
33
+ context '#close' do
34
+
35
+ it 'should set status to open' do
36
+
37
+ @channel.open
38
+
39
+ expect(@channel.close.status).to eq(:closed)
40
+ end
41
+ end
42
+
43
+ context '#open?' do
44
+
45
+ it 'should return true if status is open' do
46
+
47
+ expect(@channel.open?).to be_truthy
48
+ end
49
+
50
+ it 'should return false otherwise' do
51
+
52
+ # opening
53
+ expect(BunnyMock::Channel.new.open?).to be_falsey
54
+
55
+ # closed
56
+ expect(@channel.close.open?).to be_falsey
57
+ end
58
+ end
59
+
60
+ context '#closed?' do
61
+
62
+ it 'should return true if status is closed' do
63
+
64
+ expect(@channel.close.closed?).to be_truthy
65
+ end
66
+
67
+ it 'should return false otherwise' do
68
+
69
+ # opening
70
+ expect(BunnyMock::Channel.new.closed?).to be_falsey
71
+
72
+ # open
73
+ expect(@channel.closed?).to be_falsey
74
+ end
75
+ end
76
+
77
+ context '#exchange' do
78
+
79
+ it 'should declare a new exchange' do
80
+
81
+ xchg = @channel.exchange 'testing.xchg', type: :fanout
82
+
83
+ expect(xchg.class).to eq(BunnyMock::Exchanges::Fanout)
84
+ end
85
+
86
+ it 'should return a cached exchange with the same name' do
87
+
88
+ xchg = @channel.exchange 'testing.xchg', type: :fanout
89
+
90
+ expect(@channel.exchange('testing.xchg', type: :fanout)).to eq(xchg)
91
+ end
92
+
93
+ it 'should register the exchange in cache' do
94
+
95
+ xchg = @channel.exchange 'testing.xchg', type: :fanout
96
+
97
+ expect(@channel.exchanges['testing.xchg']).to eq(xchg)
98
+ end
99
+ end
100
+
101
+ context '#direct' do
102
+
103
+ it 'should declare a new direct exchange' do
104
+
105
+ expect(@channel.direct('testing.xchg').class).to eq(BunnyMock::Exchanges::Direct)
106
+ end
107
+ end
108
+
109
+ context '#topic' do
110
+
111
+ it 'should declare a new topic exchange' do
112
+
113
+ expect(@channel.topic('testing.xchg').class).to eq(BunnyMock::Exchanges::Topic)
114
+ end
115
+ end
116
+
117
+ context '#fanout' do
118
+
119
+ it 'should declare a new fanout exchange' do
120
+
121
+ expect(@channel.fanout('testing.xchg').class).to eq(BunnyMock::Exchanges::Fanout)
122
+ end
123
+ end
124
+
125
+ context '#header' do
126
+
127
+ it 'should declare a new headers exchange' do
128
+
129
+ expect(@channel.header('testing.xchg').class).to eq(BunnyMock::Exchanges::Header)
130
+ end
131
+ end
132
+
133
+ context '#default_exchange' do
134
+
135
+ it 'should return a nameless direct exchange' do
136
+
137
+ xchg = @channel.default_exchange
138
+
139
+ expect(xchg.class).to eq(BunnyMock::Exchanges::Direct)
140
+ expect(xchg.name).to eq('')
141
+ end
142
+ end
143
+
144
+ context '#queue' do
145
+
146
+ it 'should declare a new queue' do
147
+
148
+ q = @channel.queue 'testing.q'
149
+
150
+ expect(q.class).to eq(BunnyMock::Queue)
151
+ end
152
+
153
+ it 'should return a cached queue with the same name' do
154
+
155
+ q = @channel.queue 'testing.q'
156
+
157
+ expect(@channel.queue('testing.q')).to eq(q)
158
+ end
159
+
160
+ it 'should register the queue in cache' do
161
+
162
+ q = @channel.queue 'testing.q'
163
+
164
+ expect(@channel.queues['testing.q']).to eq(q)
165
+ end
166
+ end
167
+
168
+ context '#temporary_queue' do
169
+
170
+ it 'should declare a nameless queue' do
171
+
172
+ expect(@channel.temporary_queue.class).to eq(BunnyMock::Queue)
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,145 @@
1
+ describe BunnyMock::Exchange do
2
+
3
+ context '::declare' do
4
+
5
+ it 'should create a direct exchange' do
6
+
7
+ expect(BunnyMock::Exchange.declare(@channel, 'testing.xchg', type: :direct).class).to eq(BunnyMock::Exchanges::Direct)
8
+ end
9
+
10
+ it 'should create a topic exchange' do
11
+
12
+ expect(BunnyMock::Exchange.declare(@channel, 'testing.xchg', type: :topic).class).to eq(BunnyMock::Exchanges::Topic)
13
+ end
14
+
15
+ it 'should create a fanout exchange' do
16
+
17
+ expect(BunnyMock::Exchange.declare(@channel, 'testing.xchg', type: :fanout).class).to eq(BunnyMock::Exchanges::Fanout)
18
+ end
19
+
20
+ it 'should create a header exchange' do
21
+
22
+ expect(BunnyMock::Exchange.declare(@channel, 'testing.xchg', type: :header).class).to eq(BunnyMock::Exchanges::Header)
23
+ end
24
+
25
+ it 'should default to a direct exchange' do
26
+
27
+ expect(BunnyMock::Exchange.declare(@channel, 'testing.xchg').class).to eq(BunnyMock::Exchanges::Direct)
28
+ end
29
+ end
30
+
31
+ context '#bind' do
32
+
33
+ before do
34
+ @source = @channel.exchange 'xchg.source'
35
+ @receiver = @channel.exchange 'xchg.receiver'
36
+ end
37
+
38
+ it 'should bind by exchange instance' do
39
+
40
+ @receiver.bind @source
41
+
42
+ expect(@receiver.bound_to?(@source)).to be_truthy
43
+ expect(@source.has_binding?(@receiver)).to be_truthy
44
+ end
45
+
46
+ it 'should bind by exchange name' do
47
+
48
+ @receiver.bind @source.name
49
+
50
+ expect(@receiver.bound_to?(@source)).to be_truthy
51
+ expect(@source.has_binding?(@receiver)).to be_truthy
52
+ end
53
+ end
54
+
55
+ context '#unbind' do
56
+
57
+ before do
58
+ @source = @channel.exchange 'xchg.source'
59
+ @receiver = @channel.exchange 'xchg.receiver'
60
+
61
+ @receiver.bind @source
62
+ end
63
+
64
+ it 'should unbind by exchange instance' do
65
+
66
+ @receiver.unbind @source
67
+
68
+ expect(@receiver.bound_to?(@source)).to be_falsey
69
+ expect(@source.has_binding?(@receiver)).to be_falsey
70
+ end
71
+
72
+ it 'should unbind by exchange name' do
73
+
74
+ @receiver.unbind @source.name
75
+
76
+ expect(@receiver.bound_to?(@source)).to be_falsey
77
+ expect(@source.has_binding?(@receiver)).to be_falsey
78
+ end
79
+ end
80
+
81
+ context '#bound_to?' do
82
+
83
+ before do
84
+ @source = @channel.exchange 'xchg.source'
85
+ @receiver = @channel.exchange 'xchg.receiver'
86
+ end
87
+
88
+ context 'should return true if bound' do
89
+
90
+ it 'by instance' do
91
+
92
+ @receiver.bind @source
93
+
94
+ expect(@receiver.bound_to?(@source)).to be_truthy
95
+ end
96
+
97
+ it 'by name' do
98
+
99
+ @receiver.bind @source
100
+
101
+ expect(@receiver.bound_to?(@source.name)).to be_truthy
102
+ end
103
+
104
+ it 'by routing key' do
105
+
106
+ @receiver.bind @source, routing_key: 'xchg.route'
107
+
108
+ expect(@receiver.bound_to?(@source)).to be_falsey
109
+ expect(@receiver.bound_to?(@source, routing_key: 'xchg.route')).to be_truthy
110
+ end
111
+ end
112
+
113
+ it 'return false otherwise' do
114
+
115
+ expect(@receiver.bound_to?(@source)).to be_falsey
116
+ end
117
+ end
118
+
119
+ context '#has_binding?' do
120
+
121
+ before do
122
+ @source = @channel.exchange 'xchg.source'
123
+ @receiver = @channel.exchange 'xchg.receiver'
124
+
125
+ @receiver.bind @source
126
+ end
127
+
128
+ it 'should unbind by exchange instance' do
129
+
130
+ @receiver.unbind @source
131
+
132
+ expect(@receiver.bound_to?(@source)).to be_falsey
133
+ expect(@source.has_binding?(@receiver)).to be_falsey
134
+ end
135
+
136
+ it 'should unbind by exchange name' do
137
+
138
+ @receiver.unbind @source.name
139
+
140
+ expect(@receiver.bound_to?(@source)).to be_falsey
141
+ expect(@source.has_binding?(@receiver)).to be_falsey
142
+ end
143
+ end
144
+
145
+ end
@@ -0,0 +1,28 @@
1
+ describe BunnyMock::Exchanges::Direct do
2
+
3
+ context '#deliver' do
4
+
5
+ before do
6
+ @source = @channel.direct 'xchg.source'
7
+
8
+ @first = @channel.queue 'queue.first'
9
+ @second = @channel.queue 'queue.second'
10
+ @third = @channel.queue 'queue.third'
11
+
12
+ @first.bind @source
13
+ @second.bind @source
14
+ @third.bind @source
15
+ end
16
+
17
+ it 'should only deliver to direct route match' do
18
+
19
+ @source.publish 'Testing message', routing_key: 'queue.second'
20
+
21
+ expect(@first.message_count).to eq(0)
22
+ expect(@third.message_count).to eq(0)
23
+
24
+ expect(@second.message_count).to eq(1)
25
+ expect(@second.pop[:message]).to eq('Testing message')
26
+ end
27
+ end
28
+ end