exception_handling 2.5.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.jenkins/Jenkinsfile +24 -8
  4. data/.rspec +3 -0
  5. data/CHANGELOG.md +18 -0
  6. data/Gemfile +4 -4
  7. data/Gemfile.lock +67 -58
  8. data/Rakefile +7 -6
  9. data/gemfiles/rails_4.gemfile +4 -4
  10. data/gemfiles/rails_5.gemfile +4 -4
  11. data/gemfiles/rails_6.gemfile +4 -4
  12. data/lib/exception_handling.rb +9 -3
  13. data/lib/exception_handling/exception_info.rb +3 -6
  14. data/lib/exception_handling/log_stub_error.rb +2 -1
  15. data/lib/exception_handling/logging_methods.rb +27 -0
  16. data/lib/exception_handling/methods.rb +6 -53
  17. data/lib/exception_handling/testing.rb +20 -10
  18. data/lib/exception_handling/version.rb +1 -1
  19. data/{test → spec}/helpers/controller_helpers.rb +0 -0
  20. data/{test → spec}/helpers/exception_helpers.rb +2 -2
  21. data/{test → spec}/rake_test_warning_false.rb +0 -0
  22. data/{test/test_helper.rb → spec/spec_helper.rb} +57 -42
  23. data/spec/unit/exception_handling/exception_catalog_spec.rb +85 -0
  24. data/spec/unit/exception_handling/exception_description_spec.rb +82 -0
  25. data/{test/unit/exception_handling/exception_info_test.rb → spec/unit/exception_handling/exception_info_spec.rb} +118 -99
  26. data/{test/unit/exception_handling/honeybadger_callbacks_test.rb → spec/unit/exception_handling/honeybadger_callbacks_spec.rb} +20 -20
  27. data/{test/unit/exception_handling/log_error_stub_test.rb → spec/unit/exception_handling/log_error_stub_spec.rb} +38 -22
  28. data/spec/unit/exception_handling/logging_methods_spec.rb +38 -0
  29. data/{test/unit/exception_handling/mailer_test.rb → spec/unit/exception_handling/mailer_spec.rb} +17 -17
  30. data/spec/unit/exception_handling/methods_spec.rb +105 -0
  31. data/spec/unit/exception_handling/sensu_spec.rb +51 -0
  32. data/{test/unit/exception_handling_test.rb → spec/unit/exception_handling_spec.rb} +349 -319
  33. metadata +35 -31
  34. data/test/unit/exception_handling/exception_catalog_test.rb +0 -85
  35. data/test/unit/exception_handling/exception_description_test.rb +0 -82
  36. data/test/unit/exception_handling/methods_test.rb +0 -84
  37. data/test/unit/exception_handling/sensu_test.rb +0 -52
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('../../spec_helper', __dir__)
4
+
5
+ module ExceptionHandling
6
+ describe Sensu do
7
+ context "#generate_event" do
8
+ it "create an event" do
9
+ expect(ExceptionHandling::Sensu).to receive(:send_event).with(name: "world_is_ending", output: "stick head between knees and kiss ass goodbye", status: 1)
10
+
11
+ ExceptionHandling::Sensu.generate_event("world_is_ending", "stick head between knees and kiss ass goodbye")
12
+ end
13
+
14
+ it "add the sensu prefix" do
15
+ ExceptionHandling.sensu_prefix = "cnn_"
16
+
17
+ expect(ExceptionHandling::Sensu).to receive(:send_event).with(name: "cnn_world_is_ending", output: "stick head between knees and kiss ass goodbye", status: 1)
18
+
19
+ ExceptionHandling::Sensu.generate_event("world_is_ending", "stick head between knees and kiss ass goodbye")
20
+ end
21
+
22
+ it "allow the level to be set to critical" do
23
+ expect(ExceptionHandling::Sensu).to receive(:send_event).with(name: "world_is_ending", output: "stick head between knees and kiss ass goodbye", status: 2)
24
+
25
+ ExceptionHandling::Sensu.generate_event("world_is_ending", "stick head between knees and kiss ass goodbye", :critical)
26
+ end
27
+
28
+ it "error if an invalid level is supplied" do
29
+ expect(ExceptionHandling::Sensu).to_not receive(:send_event)
30
+
31
+ expect do
32
+ ExceptionHandling::Sensu.generate_event("world_is_ending", "stick head between knees and kiss ass goodbye", :hair_on_fire)
33
+ end.to raise_exception(RuntimeError, /Invalid alert level/)
34
+ end
35
+ end
36
+
37
+ context "#send_event" do
38
+ before do
39
+ @event = { name: "world_is_ending", output: "stick head between knees and kiss ass goodbye", status: 1 }
40
+ @socket = SocketStub.new
41
+ end
42
+
43
+ it "send event json to sensu client" do
44
+ expect_any_instance_of(Addrinfo).to receive(:connect).with(any_args) { @socket }
45
+ ExceptionHandling::Sensu.send_event(@event)
46
+
47
+ expect(@socket.sent.first).to eq(@event.to_json)
48
+ end
49
+ end
50
+ end
51
+ end
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require File.expand_path('../test_helper', __dir__)
3
+ require File.expand_path('../spec_helper', __dir__)
4
4
  require_test_helper 'controller_helpers'
5
5
  require_test_helper 'exception_helpers'
6
6
 
7
- class ExceptionHandlingTest < ActiveSupport::TestCase
7
+ describe ExceptionHandling do
8
8
  include ControllerHelpers
9
9
  include ExceptionHelpers
10
10
 
11
- setup do
11
+ before do
12
12
  @fail_count = 0
13
13
  end
14
14
 
@@ -108,194 +108,228 @@ class ExceptionHandlingTest < ActiveSupport::TestCase
108
108
  end
109
109
 
110
110
  context "with warn and honeybadger notify stubbed" do
111
- setup do
112
- stub(ExceptionHandling).warn(anything)
113
- stub(Honeybadger).notify(anything)
111
+ before do
112
+ allow(ExceptionHandling).to receive(:warn).with(anything)
113
+ allow(Honeybadger).to receive(:notify).with(anything)
114
114
  end
115
115
 
116
116
  context "with logger stashed" do
117
- setup { @original_logger = ExceptionHandling.logger }
118
- teardown { ExceptionHandling.logger = @original_logger }
117
+ before { @original_logger = ExceptionHandling.logger }
118
+ after { ExceptionHandling.logger = @original_logger }
119
119
 
120
- should "store logger as-is if it has ContextualLogger::Mixin" do
120
+ it "store logger as-is if it has ContextualLogger::Mixin" do
121
121
  logger = Logger.new('/dev/null')
122
122
  logger.extend(ContextualLogger::LoggerMixin)
123
123
  ancestors = logger.singleton_class.ancestors.*.name
124
124
 
125
125
  ExceptionHandling.logger = logger
126
- assert_equal ancestors, ExceptionHandling.logger.singleton_class.ancestors.*.name
126
+ expect(ExceptionHandling.logger.singleton_class.ancestors.*.name).to eq(ancestors)
127
127
  end
128
128
 
129
- should "allow logger = nil (no deprecation warning)" do
130
- mock(STDERR).puts(/DEPRECATION WARNING/).never
129
+ it "allow logger = nil (no deprecation warning)" do
130
+ expect(STDERR).to receive(:puts).with(/DEPRECATION WARNING/).never
131
131
  ExceptionHandling.logger = nil
132
132
  end
133
133
 
134
- should "[deprecated] mix in ContextualLogger::Mixin if not there" do
135
- mock(STDERR).puts(/DEPRECATION WARNING: implicit extend with ContextualLogger::LoggerMixin is deprecated and will be removed from exception_handling 3\.0/)
134
+ it "[deprecated] mix in ContextualLogger::Mixin if not there" do
135
+ expect(STDERR).to receive(:puts).with(/DEPRECATION WARNING: implicit extend with ContextualLogger::LoggerMixin is deprecated and will be removed from exception_handling 3\.0/)
136
136
  logger = Logger.new('/dev/null')
137
137
  ancestors = logger.singleton_class.ancestors.*.name
138
138
 
139
139
  ExceptionHandling.logger = logger
140
- assert_not_equal ancestors, ExceptionHandling.logger.singleton_class.ancestors.*.name
141
- assert_kind_of ContextualLogger::LoggerMixin, ExceptionHandling.logger
140
+ expect(ExceptionHandling.logger.singleton_class.ancestors.*.name).to_not eq(ancestors)
141
+ expect(ExceptionHandling.logger).to be_kind_of(ContextualLogger::LoggerMixin)
142
142
  end
143
143
  end
144
144
 
145
145
  context "#log_error" do
146
- should "take in additional logging context hash and pass it to the logger" do
146
+ it "take in additional logging context hash and pass it to the logger" do
147
147
  ExceptionHandling.log_error('This is an Error', 'This is the prefix context', service_name: 'exception_handling')
148
- assert_match(/This is an Error/, logged_excluding_reload_filter.last[:message])
149
- assert_not_empty logged_excluding_reload_filter.last[:context]
150
- assert_equal logged_excluding_reload_filter.last[:context], service_name: 'exception_handling'
148
+ expect(logged_excluding_reload_filter.last[:message]).to match(/This is an Error/)
149
+ expect(logged_excluding_reload_filter.last[:context]).to_not be_empty
150
+ expect(service_name: 'exception_handling').to eq(logged_excluding_reload_filter.last[:context])
151
+ end
152
+
153
+ it "log with Severity::FATAL" do
154
+ ExceptionHandling.log_error('This is a Warning', service_name: 'exception_handling')
155
+ expect('FATAL').to eq(logged_excluding_reload_filter.last[:severity])
151
156
  end
152
157
  end
153
158
 
154
159
  context "#log_warning" do
155
- should "have empty array as a backtrace" do
156
- mock(ExceptionHandling).log_error(is_a(ExceptionHandling::Warning), anything) do |error|
157
- assert_equal [], error.backtrace
160
+ it "have empty array as a backtrace" do
161
+ expect(ExceptionHandling).to receive(:log_error).with((ExceptionHandling::Warning), anything) do |error|
162
+ expect(error.backtrace).to eq([])
158
163
  end
