txgh-queue 2.1.0 → 3.0.0.beta
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/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
|
|