txgh-queue 2.1.0 → 3.0.0.beta
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/txgh-queue/application.rb +6 -0
- data/lib/txgh-queue/error_handlers/gitlab.rb +39 -0
- data/lib/txgh-queue/error_handlers.rb +1 -0
- data/lib/txgh-queue/job.rb +20 -3
- data/lib/txgh-queue/supervisor.rb +1 -0
- data/lib/txgh-queue/version.rb +1 -1
- data/lib/txgh-queue/webhooks/gitlab/request_handler.rb +26 -0
- data/lib/txgh-queue/webhooks/gitlab.rb +7 -0
- data/lib/txgh-queue/webhooks.rb +1 -0
- data/spec/application_spec.rb +34 -4
- data/spec/backends/sqs/config_spec.rb +4 -6
- data/spec/backends/sqs/consumer_spec.rb +3 -6
- data/spec/backends/sqs/history_sequence_spec.rb +1 -4
- data/spec/backends/sqs/job_spec.rb +21 -24
- data/spec/backends/sqs/message_attributes_spec.rb +3 -6
- data/spec/backends/sqs/producer_spec.rb +1 -3
- data/spec/backends/sqs/queue_spec.rb +1 -3
- data/spec/backends/sqs/retry_logic_spec.rb +11 -14
- data/spec/backends/sqs_spec.rb +5 -7
- data/spec/backends_spec.rb +1 -3
- data/spec/error_handlers/github_spec.rb +2 -4
- data/spec/error_handlers/gitlab_spec.rb +39 -0
- data/spec/error_handlers/network_errors_spec.rb +5 -7
- data/spec/error_handlers/server_response_spec.rb +5 -7
- data/spec/error_handlers/standard_errors_spec.rb +3 -5
- data/spec/error_handlers/transifex_spec.rb +4 -6
- data/spec/error_handlers/txgh_errors_spec.rb +1 -3
- data/spec/job_spec.rb +6 -8
- data/spec/result_spec.rb +3 -5
- data/spec/status_spec.rb +1 -3
- data/spec/supervisor_spec.rb +6 -8
- data/spec/webhooks/github/request_handler_spec.rb +6 -8
- data/spec/webhooks/gitlab/request_handler_spec.rb +144 -0
- data/spec/webhooks/transifex/request_handler_spec.rb +1 -3
- data/txgh-queue.gemspec +2 -3
- metadata +15 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 898748f4ec7487c2ae896e41379a004b090ec31ba2fa0aa974ab07d078a4fe10
|
4
|
+
data.tar.gz: 32426a63ef5e8d3f2ab102803576134d76ff17a1c84dff25dd2fd278a5dfb320
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 44c5160910ca4c90831ccc14dd9060c8ea0200871f8b85a6c1345886e492bcf60eae1ee43f82ce30b204fad762399f83bef5483cf8c53104f3c8e2113c2c9929
|
7
|
+
data.tar.gz: f80f1c7446514a967f93b4a79669cfaadf0905207c8f1552a0b87bba2e2466dda8eea4b9c6e643929aea22ab325beb8d65a826b671244a2ee2d901da85dde343
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'gitlab'
|
2
|
+
|
3
|
+
module TxghQueue
|
4
|
+
module ErrorHandlers
|
5
|
+
class Gitlab
|
6
|
+
# https://github.com/NARKOZ/gitlab/blob/master/lib/gitlab/error.rb
|
7
|
+
ERROR_CLASSES = {
|
8
|
+
::Gitlab::Error::BadGateway => Status.retry_without_delay,
|
9
|
+
::Gitlab::Error::BadRequest => Status.fail,
|
10
|
+
::Gitlab::Error::Conflict => Status.fail,
|
11
|
+
::Gitlab::Error::Forbidden => Status.fail,
|
12
|
+
::Gitlab::Error::InternalServerError => Status.retry_with_delay,
|
13
|
+
::Gitlab::Error::MethodNotAllowed => Status.fail,
|
14
|
+
::Gitlab::Error::NotAcceptable => Status.fail,
|
15
|
+
::Gitlab::Error::NotFound => Status.fail,
|
16
|
+
::Gitlab::Error::ServiceUnavailable => Status.retry_with_delay,
|
17
|
+
::Gitlab::Error::TooManyRequests => Status.retry_with_delay,
|
18
|
+
::Gitlab::Error::Unauthorized => Status.fail,
|
19
|
+
::Gitlab::Error::Unprocessable => Status.fail
|
20
|
+
}
|
21
|
+
|
22
|
+
class << self
|
23
|
+
def can_handle?(error_or_response)
|
24
|
+
error_or_response.is_a?(::Gitlab::Error::Error)
|
25
|
+
end
|
26
|
+
|
27
|
+
def status_for(error)
|
28
|
+
ERROR_CLASSES.fetch(error.class) { handle_other(error) }
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def handle_other(error)
|
34
|
+
Status.fail
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module TxghQueue
|
2
2
|
module ErrorHandlers
|
3
3
|
autoload :Github, 'txgh-queue/error_handlers/github'
|
4
|
+
autoload :Gitlab, 'txgh-queue/error_handlers/gitlab'
|
4
5
|
autoload :NetworkErrors, 'txgh-queue/error_handlers/network_errors'
|
5
6
|
autoload :ServerResponse, 'txgh-queue/error_handlers/server_response'
|
6
7
|
autoload :StandardErrors, 'txgh-queue/error_handlers/standard_errors'
|
data/lib/txgh-queue/job.rb
CHANGED
@@ -4,6 +4,7 @@ require 'txgh-server'
|
|
4
4
|
module TxghQueue
|
5
5
|
class Job
|
6
6
|
Github = TxghServer::Webhooks::Github
|
7
|
+
Gitlab = TxghServer::Webhooks::Gitlab
|
7
8
|
Transifex = TxghServer::Webhooks::Transifex
|
8
9
|
include TxghServer::ResponseHelpers
|
9
10
|
|
@@ -16,7 +17,7 @@ module TxghQueue
|
|
16
17
|
def process(payload)
|
17
18
|
Supervisor.supervise do
|
18
19
|
case payload.fetch('txgh_event')
|
19
|
-
when 'github.push', 'github.delete', 'transifex.hook'
|
20
|
+
when 'github.push', 'github.delete', 'gitlab.push', 'gitlab.delete', 'transifex.hook'
|
20
21
|
handle_expected(payload)
|
21
22
|
else
|
22
23
|
handle_unexpected
|
@@ -29,13 +30,17 @@ module TxghQueue
|
|
29
30
|
def handle_expected(payload)
|
30
31
|
config = config_from(payload)
|
31
32
|
project = config.transifex_project
|
32
|
-
repo = config.
|
33
|
+
repo = config.git_repo
|
33
34
|
|
34
35
|
case payload.fetch('txgh_event')
|
35
36
|
when 'github.push'
|
36
37
|
handle_github_push(project, repo, payload)
|
37
38
|
when 'github.delete'
|
38
39
|
handle_github_delete(project, repo, payload)
|
40
|
+
when 'gitlab.push'
|
41
|
+
handle_gitlab_push(project, repo, payload)
|
42
|
+
when 'gitlab.delete'
|
43
|
+
handle_gitlab_delete(project, repo, payload)
|
39
44
|
when 'transifex.hook'
|
40
45
|
handle_transifex_hook(project, repo, payload)
|
41
46
|
end
|
@@ -43,7 +48,7 @@ module TxghQueue
|
|
43
48
|
|
44
49
|
def config_from(payload)
|
45
50
|
case payload.fetch('txgh_event')
|
46
|
-
when 'github.push', 'github.delete'
|
51
|
+
when 'github.push', 'github.delete', 'gitlab.push', 'gitlab.delete'
|
47
52
|
Txgh::Config::KeyManager.config_from_repo(payload.fetch('repo_name'))
|
48
53
|
when 'transifex.hook'
|
49
54
|
Txgh::Config::KeyManager.config_from_project(payload.fetch('project'))
|
@@ -62,6 +67,18 @@ module TxghQueue
|
|
62
67
|
execute(handler)
|
63
68
|
end
|
64
69
|
|
70
|
+
def handle_gitlab_push(project, repo, payload)
|
71
|
+
attributes = TxghServer::Webhooks::Gitlab::PushAttributes.new(payload)
|
72
|
+
handler = TxghServer::Webhooks::Gitlab::PushHandler.new(project, repo, logger, attributes)
|
73
|
+
execute(handler)
|
74
|
+
end
|
75
|
+
|
76
|
+
def handle_gitlab_delete(project, repo, payload)
|
77
|
+
attributes = Gitlab::DeleteAttributes.new(payload)
|
78
|
+
handler = Gitlab::DeleteHandler.new(project, repo, logger, attributes)
|
79
|
+
execute(handler)
|
80
|
+
end
|
81
|
+
|
65
82
|
def handle_transifex_hook(project, repo, payload)
|
66
83
|
handler = Transifex::HookHandler.new(
|
67
84
|
project: project,
|
data/lib/txgh-queue/version.rb
CHANGED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'txgh-server'
|
2
|
+
|
3
|
+
module TxghQueue
|
4
|
+
module Webhooks
|
5
|
+
module Gitlab
|
6
|
+
class RequestHandler < ::TxghServer::Webhooks::Gitlab::RequestHandler
|
7
|
+
def handle_request
|
8
|
+
handle_safely do
|
9
|
+
case gitlab_event
|
10
|
+
when 'Push Hook'
|
11
|
+
txgh_event = delete_event? ? 'gitlab.delete' : 'gitlab.push'
|
12
|
+
|
13
|
+
result = ::TxghQueue::Config.backend
|
14
|
+
.producer_for(txgh_event, logger)
|
15
|
+
.enqueue(attributes.to_h.merge(txgh_event: txgh_event))
|
16
|
+
|
17
|
+
respond_with(202, result.to_json)
|
18
|
+
else
|
19
|
+
respond_with_error(400, "Event '#{gitlab_event}' cannot be enqueued")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/txgh-queue/webhooks.rb
CHANGED
data/spec/application_spec.rb
CHANGED
@@ -2,6 +2,7 @@ require 'spec_helper'
|
|
2
2
|
require 'rack/test'
|
3
3
|
|
4
4
|
require 'helpers/github_payload_builder'
|
5
|
+
require 'helpers/gitlab_payload_builder'
|
5
6
|
require 'helpers/standard_txgh_setup'
|
6
7
|
|
7
8
|
describe TxghQueue::WebhookEndpoints, auto_configure: true do
|
@@ -14,7 +15,7 @@ describe TxghQueue::WebhookEndpoints, auto_configure: true do
|
|
14
15
|
end
|
15
16
|
|
16
17
|
let(:config) do
|
17
|
-
Txgh::Config::ConfigPair.new(project_config,
|
18
|
+
Txgh::Config::ConfigPair.new(project_config, github_config)
|
18
19
|
end
|
19
20
|
|
20
21
|
let(:backend) { TxghQueue::Config.backend }
|
@@ -75,7 +76,7 @@ describe TxghQueue::WebhookEndpoints, auto_configure: true do
|
|
75
76
|
header(
|
76
77
|
TxghServer::GithubRequestAuth::GITHUB_HEADER,
|
77
78
|
TxghServer::GithubRequestAuth.compute_signature(
|
78
|
-
body, config.
|
79
|
+
body, config.git_repo.webhook_secret
|
79
80
|
)
|
80
81
|
)
|
81
82
|
end
|
@@ -83,7 +84,7 @@ describe TxghQueue::WebhookEndpoints, auto_configure: true do
|
|
83
84
|
let(:producer) { backend.producer_for('github.push') }
|
84
85
|
|
85
86
|
it 'enqueues a new job' do
|
86
|
-
payload = GithubPayloadBuilder.push_payload(
|
87
|
+
payload = GithubPayloadBuilder.push_payload(github_repo_name, ref)
|
87
88
|
payload.add_commit
|
88
89
|
|
89
90
|
sign_with payload.to_json
|
@@ -99,7 +100,36 @@ describe TxghQueue::WebhookEndpoints, auto_configure: true do
|
|
99
100
|
expect(job[:payload]).to include(
|
100
101
|
event: 'push',
|
101
102
|
txgh_event: 'github.push',
|
102
|
-
repo_name:
|
103
|
+
repo_name: github_repo_name,
|
104
|
+
ref: "refs/#{ref}"
|
105
|
+
)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe '/gitlab/enqueue' do
|
110
|
+
let(:producer) { backend.producer_for('gitlab.push') }
|
111
|
+
let(:config) do
|
112
|
+
Txgh::Config::ConfigPair.new(project_config, gitlab_config)
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'enqueues a new job' do
|
116
|
+
payload = GitlabPayloadBuilder.push_payload(gitlab_repo_name, ref)
|
117
|
+
payload.add_commit
|
118
|
+
|
119
|
+
header 'X-GitLab-Event', 'Push Hook'
|
120
|
+
header 'X-Gitlab-Token', config.git_repo.webhook_secret
|
121
|
+
|
122
|
+
expect { post '/gitlab/enqueue', payload.to_json }.to(
|
123
|
+
change { producer.enqueued_jobs.size }.from(0).to(1)
|
124
|
+
)
|
125
|
+
|
126
|
+
expect(last_response).to be_accepted
|
127
|
+
|
128
|
+
job = producer.enqueued_jobs.first
|
129
|
+
expect(job[:payload]).to include(
|
130
|
+
event: 'push',
|
131
|
+
txgh_event: 'gitlab.push',
|
132
|
+
repo_name: gitlab_repo_name.split('/').last,
|
103
133
|
ref: "refs/#{ref}"
|
104
134
|
)
|
105
135
|
end
|
@@ -1,21 +1,19 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
describe Sqs::Config, auto_configure: true do
|
3
|
+
describe TxghQueue::Backends::Sqs::Config, auto_configure: true do
|
6
4
|
let(:queue_config) { sqs_queue_config }
|
7
5
|
|
8
6
|
describe '.queues' do
|
9
7
|
it 'lists all queues' do
|
10
8
|
queues = described_class.queues
|
11
|
-
queues.each { |q| expect(q).to be_a(Sqs::Queue) }
|
9
|
+
queues.each { |q| expect(q).to be_a(TxghQueue::Backends::Sqs::Queue) }
|
12
10
|
expect(queues.map(&:name).sort).to eq(%w(test-queue test-queue-2))
|
13
11
|
end
|
14
12
|
end
|
15
13
|
|
16
14
|
describe '.failure_queue' do
|
17
15
|
it 'returns the failure queue' do
|
18
|
-
expect(described_class.failure_queue).to be_a(Sqs::Queue)
|
16
|
+
expect(described_class.failure_queue).to be_a(TxghQueue::Backends::Sqs::Queue)
|
19
17
|
expect(described_class.failure_queue.name).to eq('test-failure-queue')
|
20
18
|
end
|
21
19
|
end
|
@@ -23,7 +21,7 @@ describe Sqs::Config, auto_configure: true do
|
|
23
21
|
describe '.get_queue' do
|
24
22
|
it 'pulls out a single queue object' do
|
25
23
|
queue = described_class.get_queue('test-queue')
|
26
|
-
expect(queue).to be_a(Sqs::Queue)
|
24
|
+
expect(queue).to be_a(TxghQueue::Backends::Sqs::Queue)
|
27
25
|
expect(queue.name).to eq('test-queue')
|
28
26
|
end
|
29
27
|
end
|
@@ -1,12 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'helpers/sqs/sqs_test_message'
|
3
3
|
|
4
|
-
|
5
|
-
include TxghQueue::Backends
|
6
|
-
|
7
|
-
describe Sqs::Consumer, auto_configure: true do
|
4
|
+
describe TxghQueue::Backends::Sqs::Consumer, auto_configure: true do
|
8
5
|
let(:queue_config) { sqs_queue_config }
|
9
|
-
let(:queues) { Sqs::Config.queues }
|
6
|
+
let(:queues) { TxghQueue::Backends::Sqs::Config.queues }
|
10
7
|
let(:logger) { NilLogger.new }
|
11
8
|
let(:message) { SqsTestMessage.new('abc123', '{}') }
|
12
9
|
let(:consumer) { described_class.new(queues, logger) }
|
@@ -16,7 +13,7 @@ describe Sqs::Consumer, auto_configure: true do
|
|
16
13
|
job = double(:Job)
|
17
14
|
expect(queue).to receive(:receive_message).and_return(message.to_bundle)
|
18
15
|
expect(job).to receive(:complete)
|
19
|
-
expect(Sqs::Job).to(
|
16
|
+
expect(TxghQueue::Backends::Sqs::Job).to(
|
20
17
|
receive(:new).with(message, queue, logger).and_return(job)
|
21
18
|
)
|
22
19
|
end
|
@@ -1,10 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'helpers/sqs/sqs_test_message'
|
3
3
|
|
4
|
-
|
5
|
-
include TxghQueue::Backends
|
6
|
-
|
7
|
-
describe Sqs::HistorySequence do
|
4
|
+
describe TxghQueue::Backends::Sqs::HistorySequence do
|
8
5
|
let(:message) { SqsTestMessage.new('abc123', '{}', attributes_hash) }
|
9
6
|
let(:attributes_hash) do
|
10
7
|
{
|
@@ -1,13 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'helpers/sqs/sqs_test_message'
|
3
3
|
|
4
|
-
|
5
|
-
include TxghQueue::Backends
|
6
|
-
|
7
|
-
describe Sqs::Job, auto_configure: true do
|
4
|
+
describe TxghQueue::Backends::Sqs::Job, auto_configure: true do
|
8
5
|
let(:queue_config) { sqs_queue_config }
|
9
|
-
let(:queue) { Sqs::Config.queues.first }
|
10
|
-
let(:failure_queue) { Sqs::Config.failure_queue }
|
6
|
+
let(:queue) { TxghQueue::Backends::Sqs::Config.queues.first }
|
7
|
+
let(:failure_queue) { TxghQueue::Backends::Sqs::Config.failure_queue }
|
11
8
|
let(:logger) { NilLogger.new }
|
12
9
|
let(:body) { { 'foo' => 'bar' } }
|
13
10
|
let(:message) { SqsTestMessage.new('123abc', body.to_json) }
|
@@ -18,12 +15,12 @@ describe Sqs::Job, auto_configure: true do
|
|
18
15
|
it 'updates the history sequence with failure details for an exception' do
|
19
16
|
error = StandardError.new('foobar')
|
20
17
|
error.set_backtrace('path/to/file.rb:10')
|
21
|
-
result = Result.new(status, error)
|
18
|
+
result = TxghQueue::Result.new(status, error)
|
22
19
|
expect(job).to receive(:process).with(body).and_return(result)
|
23
20
|
|
24
21
|
# this call to send_message signifies a retry
|
25
22
|
expect(send(queue_sym)).to receive(:send_message) do |body, attributes|
|
26
|
-
message_attributes = Sqs::MessageAttributes.from_h(attributes[:message_attributes])
|
23
|
+
message_attributes = TxghQueue::Backends::Sqs::MessageAttributes.from_h(attributes[:message_attributes])
|
27
24
|
current_retry = message_attributes.history_sequence.current
|
28
25
|
expect(current_retry).to include(
|
29
26
|
response_type: 'error',
|
@@ -40,12 +37,12 @@ describe Sqs::Job, auto_configure: true do
|
|
40
37
|
|
41
38
|
it 'updates the history sequence with failure details for a txgh response' do
|
42
39
|
response = TxghServer::Response.new(502, 'Bad gateway')
|
43
|
-
result = Result.new(status, response)
|
40
|
+
result = TxghQueue::Result.new(status, response)
|
44
41
|
expect(job).to receive(:process).with(body).and_return(result)
|
45
42
|
|
46
43
|
# this call to send_message signifies a retry
|
47
44
|
expect(send(queue_sym)).to receive(:send_message) do |body, attributes|
|
48
|
-
message_attributes = Sqs::MessageAttributes.from_h(attributes[:message_attributes])
|
45
|
+
message_attributes = TxghQueue::Backends::Sqs::MessageAttributes.from_h(attributes[:message_attributes])
|
49
46
|
current_retry = message_attributes.history_sequence.current
|
50
47
|
expect(current_retry).to include(
|
51
48
|
response_type: 'response',
|
@@ -62,7 +59,7 @@ describe Sqs::Job, auto_configure: true do
|
|
62
59
|
|
63
60
|
describe '#complete' do
|
64
61
|
it 'processes a single job and deletes the message' do
|
65
|
-
result = Result.new(Status.ok, TxghServer::Response.new(200, 'Ok'))
|
62
|
+
result = TxghQueue::Result.new(TxghQueue::Status.ok, TxghServer::Response.new(200, 'Ok'))
|
66
63
|
expect(queue).to receive(:delete_message).with(message.receipt_handle)
|
67
64
|
expect(job).to receive(:process).with(body).and_return(result)
|
68
65
|
job.complete
|
@@ -70,7 +67,7 @@ describe Sqs::Job, auto_configure: true do
|
|
70
67
|
|
71
68
|
context 'error reporting' do
|
72
69
|
let(:error) { StandardError.new('jelly beans') }
|
73
|
-
let(:result) { Result.new(Status.fail, error) }
|
70
|
+
let(:result) { TxghQueue::Result.new(TxghQueue::Status.fail, error) }
|
74
71
|
|
75
72
|
before(:each) do
|
76
73
|
expect(job).to receive(:process).and_return(result)
|
@@ -93,7 +90,7 @@ describe Sqs::Job, auto_configure: true do
|
|
93
90
|
it 'includes error tracking details returned from publishing the event' do
|
94
91
|
expect(Txgh.events).to receive(:publish_error).and_return(foo: 'bar')
|
95
92
|
expect(failure_queue).to receive(:send_message) do |body, attributes|
|
96
|
-
message_attributes = Sqs::MessageAttributes.from_h(attributes[:message_attributes])
|
93
|
+
message_attributes = TxghQueue::Backends::Sqs::MessageAttributes.from_h(attributes[:message_attributes])
|
97
94
|
current_retry = message_attributes.history_sequence.current
|
98
95
|
expect(current_retry).to include(error_tracking: { foo: 'bar' })
|
99
96
|
end
|
@@ -112,12 +109,12 @@ describe Sqs::Job, auto_configure: true do
|
|
112
109
|
|
113
110
|
it 're-enqueues the message if told to retry' do
|
114
111
|
response = TxghServer::Response.new(502, 'Bad gateway')
|
115
|
-
result = Result.new(Status.retry_without_delay, response)
|
112
|
+
result = TxghQueue::Result.new(TxghQueue::Status.retry_without_delay, response)
|
116
113
|
expect(job).to receive(:process).with(body).and_return(result)
|
117
114
|
|
118
115
|
# this call to send_message signifies a retry
|
119
116
|
expect(queue).to receive(:send_message) do |body, attributes|
|
120
|
-
message_attributes = Sqs::MessageAttributes.from_h(attributes[:message_attributes])
|
117
|
+
message_attributes = TxghQueue::Backends::Sqs::MessageAttributes.from_h(attributes[:message_attributes])
|
121
118
|
history_sequence = message_attributes.history_sequence.sequence.map { |elem| elem[:status] }
|
122
119
|
expect(history_sequence).to eq(%w(retry_without_delay))
|
123
120
|
new_message
|
@@ -128,17 +125,17 @@ describe Sqs::Job, auto_configure: true do
|
|
128
125
|
|
129
126
|
it 're-enqueues with delay if told to do so' do
|
130
127
|
response = TxghServer::Response.new(502, 'Bad gateway')
|
131
|
-
result = Result.new(Status.retry_with_delay, response)
|
128
|
+
result = TxghQueue::Result.new(TxghQueue::Status.retry_with_delay, response)
|
132
129
|
expect(job).to receive(:process).with(body).and_return(result)
|
133
130
|
|
134
131
|
# this call to send_message signifies a retry
|
135
132
|
expect(queue).to receive(:send_message) do |body, attributes|
|
136
|
-
message_attributes = Sqs::MessageAttributes.from_h(attributes[:message_attributes])
|
133
|
+
message_attributes = TxghQueue::Backends::Sqs::MessageAttributes.from_h(attributes[:message_attributes])
|
137
134
|
history_sequence = message_attributes.history_sequence.sequence.map { |elem| elem[:status] }
|
138
135
|
expect(history_sequence).to eq(%w(retry_with_delay))
|
139
136
|
|
140
137
|
expect(attributes[:delay_seconds]).to eq(
|
141
|
-
Sqs::RetryLogic::DELAY_INTERVALS.first
|
138
|
+
TxghQueue::Backends::Sqs::RetryLogic::DELAY_INTERVALS.first
|
142
139
|
)
|
143
140
|
|
144
141
|
new_message
|
@@ -151,7 +148,7 @@ describe Sqs::Job, auto_configure: true do
|
|
151
148
|
let(:message) do
|
152
149
|
SqsTestMessage.new('123abc', body.to_json, {
|
153
150
|
'history_sequence' => {
|
154
|
-
'string_value' => (Sqs::RetryLogic::OVERALL_MAX_RETRIES - 1).times.map do
|
151
|
+
'string_value' => (TxghQueue::Backends::Sqs::RetryLogic::OVERALL_MAX_RETRIES - 1).times.map do
|
155
152
|
{ status: 'retry_without_delay' }
|
156
153
|
end.to_json
|
157
154
|
}
|
@@ -160,15 +157,15 @@ describe Sqs::Job, auto_configure: true do
|
|
160
157
|
|
161
158
|
it 'deletes the message and adds it to the failure queue' do
|
162
159
|
response = TxghServer::Response.new(502, 'Bad gateway')
|
163
|
-
result = Result.new(Status.retry_with_delay, response)
|
160
|
+
result = TxghQueue::Result.new(TxghQueue::Status.retry_with_delay, response)
|
164
161
|
expect(job).to receive(:process).with(body).and_return(result)
|
165
162
|
expect(failure_queue).to receive(:send_message).and_return(new_message)
|
166
163
|
job.complete
|
167
164
|
end
|
168
165
|
end
|
169
166
|
|
170
|
-
it_behaves_like "it updates the message's history sequence", Status.retry_without_delay, :queue
|
171
|
-
it_behaves_like "it updates the message's history sequence", Status.retry_with_delay, :queue
|
167
|
+
it_behaves_like "it updates the message's history sequence", TxghQueue::Status.retry_without_delay, :queue
|
168
|
+
it_behaves_like "it updates the message's history sequence", TxghQueue::Status.retry_with_delay, :queue
|
172
169
|
end
|
173
170
|
|
174
171
|
context 'failures' do
|
@@ -177,13 +174,13 @@ describe Sqs::Job, auto_configure: true do
|
|
177
174
|
end
|
178
175
|
|
179
176
|
it 'sends the message to the failure queue' do
|
180
|
-
result = Result.new(Status.fail, TxghServer::Response.new(500, '💩'))
|
177
|
+
result = TxghQueue::Result.new(TxghQueue::Status.fail, TxghServer::Response.new(500, '💩'))
|
181
178
|
expect(failure_queue).to receive(:send_message).with(body.to_json, anything)
|
182
179
|
expect(job).to receive(:process).with(body).and_return(result)
|
183
180
|
job.complete
|
184
181
|
end
|
185
182
|
|
186
|
-
it_behaves_like "it updates the message's history sequence", Status.fail, :failure_queue
|
183
|
+
it_behaves_like "it updates the message's history sequence", TxghQueue::Status.fail, :failure_queue
|
187
184
|
end
|
188
185
|
end
|
189
186
|
end
|
@@ -2,10 +2,7 @@ require 'spec_helper'
|
|
2
2
|
require 'helpers/sqs/sqs_test_message'
|
3
3
|
require 'json'
|
4
4
|
|
5
|
-
|
6
|
-
include TxghQueue::Backends
|
7
|
-
|
8
|
-
describe Sqs::MessageAttributes do
|
5
|
+
describe TxghQueue::Backends::Sqs::MessageAttributes do
|
9
6
|
let(:message) { SqsTestMessage.new('abc123', '{}', attributes_hash) }
|
10
7
|
let(:attributes_hash) do
|
11
8
|
{
|
@@ -20,7 +17,7 @@ describe Sqs::MessageAttributes do
|
|
20
17
|
describe '.from_message' do
|
21
18
|
it 'extracts the history sequence from the message attributes' do
|
22
19
|
attributes = described_class.from_message(message)
|
23
|
-
expect(attributes.history_sequence).to be_a(Sqs::HistorySequence)
|
20
|
+
expect(attributes.history_sequence).to be_a(TxghQueue::Backends::Sqs::HistorySequence)
|
24
21
|
expect(attributes.history_sequence.sequence.first[:status]).to(
|
25
22
|
eq('retry_without_delay')
|
26
23
|
)
|
@@ -30,7 +27,7 @@ describe Sqs::MessageAttributes do
|
|
30
27
|
describe '.from_h' do
|
31
28
|
it 'creates the history sequence from the hash elements' do
|
32
29
|
attributes = described_class.from_h(attributes_hash)
|
33
|
-
expect(attributes.history_sequence).to be_a(Sqs::HistorySequence)
|
30
|
+
expect(attributes.history_sequence).to be_a(TxghQueue::Backends::Sqs::HistorySequence)
|
34
31
|
expect(attributes.history_sequence.sequence.first[:status]).to(
|
35
32
|
eq('retry_without_delay')
|
36
33
|
)
|
@@ -1,9 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'securerandom'
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
describe Sqs::Producer, auto_configure: true do
|
4
|
+
describe TxghQueue::Backends::Sqs::Producer, auto_configure: true do
|
7
5
|
let(:queue_config) { sqs_queue_config }
|
8
6
|
let(:logger) { NilLogger.new }
|
9
7
|
let(:queues) { TxghQueue::Backends::Sqs::Config.queues }
|
@@ -1,16 +1,13 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'helpers/sqs/sqs_test_message'
|
3
3
|
|
4
|
-
|
5
|
-
include TxghQueue::Backends
|
6
|
-
|
7
|
-
describe Sqs::RetryLogic do
|
4
|
+
describe TxghQueue::Backends::Sqs::RetryLogic do
|
8
5
|
context 'with overall retries exceeded' do
|
9
6
|
let(:logic) { described_class.new(message_attributes, current_status) }
|
10
|
-
let(:current_status) { Status.retry_without_delay }
|
7
|
+
let(:current_status) { TxghQueue::Status.retry_without_delay }
|
11
8
|
let(:message) { SqsTestMessage.new('abc123', '{}', message_attributes.to_h) }
|
12
9
|
let(:message_attributes) do
|
13
|
-
Sqs::MessageAttributes.from_h(
|
10
|
+
TxghQueue::Backends::Sqs::MessageAttributes.from_h(
|
14
11
|
history_sequence: {
|
15
12
|
string_value: described_class::OVERALL_MAX_RETRIES.times.map do
|
16
13
|
{ status: 'retry_without_delay' }
|
@@ -33,23 +30,23 @@ describe Sqs::RetryLogic do
|
|
33
30
|
|
34
31
|
describe '#next_delay_seconds' do
|
35
32
|
it 'raises an error' do
|
36
|
-
expect { logic.next_delay_seconds }.to raise_error(Sqs::RetriesExceededError)
|
33
|
+
expect { logic.next_delay_seconds }.to raise_error(TxghQueue::Backends::Sqs::RetriesExceededError)
|
37
34
|
end
|
38
35
|
end
|
39
36
|
|
40
37
|
describe '#sqs_retry_params' do
|
41
38
|
it 'raises an error' do
|
42
|
-
expect { logic.sqs_retry_params }.to raise_error(Sqs::RetriesExceededError)
|
39
|
+
expect { logic.sqs_retry_params }.to raise_error(TxghQueue::Backends::Sqs::RetriesExceededError)
|
43
40
|
end
|
44
41
|
end
|
45
42
|
end
|
46
43
|
|
47
44
|
context 'with a run of no-delay retries' do
|
48
45
|
let(:logic) { described_class.new(message_attributes, current_status) }
|
49
|
-
let(:current_status) { Status.retry_without_delay }
|
46
|
+
let(:current_status) { TxghQueue::Status.retry_without_delay }
|
50
47
|
let(:message) { SqsTestMessage.new('abc123', '{}', message_attributes.to_h) }
|
51
48
|
let(:message_attributes) do
|
52
|
-
Sqs::MessageAttributes.from_h(
|
49
|
+
TxghQueue::Backends::Sqs::MessageAttributes.from_h(
|
53
50
|
history_sequence: {
|
54
51
|
string_value: [
|
55
52
|
{ status: 'retry_without_delay' },
|
@@ -87,7 +84,7 @@ describe Sqs::RetryLogic do
|
|
87
84
|
end
|
88
85
|
|
89
86
|
context 'and a delayed current status' do
|
90
|
-
let(:current_status) { Status.retry_with_delay }
|
87
|
+
let(:current_status) { TxghQueue::Status.retry_with_delay }
|
91
88
|
|
92
89
|
describe '#next_delay_seconds' do
|
93
90
|
it 'indicates a first-stage delay' do
|
@@ -101,10 +98,10 @@ describe Sqs::RetryLogic do
|
|
101
98
|
|
102
99
|
context 'with a run of delayed retries' do
|
103
100
|
let(:logic) { described_class.new(message_attributes, current_status) }
|
104
|
-
let(:current_status) { Status.retry_with_delay }
|
101
|
+
let(:current_status) { TxghQueue::Status.retry_with_delay }
|
105
102
|
let(:message) { SqsTestMessage.new('abc123', '{}', message_attributes.to_h) }
|
106
103
|
let(:message_attributes) do
|
107
|
-
Sqs::MessageAttributes.from_h(
|
104
|
+
TxghQueue::Backends::Sqs::MessageAttributes.from_h(
|
108
105
|
history_sequence: {
|
109
106
|
string_value: [
|
110
107
|
{ status: 'retry_with_delay' },
|
@@ -145,7 +142,7 @@ describe Sqs::RetryLogic do
|
|
145
142
|
end
|
146
143
|
|
147
144
|
context 'and a non-delayed current status' do
|
148
|
-
let(:current_status) { Status.retry_without_delay }
|
145
|
+
let(:current_status) { TxghQueue::Status.retry_without_delay }
|
149
146
|
|
150
147
|
describe '#next_delay_seconds' do
|
151
148
|
it 'indicates no delay' do
|
data/spec/backends/sqs_spec.rb
CHANGED
@@ -1,16 +1,14 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
describe Sqs, auto_configure: true do
|
3
|
+
describe TxghQueue::Backends::Sqs, auto_configure: true do
|
6
4
|
let(:queue_config) { sqs_queue_config }
|
7
5
|
|
8
6
|
describe '.producer_for' do
|
9
7
|
it 'looks up the queues for the given event and returns a producer object' do
|
10
8
|
producer = described_class.producer_for('a')
|
11
|
-
expect(producer).to be_a(Sqs::Producer)
|
9
|
+
expect(producer).to be_a(TxghQueue::Backends::Sqs::Producer)
|
12
10
|
expect(producer.queues.size).to eq(1)
|
13
|
-
expect(producer.queues.first).to be_a(Sqs::Queue)
|
11
|
+
expect(producer.queues.first).to be_a(TxghQueue::Backends::Sqs::Queue)
|
14
12
|
expect(producer.queues.first.name).to eq('test-queue')
|
15
13
|
end
|
16
14
|
|
@@ -30,9 +28,9 @@ describe Sqs, auto_configure: true do
|
|
30
28
|
describe '.consumer_for' do
|
31
29
|
it 'looks up the queue for the given event and returns a consumer object' do
|
32
30
|
consumer = described_class.consumer_for('b')
|
33
|
-
expect(consumer).to be_a(Sqs::Consumer)
|
31
|
+
expect(consumer).to be_a(TxghQueue::Backends::Sqs::Consumer)
|
34
32
|
expect(consumer.queues.size).to eq(1)
|
35
|
-
expect(consumer.queues.first).to be_a(Sqs::Queue)
|
33
|
+
expect(consumer.queues.first).to be_a(TxghQueue::Backends::Sqs::Queue)
|
36
34
|
expect(consumer.queues.first.name).to eq('test-queue')
|
37
35
|
end
|
38
36
|
|