159
164
  ExceptionHandling.log_warning('Now with empty array as a backtrace!')
160
165
  end
161
166
 
162
- should "take in additional key word args as logging context and pass them to the logger" do
167
+ it "take in additional key word args as logging context and pass them to the logger" do
168
+ ExceptionHandling.log_warning('This is a Warning', service_name: 'exception_handling')
169
+ expect(logged_excluding_reload_filter.last[:message]).to match(/This is a Warning/)
170
+ expect(logged_excluding_reload_filter.last[:context]).to_not be_empty
171
+ expect(service_name: 'exception_handling').to eq(logged_excluding_reload_filter.last[:context])
172
+ end
173
+
174
+ it "log with Severity::WARN" do
163
175
  ExceptionHandling.log_warning('This is a Warning', service_name: 'exception_handling')
164
- assert_match(/This is a Warning/, logged_excluding_reload_filter.last[:message])
165
- assert_not_empty logged_excluding_reload_filter.last[:context]
166
- assert_equal logged_excluding_reload_filter.last[:context], service_name: 'exception_handling'
176
+ expect('WARN').to eq(logged_excluding_reload_filter.last[:severity])
167
177
  end
168
178
  end
169
179
 
170
180
  context "#log_info" do
171
- should "take in additional key word args as logging context and pass them to the logger" do
172
- ExceptionHandling.log_warning('This is an Info', service_name: 'exception_handling')
173
- assert_match(/This is an Info/, logged_excluding_reload_filter.last[:message])
174
- assert_not_empty logged_excluding_reload_filter.last[:context]
175
- assert_equal logged_excluding_reload_filter.last[:context], service_name: 'exception_handling'
181
+ it "take in additional key word args as logging context and pass them to the logger" do
182
+ ExceptionHandling.log_info('This is an Info', service_name: 'exception_handling')
183
+ expect(logged_excluding_reload_filter.last[:message]).to match(/This is an Info/)
184
+ expect(logged_excluding_reload_filter.last[:context]).to_not be_empty
185
+ expect(service_name: 'exception_handling').to eq(logged_excluding_reload_filter.last[:context])
186
+ end
187
+
188
+ it "log with Severity::INFO" do
189
+ ExceptionHandling.log_info('This is a Warning', service_name: 'exception_handling')
190
+ expect('INFO').to eq(logged_excluding_reload_filter.last[:severity])
176
191
  end
177
192
  end
178
193
 
179
194
  context "#log_debug" do
180
- should "take in additional key word args as logging context and pass them to the logger" do
181
- ExceptionHandling.log_warning('This is a Debug', service_name: 'exception_handling')
182
- assert_match(/This is a Debug/, logged_excluding_reload_filter.last[:message])
183
- assert_not_empty logged_excluding_reload_filter.last[:context]
184
- assert_equal logged_excluding_reload_filter.last[:context], service_name: 'exception_handling'
195
+ it "take in additional key word args as logging context and pass them to the logger" do
196
+ ExceptionHandling.log_debug('This is a Debug', service_name: 'exception_handling')
197
+ expect(logged_excluding_reload_filter.last[:message]).to match(/This is a Debug/)
198
+ expect(logged_excluding_reload_filter.last[:context]).to_not be_empty
199
+ expect(service_name: 'exception_handling').to eq(logged_excluding_reload_filter.last[:context])
200
+ end
201
+
202
+ it "log with Severity::DEBUG" do
203
+ ExceptionHandling.log_debug('This is a Warning', service_name: 'exception_handling')
204
+ expect('DEBUG').to eq(logged_excluding_reload_filter.last[:severity])
205
+ end
206
+ end
207
+
208
+ context "#write_exception_to_log" do
209
+ it "log warnings with Severity::WARN" do
210
+ warning = ExceptionHandling::Warning.new('This is a Warning')
211
+ ExceptionHandling.write_exception_to_log(warning, '', Time.now.to_i, service_name: 'exception_handling')
212
+ expect('WARN').to eq(logged_excluding_reload_filter.last[:severity])
213
+ end
214
+
215
+ it "log everything else with Severity::FATAL" do
216
+ error = RuntimeError.new('This is a runtime error')
217
+ ExceptionHandling.write_exception_to_log(error, '', Time.now.to_i, service_name: 'exception_handling')
218
+ expect('FATAL').to eq(logged_excluding_reload_filter.last[:severity])
185
219
  end
186
220
  end
187
221
 
188
222
  context "configuration with custom_data_hook or post_log_error_hook" do
189
- teardown do
223
+ after do
190
224
  ExceptionHandling.custom_data_hook = nil
191
225
  ExceptionHandling.post_log_error_hook = nil
192
226
  end
193
227
 
194
- should "support a custom_data_hook" do
228
+ it "support a custom_data_hook" do
195
229
  capture_notifications
196
230
 
197
231
  ExceptionHandling.custom_data_hook = method(:append_organization_info_config)
198
232
  ExceptionHandling.ensure_safe("context") { raise "Some Exception" }
199
233
 
200
- assert_match(/Invoca Engineering Dept./, sent_notifications.last.enhanced_data['user_details'].to_s)
234
+ expect(sent_notifications.last.enhanced_data['user_details'].to_s).to match(/Invoca Engineering Dept./)
201
235
  end
202
236
 
203
- should "support a log_error hook, and pass exception_data, treat_like_warning, and logged_to_honeybadger to it" do
237
+ it "support a log_error hook, and pass exception_data, treat_like_warning, and logged_to_honeybadger to it" do
204
238
  @honeybadger_status = nil
205
239
  ExceptionHandling.post_log_error_hook = method(:log_error_callback_config)
206
240
 
207
241
  notify_args = []
208
- mock(Honeybadger).notify.with_any_args { |info| notify_args << info; '06220c5a-b471-41e5-baeb-de247da45a56' }
242
+ expect(Honeybadger).to receive(:notify).with(any_args) { |info| notify_args << info; '06220c5a-b471-41e5-baeb-de247da45a56' }
209
243
  ExceptionHandling.ensure_safe("context") { raise "Some Exception" }
210
- assert_equal 1, @fail_count
211
- assert_equal false, @treat_like_warning
212
- assert_equal :success, @honeybadger_status
244
+ expect(@fail_count).to eq(1)
245
+ expect(@treat_like_warning).to eq(false)
246
+ expect(@honeybadger_status).to eq(:success)
213
247
 
214
- assert_equal "this is used by a test", @callback_data["notes"]
215
- assert_equal 1, notify_args.size, notify_args.inspect
216
- assert_match(/this is used by a test/, notify_args.last[:context].to_s)
248
+ expect(@callback_data["notes"]).to eq("this is used by a test")
249
+ expect(notify_args.size).to eq(1), notify_args.inspect
250
+ expect(notify_args.last[:context].to_s).to match(/this is used by a test/)
217
251
  end
218
252
 
219
- should "plumb treat_like_warning and logged_to_honeybadger to log error hook" do
253
+ it "plumb treat_like_warning and logged_to_honeybadger to log error hook" do
220
254
  @honeybadger_status = nil
221
255
  ExceptionHandling.post_log_error_hook = method(:log_error_callback_config)
222
256
  ExceptionHandling.log_error(StandardError.new("Some Exception"), "mooo", treat_like_warning: true)
223
- assert_equal 1, @fail_count
224
- assert_equal true, @treat_like_warning
225
- assert_equal :skipped, @honeybadger_status
257
+ expect(@fail_count).to eq(1)
258
+ expect(@treat_like_warning).to eq(true)
259
+ expect(@honeybadger_status).to eq(:skipped)
226
260
  end
227
261
 
228
- should "include logging context in the exception data" do
262
+ it "include logging context in the exception data" do
229
263
  ExceptionHandling.post_log_error_hook = method(:log_error_callback_config)
230
264
  ExceptionHandling.log_error(StandardError.new("Some Exception"), "mooo", treat_like_warning: true, log_context_test: "contextual_logging")
231
265
 
232
266
  expected_log_context = {
233
267
  "log_context_test" => "contextual_logging"
234
268
  }
235
- assert_equal expected_log_context, @callback_data[:log_context]
269
+ expect(@callback_data[:log_context]).to eq(expected_log_context)
236
270
  end
237
271
 
238
- should "support rescue exceptions from a log_error hook" do
272
+ it "support rescue exceptions from a log_error hook" do
239
273
  ExceptionHandling.post_log_error_hook = method(:log_error_callback_with_failure)
240
274
  log_info_messages = []
241
- stub(ExceptionHandling.logger).info.with_any_args do |message, _|
275
+ allow(ExceptionHandling.logger).to receive(:info).with(any_args) do |message, _|
242
276
  log_info_messages << message
243
277
  end
244
- assert_nothing_raised { ExceptionHandling.ensure_safe("mooo") { raise "Some Exception" } }
245
- assert log_info_messages.find { |message| message =~ /Unable to execute custom log_error callback/ }
278
+ expect { ExceptionHandling.ensure_safe("mooo") { raise "Some Exception" } }.to_not raise_error
279
+ expect(log_info_messages.find { |message| message =~ /Unable to execute custom log_error callback/ }).to be_truthy
246
280
  end
247
281
 
248
- should "handle nil message exceptions resulting from the log_error hook" do
282
+ it "handle nil message exceptions resulting from the log_error hook" do
249
283
  ExceptionHandling.post_log_error_hook = method(:log_error_callback_returns_nil_message_exception)
250
284
  log_info_messages = []
251
- stub(ExceptionHandling.logger).info.with_any_args do |message, _|
285
+ allow(ExceptionHandling.logger).to receive(:info).with(any_args) do |message, _|
252
286
  log_info_messages << message
253
287
  end
254
- assert_nothing_raised { ExceptionHandling.ensure_safe("mooo") { raise "Some Exception" } }
255
- assert log_info_messages.find { |message| message =~ /Unable to execute custom log_error callback/ }
288
+ expect { ExceptionHandling.ensure_safe("mooo") { raise "Some Exception" } }.to_not raise_error
289
+ expect(log_info_messages.find { |message| message =~ /Unable to execute custom log_error callback/ }).to be_truthy
256
290
  end
