shivam 0.0.0-java
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 +7 -0
- data/.github/workflows/test.yml +57 -0
- data/.gitignore +10 -0
- data/.rspec +1 -0
- data/.yardopts +5 -0
- data/CHANGELOG.md +899 -0
- data/Gemfile +35 -0
- data/Guardfile +14 -0
- data/LICENSE +23 -0
- data/README.md +679 -0
- data/Rakefile +21 -0
- data/bin/ci/before_build.sh +20 -0
- data/bin/ci/before_build_docker.sh +20 -0
- data/bin/ci/install_on_debian.sh +46 -0
- data/bin/hutch +8 -0
- data/examples/consumer.rb +13 -0
- data/examples/producer.rb +10 -0
- data/hutch.gemspec +27 -0
- data/lib/hutch/acknowledgements/base.rb +16 -0
- data/lib/hutch/acknowledgements/nack_on_all_failures.rb +19 -0
- data/lib/hutch/adapter.rb +11 -0
- data/lib/hutch/adapters/bunny.rb +37 -0
- data/lib/hutch/adapters/march_hare.rb +41 -0
- data/lib/hutch/broker.rb +384 -0
- data/lib/hutch/cli.rb +246 -0
- data/lib/hutch/config.rb +305 -0
- data/lib/hutch/consumer.rb +125 -0
- data/lib/hutch/error_handlers/airbrake.rb +54 -0
- data/lib/hutch/error_handlers/base.rb +15 -0
- data/lib/hutch/error_handlers/bugsnag.rb +30 -0
- data/lib/hutch/error_handlers/honeybadger.rb +43 -0
- data/lib/hutch/error_handlers/logger.rb +22 -0
- data/lib/hutch/error_handlers/rollbar.rb +28 -0
- data/lib/hutch/error_handlers/sentry.rb +26 -0
- data/lib/hutch/error_handlers/sentry_raven.rb +31 -0
- data/lib/hutch/error_handlers.rb +11 -0
- data/lib/hutch/exceptions.rb +14 -0
- data/lib/hutch/logging.rb +32 -0
- data/lib/hutch/message.rb +31 -0
- data/lib/hutch/publisher.rb +75 -0
- data/lib/hutch/serializers/identity.rb +19 -0
- data/lib/hutch/serializers/json.rb +22 -0
- data/lib/hutch/tracers/datadog.rb +18 -0
- data/lib/hutch/tracers/newrelic.rb +19 -0
- data/lib/hutch/tracers/null_tracer.rb +15 -0
- data/lib/hutch/tracers.rb +7 -0
- data/lib/hutch/version.rb +3 -0
- data/lib/hutch/waiter.rb +104 -0
- data/lib/hutch/worker.rb +145 -0
- data/lib/hutch.rb +69 -0
- data/lib/yard-settings/handler.rb +38 -0
- data/lib/yard-settings/yard-settings.rb +2 -0
- data/spec/hutch/broker_spec.rb +462 -0
- data/spec/hutch/cli_spec.rb +93 -0
- data/spec/hutch/config_spec.rb +259 -0
- data/spec/hutch/consumer_spec.rb +208 -0
- data/spec/hutch/error_handlers/airbrake_spec.rb +49 -0
- data/spec/hutch/error_handlers/bugsnag_spec.rb +55 -0
- data/spec/hutch/error_handlers/honeybadger_spec.rb +58 -0
- data/spec/hutch/error_handlers/logger_spec.rb +28 -0
- data/spec/hutch/error_handlers/rollbar_spec.rb +45 -0
- data/spec/hutch/error_handlers/sentry_raven_spec.rb +37 -0
- data/spec/hutch/error_handlers/sentry_spec.rb +47 -0
- data/spec/hutch/logger_spec.rb +34 -0
- data/spec/hutch/message_spec.rb +38 -0
- data/spec/hutch/serializers/json_spec.rb +17 -0
- data/spec/hutch/tracers/datadog_spec.rb +44 -0
- data/spec/hutch/waiter_spec.rb +51 -0
- data/spec/hutch/worker_spec.rb +184 -0
- data/spec/hutch_spec.rb +87 -0
- data/spec/spec_helper.rb +42 -0
- data/templates/default/class/html/settings.erb +0 -0
- data/templates/default/class/setup.rb +4 -0
- data/templates/default/fulldoc/html/css/hutch.css +13 -0
- data/templates/default/layout/html/setup.rb +7 -0
- data/templates/default/method_details/html/settings.erb +5 -0
- data/templates/default/method_details/setup.rb +4 -0
- data/templates/default/method_details/text/settings.erb +0 -0
- data/templates/default/module/html/settings.erb +40 -0
- data/templates/default/module/setup.rb +4 -0
- metadata +205 -0
@@ -0,0 +1,259 @@
|
|
1
|
+
require 'hutch/config'
|
2
|
+
require 'tempfile'
|
3
|
+
|
4
|
+
describe Hutch::Config do
|
5
|
+
let(:new_value) { 'not-localhost' }
|
6
|
+
|
7
|
+
before do
|
8
|
+
Hutch::Config.instance_variable_set(:@config, nil)
|
9
|
+
Hutch::Config.initialize
|
10
|
+
end
|
11
|
+
|
12
|
+
after do
|
13
|
+
Hutch::Config.instance_variable_set(:@config, nil)
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '.get' do
|
17
|
+
context 'for valid attributes' do
|
18
|
+
subject { Hutch::Config.get(:mq_host) }
|
19
|
+
|
20
|
+
context 'with no overridden value' do
|
21
|
+
it { is_expected.to eq('127.0.0.1') }
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'with an overridden value' do
|
25
|
+
before do
|
26
|
+
Hutch::Config.set(:mq_host, new_value)
|
27
|
+
end
|
28
|
+
|
29
|
+
it { is_expected.to eq(new_value) }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'for invalid attributes' do
|
34
|
+
let(:invalid_get) { Hutch::Config.get(:invalid_attr) }
|
35
|
+
|
36
|
+
specify do
|
37
|
+
expect { invalid_get }.to raise_error Hutch::UnknownAttributeError
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '.set' do
|
43
|
+
context 'for valid attributes' do
|
44
|
+
before { Hutch::Config.set(:mq_host, new_value) }
|
45
|
+
subject { Hutch::Config.user_config[:mq_host] }
|
46
|
+
|
47
|
+
context 'sets value in user config hash' do
|
48
|
+
it { is_expected.to eq(new_value) }
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'type casting' do
|
52
|
+
context 'number attributes' do
|
53
|
+
before { Hutch::Config.set(:heartbeat, new_value) }
|
54
|
+
subject(:value) { Hutch::Config.user_config[:heartbeat] }
|
55
|
+
|
56
|
+
let(:new_value) { "0" }
|
57
|
+
|
58
|
+
|
59
|
+
specify 'casts values to integers' do
|
60
|
+
expect(value).to eq 0
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'boolean attributes' do
|
66
|
+
context 'from non-empty string' do
|
67
|
+
before { Hutch::Config.set(:autoload_rails, new_value) }
|
68
|
+
subject(:value) { Hutch::Config.user_config[:autoload_rails] }
|
69
|
+
|
70
|
+
let(:new_value) { "t" }
|
71
|
+
|
72
|
+
|
73
|
+
specify 'casts values to booleans' do
|
74
|
+
expect(value).to eq true
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'from empty string' do
|
79
|
+
before { Hutch::Config.set(:autoload_rails, new_value) }
|
80
|
+
subject(:value) { Hutch::Config.user_config[:autoload_rails] }
|
81
|
+
|
82
|
+
let(:new_value) { "" }
|
83
|
+
|
84
|
+
|
85
|
+
specify 'casts values to booleans' do
|
86
|
+
expect(value).to eq false
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'from boolean' do
|
91
|
+
before { Hutch::Config.set(:autoload_rails, new_value) }
|
92
|
+
subject(:value) { Hutch::Config.user_config[:autoload_rails] }
|
93
|
+
|
94
|
+
let(:new_value) { true }
|
95
|
+
|
96
|
+
|
97
|
+
specify 'casts values to booleans' do
|
98
|
+
expect(value).to eq true
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context 'from nil' do
|
103
|
+
before { Hutch::Config.set(:autoload_rails, new_value) }
|
104
|
+
subject(:value) { Hutch::Config.user_config[:autoload_rails] }
|
105
|
+
|
106
|
+
let(:new_value) { nil }
|
107
|
+
|
108
|
+
|
109
|
+
specify 'casts values to booleans' do
|
110
|
+
expect(value).to eq false
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
context 'string attributes' do
|
116
|
+
before { Hutch::Config.set(:mq_exchange_type, new_value) }
|
117
|
+
subject(:value) { Hutch::Config.user_config[:mq_exchange_type] }
|
118
|
+
|
119
|
+
let(:new_value) { 1 }
|
120
|
+
|
121
|
+
|
122
|
+
specify 'does not perform any typecasting' do
|
123
|
+
expect(value).to eq new_value
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'for invalid attributes' do
|
129
|
+
let(:invalid_set) { Hutch::Config.set(:invalid_attr, new_value) }
|
130
|
+
|
131
|
+
specify do
|
132
|
+
expect { invalid_set }.to raise_error Hutch::UnknownAttributeError
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe 'a magic getter' do
|
138
|
+
context 'for a valid attribute' do
|
139
|
+
it 'calls get' do
|
140
|
+
expect(Hutch::Config).to receive(:get).with(:mq_host)
|
141
|
+
Hutch::Config.mq_host
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
context 'for an invalid attribute' do
|
146
|
+
let(:invalid_getter) { Hutch::Config.invalid_attr }
|
147
|
+
specify { expect { invalid_getter }.to raise_error NoMethodError }
|
148
|
+
end
|
149
|
+
|
150
|
+
context 'for an ENV-overriden value attribute' do
|
151
|
+
around do |example|
|
152
|
+
ENV['HUTCH_MQ_HOST'] = 'example.com'
|
153
|
+
ENV['HUTCH_MQ_PORT'] = '10001'
|
154
|
+
ENV['HUTCH_MQ_TLS'] = 'true'
|
155
|
+
example.run
|
156
|
+
ENV.delete('HUTCH_MQ_HOST')
|
157
|
+
ENV.delete('HUTCH_MQ_PORT')
|
158
|
+
ENV.delete('HUTCH_MQ_TLS')
|
159
|
+
end
|
160
|
+
|
161
|
+
it 'returns the override' do
|
162
|
+
expect(Hutch::Config.mq_host).to eq 'example.com'
|
163
|
+
end
|
164
|
+
|
165
|
+
it 'returns the override for integers' do
|
166
|
+
expect(Hutch::Config.mq_port).to eq 10_001
|
167
|
+
end
|
168
|
+
|
169
|
+
it 'returns the override for booleans' do
|
170
|
+
expect(Hutch::Config.mq_tls).to eq true
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
describe 'a magic setter' do
|
176
|
+
context 'for a valid attribute' do
|
177
|
+
it 'calls set' do
|
178
|
+
expect(Hutch::Config).to receive(:set).with(:mq_host, new_value)
|
179
|
+
Hutch::Config.mq_host = new_value
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
context 'for an invalid attribute' do
|
184
|
+
let(:invalid_setter) { Hutch::Config.invalid_attr = new_value }
|
185
|
+
specify { expect { invalid_setter }.to raise_error NoMethodError }
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
describe '.load_from_file' do
|
190
|
+
let(:host) { 'broker.yourhost.com' }
|
191
|
+
let(:username) { 'calvin' }
|
192
|
+
let(:file) do
|
193
|
+
Tempfile.new('configs.yaml').tap do |t|
|
194
|
+
t.write(YAML.dump(config_data))
|
195
|
+
t.rewind
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
context 'when an attribute is invalid' do
|
200
|
+
let(:config_data) { { random_attribute: 'socks' } }
|
201
|
+
it 'raises an error' do
|
202
|
+
expect do
|
203
|
+
Hutch::Config.load_from_file(file)
|
204
|
+
end.to raise_error(NoMethodError)
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
context 'when attributes are valid' do
|
209
|
+
let(:config_data) { { mq_host: host, mq_username: username } }
|
210
|
+
|
211
|
+
it 'loads in the config data' do
|
212
|
+
Hutch::Config.load_from_file(file)
|
213
|
+
expect(Hutch::Config.mq_host).to eq host
|
214
|
+
expect(Hutch::Config.mq_username).to eq username
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
context 'when using ERB' do
|
219
|
+
let(:host) { 'localhost' }
|
220
|
+
let(:file) do
|
221
|
+
Tempfile.new('configs.yaml').tap do |t|
|
222
|
+
t.write(config_contents)
|
223
|
+
t.rewind
|
224
|
+
end
|
225
|
+
end
|
226
|
+
let(:config_contents) do
|
227
|
+
<<-YAML
|
228
|
+
mq_host: 'localhost'
|
229
|
+
mq_username: '<%= "calvin" %>'
|
230
|
+
YAML
|
231
|
+
end
|
232
|
+
it 'loads in the config data' do
|
233
|
+
Hutch::Config.load_from_file(file)
|
234
|
+
expect(Hutch::Config.mq_host).to eq host
|
235
|
+
expect(Hutch::Config.mq_username).to eq username
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
context 'developer ergonomics' do
|
241
|
+
it 'will accept strings and symbols as config keys' do
|
242
|
+
expect(Hutch::Config.get(:mq_host)).to eq '127.0.0.1'
|
243
|
+
expect(Hutch::Config.get('mq_host')).to eq '127.0.0.1'
|
244
|
+
end
|
245
|
+
|
246
|
+
describe 'it will not overwrite existing config' do
|
247
|
+
it 'with defaults' do
|
248
|
+
expect(Hutch::Config.get(:mq_host)).to eq '127.0.0.1'
|
249
|
+
Hutch::Config.initialize
|
250
|
+
|
251
|
+
Hutch::Config.set(:mq_host, 'example2.com')
|
252
|
+
|
253
|
+
expect(Hutch::Config.get(:mq_host)).to eq 'example2.com'
|
254
|
+
Hutch::Config.initialize
|
255
|
+
expect(Hutch::Config.get(:mq_host)).to eq 'example2.com'
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
@@ -0,0 +1,208 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hutch::Consumer do
|
4
|
+
around(:each) do |example|
|
5
|
+
isolate_constants do
|
6
|
+
example.run
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:simple_consumer) do
|
11
|
+
unless defined? SimpleConsumer
|
12
|
+
class SimpleConsumer
|
13
|
+
include Hutch::Consumer
|
14
|
+
consume 'hutch.test1'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
SimpleConsumer
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:complex_consumer) do
|
21
|
+
unless defined? ComplexConsumer
|
22
|
+
class ComplexConsumer
|
23
|
+
include Hutch::Consumer
|
24
|
+
consume 'hutch.test1', 'hutch.test2'
|
25
|
+
arguments foo: :bar
|
26
|
+
end
|
27
|
+
end
|
28
|
+
ComplexConsumer
|
29
|
+
end
|
30
|
+
|
31
|
+
let(:consumer_using_quorum_queue) do
|
32
|
+
unless defined? ConsumerUsingQuorumQueue
|
33
|
+
class ConsumerUsingQuorumQueue
|
34
|
+
include Hutch::Consumer
|
35
|
+
consume 'hutch.test1'
|
36
|
+
arguments foo: :bar
|
37
|
+
|
38
|
+
quorum_queue
|
39
|
+
end
|
40
|
+
end
|
41
|
+
ConsumerUsingQuorumQueue
|
42
|
+
end
|
43
|
+
|
44
|
+
let(:consumer_using_classic_queue) do
|
45
|
+
unless defined? ConsumerUsingLazyQueue
|
46
|
+
class ConsumerUsingLazyQueue
|
47
|
+
include Hutch::Consumer
|
48
|
+
consume 'hutch.test1'
|
49
|
+
arguments foo: :bar
|
50
|
+
lazy_queue
|
51
|
+
classic_queue
|
52
|
+
end
|
53
|
+
end
|
54
|
+
ConsumerUsingLazyQueue
|
55
|
+
end
|
56
|
+
|
57
|
+
describe 'module inclusion' do
|
58
|
+
it 'registers the class as a consumer' do
|
59
|
+
expect(Hutch).to receive(:register_consumer) do |klass|
|
60
|
+
expect(klass).to eq(simple_consumer)
|
61
|
+
end
|
62
|
+
|
63
|
+
simple_consumer
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
describe '.consume' do
|
69
|
+
it 'saves the routing key to the consumer' do
|
70
|
+
expect(simple_consumer.routing_keys).to include 'hutch.test1'
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'with multiple routing keys' do
|
74
|
+
it 'registers the class once for each routing key' do
|
75
|
+
expect(complex_consumer.routing_keys).to include 'hutch.test1'
|
76
|
+
expect(complex_consumer.routing_keys).to include 'hutch.test2'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context 'when given the same routing key multiple times' do
|
81
|
+
subject { simple_consumer.routing_keys }
|
82
|
+
before { simple_consumer.consume 'hutch.test1' }
|
83
|
+
|
84
|
+
describe '#length' do
|
85
|
+
subject { super().length }
|
86
|
+
it { is_expected.to eq(1)}
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe '.queue_name' do
|
92
|
+
let(:queue_name) { 'foo' }
|
93
|
+
|
94
|
+
it 'overrides the queue name' do
|
95
|
+
simple_consumer.queue_name(queue_name)
|
96
|
+
expect(simple_consumer.get_queue_name).to eq(queue_name)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe 'default queue mode' do
|
101
|
+
it 'does not specify any mode by default' do
|
102
|
+
expect(simple_consumer.queue_mode).to eq(nil)
|
103
|
+
expect(simple_consumer.queue_type).to eq(nil)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe '.lazy_queue' do
|
108
|
+
context 'when queue mode has been set explicitly to lazy' do
|
109
|
+
it 'sets queue mode to lazy' do
|
110
|
+
expect(consumer_using_classic_queue.queue_mode).to eq('lazy')
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe '.classic_queue' do
|
116
|
+
context 'when queue type has been set explicitly to classic' do
|
117
|
+
it 'sets queue type to classic' do
|
118
|
+
expect(consumer_using_classic_queue.queue_type).to eq('classic')
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe '.quorum_queue' do
|
124
|
+
context 'when queue type has been set explicitly to quorum' do
|
125
|
+
it 'sets queue type to quorum' do
|
126
|
+
expect(consumer_using_quorum_queue.queue_type).to eq('quorum')
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'accepts initial group size as an option' do
|
130
|
+
consumer = simple_consumer
|
131
|
+
expect { consumer.quorum_queue(initial_group_size: 3) }
|
132
|
+
.to change { consumer.initial_group_size }.to(3)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe '.arguments' do
|
138
|
+
let(:args) { { foo: :bar} }
|
139
|
+
|
140
|
+
it 'overrides the arguments' do
|
141
|
+
simple_consumer.arguments(args)
|
142
|
+
expect(simple_consumer.get_arguments).to eq(args)
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
describe '.get_arguments' do
|
148
|
+
context 'when defined' do
|
149
|
+
it { expect(complex_consumer.get_arguments).to include(foo: :bar) }
|
150
|
+
end
|
151
|
+
|
152
|
+
context 'when queue is lazy' do
|
153
|
+
it 'has the x-queue-mode argument set to lazy' do
|
154
|
+
expect(consumer_using_classic_queue.get_arguments['x-queue-mode'])
|
155
|
+
.to eq('lazy')
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
context "when queue's type is quorum" do
|
160
|
+
let(:arguments) { consumer_using_quorum_queue.get_arguments }
|
161
|
+
it 'has the x-queue-type argument set to quorum' do
|
162
|
+
expect(arguments['x-queue-type']).to eq('quorum')
|
163
|
+
expect(arguments).to_not have_key('x-quorum-initial-group-size')
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'has the x-quorum-initial-group-size argument set to quorum' do
|
167
|
+
consumer_using_quorum_queue.quorum_queue(initial_group_size: 5)
|
168
|
+
expect(arguments['x-queue-type']).to eq('quorum')
|
169
|
+
expect(arguments['x-quorum-initial-group-size']).to eq(5)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
describe '.get_queue_name' do
|
175
|
+
|
176
|
+
context 'when queue name has been set explicitly' do
|
177
|
+
it 'returns the give queue name' do
|
178
|
+
class Foo
|
179
|
+
include Hutch::Consumer
|
180
|
+
queue_name "bar"
|
181
|
+
end
|
182
|
+
|
183
|
+
expect(Foo.get_queue_name).to eq("bar")
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
context 'when no queue name has been set' do
|
188
|
+
it 'replaces module separators with colons' do
|
189
|
+
module Foo
|
190
|
+
class Bar
|
191
|
+
include Hutch::Consumer
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
expect(Foo::Bar.get_queue_name).to eq('foo:bar')
|
196
|
+
end
|
197
|
+
|
198
|
+
it 'converts camelcase class names to snake case' do
|
199
|
+
class FooBarBAZ
|
200
|
+
include Hutch::Consumer
|
201
|
+
end
|
202
|
+
|
203
|
+
expect(FooBarBAZ.get_queue_name).to eq('foo_bar_baz')
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hutch::ErrorHandlers::Airbrake do
|
4
|
+
let(:error_handler) { Hutch::ErrorHandlers::Airbrake.new }
|
5
|
+
|
6
|
+
describe '#handle' do
|
7
|
+
let(:error) do
|
8
|
+
begin
|
9
|
+
raise "Stuff went wrong"
|
10
|
+
rescue RuntimeError => err
|
11
|
+
err
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it "logs the error to Airbrake" do
|
16
|
+
message_id = "1"
|
17
|
+
properties = OpenStruct.new(message_id: message_id)
|
18
|
+
payload = "{}"
|
19
|
+
consumer = double
|
20
|
+
ex = error
|
21
|
+
message = {
|
22
|
+
payload: payload,
|
23
|
+
consumer: consumer,
|
24
|
+
cgi_data: ENV.to_hash,
|
25
|
+
}
|
26
|
+
expect(::Airbrake).to receive(:notify).with(ex, message)
|
27
|
+
error_handler.handle(properties, payload, consumer, ex)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#handle_setup_exception' do
|
32
|
+
let(:error) do
|
33
|
+
begin
|
34
|
+
raise "Stuff went wrong"
|
35
|
+
rescue RuntimeError => err
|
36
|
+
err
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it "logs the error to Airbrake" do
|
41
|
+
ex = error
|
42
|
+
message = {
|
43
|
+
cgi_data: ENV.to_hash,
|
44
|
+
}
|
45
|
+
expect(::Airbrake).to receive(:notify).with(ex, message)
|
46
|
+
error_handler.handle_setup_exception(ex)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe Hutch::ErrorHandlers::Bugsnag do
|
6
|
+
let(:error_handler) { described_class.new }
|
7
|
+
|
8
|
+
before do
|
9
|
+
Bugsnag.configure do |bugsnag|
|
10
|
+
bugsnag.api_key = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#handle" do
|
15
|
+
let(:error) do
|
16
|
+
begin
|
17
|
+
raise "Stuff went wrong"
|
18
|
+
rescue RuntimeError => err
|
19
|
+
err
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "logs the error to Bugsnag" do
|
24
|
+
message_id = "1"
|
25
|
+
properties = OpenStruct.new(message_id: message_id)
|
26
|
+
payload = "{}"
|
27
|
+
consumer = double
|
28
|
+
ex = error
|
29
|
+
message = {
|
30
|
+
payload: payload,
|
31
|
+
consumer: consumer
|
32
|
+
}
|
33
|
+
|
34
|
+
expect(::Bugsnag).to receive(:notify).with(ex).and_call_original
|
35
|
+
expect_any_instance_of(::Bugsnag::Report).to receive(:add_tab).with(:hutch, message)
|
36
|
+
error_handler.handle(properties, payload, consumer, ex)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#handle_setup_exception" do
|
41
|
+
let(:error) do
|
42
|
+
begin
|
43
|
+
raise "Stuff went wrong"
|
44
|
+
rescue RuntimeError => err
|
45
|
+
err
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
it "logs the error to Bugsnag" do
|
50
|
+
ex = error
|
51
|
+
expect(::Bugsnag).to receive(:notify).with(ex)
|
52
|
+
error_handler.handle_setup_exception(ex)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hutch::ErrorHandlers::Honeybadger do
|
4
|
+
let(:error_handler) { Hutch::ErrorHandlers::Honeybadger.new }
|
5
|
+
|
6
|
+
describe '#handle' do
|
7
|
+
let(:error) do
|
8
|
+
begin
|
9
|
+
raise "Stuff went wrong"
|
10
|
+
rescue RuntimeError => err
|
11
|
+
err
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it "logs the error to Honeybadger" do
|
16
|
+
message_id = "1"
|
17
|
+
properties = OpenStruct.new(message_id: message_id)
|
18
|
+
payload = "{}"
|
19
|
+
consumer = double
|
20
|
+
ex = error
|
21
|
+
message = {
|
22
|
+
:error_class => ex.class.name,
|
23
|
+
:error_message => "#{ ex.class.name }: #{ ex.message }",
|
24
|
+
:backtrace => ex.backtrace,
|
25
|
+
:context => {
|
26
|
+
:message_id => message_id,
|
27
|
+
:consumer => consumer
|
28
|
+
},
|
29
|
+
:parameters => {
|
30
|
+
:payload => payload
|
31
|
+
}
|
32
|
+
}
|
33
|
+
expect(error_handler).to receive(:notify_honeybadger).with(message)
|
34
|
+
error_handler.handle(properties, payload, consumer, ex)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#handle_setup_exception' do
|
39
|
+
let(:error) do
|
40
|
+
begin
|
41
|
+
raise "Stuff went wrong during setup"
|
42
|
+
rescue RuntimeError => err
|
43
|
+
err
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it "logs the error to Honeybadger" do
|
48
|
+
ex = error
|
49
|
+
message = {
|
50
|
+
:error_class => ex.class.name,
|
51
|
+
:error_message => "#{ ex.class.name }: #{ ex.message }",
|
52
|
+
:backtrace => ex.backtrace,
|
53
|
+
}
|
54
|
+
expect(error_handler).to receive(:notify_honeybadger).with(message)
|
55
|
+
error_handler.handle_setup_exception(ex)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hutch::ErrorHandlers::Logger do
|
4
|
+
let(:error_handler) { Hutch::ErrorHandlers::Logger.new }
|
5
|
+
|
6
|
+
describe '#handle' do
|
7
|
+
let(:properties) { OpenStruct.new(message_id: "1") }
|
8
|
+
let(:payload) { "{}" }
|
9
|
+
let(:error) { double(message: "Stuff went wrong", class: "RuntimeError",
|
10
|
+
backtrace: ["line 1", "line 2"]) }
|
11
|
+
|
12
|
+
it "logs three separate lines" do
|
13
|
+
expect(Hutch::Logging.logger).to receive(:error).exactly(3).times
|
14
|
+
error_handler.handle(properties, payload, double, error)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#handle_setup_exception' do
|
19
|
+
let(:error) { double(message: "Stuff went wrong during setup",
|
20
|
+
class: "RuntimeError",
|
21
|
+
backtrace: ["line 1", "line 2"]) }
|
22
|
+
|
23
|
+
it "logs two separate lines" do
|
24
|
+
expect(Hutch::Logging.logger).to receive(:error).exactly(2).times
|
25
|
+
error_handler.handle_setup_exception(error)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hutch::ErrorHandlers::Rollbar do
|
4
|
+
let(:error_handler) { Hutch::ErrorHandlers::Rollbar.new }
|
5
|
+
|
6
|
+
describe '#handle' do
|
7
|
+
let(:error) do
|
8
|
+
begin
|
9
|
+
raise "Stuff went wrong"
|
10
|
+
rescue RuntimeError => err
|
11
|
+
err
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it "logs the error to Rollbar" do
|
16
|
+
message_id = "1"
|
17
|
+
properties = OpenStruct.new(message_id: message_id)
|
18
|
+
payload = "{}"
|
19
|
+
consumer = double
|
20
|
+
ex = error
|
21
|
+
message = {
|
22
|
+
payload: payload,
|
23
|
+
consumer: consumer
|
24
|
+
}
|
25
|
+
expect(::Rollbar).to receive(:error).with(ex, message)
|
26
|
+
error_handler.handle(properties, payload, consumer, ex)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#handle_setup_exception' do
|
31
|
+
let(:error) do
|
32
|
+
begin
|
33
|
+
raise "Stuff went wrong"
|
34
|
+
rescue RuntimeError => err
|
35
|
+
err
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
it "logs the error to Rollbar" do
|
40
|
+
ex = error
|
41
|
+
expect(::Rollbar).to receive(:error).with(ex)
|
42
|
+
error_handler.handle_setup_exception(ex)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|