txgh-queue 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/txgh-queue/application.rb +35 -0
- data/lib/txgh-queue/backends/null.rb +19 -0
- data/lib/txgh-queue/backends/sqs/config.rb +29 -0
- data/lib/txgh-queue/backends/sqs/consumer.rb +30 -0
- data/lib/txgh-queue/backends/sqs/history_sequence.rb +62 -0
- data/lib/txgh-queue/backends/sqs/job.rb +115 -0
- data/lib/txgh-queue/backends/sqs/message_attributes.rb +33 -0
- data/lib/txgh-queue/backends/sqs/producer.rb +33 -0
- data/lib/txgh-queue/backends/sqs/queue.rb +45 -0
- data/lib/txgh-queue/backends/sqs/retry_logic.rb +118 -0
- data/lib/txgh-queue/backends/sqs.rb +36 -0
- data/lib/txgh-queue/backends.rb +22 -0
- data/lib/txgh-queue/config.rb +48 -0
- data/lib/txgh-queue/error_handlers/github.rb +47 -0
- data/lib/txgh-queue/error_handlers/server_response.rb +22 -0
- data/lib/txgh-queue/error_handlers/standard_errors.rb +15 -0
- data/lib/txgh-queue/error_handlers/transifex.rb +23 -0
- data/lib/txgh-queue/error_handlers/txgh_errors.rb +27 -0
- data/lib/txgh-queue/error_handlers.rb +9 -0
- data/lib/txgh-queue/job.rb +77 -0
- data/lib/txgh-queue/result.rb +26 -0
- data/lib/txgh-queue/status.rb +51 -0
- data/lib/txgh-queue/supervisor.rb +76 -0
- data/lib/txgh-queue/version.rb +3 -0
- data/lib/txgh-queue/webhooks/github/request_handler.rb +34 -0
- data/lib/txgh-queue/webhooks/github.rb +7 -0
- data/lib/txgh-queue/webhooks/transifex/request_handler.rb +21 -0
- data/lib/txgh-queue/webhooks/transifex.rb +7 -0
- data/lib/txgh-queue/webhooks.rb +6 -0
- data/lib/txgh-queue.rb +14 -0
- data/spec/application_spec.rb +97 -0
- data/spec/backends/sqs/config_spec.rb +30 -0
- data/spec/backends/sqs/consumer_spec.rb +34 -0
- data/spec/backends/sqs/history_sequence_spec.rb +75 -0
- data/spec/backends/sqs/job_spec.rb +189 -0
- data/spec/backends/sqs/message_attributes_spec.rb +64 -0
- data/spec/backends/sqs/producer_spec.rb +32 -0
- data/spec/backends/sqs/queue_spec.rb +65 -0
- data/spec/backends/sqs/retry_logic_spec.rb +157 -0
- data/spec/backends/sqs_spec.rb +57 -0
- data/spec/backends_spec.rb +31 -0
- data/spec/config_spec.rb +15 -0
- data/spec/error_handlers/github_spec.rb +30 -0
- data/spec/error_handlers/server_response_spec.rb +36 -0
- data/spec/error_handlers/standard_errors_spec.rb +22 -0
- data/spec/error_handlers/transifex_spec.rb +43 -0
- data/spec/error_handlers/txgh_errors_spec.rb +25 -0
- data/spec/helpers/env_helpers.rb +13 -0
- data/spec/helpers/nil_logger.rb +10 -0
- data/spec/helpers/sqs/sqs_test_message.rb +47 -0
- data/spec/helpers/test_backend.rb +54 -0
- data/spec/job_spec.rb +111 -0
- data/spec/result_spec.rb +63 -0
- data/spec/spec_helper.rb +66 -0
- data/spec/status_spec.rb +68 -0
- data/spec/supervisor_spec.rb +40 -0
- data/spec/webhooks/github/request_handler_spec.rb +145 -0
- data/spec/webhooks/transifex/request_handler_spec.rb +87 -0
- data/txgh-queue.gemspec +24 -0
- metadata +172 -0
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include TxghQueue
|
4
|
+
|
5
|
+
describe ErrorHandlers::StandardErrors do
|
6
|
+
describe '.can_handle?' do
|
7
|
+
it 'can reply to StandardError' do
|
8
|
+
expect(described_class.can_handle?(StandardError.new)).to eq(true)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'can reply to things that inherit from StandardError' do
|
12
|
+
expect(described_class.can_handle?(RuntimeError.new)).to eq(true)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '.status_for' do
|
17
|
+
it 'always responds with fail' do
|
18
|
+
expect(described_class.status_for(StandardError.new)).to eq(Status.fail)
|
19
|
+
expect(described_class.status_for('foo')).to eq(Status.fail)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include TxghQueue
|
4
|
+
|
5
|
+
describe ErrorHandlers::Transifex do
|
6
|
+
describe '.can_handle?' do
|
7
|
+
it 'can reply to transifex api errors' do
|
8
|
+
error = Txgh::TransifexApiError.new(500, 'Internal error')
|
9
|
+
expect(described_class.can_handle?(error)).to eq(true)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'can reply to transifex not found errors' do
|
13
|
+
error = Txgh::TransifexNotFoundError.new
|
14
|
+
expect(described_class.can_handle?(error)).to eq(true)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'can reply to transifex unauthorized errors' do
|
18
|
+
error = Txgh::TransifexUnauthorizedError.new
|
19
|
+
expect(described_class.can_handle?(error)).to eq(true)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "can't reply to unsupported error classes" do
|
23
|
+
expect(described_class.can_handle?(StandardError.new)).to eq(false)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '.status_for' do
|
28
|
+
it 'retries with delay on api error' do
|
29
|
+
error = Txgh::TransifexApiError.new(500, 'Internal error')
|
30
|
+
expect(described_class.status_for(error)).to eq(Status.retry_with_delay)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'fails on not found error' do
|
34
|
+
error = Txgh::TransifexNotFoundError.new
|
35
|
+
expect(described_class.status_for(error)).to eq(Status.fail)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'fails on unauthorized error' do
|
39
|
+
error = Txgh::TransifexUnauthorizedError.new
|
40
|
+
expect(described_class.status_for(error)).to eq(Status.fail)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include TxghQueue
|
4
|
+
|
5
|
+
describe ErrorHandlers::TxghErrors do
|
6
|
+
describe '.can_handle?' do
|
7
|
+
it 'can reply to all configured error classes' do
|
8
|
+
described_class::ERROR_CLASSES.keys.each do |klass|
|
9
|
+
expect(described_class.can_handle?(klass.new)).to eq(true)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
it "can't reply to unsupported error classes" do
|
14
|
+
expect(described_class.can_handle?(StandardError.new)).to eq(false)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '.status_for' do
|
19
|
+
it 'replies to all configured errors correctly' do
|
20
|
+
described_class::ERROR_CLASSES.each_pair do |klass, expected_response|
|
21
|
+
expect(described_class.status_for(klass.new)).to eq(expected_response)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module EnvHelpers
|
2
|
+
def with_env(env)
|
3
|
+
# ENV can't be duped, so use select instead to make a copy
|
4
|
+
old_env = ENV.select { true }
|
5
|
+
env.each_pair { |k, v| ENV[k] = v }
|
6
|
+
yield
|
7
|
+
ensure
|
8
|
+
# reset back to old vars
|
9
|
+
env.each_pair { |k, _| ENV[k] = old_env[k] }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
EnvHelpers.extend(EnvHelpers)
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
|
3
|
+
class SqsTestMessage
|
4
|
+
attr_reader :message_id, :body, :message_attributes
|
5
|
+
attr_reader :receipt_handle
|
6
|
+
|
7
|
+
def initialize(message_id, body, message_attributes = {})
|
8
|
+
@message_id = message_id
|
9
|
+
@body = body
|
10
|
+
@message_attributes = SqsTestMessageAttributes.new(message_attributes)
|
11
|
+
@receipt_handle = SecureRandom.hex
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_bundle
|
15
|
+
SqsTestMessageBundle.new([self])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class SqsTestMessageBundle
|
20
|
+
attr_reader :messages
|
21
|
+
|
22
|
+
def initialize(messages)
|
23
|
+
@messages = messages
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class SqsTestMessageAttributes
|
28
|
+
attr_reader :attributes
|
29
|
+
|
30
|
+
def initialize(attributes)
|
31
|
+
@attributes = attributes
|
32
|
+
end
|
33
|
+
|
34
|
+
def [](key)
|
35
|
+
if attribute = attributes[key]
|
36
|
+
SqsTestMessageAttribute.new(attribute)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class SqsTestMessageAttribute
|
42
|
+
attr_reader :string_value
|
43
|
+
|
44
|
+
def initialize(attribute)
|
45
|
+
@string_value = attribute['string_value']
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module TxghQueue
|
2
|
+
class TestBackend
|
3
|
+
class << self
|
4
|
+
def producer_for(event, logger = Txgh::TxLogger.logger)
|
5
|
+
producers[event] ||= TestProducer.new(event, logger)
|
6
|
+
end
|
7
|
+
|
8
|
+
def consumer_for(event, logger = Txgh::TxLogger.logger)
|
9
|
+
consumers[event] ||= TestConsumer.new(event, logger)
|
10
|
+
end
|
11
|
+
|
12
|
+
def reset!
|
13
|
+
@producers = nil
|
14
|
+
@consumers = nil
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def producers
|
20
|
+
@producers ||= {}
|
21
|
+
end
|
22
|
+
|
23
|
+
def consumers
|
24
|
+
@consumers ||= {}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class TestProducer
|
30
|
+
attr_reader :queue_names, :logger, :enqueued_jobs
|
31
|
+
|
32
|
+
def initialize(event, logger)
|
33
|
+
@event = event
|
34
|
+
@logger = logger
|
35
|
+
@enqueued_jobs = []
|
36
|
+
end
|
37
|
+
|
38
|
+
def enqueue(payload, options = {})
|
39
|
+
enqueued_jobs << { payload: payload, options: options }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class TestConsumer
|
44
|
+
attr_reader :queue_names, :logger
|
45
|
+
|
46
|
+
def initialize(event, logger)
|
47
|
+
@event = event
|
48
|
+
@logger = logger
|
49
|
+
end
|
50
|
+
|
51
|
+
def work
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/spec/job_spec.rb
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include TxghQueue
|
4
|
+
|
5
|
+
describe Job, auto_configure: true do
|
6
|
+
let(:logger) { NilLogger.new }
|
7
|
+
let(:repo_name) { 'my_repo' }
|
8
|
+
let(:txgh_config) { Txgh::Config::ConfigPair.new(:github_repo, :transifex_project) }
|
9
|
+
let(:job) { described_class.new(logger) }
|
10
|
+
|
11
|
+
before(:each) do
|
12
|
+
allow(Txgh::Config::KeyManager).to(
|
13
|
+
receive(:config_from_repo).with(repo_name).and_return(txgh_config)
|
14
|
+
)
|
15
|
+
end
|
16
|
+
|
17
|
+
shared_examples 'a payload processor' do
|
18
|
+
it 'processes the payload' do
|
19
|
+
server_response = TxghServer::Response.new(200, 'Ok')
|
20
|
+
expect(handler).to receive(:execute).and_return(server_response)
|
21
|
+
result = job.process(payload)
|
22
|
+
expect(result.status).to eq(Status.ok)
|
23
|
+
expect(result.response).to eq(server_response)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'responds appropriately when an error is raised' do
|
27
|
+
expect(handler).to receive(:execute).and_raise(StandardError)
|
28
|
+
result = job.process(payload)
|
29
|
+
expect(result.status).to eq(Status.fail)
|
30
|
+
expect(result.error).to be_a(StandardError)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'responds appropriately when an error response is returned' do
|
34
|
+
server_response = TxghServer::Response.new(404, 'Not found')
|
35
|
+
expect(handler).to receive(:execute).and_return(server_response)
|
36
|
+
result = job.process(payload)
|
37
|
+
expect(result.status).to eq(Status.fail)
|
38
|
+
expect(result.response).to eq(server_response)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'with a push payload' do
|
43
|
+
let(:payload) do
|
44
|
+
{
|
45
|
+
'repo_name' => repo_name,
|
46
|
+
'event' => 'push',
|
47
|
+
'txgh_event' => 'github.push',
|
48
|
+
'ref' => 'heads/master',
|
49
|
+
'before' => 'abc123',
|
50
|
+
'after' => 'def456',
|
51
|
+
'added_files' => [],
|
52
|
+
'modified_files' => [],
|
53
|
+
'author' => 'Bugs Bunny'
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#process' do
|
58
|
+
let(:handler) { double(:handler) }
|
59
|
+
|
60
|
+
before(:each) do
|
61
|
+
expect(TxghServer::Webhooks::Github::PushHandler).to(
|
62
|
+
receive(:new).and_return(handler)
|
63
|
+
)
|
64
|
+
end
|
65
|
+
|
66
|
+
it_behaves_like 'a payload processor'
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'with a delete payload' do
|
71
|
+
let(:payload) do
|
72
|
+
{
|
73
|
+
'repo_name' => repo_name,
|
74
|
+
'event' => 'delete',
|
75
|
+
'txgh_event' => 'github.delete',
|
76
|
+
'ref' => 'heads/master',
|
77
|
+
'ref_type' => 'branch'
|
78
|
+
}
|
79
|
+
end
|
80
|
+
|
81
|
+
describe '#process' do
|
82
|
+
let(:handler) { double(:handler) }
|
83
|
+
|
84
|
+
before(:each) do
|
85
|
+
expect(TxghServer::Webhooks::Github::DeleteHandler).to(
|
86
|
+
receive(:new).and_return(handler)
|
87
|
+
)
|
88
|
+
end
|
89
|
+
|
90
|
+
it_behaves_like 'a payload processor'
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
context 'with a payload with an unrecognized event type' do
|
95
|
+
let(:payload) do
|
96
|
+
{
|
97
|
+
'repo_name' => repo_name,
|
98
|
+
'txgh_event' => 'foobarbazboo'
|
99
|
+
}
|
100
|
+
end
|
101
|
+
|
102
|
+
describe '#process' do
|
103
|
+
it 'responds with fail' do
|
104
|
+
result = job.process(payload)
|
105
|
+
expect(result.status).to eq(Status.fail)
|
106
|
+
expect(result.response.status).to eq(400)
|
107
|
+
expect(result.response.body).to eq([error: 'Unexpected event type'])
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
data/spec/result_spec.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include TxghQueue
|
4
|
+
|
5
|
+
describe Result do
|
6
|
+
context 'with a response' do
|
7
|
+
let(:response) { TxghServer::Response.new(200, 'Ok') }
|
8
|
+
let(:result) { Result.new(Status.ok, response) }
|
9
|
+
|
10
|
+
describe 'has_response?' do
|
11
|
+
it 'does have a response' do
|
12
|
+
expect(result.has_response?).to eq(true)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'has_error?' do
|
17
|
+
it 'does not have an error' do
|
18
|
+
expect(result.has_error?).to eq(false)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#response' do
|
23
|
+
it 'returns the response' do
|
24
|
+
expect(result.response).to eq(response)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#error' do
|
29
|
+
it 'returns nil' do
|
30
|
+
expect(result.error).to eq(nil)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'with an error' do
|
36
|
+
let(:error) { StandardError.new }
|
37
|
+
let(:result) { Result.new(Status.fail, error) }
|
38
|
+
|
39
|
+
describe 'has_response?' do
|
40
|
+
it 'does not have a response' do
|
41
|
+
expect(result.has_response?).to eq(false)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe 'has_error?' do
|
46
|
+
it 'does have an error' do
|
47
|
+
expect(result.has_error?).to eq(true)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#response' do
|
52
|
+
it 'returns nil' do
|
53
|
+
expect(result.response).to eq(nil)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#error' do
|
58
|
+
it 'returns nil' do
|
59
|
+
expect(result.error).to eq(error)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
$:.push(File.join(Gem.loaded_specs['txgh'].full_gem_path, 'spec'))
|
2
|
+
$:.push(File.join(Gem.loaded_specs['txgh-server'].full_gem_path, 'spec'))
|
3
|
+
|
4
|
+
require 'pry-byebug'
|
5
|
+
require 'rake'
|
6
|
+
require 'rspec'
|
7
|
+
require 'txgh'
|
8
|
+
require 'txgh-queue'
|
9
|
+
require 'txgh-server'
|
10
|
+
|
11
|
+
require 'helpers/env_helpers'
|
12
|
+
require 'helpers/nil_logger'
|
13
|
+
require 'helpers/test_backend'
|
14
|
+
|
15
|
+
RSpec.configure do |config|
|
16
|
+
module GlobalLets
|
17
|
+
extend RSpec::SharedContext
|
18
|
+
|
19
|
+
# default config, override in specs if you wanna customize
|
20
|
+
let(:queue_config) do
|
21
|
+
{
|
22
|
+
backend: 'test',
|
23
|
+
options: {
|
24
|
+
queues: %w(test-queue)
|
25
|
+
}
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
# default sqs config; override queue_config with this when working with the
|
30
|
+
# sqs backend, i.e. let(:queue_config) { sqs_queue_config }
|
31
|
+
let(:sqs_queue_config) do
|
32
|
+
{
|
33
|
+
backend: 'sqs',
|
34
|
+
options: {
|
35
|
+
queues: [
|
36
|
+
{ name: 'test-queue', region: 'us-east-1', events: %w(a b c) },
|
37
|
+
{ name: 'test-queue-2', region: 'us-west-1', events: %w(c d e) }
|
38
|
+
],
|
39
|
+
|
40
|
+
failure_queue: {
|
41
|
+
name: 'test-failure-queue', region: 'us-east-1'
|
42
|
+
}
|
43
|
+
}
|
44
|
+
}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
config.include(GlobalLets)
|
49
|
+
config.include(EnvHelpers)
|
50
|
+
|
51
|
+
config.around(:each) do |example|
|
52
|
+
if example.metadata[:auto_configure]
|
53
|
+
env_vars = { 'TXGH_QUEUE_CONFIG' => "raw://#{YAML.dump(queue_config)}" }
|
54
|
+
with_env(env_vars) { example.run }
|
55
|
+
|
56
|
+
# reset global config
|
57
|
+
TxghQueue::Config.reset!
|
58
|
+
TxghQueue::TestBackend.reset!
|
59
|
+
TxghQueue::Backends::Sqs::Config.reset!
|
60
|
+
else
|
61
|
+
example.run
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
TxghQueue::Backends.register('test', TxghQueue::TestBackend)
|
data/spec/status_spec.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include TxghQueue
|
4
|
+
|
5
|
+
describe Status do
|
6
|
+
describe '.retry_without_delay' do
|
7
|
+
it 'returns the same object' do
|
8
|
+
expect(described_class.retry_without_delay.object_id).to eq(
|
9
|
+
described_class.retry_without_delay.object_id
|
10
|
+
)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '.retry_with_delay' do
|
15
|
+
it 'returns the same object' do
|
16
|
+
expect(described_class.retry_with_delay.object_id).to eq(
|
17
|
+
described_class.retry_with_delay.object_id
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '.fail' do
|
23
|
+
it 'returns the same object' do
|
24
|
+
expect(described_class.fail.object_id).to eq(described_class.fail.object_id)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '.ok' do
|
29
|
+
it 'returns the same object' do
|
30
|
+
expect(described_class.ok.object_id).to eq(described_class.ok.object_id)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#retry_without_delay?' do
|
35
|
+
it 'returns true if the response matches, false otherwise' do
|
36
|
+
expect(described_class.retry_without_delay.retry_without_delay?).to eq(true)
|
37
|
+
expect(described_class.ok.retry_without_delay?).to eq(false)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#retry_with_delay?' do
|
42
|
+
it 'returns true if the response matches, false otherwise' do
|
43
|
+
expect(described_class.retry_with_delay.retry_with_delay?).to eq(true)
|
44
|
+
expect(described_class.ok.retry_with_delay?).to eq(false)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '#fail?' do
|
49
|
+
it 'returns true if the response matches, false otherwise' do
|
50
|
+
expect(described_class.fail.fail?).to eq(true)
|
51
|
+
expect(described_class.ok.fail?).to eq(false)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe '#ok?' do
|
56
|
+
it 'returns true if the response matches, false otherwise' do
|
57
|
+
expect(described_class.ok.ok?).to eq(true)
|
58
|
+
expect(described_class.fail.ok?).to eq(false)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe '#to_s' do
|
63
|
+
it 'converts the status into a string' do
|
64
|
+
expect(described_class.fail.to_s).to eq('fail')
|
65
|
+
expect(described_class.ok.to_s).to eq('ok')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
include TxghQueue
|
4
|
+
|
5
|
+
describe Supervisor do
|
6
|
+
describe '.supervise' do
|
7
|
+
it 'provides a handy shortcut to wrap a block with supervising' do
|
8
|
+
response = described_class.supervise { raise StandardError }
|
9
|
+
expect(response.status).to eq(Status.fail)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#execute' do
|
14
|
+
it 'handles errors generated by the given block' do
|
15
|
+
responder = described_class.new { raise StandardError }
|
16
|
+
expect(responder.execute.status).to eq(Status.fail)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'handles error responses generated by the given block' do
|
20
|
+
responder = described_class.new do
|
21
|
+
TxghServer::Response.new(401, 'Unauthorized')
|
22
|
+
end
|
23
|
+
|
24
|
+
expect(responder.execute.status).to eq(Status.fail)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'handles non-error responses generated by the given block' do
|
28
|
+
responder = described_class.new do
|
29
|
+
TxghServer::Response.new(200, 'Ok')
|
30
|
+
end
|
31
|
+
|
32
|
+
expect(responder.execute.status).to eq(Status.ok)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "raises an error if error handling logic can't be determined" do
|
36
|
+
responder = described_class.new { 'unexpected response' }
|
37
|
+
expect { responder.execute }.to raise_error(UnexpectedResponse)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|