257
291
 
258
- should "handle nil message exceptions resulting from the custom data hook" do
292
+ it "handle nil message exceptions resulting from the custom data hook" do
259
293
  ExceptionHandling.custom_data_hook = method(:custom_data_callback_returns_nil_message_exception)
260
294
  log_info_messages = []
261
- stub(ExceptionHandling.logger).info.with_any_args do |message, _|
295
+ allow(ExceptionHandling.logger).to receive(:info).with(any_args) do |message, _|
262
296
  log_info_messages << message
263
297
  end
264
- assert_nothing_raised { ExceptionHandling.ensure_safe("mooo") { raise "Some Exception" } }
265
- assert log_info_messages.find { |message| message =~ /Unable to execute custom custom_data_hook callback/ }
298
+ expect { ExceptionHandling.ensure_safe("mooo") { raise "Some Exception" } }.not_to raise_error
299
+ expect(log_info_messages.find { |message| message =~ /Unable to execute custom custom_data_hook callback/ }).to be_truthy
266
300
  end
267
301
  end
268
302
 
269
303
  context "Exception Handling" do
270
304
  context "default_metric_name" do
271
305
  context "when metric_name is present in exception_data" do
272
- should "include metric_name in resulting metric name" do
306
+ it "include metric_name in resulting metric name" do
273
307
  exception = StandardError.new('this is an exception')
274
308
  metric = ExceptionHandling.default_metric_name({ 'metric_name' => 'special_metric' }, exception, true)
275
- assert_equal 'exception_handling.special_metric', metric
309
+ expect(metric).to eq('exception_handling.special_metric')
276
310
  end
277
311
  end
278
312
 
279
313
  context "when metric_name is not present in exception_data" do
280
- should "return exception_handling.warning when using log warning" do
314
+ it "return exception_handling.warning when using log warning" do
281
315
  warning = ExceptionHandling::Warning.new('this is a warning')
282
316
  metric = ExceptionHandling.default_metric_name({}, warning, false)
283
- assert_equal 'exception_handling.warning', metric
317
+ expect(metric).to eq('exception_handling.warning')
284
318
  end
285
319
 
286
- should "return exception_handling.exception when using log error" do
320
+ it "return exception_handling.exception when using log error" do
287
321
  exception = StandardError.new('this is an exception')
288
322
  metric = ExceptionHandling.default_metric_name({}, exception, false)
289
- assert_equal 'exception_handling.exception', metric
323
+ expect(metric).to eq('exception_handling.exception')
290
324
  end
291
325
 
292
326
  context "when using log error with treat_like_warning" do
293
- should "return exception_handling.unforwarded_exception when exception not present" do
327
+ it "return exception_handling.unforwarded_exception when exception not present" do
294
328
  metric = ExceptionHandling.default_metric_name({}, nil, true)
295
- assert_equal 'exception_handling.unforwarded_exception', metric
329
+ expect(metric).to eq('exception_handling.unforwarded_exception')
296
330
  end
297
331
 
298
- should "return exception_handling.unforwarded_exception with exception classname when exception is present" do
332
+ it "return exception_handling.unforwarded_exception with exception classname when exception is present" do
299
333
  module SomeModule
300
334
  class SomeException < StandardError
301
335
  end
@@ -303,43 +337,43 @@ class ExceptionHandlingTest < ActiveSupport::TestCase
303
337
 
304
338
  exception = SomeModule::SomeException.new('this is an exception')
305
339
  metric = ExceptionHandling.default_metric_name({}, exception, true)
306
- assert_equal 'exception_handling.unforwarded_exception_SomeException', metric
340
+ expect(metric).to eq('exception_handling.unforwarded_exception_SomeException')
307
341
  end
308
342
  end
309
343
  end
310
344
  end
311
345
 
312
346
  context "default_honeybadger_metric_name" do
313
- should "return exception_handling.honeybadger.success when status is :success" do
347
+ it "return exception_handling.honeybadger.success when status is :success" do
314
348
  metric = ExceptionHandling.default_honeybadger_metric_name(:success)
315
- assert_equal 'exception_handling.honeybadger.success', metric
349
+ expect(metric).to eq('exception_handling.honeybadger.success')
316
350
  end
317
351
 
318
- should "return exception_handling.honeybadger.failure when status is :failure" do
352
+ it "return exception_handling.honeybadger.failure when status is :failure" do
319
353
  metric = ExceptionHandling.default_honeybadger_metric_name(:failure)
320
- assert_equal 'exception_handling.honeybadger.failure', metric
354
+ expect(metric).to eq('exception_handling.honeybadger.failure')
321
355
  end
322
356
 
323
- should "return exception_handling.honeybadger.skipped when status is :skipped" do
357
+ it "return exception_handling.honeybadger.skipped when status is :skipped" do
324
358
  metric = ExceptionHandling.default_honeybadger_metric_name(:skipped)
325
- assert_equal 'exception_handling.honeybadger.skipped', metric
359
+ expect(metric).to eq('exception_handling.honeybadger.skipped')
326
360
  end
327
361
 
328
- should "return exception_handling.honeybadger.unknown_status when status is not recognized" do
362
+ it "return exception_handling.honeybadger.unknown_status when status is not recognized" do
329
363
  metric = ExceptionHandling.default_honeybadger_metric_name(nil)
330
- assert_equal 'exception_handling.honeybadger.unknown_status', metric
364
+ expect(metric).to eq('exception_handling.honeybadger.unknown_status')
331
365
  end
332
366
  end
333
367
 
334
368
  context "ExceptionHandling.ensure_safe" do
335
- should "log an exception with call stack if an exception is raised." do
336
- mock(ExceptionHandling.logger).fatal(/\(blah\):\n.*exception_handling_test\.rb/, anything)
369
+ it "log an exception with call stack if an exception is raised." do
370
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/\(blah\):\n.*exception_handling_spec\.rb/, anything)
337
371
  ExceptionHandling.ensure_safe { raise ArgumentError, "blah" }
338
372
  end
339
373
 
340
374
  if ActionView::VERSION::MAJOR >= 5
341
- should "log an exception with call stack if an ActionView template exception is raised." do
342
- mock(ExceptionHandling.logger).fatal(/\(Error:\d+\) ActionView::Template::Error \(blah\):\n /, anything)
375
+ it "log an exception with call stack if an ActionView template exception is raised." do
376
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/\(Error:\d+\) \nActionView::Template::Error: \(blah\):\n /, anything)
343
377
  ExceptionHandling.ensure_safe do
344
378
  begin
345
379
  # Rails 5 made the switch from ActionView::TemplateError taking in the original exception
@@ -351,297 +385,292 @@ class ExceptionHandlingTest < ActiveSupport::TestCase
351
385
  end
352
386
  end
353
387
  else
354
- should "log an exception with call stack if an ActionView template exception is raised." do
355
- mock(ExceptionHandling.logger).fatal(/\(Error:\d+\) ActionView::Template::Error \(blah\):\n /, anything)
388
+ it "log an exception with call stack if an ActionView template exception is raised." do
389
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/\(Error:\d+\) \nActionView::Template::Error: \(blah\):\n /, anything)
356
390
  ExceptionHandling.ensure_safe { raise ActionView::TemplateError.new({}, ArgumentError.new("blah")) }
357
391
  end
358
392
  end
359
393
 
360
- should "should not log an exception if an exception is not raised." do
361
- dont_allow(ExceptionHandling.logger).fatal
394
+ it "should not log an exception if an exception is not raised." do
395
+ expect(ExceptionHandling.logger).to_not receive(:fatal)
362
396
  ExceptionHandling.ensure_safe { ; }
363
397
  end
364
398
 
365
- should "return its value if used during an assignment" do
366
- dont_allow(ExceptionHandling.logger).fatal
399
+ it "return its value if used during an assignment" do
400
+ expect(ExceptionHandling.logger).to_not receive(:fatal)
367
401
  b = ExceptionHandling.ensure_safe { 5 }
368
- assert_equal 5, b
402
+ expect(b).to eq(5)
369
403
  end
370
404
 
371
- should "return nil if an exception is raised during an assignment" do
372
- mock(ExceptionHandling.logger).fatal(/\(blah\):\n.*exception_handling_test\.rb/, anything)
405
+ it "return nil if an exception is raised during an assignment" do
406
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/\(blah\):\n.*exception_handling_spec\.rb/, anything)
373
407
  b = ExceptionHandling.ensure_safe { raise ArgumentError, "blah" }
374
- assert_nil b
408
+ expect(b).to be_nil
375
409
  end
376
410
 
377
- should "allow a message to be appended to the error when logged." do
378
- mock(ExceptionHandling.logger).fatal(/mooo \(blah\):\n.*exception_handling_test\.rb/, anything)
411
+ it "allow a message to be appended to the error when logged." do
412
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/mooo\nArgumentError: \(blah\):\n.*exception_handling_spec\.rb/, anything)
379
413
  b = ExceptionHandling.ensure_safe("mooo") { raise ArgumentError, "blah" }
380
- assert_nil b
414
+ expect(b).to be_nil
381
415
  end
382
416
 
383
- should "only rescue StandardError and descendents" do
384
- assert_raise(Exception) { ExceptionHandling.ensure_safe("mooo") { raise Exception } }
417
+ it "only rescue StandardError and descendents" do
418
+ expect { ExceptionHandling.ensure_safe("mooo") { raise Exception } }.to raise_exception(Exception)
385
419
 
386
- mock(ExceptionHandling.logger).fatal(/mooo \(blah\):\n.*exception_handling_test\.rb/, anything)
420
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/mooo\nStandardError: \(blah\):\n.*exception_handling_spec\.rb/, anything)
387
421
 
388
422
  b = ExceptionHandling.ensure_safe("mooo") { raise StandardError, "blah" }
389
- assert_nil b
423
+ expect(b).to be_nil
390
424
  end
391
425
  end
392
426
 
393
427
  context "ExceptionHandling.ensure_completely_safe" do
