govuk_message_queue_consumer 2.1.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +42 -0
- data/LICENCE +20 -0
- data/README.md +1 -2
- data/lib/govuk_message_queue_consumer/consumer.rb +19 -24
- data/lib/govuk_message_queue_consumer/message.rb +0 -2
- data/lib/govuk_message_queue_consumer/rabbitmq_config.rb +25 -23
- data/lib/govuk_message_queue_consumer/version.rb +1 -1
- data/lib/govuk_message_queue_consumer.rb +3 -0
- metadata +5 -22
- data/Rakefile +0 -8
- data/lib/govuk_message_queue_consumer/null_statsd.rb +0 -4
- data/lib/govuk_message_queue_consumer/test_helpers/test_consumer.rb +0 -12
- data/spec/consumer_spec.rb +0 -36
- data/spec/consumer_with_statsd_spec.rb +0 -54
- data/spec/heartbeat_processor_spec.rb +0 -43
- data/spec/json_processor_spec.rb +0 -33
- data/spec/message_spec.rb +0 -32
- data/spec/mock_message_spec.rb +0 -43
- data/spec/rabbitmq_config_spec.rb +0 -26
- data/spec/spec_helper.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d4a095426507f671b2ed962c5fcd7fd2a8b8562a
|
4
|
+
data.tar.gz: 7b5611a301ea24405a3b2fc83e18e436480f6123
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf97eb5b97d6a202224689afc7d4b8a79e21bbbdba16337d54f2ad52b5404a0bae7fea90dde0865230fecb40419cab9555b027db06d561089a1862321c737789
|
7
|
+
data.tar.gz: 6dd646bfd603d17f827b91ff5cf19c48bf24c0f732bc9bfc6e7f8ade85cf5ea3954f0f002c12e3b901b2f288893de3b786e03d0f26cabc9f9bb753f129075871
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# 3.0.0
|
2
|
+
|
3
|
+
- Updated README to conform changes on [PR #32](https://github.com/alphagov/govuk_message_queue_consumer/pull/32)
|
4
|
+
- Remove `exchange_name` parameter [PR #34](https://github.com/alphagov/govuk_message_queue_consumer/pull/34)
|
5
|
+
- Don't build test files in the gem [PR #33](https://github.com/alphagov/govuk_message_queue_consumer/pull/33)
|
6
|
+
- Prevent consumer from creating rabbitmq queues or bindings [PR #32](https://github.com/alphagov/govuk_message_queue_consumer/pull/32)
|
7
|
+
|
8
|
+
# 2.1.0
|
9
|
+
|
10
|
+
- Add support for sending stats to Statsd
|
11
|
+
|
12
|
+
# 2.0.1
|
13
|
+
|
14
|
+
* Add support for Airbrake.
|
15
|
+
|
16
|
+
# 2.0.0
|
17
|
+
|
18
|
+
- README updates making it clearer how to use the gem
|
19
|
+
- Use environment variables for RabbitMQ configuration
|
20
|
+
- Use keyword arguments for the `Consumer` setup
|
21
|
+
- Add rspec shared examples for testing a message processor
|
22
|
+
- Add `GovukMessageQueueConsumer::MockMessage` for easy testing
|
23
|
+
- Add `GovukMessageQueueConsumer::JSONProcessor` as an intermediate processor for JSON payloads
|
24
|
+
- Add Airbrake notification for gem errors
|
25
|
+
- Remove active_support dependency
|
26
|
+
|
27
|
+
# 1.0.0
|
28
|
+
|
29
|
+
- Rename the gem to `govuk_message_queue_consumer`
|
30
|
+
- Make test helpers easier to use
|
31
|
+
- Readme improvements
|
32
|
+
- Initial release!
|
33
|
+
|
34
|
+
# 0.9.1
|
35
|
+
|
36
|
+
Bug fix:
|
37
|
+
- relax the ruby version as it's causing problems in projects trying to use it
|
38
|
+
|
39
|
+
|
40
|
+
# 0.9.0
|
41
|
+
|
42
|
+
- Initial implementation of the gem
|
data/LICENCE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
Copyright (C) 2015 Crown copyright (Government Digital Service)
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
5
|
+
this software and associated documentation files (the "Software"), to deal in
|
6
|
+
the Software without restriction, including without limitation the rights to
|
7
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
8
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
9
|
+
so, subject to the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be included in all
|
12
|
+
copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
20
|
+
SOFTWARE.
|
data/README.md
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
require 'bunny'
|
2
|
-
require_relative 'null_statsd'
|
3
|
-
|
4
1
|
module GovukMessageQueueConsumer
|
5
2
|
class Consumer
|
6
3
|
# Only fetch one message at a time on the channel.
|
@@ -14,20 +11,23 @@ module GovukMessageQueueConsumer
|
|
14
11
|
|
15
12
|
# Create a new consumer
|
16
13
|
#
|
17
|
-
# @param queue_name [String] Your queue name. This is specific to your application
|
18
|
-
#
|
14
|
+
# @param queue_name [String] Your queue name. This is specific to your application,
|
15
|
+
# and should already exist and have a binding via puppet
|
19
16
|
# @param processor [Object] An object that responds to `process`
|
20
|
-
# @param
|
17
|
+
# @param rabbitmq_connection [Object] A Bunny connection object derived from `Bunny.new`
|
21
18
|
# @param statsd_client [Statsd] An instance of the Statsd class
|
22
|
-
|
19
|
+
# @param logger [Object] A Logger object for emitting errors (to stderr by default)
|
20
|
+
def initialize(queue_name:, processor:, rabbitmq_connection: Consumer.default_connection_from_env, statsd_client: NullStatsd.new, logger: Logger.new(STDERR))
|
23
21
|
@queue_name = queue_name
|
24
|
-
@exchange_name = exchange_name
|
25
22
|
@processor = processor
|
26
|
-
@
|
23
|
+
@rabbitmq_connection = rabbitmq_connection
|
27
24
|
@statsd_client = statsd_client
|
25
|
+
@logger = logger
|
28
26
|
end
|
29
27
|
|
30
28
|
def run
|
29
|
+
@rabbitmq_connection.start
|
30
|
+
|
31
31
|
queue.subscribe(block: true, manual_ack: true) do |delivery_info, headers, payload|
|
32
32
|
begin
|
33
33
|
message = Message.new(payload, headers, delivery_info)
|
@@ -37,7 +37,7 @@ module GovukMessageQueueConsumer
|
|
37
37
|
rescue Exception => e
|
38
38
|
@statsd_client.increment("#{@queue_name}.uncaught_exception")
|
39
39
|
Airbrake.notify_or_ignore(e) if defined?(Airbrake)
|
40
|
-
|
40
|
+
@logger.error "Uncaught exception in processor: \n\n #{e.class}: #{e.message}\n\n#{e.backtrace.join("\n")}"
|
41
41
|
exit(1) # Ensure rabbitmq requeues outstanding messages
|
42
42
|
end
|
43
43
|
end
|
@@ -45,6 +45,11 @@ module GovukMessageQueueConsumer
|
|
45
45
|
|
46
46
|
private
|
47
47
|
|
48
|
+
class NullStatsd
|
49
|
+
def increment(_key)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
48
53
|
def processor_chain
|
49
54
|
@processor_chain ||= HeartbeatProcessor.new(JSONProcessor.new(@processor))
|
50
55
|
end
|
@@ -52,26 +57,16 @@ module GovukMessageQueueConsumer
|
|
52
57
|
def queue
|
53
58
|
@queue ||= begin
|
54
59
|
channel.prefetch(NUMBER_OF_MESSAGES_TO_PREFETCH)
|
55
|
-
|
56
|
-
queue.bind(exchange, routing_key: @routing_key)
|
57
|
-
queue
|
60
|
+
channel.queue(@queue_name, no_declare: true)
|
58
61
|
end
|
59
62
|
end
|
60
63
|
|
61
|
-
def exchange
|
62
|
-
@exchange ||= channel.topic(@exchange_name, passive: true)
|
63
|
-
end
|
64
|
-
|
65
64
|
def channel
|
66
|
-
@channel ||=
|
65
|
+
@channel ||= @rabbitmq_connection.create_channel
|
67
66
|
end
|
68
67
|
|
69
|
-
def
|
70
|
-
|
71
|
-
new_connection = Bunny.new(RabbitMQConfig.new.from_environment)
|
72
|
-
new_connection.start
|
73
|
-
new_connection
|
74
|
-
end
|
68
|
+
def self.default_connection_from_env
|
69
|
+
Bunny.new(GovukMessageQueueConsumer::RabbitMQConfig.from_environment(ENV))
|
75
70
|
end
|
76
71
|
end
|
77
72
|
end
|
@@ -1,29 +1,31 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
module GovukMessageQueueConsumer
|
2
|
+
module RabbitMQConfig
|
3
|
+
class ConfigurationError < StandardError
|
4
|
+
end
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
def self.from_environment(env)
|
7
|
+
{
|
8
|
+
hosts: fetch(env, "RABBITMQ_HOSTS").split(','),
|
9
|
+
vhost: fetch(env, "RABBITMQ_VHOST"),
|
10
|
+
user: fetch(env, "RABBITMQ_USER"),
|
11
|
+
pass: fetch(env, "RABBITMQ_PASSWORD"),
|
12
|
+
recover_from_connection_close: true,
|
13
|
+
}
|
14
|
+
end
|
14
15
|
|
15
|
-
private
|
16
|
+
private
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
def self.fetch(env, variable_name)
|
19
|
+
env[variable_name] || raise_error(variable_name)
|
20
|
+
end
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
22
|
+
def self.raise_error(variable_name)
|
23
|
+
raise ConfigurationError, <<-err
|
24
|
+
The environment variable #{variable_name} is not set. If you are in test
|
25
|
+
mode, make sure you set the correct vars in your helpers. If you get this
|
26
|
+
error in development, make sure you run rails or rake with `govuk_setenv`
|
27
|
+
and puppet is up to date.
|
28
|
+
err
|
29
|
+
end
|
28
30
|
end
|
29
31
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: govuk_message_queue_consumer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GOV.UK Dev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bunny
|
@@ -88,28 +88,19 @@ executables: []
|
|
88
88
|
extensions: []
|
89
89
|
extra_rdoc_files: []
|
90
90
|
files:
|
91
|
+
- CHANGELOG.md
|
92
|
+
- LICENCE
|
91
93
|
- README.md
|
92
|
-
- Rakefile
|
93
94
|
- lib/govuk_message_queue_consumer.rb
|
94
95
|
- lib/govuk_message_queue_consumer/consumer.rb
|
95
96
|
- lib/govuk_message_queue_consumer/heartbeat_processor.rb
|
96
97
|
- lib/govuk_message_queue_consumer/json_processor.rb
|
97
98
|
- lib/govuk_message_queue_consumer/message.rb
|
98
|
-
- lib/govuk_message_queue_consumer/null_statsd.rb
|
99
99
|
- lib/govuk_message_queue_consumer/rabbitmq_config.rb
|
100
100
|
- lib/govuk_message_queue_consumer/test_helpers.rb
|
101
101
|
- lib/govuk_message_queue_consumer/test_helpers/mock_message.rb
|
102
102
|
- lib/govuk_message_queue_consumer/test_helpers/shared_examples.rb
|
103
|
-
- lib/govuk_message_queue_consumer/test_helpers/test_consumer.rb
|
104
103
|
- lib/govuk_message_queue_consumer/version.rb
|
105
|
-
- spec/consumer_spec.rb
|
106
|
-
- spec/consumer_with_statsd_spec.rb
|
107
|
-
- spec/heartbeat_processor_spec.rb
|
108
|
-
- spec/json_processor_spec.rb
|
109
|
-
- spec/message_spec.rb
|
110
|
-
- spec/mock_message_spec.rb
|
111
|
-
- spec/rabbitmq_config_spec.rb
|
112
|
-
- spec/spec_helper.rb
|
113
104
|
homepage: https://github.com/alphagov/govuk_message_queue_consumer
|
114
105
|
licenses: []
|
115
106
|
metadata: {}
|
@@ -133,13 +124,5 @@ rubygems_version: 2.4.5.1
|
|
133
124
|
signing_key:
|
134
125
|
specification_version: 4
|
135
126
|
summary: AMQP message queue consumption with GOV.UK conventions
|
136
|
-
test_files:
|
137
|
-
- spec/heartbeat_processor_spec.rb
|
138
|
-
- spec/spec_helper.rb
|
139
|
-
- spec/message_spec.rb
|
140
|
-
- spec/consumer_spec.rb
|
141
|
-
- spec/consumer_with_statsd_spec.rb
|
142
|
-
- spec/mock_message_spec.rb
|
143
|
-
- spec/json_processor_spec.rb
|
144
|
-
- spec/rabbitmq_config_spec.rb
|
127
|
+
test_files: []
|
145
128
|
has_rdoc:
|
data/Rakefile
DELETED
data/spec/consumer_spec.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
require_relative 'spec_helper'
|
2
|
-
require_relative 'support/queue_helpers'
|
3
|
-
|
4
|
-
describe Consumer do
|
5
|
-
include QueueHelpers
|
6
|
-
|
7
|
-
let(:client_processor) { instance_double('Client::Processor') }
|
8
|
-
|
9
|
-
describe "#run" do
|
10
|
-
it "binds the queue to the all-routing key" do
|
11
|
-
queue = create_stubbed_queue
|
12
|
-
|
13
|
-
expect(queue).to receive(:bind).with(nil, { routing_key: "#" })
|
14
|
-
|
15
|
-
Consumer.new(queue_name: "some-queue", exchange_name: "my-exchange", processor: client_processor).run
|
16
|
-
end
|
17
|
-
|
18
|
-
it "binds the queue to a custom routing key" do
|
19
|
-
queue = create_stubbed_queue
|
20
|
-
|
21
|
-
expect(queue).to receive(:bind).with(nil, { routing_key: "*.major" })
|
22
|
-
|
23
|
-
Consumer.new(queue_name: "some-queue", exchange_name: "my-exchange", processor: client_processor, routing_key: "*.major").run
|
24
|
-
end
|
25
|
-
|
26
|
-
it "calls the heartbeat processor when subscribing to messages" do
|
27
|
-
queue = create_stubbed_queue
|
28
|
-
|
29
|
-
expect(queue).to receive(:subscribe).and_yield(:delivery_info_object, :headers, "payload")
|
30
|
-
|
31
|
-
expect_any_instance_of(HeartbeatProcessor).to receive(:process).with(kind_of(Message))
|
32
|
-
|
33
|
-
Consumer.new(queue_name: "some-queue", exchange_name: "my-exchange", processor: client_processor).run
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,54 +0,0 @@
|
|
1
|
-
require_relative 'spec_helper'
|
2
|
-
require_relative 'support/queue_helpers'
|
3
|
-
|
4
|
-
describe Consumer do
|
5
|
-
include QueueHelpers
|
6
|
-
|
7
|
-
describe "#run" do
|
8
|
-
it "increments the counters on the statsd client" do
|
9
|
-
statsd_client = StatsdClientMock.new
|
10
|
-
queue = create_stubbed_queue
|
11
|
-
|
12
|
-
expect(queue).to receive(:subscribe).and_yield(
|
13
|
-
double(:delivery_info, channel: double(:channel, reject: double), delivery_tag: double),
|
14
|
-
double(:headers, content_type: 'application/json'),
|
15
|
-
"message_payload"
|
16
|
-
)
|
17
|
-
|
18
|
-
Consumer.new(queue_name: "some-queue", exchange_name: "my-exchange", processor: double, statsd_client: statsd_client).run
|
19
|
-
|
20
|
-
expect(statsd_client.incremented_keys).to eql(['some-queue.started', 'some-queue.discarded'])
|
21
|
-
end
|
22
|
-
|
23
|
-
it "increments the uncaught_exception counter for uncaught exceptions" do
|
24
|
-
statsd_client = StatsdClientMock.new
|
25
|
-
queue = create_stubbed_queue
|
26
|
-
|
27
|
-
expect(queue).to receive(:subscribe).and_yield(
|
28
|
-
double(:delivery_info, channel: double(:channel, reject: double), delivery_tag: double),
|
29
|
-
double(:headers, content_type: 'application/json'),
|
30
|
-
{}.to_json
|
31
|
-
)
|
32
|
-
|
33
|
-
processor = double
|
34
|
-
expect(processor).to receive(:process).and_raise("An exception")
|
35
|
-
|
36
|
-
expect do
|
37
|
-
Consumer.new(queue_name: "some-queue", exchange_name: "my-exchange", processor: processor, statsd_client: statsd_client).run
|
38
|
-
end.to raise_error(SystemExit)
|
39
|
-
|
40
|
-
expect(statsd_client.incremented_keys).to eql(['some-queue.started', 'some-queue.uncaught_exception'])
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
class StatsdClientMock
|
45
|
-
attr_reader :incremented_keys
|
46
|
-
def initialize
|
47
|
-
@incremented_keys = []
|
48
|
-
end
|
49
|
-
|
50
|
-
def increment(key)
|
51
|
-
@incremented_keys << key
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
require_relative 'spec_helper'
|
2
|
-
|
3
|
-
describe HeartbeatProcessor do
|
4
|
-
let(:heartbeat_headers) { instance_double("Heartbeat Headers", :content_type => "application/x-heartbeat") }
|
5
|
-
let(:heartbeat_message) { instance_double("Heartbeat Message", :headers => heartbeat_headers, :ack => nil) }
|
6
|
-
let(:standard_headers) { instance_double("Standard Headers", :content_type => nil) }
|
7
|
-
let(:standard_message) { instance_double("Standard Message", :headers => standard_headers, :ack => nil) }
|
8
|
-
|
9
|
-
let(:next_processor) { instance_double("Client::Processor") }
|
10
|
-
|
11
|
-
subject {
|
12
|
-
HeartbeatProcessor.new(next_processor)
|
13
|
-
}
|
14
|
-
|
15
|
-
context "for a heartbeat message" do
|
16
|
-
it "doesn't call the next processor" do
|
17
|
-
expect(next_processor).not_to receive(:process)
|
18
|
-
|
19
|
-
subject.process(heartbeat_message)
|
20
|
-
end
|
21
|
-
|
22
|
-
it "acks the message" do
|
23
|
-
expect(heartbeat_message).to receive(:ack)
|
24
|
-
|
25
|
-
subject.process(heartbeat_message)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
context "for a content message" do
|
30
|
-
it "calls the next processor" do
|
31
|
-
expect(next_processor).to receive(:process).with(standard_message)
|
32
|
-
|
33
|
-
subject.process(standard_message)
|
34
|
-
end
|
35
|
-
|
36
|
-
it "doesn't ack the message" do
|
37
|
-
expect(standard_message).not_to receive(:ack)
|
38
|
-
expect(next_processor).to receive(:process)
|
39
|
-
|
40
|
-
subject.process(standard_message)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
data/spec/json_processor_spec.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
require_relative 'spec_helper'
|
2
|
-
|
3
|
-
describe JSONProcessor do
|
4
|
-
describe "#process" do
|
5
|
-
it "parses the payload string" do
|
6
|
-
next_processor = double("next_processor", process: "ha")
|
7
|
-
message = MockMessage.new('{"some":"json"}', { content_type: "application/json" })
|
8
|
-
|
9
|
-
JSONProcessor.new(next_processor).process(message)
|
10
|
-
|
11
|
-
expect(message.payload).to eql({ "some" => "json" })
|
12
|
-
expect(next_processor).to have_received(:process)
|
13
|
-
end
|
14
|
-
|
15
|
-
it "discards messages with JSON errors" do
|
16
|
-
message = MockMessage.new('{"some" "json"}', { content_type: "application/json" })
|
17
|
-
|
18
|
-
JSONProcessor.new(double).process(message)
|
19
|
-
|
20
|
-
expect(message).to be_discarded
|
21
|
-
end
|
22
|
-
|
23
|
-
it "doesn't parse non-JSON message" do
|
24
|
-
next_processor = double("next_processor", process: "ha")
|
25
|
-
message = MockMessage.new('<SomeXML></SomeXML>', { content_type: "application/xml" })
|
26
|
-
|
27
|
-
JSONProcessor.new(next_processor).process(message)
|
28
|
-
|
29
|
-
expect(message.payload).to eql('<SomeXML></SomeXML>')
|
30
|
-
expect(next_processor).to have_received(:process)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
data/spec/message_spec.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
require_relative 'spec_helper'
|
2
|
-
|
3
|
-
describe Message do
|
4
|
-
let(:mock_channel) { instance_double("Channel") }
|
5
|
-
let(:delivery_info) { instance_double("DeliveryInfo", :channel => mock_channel, :delivery_tag => "a_tag") }
|
6
|
-
let(:headers) { instance_double("Headers") }
|
7
|
-
let(:message) { Message.new({ "a" => "payload" }, headers, delivery_info) }
|
8
|
-
|
9
|
-
it "ack sends an ack to the channel" do
|
10
|
-
expect(mock_channel).to receive(:ack).with("a_tag")
|
11
|
-
|
12
|
-
message.ack
|
13
|
-
|
14
|
-
expect(message.status).to eql(:acked)
|
15
|
-
end
|
16
|
-
|
17
|
-
it "retry sends a reject to the channel with requeue set" do
|
18
|
-
expect(mock_channel).to receive(:reject).with("a_tag", true)
|
19
|
-
|
20
|
-
message.retry
|
21
|
-
|
22
|
-
expect(message.status).to eql(:retried)
|
23
|
-
end
|
24
|
-
|
25
|
-
it "reject sends a reject to the channel without requeue set" do
|
26
|
-
expect(mock_channel).to receive(:reject).with("a_tag", false)
|
27
|
-
|
28
|
-
message.discard
|
29
|
-
|
30
|
-
expect(message.status).to eql(:discarded)
|
31
|
-
end
|
32
|
-
end
|
data/spec/mock_message_spec.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
require_relative 'spec_helper'
|
2
|
-
require_relative '../lib/govuk_message_queue_consumer/test_helpers/mock_message'
|
3
|
-
|
4
|
-
describe GovukMessageQueueConsumer::MockMessage do
|
5
|
-
describe '#methods' do
|
6
|
-
it "implements the same methods as Message" do
|
7
|
-
mock = MockMessage.new
|
8
|
-
real = Message.new(double, double, double)
|
9
|
-
|
10
|
-
expect(real.methods - mock.methods).to be_empty
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
describe '#ack' do
|
15
|
-
it "marks the message as acked" do
|
16
|
-
message = MockMessage.new
|
17
|
-
|
18
|
-
message.ack
|
19
|
-
|
20
|
-
expect(message).to be_acked
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
describe '#retry' do
|
25
|
-
it "marks the message as retried" do
|
26
|
-
message = MockMessage.new
|
27
|
-
|
28
|
-
message.retry
|
29
|
-
|
30
|
-
expect(message).to be_retried
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe '#discard' do
|
35
|
-
it "marks the message as discarded" do
|
36
|
-
message = MockMessage.new
|
37
|
-
|
38
|
-
message.discard
|
39
|
-
|
40
|
-
expect(message).to be_discarded
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe RabbitMQConfig do
|
4
|
-
describe ".from_environment" do
|
5
|
-
it "connects to rabbitmq with the correct environment variables" do
|
6
|
-
ENV["RABBITMQ_HOSTS"] = "server-one,server-two"
|
7
|
-
ENV["RABBITMQ_VHOST"] = "/"
|
8
|
-
ENV["RABBITMQ_USER"] = "my_user"
|
9
|
-
ENV["RABBITMQ_PASSWORD"] = "my_pass"
|
10
|
-
|
11
|
-
expect(RabbitMQConfig.new.from_environment).to eql({
|
12
|
-
hosts: ["server-one", "server-two"],
|
13
|
-
vhost: "/",
|
14
|
-
user: "my_user",
|
15
|
-
pass: "my_pass",
|
16
|
-
recover_from_connection_close: true,
|
17
|
-
})
|
18
|
-
end
|
19
|
-
|
20
|
-
it "provides a friendly error message when a variable is missing" do
|
21
|
-
ENV["RABBITMQ_HOSTS"] = nil
|
22
|
-
|
23
|
-
expect { RabbitMQConfig.new.from_environment }.to raise_error(RabbitMQConfig::ConfigurationError)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
require_relative '../lib/govuk_message_queue_consumer'
|
2
|
-
|
3
|
-
include GovukMessageQueueConsumer
|
4
|
-
|
5
|
-
module TestHelpers
|
6
|
-
def stub_environment_variables!
|
7
|
-
ENV["RABBITMQ_HOSTS"] ||= ""
|
8
|
-
ENV["RABBITMQ_VHOST"] ||= "/"
|
9
|
-
ENV["RABBITMQ_USER"] ||= "/"
|
10
|
-
ENV["RABBITMQ_PASSWORD"] ||= "/"
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
RSpec.configure do |c|
|
15
|
-
c.include TestHelpers
|
16
|
-
end
|