action_subscriber 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +21 -0
- data/.rspec +2 -0
- data/Gemfile +5 -0
- data/LICENSE +20 -0
- data/LICENSE.txt +22 -0
- data/README.md +122 -0
- data/Rakefile +8 -0
- data/action_subscriber.gemspec +38 -0
- data/examples/at_least_once.rb +17 -0
- data/examples/at_most_once.rb +15 -0
- data/examples/basic_subscriber.rb +30 -0
- data/examples/message_acknowledgement.rb +19 -0
- data/lib/action_subscriber.rb +93 -0
- data/lib/action_subscriber/base.rb +83 -0
- data/lib/action_subscriber/bunny/subscriber.rb +57 -0
- data/lib/action_subscriber/configuration.rb +68 -0
- data/lib/action_subscriber/default_routing.rb +26 -0
- data/lib/action_subscriber/dsl.rb +83 -0
- data/lib/action_subscriber/march_hare/subscriber.rb +60 -0
- data/lib/action_subscriber/middleware.rb +18 -0
- data/lib/action_subscriber/middleware/active_record/connection_management.rb +17 -0
- data/lib/action_subscriber/middleware/active_record/query_cache.rb +29 -0
- data/lib/action_subscriber/middleware/decoder.rb +33 -0
- data/lib/action_subscriber/middleware/env.rb +65 -0
- data/lib/action_subscriber/middleware/error_handler.rb +16 -0
- data/lib/action_subscriber/middleware/router.rb +17 -0
- data/lib/action_subscriber/middleware/runner.rb +16 -0
- data/lib/action_subscriber/rabbit_connection.rb +40 -0
- data/lib/action_subscriber/railtie.rb +13 -0
- data/lib/action_subscriber/rspec.rb +91 -0
- data/lib/action_subscriber/subscribable.rb +118 -0
- data/lib/action_subscriber/threadpool.rb +29 -0
- data/lib/action_subscriber/version.rb +3 -0
- data/spec/integration/basic_subscriber_spec.rb +42 -0
- data/spec/lib/action_subscriber/base_spec.rb +18 -0
- data/spec/lib/action_subscriber/configuration_spec.rb +32 -0
- data/spec/lib/action_subscriber/dsl_spec.rb +143 -0
- data/spec/lib/action_subscriber/middleware/active_record/connection_management_spec.rb +17 -0
- data/spec/lib/action_subscriber/middleware/active_record/query_cache_spec.rb +49 -0
- data/spec/lib/action_subscriber/middleware/decoder_spec.rb +31 -0
- data/spec/lib/action_subscriber/middleware/env_spec.rb +60 -0
- data/spec/lib/action_subscriber/middleware/error_handler_spec.rb +35 -0
- data/spec/lib/action_subscriber/middleware/router_spec.rb +24 -0
- data/spec/lib/action_subscriber/middleware/runner_spec.rb +6 -0
- data/spec/lib/action_subscriber/subscribable_spec.rb +128 -0
- data/spec/lib/action_subscriber/threadpool_spec.rb +35 -0
- data/spec/spec_helper.rb +26 -0
- data/spec/support/user_subscriber.rb +6 -0
- metadata +257 -0
@@ -0,0 +1,143 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ::ActionSubscriber::DSL do
|
4
|
+
let(:subscriber) { Object.new }
|
5
|
+
before { subscriber.extend(::ActionSubscriber::DSL) }
|
6
|
+
|
7
|
+
describe "acknowledging messages" do
|
8
|
+
context "when manual_acknowledgement! is set" do
|
9
|
+
before { subscriber.manual_acknowledgement! }
|
10
|
+
|
11
|
+
it "acknowledges messages" do
|
12
|
+
expect(subscriber.acknowledge_messages?).to eq(true)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "returns expected queue subscription options" do
|
16
|
+
expect(subscriber.queue_subscription_options).to eq( :manual_ack => true )
|
17
|
+
end
|
18
|
+
|
19
|
+
it "does not acknowledge messages after processing them" do
|
20
|
+
expect(subscriber.acknowledge_messages_after_processing?).to eq(false)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "does not acknowledge messages before processing them" do
|
24
|
+
expect(subscriber.acknowledge_messages_before_processing?).to eq(false)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "when at_most_once! is set" do
|
29
|
+
before { subscriber.at_most_once! }
|
30
|
+
|
31
|
+
it "acknowledges messages" do
|
32
|
+
expect(subscriber.acknowledge_messages?).to eq(true)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "acknowledges messages before processing them" do
|
36
|
+
expect(subscriber.acknowledge_messages_before_processing?).to eq(true)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "does not acknowledge messages after processing them" do
|
40
|
+
expect(subscriber.acknowledge_messages_after_processing?).to eq(false)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "when at_least_once! is set" do
|
45
|
+
before { subscriber.at_least_once! }
|
46
|
+
|
47
|
+
it "acknowledges messages" do
|
48
|
+
expect(subscriber.acknowledge_messages?).to eq(true)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "does not acknowledge messages before processing them" do
|
52
|
+
expect(subscriber.acknowledge_messages_before_processing?).to eq(false)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "acknowledges messages after processing them" do
|
56
|
+
expect(subscriber.acknowledge_messages_after_processing?).to eq(true)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context "when no_acknowledgement! is set" do
|
61
|
+
before { subscriber.no_acknowledgement! }
|
62
|
+
|
63
|
+
it "does not acknowledge messages" do
|
64
|
+
expect(subscriber.acknowledge_messages?).to eq(false)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "does not acknowledge messages after processing them" do
|
68
|
+
expect(subscriber.acknowledge_messages_after_processing?).to eq(false)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "does not acknowledge messages before processing them" do
|
72
|
+
expect(subscriber.acknowledge_messages_before_processing?).to eq(false)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context "default" do
|
77
|
+
it "does not acknowledge messages" do
|
78
|
+
expect(subscriber.acknowledge_messages?).to eq(false)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "does not acknowledge messages after processing them" do
|
82
|
+
expect(subscriber.acknowledge_messages_after_processing?).to eq(false)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "does not acknowledge messages before processing them" do
|
86
|
+
expect(subscriber.acknowledge_messages_before_processing?).to eq(false)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "exchange_names" do
|
92
|
+
context "when exchange names are set" do
|
93
|
+
before { subscriber.exchange_names :foo, :bar }
|
94
|
+
|
95
|
+
it "returns an array of exchange names" do
|
96
|
+
expect(subscriber.exchange_names).to eq(["foo", "bar"])
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
context "when exchange names are not set" do
|
101
|
+
before { subscriber.instance_variable_set(:@_exchange_names, nil) }
|
102
|
+
|
103
|
+
it "returns the default exchange" do
|
104
|
+
expect(subscriber.exchange_names).to eq(["events"])
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe "queue_for" do
|
110
|
+
before { subscriber.queue_for(:created, "my_app.app.user.created") }
|
111
|
+
|
112
|
+
it "adds the method and queue name to the queue names collection" do
|
113
|
+
expect(subscriber.queue_names).to eq({:created => "my_app.app.user.created" })
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe "remote_application_name" do
|
118
|
+
context "when remote appliation name is set" do
|
119
|
+
before { subscriber.remote_application_name "app" }
|
120
|
+
|
121
|
+
it "returns the remote application name" do
|
122
|
+
expect(subscriber.remote_application_name).to eq("app")
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
context "when remote application name is not set" do
|
127
|
+
before { subscriber.instance_variable_set(:@_remote_application_name, nil) }
|
128
|
+
|
129
|
+
it "returns nil" do
|
130
|
+
expect(subscriber.remote_application_name).to be_nil
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
describe "routing_key_for" do
|
136
|
+
before { subscriber.routing_key_for(:created, "app.user.created") }
|
137
|
+
|
138
|
+
it "adds the method name to the routing key names collection" do
|
139
|
+
expect(subscriber.routing_key_names).to eq({:created => "app.user.created"})
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'action_subscriber/middleware/active_record/connection_management'
|
3
|
+
|
4
|
+
describe ActionSubscriber::Middleware::ActiveRecord::ConnectionManagement do
|
5
|
+
include_context 'action subscriber middleware env'
|
6
|
+
|
7
|
+
before { allow(ActiveRecord::Base).to receive(:clear_active_connections!) }
|
8
|
+
|
9
|
+
subject { described_class.new(app) }
|
10
|
+
|
11
|
+
it_behaves_like 'an action subscriber middleware'
|
12
|
+
|
13
|
+
it "clears active connections" do
|
14
|
+
expect(ActiveRecord::Base).to receive(:clear_active_connections!)
|
15
|
+
subject.call(env)
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'action_subscriber/middleware/active_record/query_cache'
|
3
|
+
|
4
|
+
describe ActionSubscriber::Middleware::ActiveRecord::QueryCache do
|
5
|
+
include_context 'action subscriber middleware env'
|
6
|
+
|
7
|
+
let(:connection) { double(:connection, :query_cache_enabled => true) }
|
8
|
+
|
9
|
+
before do
|
10
|
+
allow(connection).to receive(:clear_query_cache)
|
11
|
+
allow(connection).to receive(:disable_query_cache!)
|
12
|
+
allow(connection).to receive(:enable_query_cache!)
|
13
|
+
|
14
|
+
allow(ActiveRecord::Base).to receive(:connection).and_return(connection)
|
15
|
+
allow(ActiveRecord::Base).to receive(:connection_id)
|
16
|
+
end
|
17
|
+
|
18
|
+
subject { described_class.new(app) }
|
19
|
+
|
20
|
+
it_behaves_like 'an action subscriber middleware'
|
21
|
+
|
22
|
+
it "enables the query cache" do
|
23
|
+
expect(connection).to receive(:enable_query_cache!)
|
24
|
+
subject.call(env)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "clears the query cache" do
|
28
|
+
expect(connection).to receive(:clear_query_cache)
|
29
|
+
subject.call(env)
|
30
|
+
end
|
31
|
+
|
32
|
+
context "when the query cache is already enabled" do
|
33
|
+
before { allow(connection).to receive(:query_cache_enabled).and_return(true) }
|
34
|
+
|
35
|
+
it "does not disable the query cache" do
|
36
|
+
expect(connection).to_not receive(:disable_query_cache!)
|
37
|
+
subject.call(env)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "when the query cache is not already enabled" do
|
42
|
+
before { allow(connection).to receive(:query_cache_enabled).and_return(false) }
|
43
|
+
|
44
|
+
it "does disable the query cache" do
|
45
|
+
expect(connection).to receive(:disable_query_cache!)
|
46
|
+
subject.call(env)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActionSubscriber::Middleware::Decoder do
|
4
|
+
include_context 'action subscriber middleware env'
|
5
|
+
|
6
|
+
subject { described_class.new(app) }
|
7
|
+
|
8
|
+
it_behaves_like 'an action subscriber middleware'
|
9
|
+
|
10
|
+
let(:env) { ActionSubscriber::Middleware::Env.new(UserSubscriber, encoded_payload, message_properties) }
|
11
|
+
let(:encoded_payload) { JSON.generate(payload) }
|
12
|
+
let(:payload) { {"ohai" => "GUYZ"} }
|
13
|
+
|
14
|
+
context "when the content type has an associated decoder" do
|
15
|
+
before { message_properties[:content_type] = "application/json"}
|
16
|
+
|
17
|
+
it "decodes the payload" do
|
18
|
+
subject.call(env)
|
19
|
+
expect(env.payload).to eq(payload)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "when the content type does not have an associated decoder" do
|
24
|
+
before { message_properties[:content_type] = "application/foo"}
|
25
|
+
|
26
|
+
it "uses the payload as-is" do
|
27
|
+
subject.call(env)
|
28
|
+
expect(env.payload).to eq(encoded_payload)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActionSubscriber::Middleware::Env do
|
4
|
+
let(:channel) { double("channel") }
|
5
|
+
let(:encoded_payload) { 'encoded_payload' }
|
6
|
+
let(:properties){ {
|
7
|
+
:channel => channel,
|
8
|
+
:content_type => "application/json",
|
9
|
+
:delivery_tag => "XYZ",
|
10
|
+
:encoded_payload => encoded_payload,
|
11
|
+
:exchange => "events",
|
12
|
+
:message_id => "MSG-1234",
|
13
|
+
:routing_key => "amigo.user.created",
|
14
|
+
} }
|
15
|
+
let(:subscriber) { UserSubscriber }
|
16
|
+
|
17
|
+
subject { described_class.new(subscriber, encoded_payload, properties) }
|
18
|
+
|
19
|
+
specify { expect(subject.action).to eq("created") }
|
20
|
+
specify { expect(subject.content_type).to eq(properties[:content_type]) }
|
21
|
+
specify { expect(subject.exchange).to eq(properties[:exchange]) }
|
22
|
+
specify { expect(subject.message_id).to eq(properties[:message_id]) }
|
23
|
+
specify { expect(subject.routing_key).to eq(properties[:routing_key]) }
|
24
|
+
|
25
|
+
describe "#acknowledge" do
|
26
|
+
it "sends an acknowledgement to rabbitmq" do
|
27
|
+
expect(channel).to receive(:ack).with(properties[:delivery_tag], false)
|
28
|
+
subject.acknowledge
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#reject" do
|
33
|
+
it "sends an rejection to rabbitmq" do
|
34
|
+
expect(channel).to receive(:reject).with(properties[:delivery_tag], true)
|
35
|
+
subject.reject
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#to_hash" do
|
40
|
+
it "includes the action" do
|
41
|
+
expect(subject.to_hash).to have_key(:action)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "includes the content_type" do
|
45
|
+
expect(subject.to_hash).to have_key(:content_type)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "includes the exchange" do
|
49
|
+
expect(subject.to_hash).to have_key(:exchange)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "includes the routing_key" do
|
53
|
+
expect(subject.to_hash).to have_key(:routing_key)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "includes the payload" do
|
57
|
+
expect(subject.to_hash).to have_key(:payload)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'action_subscriber/middleware/error_handler'
|
3
|
+
|
4
|
+
describe ActionSubscriber::Middleware::ErrorHandler do
|
5
|
+
include_context 'action subscriber middleware env'
|
6
|
+
|
7
|
+
subject { described_class.new(app) }
|
8
|
+
|
9
|
+
it_behaves_like 'an action subscriber middleware'
|
10
|
+
|
11
|
+
let(:error) { ::RuntimeError.new("Boom!") }
|
12
|
+
|
13
|
+
context "when an exception occurs" do
|
14
|
+
before { allow(app).to receive(:call).and_raise(error) }
|
15
|
+
|
16
|
+
it "calls the exception handler" do
|
17
|
+
handler = ::ActionSubscriber.configuration.error_handler
|
18
|
+
expect(handler).to receive(:call).with(error, env.to_h)
|
19
|
+
|
20
|
+
subject.call(env)
|
21
|
+
end
|
22
|
+
|
23
|
+
context "when the subscriber was expecting to acknowledge the message" do
|
24
|
+
before { allow(env.subscriber).to receive(:acknowledge_messages_after_processing?).and_return(true) }
|
25
|
+
|
26
|
+
it "calls the exception handler and rejects the message" do
|
27
|
+
handler = ::ActionSubscriber.configuration.error_handler
|
28
|
+
expect(handler).to receive(:call).with(error, env.to_h)
|
29
|
+
expect(env).to receive(:reject).with(no_args)
|
30
|
+
|
31
|
+
subject.call(env)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActionSubscriber::Middleware::Router do
|
4
|
+
include_context 'action subscriber middleware env'
|
5
|
+
|
6
|
+
subject { described_class.new(app) }
|
7
|
+
|
8
|
+
it "routes the event to the proper action" do
|
9
|
+
allow_any_instance_of(env.subscriber).to receive(env.action)
|
10
|
+
subject.call(env)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "acknowledges messages after processing if the subscriber flag is set" do
|
14
|
+
allow(env.subscriber).to receive(:acknowledge_messages_after_processing?).and_return(true)
|
15
|
+
expect(env).to receive(:acknowledge)
|
16
|
+
subject.call(env)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "acknowledges messages before processing if the subscriber flag is set" do
|
20
|
+
allow(env.subscriber).to receive(:acknowledge_messages_before_processing?).and_return(true)
|
21
|
+
expect(env).to receive(:acknowledge)
|
22
|
+
subject.call(env)
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
TestSubscriber = Class.new(ActionSubscriber::Base) do
|
4
|
+
def updated
|
5
|
+
end
|
6
|
+
|
7
|
+
def updated_low
|
8
|
+
end
|
9
|
+
end
|
10
|
+
TestSubscriber.remote_application_name :bob
|
11
|
+
|
12
|
+
describe ActionSubscriber::Subscribable do
|
13
|
+
describe "allow_low_priority_methods?" do
|
14
|
+
after do
|
15
|
+
::ActionSubscriber.configure { |config| config.allow_low_priority_methods = false }
|
16
|
+
end
|
17
|
+
|
18
|
+
it "when the configuration is false is is false" do
|
19
|
+
::ActionSubscriber.configure { |config| config.allow_low_priority_methods = false }
|
20
|
+
expect(TestSubscriber.allow_low_priority_methods?).to eq(false)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "when the configuration is true it is true" do
|
24
|
+
::ActionSubscriber.configure { |config| config.allow_low_priority_methods = true }
|
25
|
+
expect(TestSubscriber.allow_low_priority_methods?).to eq(true)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "filter_low_priority_methods" do
|
30
|
+
context "when allow_low_priority_methods? is false" do
|
31
|
+
before { allow(TestSubscriber).to receive(:allow_low_priority_methods?).and_return(false) }
|
32
|
+
|
33
|
+
it "removes low priority methods" do
|
34
|
+
filtered_methods = TestSubscriber.filter_low_priority_methods([:updated, :updated_low])
|
35
|
+
expect(filtered_methods).to eq([:updated])
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context "when allow_low_priority_methods? is true" do
|
40
|
+
before { allow(TestSubscriber).to receive(:allow_low_priority_methods?).and_return(true) }
|
41
|
+
|
42
|
+
it "allows low priority methods" do
|
43
|
+
filtered_methods = TestSubscriber.filter_low_priority_methods([:updated, :updated_low])
|
44
|
+
expect(filtered_methods).to eq([:updated, :updated_low])
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "generate_queue_name" do
|
50
|
+
it "returns a queue name" do
|
51
|
+
queue_name = TestSubscriber.generate_queue_name(:created)
|
52
|
+
expect(queue_name).to eq("alice.bob.test.created")
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "generate_routing_key_name" do
|
57
|
+
it "returns a routing key name" do
|
58
|
+
routing_key_name = TestSubscriber.generate_routing_key_name(:created)
|
59
|
+
expect(routing_key_name).to eq("bob.test.created")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "local_application_name" do
|
64
|
+
it "returns the local application name" do
|
65
|
+
expect(TestSubscriber.local_application_name).to eq("alice")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "queue_name_for_method" do
|
70
|
+
before { TestSubscriber.instance_variable_set(:@_queue_names, nil) }
|
71
|
+
|
72
|
+
context "when the queue is already registered" do
|
73
|
+
it "returns the registered queue" do
|
74
|
+
TestSubscriber.queue_for(:created, "foo.bar")
|
75
|
+
queue_name = TestSubscriber.queue_name_for_method(:created)
|
76
|
+
expect(queue_name).to eq("foo.bar")
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context "when the queue is not registered" do
|
81
|
+
it "generates a queue name" do
|
82
|
+
queue_name = TestSubscriber.queue_name_for_method(:created)
|
83
|
+
expect(queue_name).to eq("alice.bob.test.created")
|
84
|
+
end
|
85
|
+
|
86
|
+
it "registers the generated queue" do
|
87
|
+
queue_name = TestSubscriber.queue_name_for_method(:created)
|
88
|
+
expect(TestSubscriber.queue_names).to eq({:created =>"alice.bob.test.created"})
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe "resource_name" do
|
94
|
+
it "returns the resource name" do
|
95
|
+
expect(TestSubscriber.resource_name).to eq("test")
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "routing_key_name_for_method" do
|
100
|
+
before { TestSubscriber.instance_variable_set(:@_routing_key_names, nil) }
|
101
|
+
|
102
|
+
context "when the routing key is already registered" do
|
103
|
+
it "returns the registered routing key" do
|
104
|
+
TestSubscriber.routing_key_for(:created, "bar.foo")
|
105
|
+
routing_key_name = TestSubscriber.routing_key_name_for_method(:created)
|
106
|
+
expect(routing_key_name).to eq("bar.foo")
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context "when the routing key is not registered" do
|
111
|
+
it "generates a routing key name" do
|
112
|
+
routing_key_name = TestSubscriber.routing_key_name_for_method(:created)
|
113
|
+
expect(routing_key_name).to eq("bob.test.created")
|
114
|
+
end
|
115
|
+
|
116
|
+
it "registers the generated routing key" do
|
117
|
+
routing_key_name = TestSubscriber.routing_key_name_for_method(:created)
|
118
|
+
expect(TestSubscriber.routing_key_names).to eq({:created => "bob.test.created"})
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe "subscribable methods" do
|
124
|
+
it "returns the subscribable methods" do
|
125
|
+
expect(TestSubscriber.subscribable_methods).to eq([:updated])
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|