394
- should "log an exception if an exception is raised." do
395
- mock(ExceptionHandling.logger).fatal(/\(blah\):\n.*exception_handling_test\.rb/, anything)
428
+ it "log an exception if an exception is raised." do
429
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/\(blah\):\n.*exception_handling_spec\.rb/, anything)
396
430
  ExceptionHandling.ensure_completely_safe { raise ArgumentError, "blah" }
397
431
  end
398
432
 
399
- should "should not log an exception if an exception is not raised." do
400
- mock(ExceptionHandling.logger).fatal.times(0)
433
+ it "should not log an exception if an exception is not raised." do
434
+ expect(ExceptionHandling.logger).to receive(:fatal).exactly(0)
401
435
  ExceptionHandling.ensure_completely_safe { ; }
402
436
  end
403
437
 
404
- should "return its value if used during an assignment" do
405
- mock(ExceptionHandling.logger).fatal.times(0)
438
+ it "return its value if used during an assignment" do
439
+ expect(ExceptionHandling.logger).to receive(:fatal).exactly(0)
406
440
  b = ExceptionHandling.ensure_completely_safe { 5 }
407
- assert_equal 5, b
441
+ expect(b).to eq(5)
408
442
  end
409
443
 
410
- should "return nil if an exception is raised during an assignment" do
411
- mock(ExceptionHandling.logger).fatal(/\(blah\):\n.*exception_handling_test\.rb/, anything) { nil }
444
+ it "return nil if an exception is raised during an assignment" do
445
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/\(blah\):\n.*exception_handling_spec\.rb/, anything) { nil }
412
446
  b = ExceptionHandling.ensure_completely_safe { raise ArgumentError, "blah" }
413
- assert_nil b
447
+ expect(b).to be_nil
414
448
  end
415
449
 
416
- should "allow a message to be appended to the error when logged." do
417
- mock(ExceptionHandling.logger).fatal(/mooo \(blah\):\n.*exception_handling_test\.rb/, anything)
450
+ it "allow a message to be appended to the error when logged." do
451
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/mooo\nArgumentError: \(blah\):\n.*exception_handling_spec\.rb/, anything)
418
452
  b = ExceptionHandling.ensure_completely_safe("mooo") { raise ArgumentError, "blah" }
419
- assert_nil b
453
+ expect(b).to be_nil
420
454
  end
421
455
 
422
- should "rescue any instance or child of Exception" do
423
- mock(ExceptionHandling.logger).fatal(/\(blah\):\n.*exception_handling_test\.rb/, anything)
456
+ it "rescue any instance or child of Exception" do
457
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/\(blah\):\n.*exception_handling_spec\.rb/, anything)
424
458
  ExceptionHandling.ensure_completely_safe { raise Exception, "blah" }
425
459
  end
426
460
 
427
- should "not rescue the special exceptions that Ruby uses" do
461
+ it "not rescue the special exceptions that Ruby uses" do
428
462
  [SystemExit, SystemStackError, NoMemoryError, SecurityError].each do |exception|
429
- assert_raise exception do
463
+ expect do
430
464
  ExceptionHandling.ensure_completely_safe do
431
465
  raise exception
432
466
  end
433
- end
467
+ end.to raise_exception(exception)
434
468
  end
435
469
  end
436
470
  end
437
471
 
438
472
  context "ExceptionHandling.ensure_escalation" do
439
- setup do
473
+ before do
440
474
  capture_notifications
441
475
  ActionMailer::Base.deliveries.clear
442
476
  end
443
477
 
444
- should "log the exception as usual and send the proper email" do
445
- mock(ExceptionHandling.logger).fatal(/\(blah\):\n.*exception_handling_test\.rb/, anything)
478
+ it "log the exception as usual and send the proper email" do
479
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/\(blah\):\n.*exception_handling_spec\.rb/, anything)
446
480
  ExceptionHandling.ensure_escalation("Favorite Feature") { raise ArgumentError, "blah" }
447
- assert_equal 1, ActionMailer::Base.deliveries.count
448
- assert_equal 1, sent_notifications.size, sent_notifications.inspect
481
+ expect(ActionMailer::Base.deliveries.count).to eq(1)
482
+ expect(sent_notifications.size).to eq(1), sent_notifications.inspect
449
483
 
450
484
  email = ActionMailer::Base.deliveries.last
451
- assert_equal "#{ExceptionHandling.email_environment} Escalation: Favorite Feature", email.subject
452
- assert_match 'ArgumentError: blah', email.body.to_s
453
- assert_match ExceptionHandling.last_exception_timestamp.to_s, email.body.to_s
485
+ expect(email.subject).to eq("#{ExceptionHandling.email_environment} Escalation: Favorite Feature")
486
+ expect(email.body.to_s).to match('ArgumentError: blah')
487
+ expect(email.body.to_s).to match(ExceptionHandling.last_exception_timestamp.to_s)
454
488
  end
455
489
 
456
- should "should not escalate if an exception is not raised." do
457
- dont_allow(ExceptionHandling.logger).fatal
490
+ it "should not escalate if an exception is not raised." do
491
+ expect(ExceptionHandling.logger).to_not receive(:fatal)
458
492
  ExceptionHandling.ensure_escalation('Ignored') { ; }
459
- assert_equal 0, ActionMailer::Base.deliveries.count
493
+ expect(ActionMailer::Base.deliveries.count).to eq(0)
460
494
  end
461
495
 
462
- should "log if the escalation email cannot be sent" do
463
- any_instance_of(Mail::Message) do |message|
464
- mock(message).deliver { raise RuntimeError.new, "Delivery Error" }
465
- end
496
+ it "log if the escalation email cannot be sent" do
497
+ expect_any_instance_of(Mail::Message).to receive(:deliver).and_raise(RuntimeError.new, "Delivery Error")
466
498
  log_fatals = []
467
- stub(ExceptionHandling.logger) do |logger|
468
- logger.fatal.with_any_args { |*args| log_fatals << args }
499
+ expect(ExceptionHandling.logger).to receive(:fatal).with(any_args).at_least(:once) do |*args|
500
+ log_fatals << args
469
501
  end
470
502
 
471
503
  ExceptionHandling.ensure_escalation("ensure context") { raise ArgumentError, "first_test_exception" }
504
+ expect(log_fatals[0].first).to match(/ArgumentError.*first_test_exception/)
505
+ expect(log_fatals[1].first).to match(/safe_email_deliver.*Delivery Error/m)
472
506
 
473
- assert_match(/ArgumentError.*first_test_exception/, log_fatals[0].first)
474
- assert_match(/safe_email_deliver.*Delivery Error/, log_fatals[1].first)
475
-
476
- assert_equal 2, log_fatals.size, log_fatals.inspect
507
+ expect(log_fatals.size).to eq(2), log_fatals.inspect
477
508
 
478
- assert_equal 1, sent_notifications.size, sent_notifications.inspect # still sent to honeybadger
509
+ expect(sent_notifications.size).to eq(1), sent_notifications.inspect # still sent to honeybadger
479
510
  end
480
511
 
481
- should "allow the caller to specify custom recipients" do
512
+ it "allow the caller to specify custom recipients" do
482
513
  custom_recipients = ['something@invoca.com']
483
- mock(ExceptionHandling.logger).fatal(/\(blah\):\n.*exception_handling_test\.rb/, anything)
514
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/\(blah\):\n.*exception_handling_spec\.rb/, anything)
484
515
  ExceptionHandling.ensure_escalation("Favorite Feature", custom_recipients) { raise ArgumentError, "blah" }
485
- assert_equal 1, ActionMailer::Base.deliveries.count
486
- assert_equal 1, sent_notifications.size, sent_notifications.inspect
516
+ expect(ActionMailer::Base.deliveries.count).to eq(1)
517
+ expect(sent_notifications.size).to eq(1), sent_notifications.inspect
487
518
 
488
519
  email = ActionMailer::Base.deliveries.last
489
- assert_equal "#{ExceptionHandling.email_environment} Escalation: Favorite Feature", email.subject
490
- assert_match 'ArgumentError: blah', email.body.to_s
491
- assert_match ExceptionHandling.last_exception_timestamp.to_s, email.body.to_s
492
- assert_equal custom_recipients, email.to
520
+ expect(email.subject).to eq("#{ExceptionHandling.email_environment} Escalation: Favorite Feature")
521
+ expect(email.body.to_s).to match('ArgumentError: blah')
522
+ expect(email.body.to_s).to match(ExceptionHandling.last_exception_timestamp.to_s)
523
+ expect(email.to).to eq(custom_recipients)
493
524
  end
494
525
  end
495
526
 
496
527
  context "ExceptionHandling.ensure_alert" do
497
- should "log the exception as usual and fire a sensu event" do
498
- mock(ExceptionHandling::Sensu).generate_event("Favorite Feature", "test context\nblah")
499
- mock(ExceptionHandling.logger).fatal(/\(blah\):\n.*exception_handling_test\.rb/, anything)
528
+ it "log the exception as usual and fire a sensu event" do
529
+ expect(ExceptionHandling::Sensu).to receive(:generate_event).with("Favorite Feature", "test context\nblah")
530
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/\(blah\):\n.*exception_handling_spec\.rb/, anything)
500
531
  ExceptionHandling.ensure_alert('Favorite Feature', 'test context') { raise ArgumentError, "blah" }
501
532
  end
502
533
 
503
- should "should not send sensu event if an exception is not raised." do
504
- dont_allow(ExceptionHandling.logger).fatal
505
- dont_allow(ExceptionHandling::Sensu).generate_event
534
+ it "should not send sensu event if an exception is not raised." do
535
+ expect(ExceptionHandling.logger).to_not receive(:fatal)
536
+ expect(ExceptionHandling::Sensu).to_not receive(:generate_event)
506
537
  ExceptionHandling.ensure_alert('Ignored', 'test context') { ; }
507
538
  end
508
539
 
