govuk_message_queue_consumer 2.1.0 → 3.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.
- 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
|