509
- should "log if the sensu event could not be sent" do
510
- mock(ExceptionHandling::Sensu).send_event(anything) { raise "Failed to send" }
511
- mock(ExceptionHandling.logger) do |logger|
512
- logger.fatal(/first_test_exception/, anything)
513
- logger.fatal(/Failed to send/, anything)
514
- end
540
+ it "log if the sensu event could not be sent" do
541
+ expect(ExceptionHandling::Sensu).to receive(:send_event).with(anything) { raise "Failed to send" }
542
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/first_test_exception/, anything)
543
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/Failed to send/, anything)
515
544
  ExceptionHandling.ensure_alert("Not Used", 'test context') { raise ArgumentError, "first_test_exception" }
516
545
  end
517
546
 
518
- should "log if the exception message is nil" do
519
- mock(ExceptionHandling::Sensu).generate_event("some alert", "test context\n")
547
+ it "log if the exception message is nil" do
548
+ expect(ExceptionHandling::Sensu).to receive(:generate_event).with("some alert", "test context\n")
520
549
  ExceptionHandling.ensure_alert('some alert', 'test context') { raise_exception_with_nil_message }
521
550
  end
522
551
  end
523
552
 
524
553
  context "ExceptionHandling.escalate_to_production_support" do
525
- should "notify production support" do
554
+ it "notify production support" do
526
555
  subject = "Runtime Error found!"
527
556
  exception = RuntimeError.new("Test")
528
557
  recipients = ["prodsupport@example.com"]
529
558
 
530
- mock(ExceptionHandling).production_support_recipients { recipients }.times(2)
531
- mock(ExceptionHandling).escalate(subject, exception, ExceptionHandling.last_exception_timestamp, recipients)
559
+ expect(ExceptionHandling).to receive(:production_support_recipients).and_return(recipients).exactly(2)
560
+ expect(ExceptionHandling).to receive(:escalate).with(subject, exception, ExceptionHandling.last_exception_timestamp, recipients)
532
561
  ExceptionHandling.escalate_to_production_support(exception, subject)
533
562
  end
534
563
  end
535
564
 
536
565
  context "exception timestamp" do
537
- setup do
566
+ before do
538
567
  Time.now_override = Time.parse('1986-5-21 4:17 am UTC')
539
568
  end
540
569
 
541
- should "include the timestamp when the exception is logged" do
570
+ it "include the timestamp when the exception is logged" do
542
571
  capture_notifications
543
572
 
544
- mock(ExceptionHandling.logger).fatal(/\(Error:517033020\) ArgumentError context \(blah\):\n.*exception_handling_test\.rb/, anything)
573
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/\(Error:517033020\) context\nArgumentError: \(blah\):\n.*exception_handling_spec\.rb/, anything)
545
574
  b = ExceptionHandling.ensure_safe("context") { raise ArgumentError, "blah" }
546
- assert_nil b
575
+ expect(b).to be_nil
547
576
 
548
- assert_equal 517_033_020, ExceptionHandling.last_exception_timestamp
577
+ expect(ExceptionHandling.last_exception_timestamp).to eq(517_033_020)
549
578
 
550
- assert_equal 1, sent_notifications.size, sent_notifications.inspect
579
+ expect(sent_notifications.size).to eq(1), sent_notifications.inspect
551
580
 
552
- assert_equal 517_033_020, sent_notifications.last.enhanced_data['timestamp']
581
+ expect(sent_notifications.last.enhanced_data['timestamp']).to eq(517_033_020)
553
582
  end
554
583
  end
555
584
 
556
- should "log the error if the exception message is nil" do
585
+ it "log the error if the exception message is nil" do
557
586
  capture_notifications
558
587
 
559
588
  ExceptionHandling.log_error(exception_with_nil_message)
560
589
 
561
- assert_equal 1, sent_notifications.size, sent_notifications.inspect
562
- assert_equal 'RuntimeError: ', sent_notifications.last.enhanced_data['error_string']
590
+ expect(sent_notifications.size).to eq(1), sent_notifications.inspect
591
+ expect(sent_notifications.last.enhanced_data['error_string']).to eq('RuntimeError: ')
563
592
  end
564
593
 
565
- should "log the error if the exception message is nil and the exception context is a hash" do
594
+ it "log the error if the exception message is nil and the exception context is a hash" do
566
595
  capture_notifications
567
596
 
568
597
  ExceptionHandling.log_error(exception_with_nil_message, "SERVER_NAME" => "exceptional.com")
569
598
 
570
- assert_equal 1, sent_notifications.size, sent_notifications.inspect
571
- assert_equal 'RuntimeError: ', sent_notifications.last.enhanced_data['error_string']
599
+ expect(sent_notifications.size).to eq(1), sent_notifications.inspect
600
+ expect(sent_notifications.last.enhanced_data['error_string']).to eq('RuntimeError: ')
572
601
  end
573
602
 
574
603
  context "Honeybadger integration" do
575
604
  context "with Honeybadger not defined" do
576
- setup do
577
- stub(ExceptionHandling).honeybadger_defined? { false }
605
+ before do
606
+ allow(ExceptionHandling).to receive(:honeybadger_defined?) { false }
578
607
  end
579
608
 
580
- should "not invoke send_exception_to_honeybadger when log_error is executed" do
581
- dont_allow(ExceptionHandling).send_exception_to_honeybadger
609
+ it "not invoke send_exception_to_honeybadger when log_error is executed" do
610
+ expect(ExceptionHandling).to_not receive(:send_exception_to_honeybadger)
582
611
  ExceptionHandling.log_error(exception_1)
583
612
  end
584
613
 
585
- should "not invoke send_exception_to_honeybadger when ensure_safe is executed" do
586
- dont_allow(ExceptionHandling).send_exception_to_honeybadger
614
+ it "not invoke send_exception_to_honeybadger when ensure_safe is executed" do
615
+ expect(ExceptionHandling).to_not receive(:send_exception_to_honeybadger)
587
616
  ExceptionHandling.ensure_safe { raise exception_1 }
588
617
  end
589
618
  end
590
619
 
591
620
  context "with Honeybadger defined" do
592
- should "not send_exception_to_honeybadger when log_warning is executed" do
593
- dont_allow(ExceptionHandling).send_exception_to_honeybadger
621
+ it "not send_exception_to_honeybadger when log_warning is executed" do
622
+ expect(ExceptionHandling).to_not receive(:send_exception_to_honeybadger)
594
623
  ExceptionHandling.log_warning("This should not go to honeybadger")
595
624
  end
596
625
 
597
- should "not send_exception_to_honeybadger when log_error is called with a Warning" do
598
- dont_allow(ExceptionHandling).send_exception_to_honeybadger
626
+ it "not send_exception_to_honeybadger when log_error is called with a Warning" do
627
+ expect(ExceptionHandling).to_not receive(:send_exception_to_honeybadger)
599
628
  ExceptionHandling.log_error(ExceptionHandling::Warning.new("This should not go to honeybadger"))
600
629
  end
601
630
 
602
- should "invoke send_exception_to_honeybadger when log_error is executed" do
603
- mock.proxy(ExceptionHandling).send_exception_to_honeybadger.with_any_args
631
+ it "invoke send_exception_to_honeybadger when log_error is executed" do
632
+ expect(ExceptionHandling).to receive(:send_exception_to_honeybadger).with(any_args).and_call_original
604
633
  ExceptionHandling.log_error(exception_1)
605
634
  end
606
635
 
607
- should "invoke send_exception_to_honeybadger when log_error_rack is executed" do
608
- mock.proxy(ExceptionHandling).send_exception_to_honeybadger.with_any_args
636
+ it "invoke send_exception_to_honeybadger when log_error_rack is executed" do
637
+ expect(ExceptionHandling).to receive(:send_exception_to_honeybadger).with(any_args).and_call_original
609
638
  ExceptionHandling.log_error_rack(exception_1, {}, nil)
610
639
  end
611
640
 
612
- should "invoke send_exception_to_honeybadger when ensure_safe is executed" do
613
- mock.proxy(ExceptionHandling).send_exception_to_honeybadger.with_any_args
641
+ it "invoke send_exception_to_honeybadger when ensure_safe is executed" do
642
+ expect(ExceptionHandling).to receive(:send_exception_to_honeybadger).with(any_args).and_call_original
614
643
  ExceptionHandling.ensure_safe { raise exception_1 }
615
644
  end
616
645
 
617
- should "specify error message as an empty string when notifying honeybadger if exception message is nil" do
618
- mock(Honeybadger).notify.with_any_args do |args|
619
- assert_equal "", args[:error_message]
646
+ it "specify error message as an empty string when notifying honeybadger if exception message is nil" do
647
+ expect(Honeybadger).to receive(:notify).with(any_args) do |args|
648
+ expect(args[:error_message]).to eq("")
620
649
  end
621
650
  ExceptionHandling.log_error(exception_with_nil_message)
622
651
  end
623
652
 
624
653
  context "with stubbed values" do
625
- setup do
654
+ before do
626
655
  Time.now_override = Time.now
627
656
  @env = { server: "fe98" }
628
657
  @parameters = { advertiser_id: 435, controller: "some_controller" }
629
658
  @session = { username: "jsmith" }
630
659
  @request_uri = "host/path"
631
660
  @controller = create_dummy_controller(@env, @parameters, @session, @request_uri)
632
- stub(ExceptionHandling).server_name { "invoca_fe98" }
661
+ allow(ExceptionHandling).to receive(:server_name) { "invoca_fe98" }
633
662
 
634
663
  @exception = StandardError.new("Some Exception")
635
664
  @exception.set_backtrace([
636
- "test/unit/exception_handling_test.rb:847:in `exception_1'",
637
- "test/unit/exception_handling_test.rb:455:in `block (4 levels) in <class:ExceptionHandlingTest>'"
665
+ "spec/unit/exception_handling_spec.rb:847:in `exception_1'",
666
+ "spec/unit/exception_handling_spec.rb:455:in `block (4 levels) in <class:ExceptionHandlingTest>'"
638
667
  ])
639
668
  @exception_context = { "SERVER_NAME" => "exceptional.com" }
640
669
  end
641
670
 
642
- should "send error details and relevant context data to Honeybadger with log_context" do
671
+ it "send error details and relevant context data to Honeybadger with log_context" do
643
672
  honeybadger_data = nil
644
- mock(Honeybadger).notify.with_any_args do |data|
673
+ expect(Honeybadger).to receive(:notify).with(any_args) do |data|
645
674
  honeybadger_data = data
646
675
  end
647
676
  ExceptionHandling.logger.global_context = { service_name: "rails", region: "AWS-us-east-1" }
@@ -679,19 +708,19 @@ class ExceptionHandlingTest < ActiveSupport::TestCase
679
708
  "SERVER_NAME" => "exceptional.com"
680
709
  },
681
710
  backtrace: [
682
- "test/unit/exception_handling_test.rb:847:in `exception_1'",
683
- "test/unit/exception_handling_test.rb:455:in `block (4 levels) in <class:ExceptionHandlingTest>'"
711
+ "spec/unit/exception_handling_spec.rb:847:in `exception_1'",
712
+ "spec/unit/exception_handling_spec.rb:455:in `block (4 levels) in <class:ExceptionHandlingTest>'"
684
713
  ],
685
714
  event_response: "Event successfully received",
686
715
  log_context: { "service_name" => "bin/console", "region" => "AWS-us-east-1", "log_source" => "gem/listen" }
687
716
  }
688
717
  }
689
- assert_equal_with_diff expected_data, honeybadger_data
718
+ expect(honeybadger_data).to eq(expected_data)
690
719
  end
691
720
 
692
- should "send error details and relevant context data to Honeybadger with empty log_context" do
721
+ it "send error details and relevant context data to Honeybadger with empty log_context" do
693
722
  honeybadger_data = nil
694
- mock(Honeybadger).notify.with_any_args do |data|
723
+ expect(Honeybadger).to receive(:notify).with(any_args) do |data|
695
724
  honeybadger_data = data
696
725
  end
697
726
  ExceptionHandling.logger.global_context = {}
@@ -729,22 +758,22 @@ class ExceptionHandlingTest < ActiveSupport::TestCase
729
758
  "SERVER_NAME" => "exceptional.com"
730
759
  },
731
760
  backtrace: [
732
- "test/unit/exception_handling_test.rb:847:in `exception_1'",
733
- "test/unit/exception_handling_test.rb:455:in `block (4 levels) in <class:ExceptionHandlingTest>'"
761
+ "spec/unit/exception_handling_spec.rb:847:in `exception_1'",
762
+ "spec/unit/exception_handling_spec.rb:455:in `block (4 levels) in <class:ExceptionHandlingTest>'"
734
763
  ],
735
764
  event_response: "Event successfully received"
736
765
  }
737
766
  }
738
- assert_equal_with_diff expected_data, honeybadger_data
767
+ expect(honeybadger_data).to eq(expected_data)
739
768
  end
740
769
  end
741
770
 
742
771
  context "with post_log_error_hook set" do
743
- teardown do
772
+ after do
744
773
  ExceptionHandling.post_log_error_hook = nil
745
774
  end
746
775
 
747
- should "not send notification to honeybadger when exception description has the flag turned off and call log error callback with logged_to_honeybadger set to nil" do
776
+ it "not send notification to honeybadger when exception description has the flag turned off and call log error callback with logged_to_honeybadger set to nil" do
748
777
  @honeybadger_status = nil
749
778
  ExceptionHandling.post_log_error_hook = method(:log_error_callback_config)
750
779
  filter_list = {
@@ -753,37 +782,37 @@ class ExceptionHandlingTest < ActiveSupport::TestCase
753
782
  send_to_honeybadger: false
754
783
  }
755
784
  }
756
- stub(File).mtime { incrementing_mtime }
757
- mock(YAML).load_file.with_any_args { ActiveSupport::HashWithIndifferentAccess.new(filter_list) }.at_least(1)
785
+ allow(File).to receive(:mtime) { incrementing_mtime }
786
+ expect(YAML).to receive(:load_file).with(any_args) { ActiveSupport::HashWithIndifferentAccess.new(filter_list) }.at_least(1)
758
787
 
759
- mock.proxy(ExceptionHandling).send_exception_to_honeybadger_unless_filtered.with_any_args.once
760
- dont_allow(Honeybadger).notify
788
+ expect(ExceptionHandling).to receive(:send_exception_to_honeybadger_unless_filtered).with(any_args).exactly(1).and_call_original
789
+ expect(Honeybadger).to_not receive(:notify)
761
790
  ExceptionHandling.log_error(StandardError.new("suppress Honeybadger notification"))
762
- assert_equal :skipped, @honeybadger_status
791
+ expect(@honeybadger_status).to eq(:skipped)
763
792
  end
764
793
 
765
- should "call log error callback with logged_to_honeybadger set to false if an error occurs while attempting to notify honeybadger" do
794
+ it "call log error callback with logged_to_honeybadger set to false if an error occurs while attempting to notify honeybadger" do
766
795
  @honeybadger_status = nil
767
796
  ExceptionHandling.post_log_error_hook = method(:log_error_callback_config)
768
- mock(Honeybadger).notify.with_any_args { raise "Honeybadger Notification Failure" }
797
+ expect(Honeybadger).to receive(:notify).with(any_args) { raise "Honeybadger Notification Failure" }
769
798
  ExceptionHandling.log_error(exception_1)
770
- assert_equal :failure, @honeybadger_status
799
+ expect(@honeybadger_status).to eq(:failure)
771
800
  end
772
801
 
773
- should "call log error callback with logged_to_honeybadger set to false on unsuccessful honeybadger notification" do
802
+ it "call log error callback with logged_to_honeybadger set to false on unsuccessful honeybadger notification" do
774
803
  @honeybadger_status = nil
775
804
  ExceptionHandling.post_log_error_hook = method(:log_error_callback_config)
776
- mock(Honeybadger).notify.with_any_args { false }
805
+ expect(Honeybadger).to receive(:notify).with(any_args) { false }
777
806
  ExceptionHandling.log_error(exception_1)
778
- assert_equal :failure, @honeybadger_status
807
+ expect(@honeybadger_status).to eq(:failure)
779
808
  end
780
809
 
781
- should "call log error callback with logged_to_honeybadger set to true on successful honeybadger notification" do
810
+ it "call log error callback with logged_to_honeybadger set to true on successful honeybadger notification" do
782
811
  @honeybadger_status = nil
783
812
  ExceptionHandling.post_log_error_hook = method(:log_error_callback_config)
784
- mock(Honeybadger).notify.with_any_args { '06220c5a-b471-41e5-baeb-de247da45a56' }
813
+ expect(Honeybadger).to receive(:notify).with(any_args) { '06220c5a-b471-41e5-baeb-de247da45a56' }
785
814
  ExceptionHandling.log_error(exception_1)
786
- assert_equal :success, @honeybadger_status
815
+ expect(@honeybadger_status).to eq(:success)
787
816
  end
788
817
  end
789
818
  end
@@ -795,33 +824,33 @@ class ExceptionHandlingTest < ActiveSupport::TestCase
795
824
  end
796
825
  end
797
826
 
798
- should "allow sections to have data with just a to_s method" do
827
+ it "allow sections to have data with just a to_s method" do
799
828
  capture_notifications
800
829
 
801
830
  ExceptionHandling.log_error("This is my RingSwitch example.") do |data|
802
831
  data.merge!(event_response: EventResponse.new)
803
832
  end
804
833
 
805
- assert_equal 1, sent_notifications.size, sent_notifications.inspect
806
- assert_match(/message from to_s!/, sent_notifications.last.enhanced_data['event_response'].to_s)
834
+ expect(sent_notifications.size).to eq(1), sent_notifications.inspect
835
+ expect(sent_notifications.last.enhanced_data['event_response'].to_s).to match(/message from to_s!/)
807
836
  end
808
837
  end
809
838
 
810
- should "return the error ID (timestamp)" do
839
+ it "return the error ID (timestamp)" do
811
840
  result = ExceptionHandling.log_error(RuntimeError.new("A runtime error"), "Runtime message")
812
- assert_equal ExceptionHandling.last_exception_timestamp, result
841
+ expect(result).to eq(ExceptionHandling.last_exception_timestamp)
813
842
  end
814
843
 
815
- should "rescue exceptions that happen in log_error" do
816
- stub(ExceptionHandling).make_exception { raise ArgumentError, "Bad argument" }
817
- mock(ExceptionHandling).write_exception_to_log(satisfy { |ex| ex.to_s['Bad argument'] },
844
+ it "rescue exceptions that happen in log_error" do
845
+ allow(ExceptionHandling).to receive(:make_exception) { raise ArgumentError, "Bad argument" }
846
+ expect(ExceptionHandling).to receive(:write_exception_to_log).with(satisfy { |ex| ex.to_s['Bad argument'] },
818
847
  satisfy { |context| context['ExceptionHandlingError: log_error rescued exception while logging Runtime message'] },
819
848
  anything)
820
849
  ExceptionHandling.log_error(RuntimeError.new("A runtime error"), "Runtime message")
821
850
  end
822
851
 
823
- should "rescue exceptions that happen when log_error yields" do
824
- mock(ExceptionHandling).write_exception_to_log(satisfy { |ex| ex.to_s['Bad argument'] },
852
+ it "rescue exceptions that happen when log_error yields" do
853
+ expect(ExceptionHandling).to receive(:write_exception_to_log).with(satisfy { |ex| ex.to_s['Bad argument'] },
825
854
  satisfy { |context| context['Context message'] },
826
855
  anything,
827
856
  anything)
@@ -829,38 +858,38 @@ class ExceptionHandlingTest < ActiveSupport::TestCase
829
858
  end
830
859
 
831
860
  context "Exception Filtering" do
832
- setup do
861
+ before do
833
862
  filter_list = { exception1: { 'error' => "my error message" },
834
863
  exception2: { 'error' => "some other message", :session => "misc data" } }
835
- stub(YAML).load_file { ActiveSupport::HashWithIndifferentAccess.new(filter_list) }
864
+ allow(YAML).to receive(:load_file) { ActiveSupport::HashWithIndifferentAccess.new(filter_list) }
836
865
 
837
866
  # bump modified time up to get the above filter loaded
838
- stub(File).mtime { incrementing_mtime }
867
+ allow(File).to receive(:mtime) { incrementing_mtime }
839
868
  end
840
869
 
841
- should "handle case where filter list is not found" do
842
- stub(YAML).load_file { raise Errno::ENOENT, "File not found" }
870
+ it "handle case where filter list is not found" do
871
+ allow(YAML).to receive(:load_file) { raise Errno::ENOENT, "File not found" }
843
872
 
844
873
  capture_notifications
845
874
 
846
875
  ExceptionHandling.log_error("My error message is in list")
847
- assert_equal 1, sent_notifications.size, sent_notifications.inspect
876
+ expect(sent_notifications.size).to eq(1), sent_notifications.inspect
848
877
  end
849
878
 
850
- should "log exception and suppress email when exception is on filter list" do
879
+ it "log exception and suppress email when exception is on filter list" do
851
880
  capture_notifications
852
881
 
853
882
  ExceptionHandling.log_error("Error message is not in list")
854
- assert_equal 1, sent_notifications.size, sent_notifications.inspect
883
+ expect(sent_notifications.size).to eq(1), sent_notifications.inspect
855
884
 
856
885
  sent_notifications.clear
857
886
  ExceptionHandling.log_error("My error message is in list")
858
- assert_equal 0, sent_notifications.size, sent_notifications.inspect
887
+ expect(sent_notifications.size).to eq(0), sent_notifications.inspect
859
888
  end
860
889
 
861
- should "allow filtering exception on any text in exception data" do
890
+ it "allow filtering exception on any text in exception data" do
862
891
  filters = { exception1: { session: "data: my extra session data" } }
863
- stub(YAML).load_file { ActiveSupport::HashWithIndifferentAccess.new(filters) }
892
+ allow(YAML).to receive(:load_file) { ActiveSupport::HashWithIndifferentAccess.new(filters) }
864
893
 
865
894
  capture_notifications
866
895
 
@@ -870,7 +899,7 @@ class ExceptionHandlingTest < ActiveSupport::TestCase
870
899
  data: "my extra session data"
871
900
  }
872
901
  end
873
- assert_equal 0, sent_notifications.size, sent_notifications.inspect
902
+ expect(sent_notifications.size).to eq(0), sent_notifications.inspect
874
903
 
875
904
  ExceptionHandling.log_error("No match here") do |data|
876
905
  data[:session] = {
@@ -878,86 +907,86 @@ class ExceptionHandlingTest < ActiveSupport::TestCase
878
907
  data: "my extra session <no match!> data"
879
908
  }
880
909
  end
881
- assert_equal 1, sent_notifications.size, sent_notifications.inspect
910
+ expect(sent_notifications.size).to eq(1), sent_notifications.inspect
882
911
  end
883
912
 
884
- should "reload filter list on the next exception if file was modified" do
913
+ it "reload filter list on the next exception if file was modified" do
885
914
  capture_notifications
886
915
 
887
916
  ExceptionHandling.log_error("Error message is not in list")
888
- assert_equal 1, sent_notifications.size, sent_notifications.inspect
917
+ expect(sent_notifications.size).to eq(1), sent_notifications.inspect
889
918
 
890
919
  filter_list = { exception1: { 'error' => "Error message is not in list" } }
891
- stub(YAML).load_file { ActiveSupport::HashWithIndifferentAccess.new(filter_list) }
892
- stub(File).mtime { incrementing_mtime }
920
+ allow(YAML).to receive(:load_file) { ActiveSupport::HashWithIndifferentAccess.new(filter_list) }
921
+ allow(File).to receive(:mtime) { incrementing_mtime }
893
922
 
894
923
  sent_notifications.clear
895
924
  ExceptionHandling.log_error("Error message is not in list")
896
- assert_equal 0, sent_notifications.size, sent_notifications.inspect
925
+ expect(sent_notifications.size).to eq(0), sent_notifications.inspect
897
926
  end
898
927
 
899
- should "not consider filter if both error message and body do not match" do
928
+ it "not consider filter if both error message and body do not match" do
900
929
  capture_notifications
901
930
 
902
931
  # error message matches, but not full text
903
932
  ExceptionHandling.log_error("some other message")
904
- assert_equal 1, sent_notifications.size, sent_notifications.inspect
933
+ expect(sent_notifications.size).to eq(1), sent_notifications.inspect
905
934
 
906
935
  # now both match
907
936
  sent_notifications.clear
908
937
  ExceptionHandling.log_error("some other message") do |data|
909
938
  data[:session] = { some_random_key: "misc data" }
910
939
  end
911
- assert_equal 0, sent_notifications.size, sent_notifications.inspect
940
+ expect(sent_notifications.size).to eq(0), sent_notifications.inspect
912
941
  end
913
942
 
914
- should "skip environment keys not on whitelist" do
943
+ it "skip environment keys not on whitelist" do
915
944
  capture_notifications
916
945
 
917
946
  ExceptionHandling.log_error("some message") do |data|
918
947
  data[:environment] = { SERVER_PROTOCOL: "HTTP/1.0", RAILS_SECRETS_YML_CONTENTS: 'password: VERY_SECRET_PASSWORD' }
919
948
  end
920
- assert_equal 1, sent_notifications.size, sent_notifications.inspect
949
+ expect(sent_notifications.size).to eq(1), sent_notifications.inspect
921
950
 
922
951
  mail = sent_notifications.last
923
952
  environment = mail.enhanced_data['environment']
924
953
 
925
- assert_nil environment["RAILS_SECRETS_YML_CONTENTS"], environment.inspect # this is not on whitelist
926
- assert environment["SERVER_PROTOCOL"], environment.inspect # this is
954
+ expect(environment["RAILS_SECRETS_YML_CONTENTS"]).to be_nil, environment.inspect # this is not on whitelist).to be_nil
955
+ expect(environment["SERVER_PROTOCOL"]).to be_truthy, environment.inspect # this is
927
956
  end
928
957
 
929
- should "omit environment defaults" do
958
+ it "omit environment defaults" do
930
959
  capture_notifications
931
960
 
932
- stub(ExceptionHandling).send_exception_to_honeybadger(anything) { |exception_info| sent_notifications << exception_info }
961
+ allow(ExceptionHandling).to receive(:send_exception_to_honeybadger).with(anything) { |exception_info| sent_notifications << exception_info }
933
962
 
934
963
  ExceptionHandling.log_error("some message") do |data|
935
964
  data[:environment] = { SERVER_PORT: '80', SERVER_PROTOCOL: "HTTP/1.0" }
936
965
  end
937
- assert_equal 1, sent_notifications.size, sent_notifications.inspect
966
+ expect(sent_notifications.size).to eq(1), sent_notifications.inspect
938
967
  mail = sent_notifications.last
939
968
  environment = mail.enhanced_data['environment']
940
969
 
941
- assert_nil environment["SERVER_PORT"], environment.inspect # this was default
942
- assert environment["SERVER_PROTOCOL"], environment # this was not
970
+ expect(environment["SERVER_PORT"]).to be_nil, environment.inspect # this was default).to be_nil
971
+ expect(environment["SERVER_PROTOCOL"]).to be_truthy, environment.inspect # this was not
943
972
  end
944
973
 
945
- should "reject the filter file if any contain all empty regexes" do
974
+ it "reject the filter file if any contain all empty regexes" do
946
975
  filter_list = { exception1: { 'error' => "", :session => "" },
947
976
  exception2: { 'error' => "is not in list", :session => "" } }
948
- stub(YAML).load_file { ActiveSupport::HashWithIndifferentAccess.new(filter_list) }
949
- stub(File).mtime { incrementing_mtime }
977
+ allow(YAML).to receive(:load_file) { ActiveSupport::HashWithIndifferentAccess.new(filter_list) }
978
+ allow(File).to receive(:mtime) { incrementing_mtime }
950
979
 
951
980
  capture_notifications
952
981
 
953
982
  ExceptionHandling.log_error("Error message is not in list")
954
- assert_equal 1, sent_notifications.size, sent_notifications.inspect
983
+ expect(sent_notifications.size).to eq(1), sent_notifications.inspect
955
984
  end
956
985
 
957
- should "reload filter file if filename changes" do
986
+ it "reload filter file if filename changes" do
958
987
  catalog = ExceptionHandling.exception_catalog
959
988
  ExceptionHandling.filter_list_filename = "./config/other_exception_filters.yml"
960
- assert_not_equal catalog, ExceptionHandling.exception_catalog
989
+ expect(ExceptionHandling.exception_catalog).to_not eq(catalog)
961
990
  end
962
991
 
963
992
  context "Exception Handling Mailer" do
@@ -971,7 +1000,7 @@ class ExceptionHandlingTest < ActiveSupport::TestCase
971
1000
 
972
1001
  [[true, false], [true, true]].each do |em_flag, synchrony_flag|
973
1002
  context "eventmachine_safe = #{em_flag} && eventmachine_synchrony = #{synchrony_flag}" do
974
- setup do
1003
+ before do
975
1004
  ExceptionHandling.eventmachine_safe = em_flag
976
1005
  ExceptionHandling.eventmachine_synchrony = synchrony_flag
977
1006
  EventMachineStub.block = nil
@@ -981,61 +1010,60 @@ class ExceptionHandlingTest < ActiveSupport::TestCase
981
1010
  set_test_const('EventMachine::DNS::Resolver', DNSResolvStub)
982
1011
  end
983
1012
 
984
- teardown do
1013
+ after do
985
1014
  ExceptionHandling.eventmachine_safe = false
986
1015
  ExceptionHandling.eventmachine_synchrony = false
987
1016
  end
988
1017
 
989
- should "schedule EventMachine STMP when EventMachine defined" do
1018
+ it "schedule EventMachine STMP when EventMachine defined" do
990
1019
  ActionMailer::Base.deliveries.clear
991
1020
 
992
1021
  set_test_const('EventMachine::Protocols::SmtpClient', SmtpClientStub)
993
1022
 
994
1023
  ExceptionHandling.ensure_escalation("ensure message") { raise 'Exception to escalate!' }
995
- assert EventMachineStub.block
1024
+ expect(EventMachineStub.block).to be_truthy
996
1025
  EventMachineStub.block.call
997
- assert DNSResolvStub.callback_block
1026
+ expect(DNSResolvStub.callback_block).to be_truthy
998
1027
  DNSResolvStub.callback_block.call ['127.0.0.1']
999
- assert_equal_with_diff EXPECTED_SMTP_HASH, (SmtpClientStub.send_hash & EXPECTED_SMTP_HASH.keys).map_hash { |_k, v| v.to_s }, SmtpClientStub.send_hash.inspect
1000
- assert_equal((synchrony_flag ? :asend : :send), SmtpClientStub.last_method)
1001
- assert_match(/Exception to escalate/, SmtpClientStub.send_hash[:content])
1028
+ expect((SmtpClientStub.send_hash & EXPECTED_SMTP_HASH.keys).map_hash { |_k, v| v.to_s }) .to eq(EXPECTED_SMTP_HASH), SmtpClientStub.send_hash.inspect
1029
+ expect(SmtpClientStub.last_method).to eq((synchrony_flag ? :asend : :send))
1030
+ expect(SmtpClientStub.send_hash[:content]).to match(/Exception to escalate/)
1002
1031
  assert_emails 0, ActionMailer::Base.deliveries.*.to_s
1003
1032
  end
1004
1033
 
1005
- should "pass the content as a proper rfc 2822 message" do
1034
+ it "pass the content as a proper rfc 2822 message" do
1006
1035
  set_test_const('EventMachine::Protocols::SmtpClient', SmtpClientStub)
1007
1036
  ExceptionHandling.ensure_escalation("ensure message") { raise 'Exception to escalate!' }
1008
- assert EventMachineStub.block
1037
+ expect(EventMachineStub.block).to be_truthy
1009
1038
  EventMachineStub.block.call
1010
- assert DNSResolvStub.callback_block
1039
+ expect(DNSResolvStub.callback_block).to be_truthy
1011
1040
  DNSResolvStub.callback_block.call ['127.0.0.1']
1012
- assert content = SmtpClientStub.send_hash[:content]
1013
- assert_match(/Content-Transfer-Encoding: 7bit/, content)
1014
- assert_match(/\r\n\.\r\n\z/, content)
1041
+ expect(content = SmtpClientStub.send_hash[:content]).to be_truthy
1042
+ expect(content).to match(/Content-Transfer-Encoding: 7bit/)
1043
+ expect(content).to match(/\r\n\.\r\n\z/)
1015
1044
  end
1016
1045
 
1017
- should "log fatal on EventMachine STMP errback" do
1046
+ it "log fatal on EventMachine STMP errback" do
1018
1047
  ActionMailer::Base.deliveries.clear
1019
1048
 
1020
1049
  set_test_const('EventMachine::Protocols::SmtpClient', SmtpClientErrbackStub)
1021
- mock(ExceptionHandling.logger).fatal(/Exception to escalate/, anything)
1022
- mock(ExceptionHandling.logger).fatal(/Failed to email by SMTP: "credential mismatch"/)
1050
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/Exception to escalate/, anything)
1051
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/Failed to email by SMTP: "credential mismatch"/)
1023
1052
 
1024
1053
  ExceptionHandling.ensure_escalation("ensure message") { raise 'Exception to escalate!' }
1025
- assert EventMachineStub.block
1054
+ expect(EventMachineStub.block).to be_truthy
1026
1055
  EventMachineStub.block.call
1027
- assert DNSResolvStub.callback_block
1056
+ expect(DNSResolvStub.callback_block).to be_truthy
1028
1057
  DNSResolvStub.callback_block.call(['127.0.0.1'])
1029
1058
  SmtpClientErrbackStub.block.call("credential mismatch")
1030
- assert_equal_with_diff EXPECTED_SMTP_HASH, (SmtpClientErrbackStub.send_hash & EXPECTED_SMTP_HASH.keys).map_hash { |_k, v| v.to_s }, SmtpClientErrbackStub.send_hash.inspect
1031
- end
1059
+ expect((SmtpClientErrbackStub.send_hash & EXPECTED_SMTP_HASH.keys).map_hash { |_k, v| v.to_s }).to eq(EXPECTED_SMTP_HASH), SmtpClientErrbackStub.send_hash.inspect end
1032
1060
 
1033
- should "log fatal on EventMachine dns resolver errback" do
1034
- mock(ExceptionHandling.logger).fatal(/Exception to escalate/, anything)
1035
- mock(ExceptionHandling.logger).fatal(/Failed to resolv DNS for localhost: "softlayer sucks"/)
1061
+ it "log fatal on EventMachine dns resolver errback" do
1062
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/Exception to escalate/, anything)
1063
+ expect(ExceptionHandling.logger).to receive(:fatal).with(/Failed to resolv DNS for localhost: "softlayer sucks"/)
1036
1064
 
1037
1065
  ExceptionHandling.ensure_escalation("ensure message") { raise 'Exception to escalate!' }
1038
- assert EventMachineStub.block
1066
+ expect(EventMachineStub.block).to be_truthy
1039
1067
  EventMachineStub.block.call
1040
1068
  DNSResolvStub.errback_block.call("softlayer sucks")
1041
1069
  end
@@ -1045,7 +1073,7 @@ class ExceptionHandlingTest < ActiveSupport::TestCase
1045
1073
  end
1046
1074
 
1047
1075
  context "Exception mapping" do
1048
- setup do
1076
+ before do
1049
1077
  @data = {
1050
1078
  environment: {
1051
1079
  'HTTP_HOST' => "localhost",
@@ -1070,17 +1098,17 @@ class ExceptionHandlingTest < ActiveSupport::TestCase
1070
1098
  }
1071
1099
  end
1072
1100
 
1073
- should "clean backtraces" do
1101
+ it "clean backtraces" do
1074
1102
  begin
1075
1103
  raise "test exception"
1076
1104
  rescue => ex
1077
1105
  backtrace = ex.backtrace
1078
1106
  end
1079
1107
  result = ExceptionHandling.send(:clean_backtrace, ex).to_s
1080
- assert_not_equal result, backtrace
1108
+ expect(backtrace).to_not eq(result)
1081
1109
  end
1082
1110
 
1083
- should "return entire backtrace if cleaned is emtpy" do
1111
+ it "return entire backtrace if cleaned is emtpy" do
1084
1112
  begin
1085
1113
  backtrace = ["/Users/peter/ringrevenue/web/vendor/rails-3.2.12/activerecord/lib/active_record/relation/finder_methods.rb:312:in `find_with_ids'",
1086
1114
  "/Users/peter/ringrevenue/web/vendor/rails-3.2.12/activerecord/lib/active_record/relation/finder_methods.rb:107:in `find'",
@@ -1118,12 +1146,14 @@ class ExceptionHandlingTest < ActiveSupport::TestCase
1118
1146
  end
1119
1147
  end
1120
1148
 
1121
- mock(Rails).backtrace_cleaner { Rails::BacktraceCleaner.new }
1149
+ rails = double(Rails)
1150
+ expect(rails).to receive(:backtrace_cleaner) { Rails::BacktraceCleaner.new }
1151
+ rails.backtrace_cleaner
1122
1152
 
1123
1153
  ex = Exception.new
1124
1154
  ex.set_backtrace(backtrace)
1125
1155
  result = ExceptionHandling.send(:clean_backtrace, ex)
1126
- assert_equal backtrace, result
1156
+ expect(result).to eq(backtrace)
1127
1157
  ensure
1128
1158
  Object.send(:remove_const, :Rails)
1129
1159
  end
@@ -1131,36 +1161,36 @@ class ExceptionHandlingTest < ActiveSupport::TestCase
1131
1161
  end
1132
1162
 
1133
1163
  context "log_perodically" do
1134
- setup do
1164
+ before do
1135
1165
  Time.now_override = Time.now # Freeze time
1136
1166
  ExceptionHandling.logger.clear
1137
1167
  end
1138
1168
 
1139
- teardown do
1169
+ after do
1140
1170
  Time.now_override = nil
1141
1171
  end
1142
1172
 
1143
- should "take in additional logging context and pass them to the logger" do
1173
+ it "take in additional logging context and pass them to the logger" do
1144
1174
  ExceptionHandling.log_periodically(:test_context_with_periodic, 30.minutes, "this will be written", service_name: 'exception_handling')
1145
- assert_not_empty logged_excluding_reload_filter.last[:context]
1146
- assert_equal({ service_name: 'exception_handling' }, logged_excluding_reload_filter.last[:context])
1175
+ expect(logged_excluding_reload_filter.last[:context]).to_not be_empty
1176
+ expect(logged_excluding_reload_filter.last[:context]).to eq({ service_name: 'exception_handling' })
1147
1177
  end
1148
1178
 
1149
- should "log immediately when we are expected to log" do
1179
+ it "log immediately when we are expected to log" do
1150
1180
  ExceptionHandling.log_periodically(:test_periodic_exception, 30.minutes, "this will be written")
1151
- assert_equal 1, logged_excluding_reload_filter.size
1181
+ expect(logged_excluding_reload_filter.size).to eq(1)
1152
1182
 
1153
1183
  Time.now_override = Time.now + 5.minutes
1154
1184
  ExceptionHandling.log_periodically(:test_periodic_exception, 30.minutes, "this will not be written")
1155
- assert_equal 1, logged_excluding_reload_filter.size
1185
+ expect(logged_excluding_reload_filter.size).to eq(1)
1156
1186
 
1157
1187
  ExceptionHandling.log_periodically(:test_another_periodic_exception, 30.minutes, "this will be written")
1158
- assert_equal 2, logged_excluding_reload_filter.size
1188
+ expect(logged_excluding_reload_filter.size).to eq(2)
1159
1189
 
1160
1190
  Time.now_override = Time.now + 26.minutes
1161
1191
 
1162
1192
  ExceptionHandling.log_periodically(:test_periodic_exception, 30.minutes, "this will be written")
1163
- assert_equal 3, logged_excluding_reload_filter.size
1193
+ expect(logged_excluding_reload_filter.size).to eq(3)
1164
1194
  end
1165
1195
  end
1166
1196
  end