exception_handling 2.17.0.pre.tstarck.1 → 3.0.pre.1

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 (48) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +0 -3
  3. data/.ruby-version +1 -1
  4. data/Gemfile +16 -12
  5. data/Gemfile.lock +138 -153
  6. data/README.md +21 -90
  7. data/Rakefile +11 -8
  8. data/exception_handling.gemspec +10 -14
  9. data/lib/exception_handling/exception_info.rb +11 -15
  10. data/lib/exception_handling/honeybadger_callbacks.rb +59 -0
  11. data/lib/exception_handling/log_stub_error.rb +1 -2
  12. data/lib/exception_handling/methods.rb +53 -6
  13. data/lib/exception_handling/testing.rb +10 -20
  14. data/lib/exception_handling/version.rb +1 -1
  15. data/lib/exception_handling.rb +34 -135
  16. data/semaphore_ci/setup.sh +3 -0
  17. data/{spec → test}/helpers/exception_helpers.rb +2 -2
  18. data/{spec/spec_helper.rb → test/test_helper.rb} +45 -75
  19. data/test/unit/exception_handling/exception_catalog_test.rb +85 -0
  20. data/test/unit/exception_handling/exception_description_test.rb +82 -0
  21. data/{spec/unit/exception_handling/exception_info_spec.rb → test/unit/exception_handling/exception_info_test.rb} +114 -170
  22. data/test/unit/exception_handling/honeybadger_callbacks_test.rb +122 -0
  23. data/{spec/unit/exception_handling/log_error_stub_spec.rb → test/unit/exception_handling/log_error_stub_test.rb} +22 -38
  24. data/{spec/unit/exception_handling/mailer_spec.rb → test/unit/exception_handling/mailer_test.rb} +18 -17
  25. data/test/unit/exception_handling/methods_test.rb +84 -0
  26. data/test/unit/exception_handling/sensu_test.rb +52 -0
  27. data/test/unit/exception_handling_test.rb +1109 -0
  28. metadata +59 -99
  29. data/.github/CODEOWNERS +0 -1
  30. data/.github/workflows/pipeline.yml +0 -36
  31. data/.rspec +0 -3
  32. data/.tool-versions +0 -1
  33. data/Appraisals +0 -19
  34. data/CHANGELOG.md +0 -149
  35. data/gemfiles/rails_5.gemfile +0 -18
  36. data/gemfiles/rails_6.gemfile +0 -18
  37. data/gemfiles/rails_7.gemfile +0 -18
  38. data/lib/exception_handling/escalate_callback.rb +0 -19
  39. data/lib/exception_handling/logging_methods.rb +0 -27
  40. data/spec/rake_test_warning_false.rb +0 -20
  41. data/spec/unit/exception_handling/escalate_callback_spec.rb +0 -81
  42. data/spec/unit/exception_handling/exception_catalog_spec.rb +0 -85
  43. data/spec/unit/exception_handling/exception_description_spec.rb +0 -82
  44. data/spec/unit/exception_handling/logging_methods_spec.rb +0 -38
  45. data/spec/unit/exception_handling/methods_spec.rb +0 -105
  46. data/spec/unit/exception_handling/sensu_spec.rb +0 -51
  47. data/spec/unit/exception_handling_spec.rb +0 -1465
  48. /data/{spec → test}/helpers/controller_helpers.rb +0 -0
@@ -1,75 +1,58 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require File.expand_path('../../spec_helper', __dir__)
3
+ require File.expand_path('../../test_helper', __dir__)
4
4
  require_test_helper 'controller_helpers'
5
5
  require_test_helper 'exception_helpers'
6
6
 
7
7
  module ExceptionHandling
8
- describe ExceptionInfo do
8
+ class ExceptionInfoTest < ActiveSupport::TestCase
9
9
  include ControllerHelpers
10
10
  include ExceptionHelpers
11
11
 
12
12
  context "initialize" do
13
- before do
13
+ setup do
14
14
  @exception = StandardError.new("something went wrong")
15
15
  @timestamp = Time.now
16
16
  @controller = Object.new
17
17
  end
18
18
 
19
19
  context "controller_from_context" do
20
- it "extract controller from context when not specified explicitly" do
20
+ should "extract controller from context when not specified explicitly" do
21
21
  exception_context = {
22
22
  "action_controller.instance" => @controller
23
23
  }
24
24
  exception_info = ExceptionInfo.new(@exception, exception_context, @timestamp)
25
- expect(exception_info.controller).to eq(@controller)
25
+ assert_equal @controller, exception_info.controller
26
26
  end
27
27
 
28
- it "prefer the explicit controller over the one from context" do
28
+ should "prefer the explicit controller over the one from context" do
29
29
  exception_context = {
30
30
  "action_controller.instance" => Object.new
31
31
  }
32
- exception_info = ExceptionInfo.new(@exception, exception_context, @timestamp, controller: @controller)
33
- expect(exception_info.controller).to eq(@controller)
34
- expect(exception_info.controller).not_to eq(exception_context["action_controller.instance"])
32
+ exception_info = ExceptionInfo.new(@exception, exception_context, @timestamp, @controller)
33
+ assert_equal @controller, exception_info.controller
34
+ assert_not_equal exception_context["action_controller.instance"], exception_info.controller
35
35
  end
36
36
 
37
- it "leave controller unset when not included in the context hash" do
37
+ should "leave controller unset when not included in the context hash" do
38
38
  exception_info = ExceptionInfo.new(@exception, {}, @timestamp)
39
- expect(exception_info.controller).to be_nil
39
+ assert_nil exception_info.controller
40
40
  end
41
41
 
42
- it "leave controller unset when context is not in hash format" do
42
+ should "leave controller unset when context is not in hash format" do
43
43
  exception_info = ExceptionInfo.new(@exception, "string context", @timestamp)
44
- expect(exception_info.controller).to be_nil
45
- end
46
- end
47
-
48
- context "honeybadger_tags" do
49
- it "retrieved from log_context" do
50
- exception_info = ExceptionInfo.new(@exception, "string context", @timestamp, log_context: { honeybadger_tags: ['Data-Services'] })
51
- expect(exception_info.honeybadger_tags).to eq(['Data-Services'])
52
- end
53
-
54
- it "retrieved from log_context and normalized to array if a string" do
55
- exception_info = ExceptionInfo.new(@exception, "string context", @timestamp, log_context: { honeybadger_tags: 'Data-Services' })
56
- expect(exception_info.honeybadger_tags).to eq(['Data-Services'])
57
- end
58
-
59
- it "defaults to empty array if not given" do
60
- exception_info = ExceptionInfo.new(@exception, "string context", @timestamp)
61
- expect(exception_info.honeybadger_tags).to eq([])
44
+ assert_nil exception_info.controller
62
45
  end
63
46
  end
64
47
  end
65
48
 
66
49
  context "data" do
67
- before do
50
+ setup do
68
51
  @exception = StandardError.new("something went wrong")
69
52
  @timestamp = Time.now
70
53
  end
71
54
 
72
- it "return a hash with exception specific data including context hash" do
55
+ should "return a hash with exception specific data including context hash" do
73
56
  exception_context = {
74
57
  "rack.session" => {
75
58
  user_id: 23,
@@ -90,17 +73,17 @@ module ExceptionHandling
90
73
  }
91
74
  }
92
75
 
93
- expect(exception_info.data).to eq(expected_data)
76
+ assert_equal_with_diff expected_data, exception_info.data
94
77
  end
95
78
 
96
- it "generate exception data appropriately if exception message is nil" do
79
+ should "generate exception data appropriately if exception message is nil" do
97
80
  exception_info = ExceptionInfo.new(exception_with_nil_message, "custom context data", @timestamp)
98
81
  exception_data = exception_info.data
99
- expect(exception_data["error_string"]).to eq("RuntimeError: ")
100
- expect(exception_data["error"]).to eq("RuntimeError: : custom context data")
82
+ assert_equal "RuntimeError: ", exception_data["error_string"]
83
+ assert_equal "RuntimeError: : custom context data", exception_data["error"]
101
84
  end
102
85
 
103
- it "return a hash with exception specific data including context string" do
86
+ should "return a hash with exception specific data including context string" do
104
87
  exception_context = "custom context data"
105
88
  exception_info = ExceptionInfo.new(@exception, exception_context, @timestamp)
106
89
  expected_data = {
@@ -113,20 +96,21 @@ module ExceptionHandling
113
96
  "message" => "custom context data"
114
97
  }
115
98
  }
116
- expect(exception_info.data).to eq(expected_data)
99
+
100
+ assert_equal_with_diff expected_data, exception_info.data
117
101
  end
118
102
 
119
- it "not include enhanced data from controller or custom data callback" do
103
+ should "not include enhanced data from controller or custom data callback" do
120
104
  env = { server: "fe98" }
121
105
  parameters = { advertiser_id: 435 }
122
106
  session = { username: "jsmith" }
123
107
  request_uri = "host/path"
124
108
  controller = create_dummy_controller(env, parameters, session, request_uri)
125
109
  data_callback = ->(data) { data[:custom_section] = "value" }
126
- exception_info = ExceptionInfo.new(@exception, "custom context data", @timestamp, controller: controller, data_callback: data_callback)
110
+ exception_info = ExceptionInfo.new(@exception, "custom context data", @timestamp, controller, data_callback)
127
111
 
128
- expect(exception_info).to_not receive(:extract_and_merge_controller_data)
129
- expect(exception_info).to_not receive(:customize_from_data_callback)
112
+ dont_allow(exception_info).extract_and_merge_controller_data
113
+ dont_allow(exception_info).customize_from_data_callback
130
114
  expected_data = {
131
115
  "error_class" => "StandardError",
132
116
  "error_string" => "StandardError: something went wrong",
@@ -138,12 +122,12 @@ module ExceptionHandling
138
122
  }
139
123
  }
140
124
 
141
- expect(exception_info.data).to eq(expected_data)
125
+ assert_equal_with_diff expected_data, exception_info.data
142
126
  end
143
127
  end
144
128
 
145
129
  context "enhanced_data" do
146
- before do
130
+ setup do
147
131
  @exception = StandardError.new("something went wrong")
148
132
  @timestamp = Time.now
149
133
  @exception_context = {
@@ -161,13 +145,13 @@ module ExceptionHandling
161
145
  @data_callback = ->(data) { data[:custom_section] = "check this out" }
162
146
  end
163
147
 
164
- it "not return a mutable object for the session" do
148
+ should "not return a mutable object for the session" do
165
149
  exception_info = ExceptionInfo.new(@exception, @exception_context, @timestamp)
166
150
  exception_info.enhanced_data["session"]["hello"] = "world"
167
- expect(@controller.session["hello"]).to be_nil
151
+ assert_nil @controller.session["hello"]
168
152
  end
169
153
 
170
- it "return a hash with generic exception attributes as well as context data" do
154
+ should "return a hash with generic exception attributes as well as context data" do
171
155
  exception_info = ExceptionInfo.new(@exception, @exception_context, @timestamp)
172
156
  expected_data = {
173
157
  "error_class" => "StandardError",
@@ -180,20 +164,20 @@ module ExceptionHandling
180
164
  "location" => { "file" => "<no backtrace>", "line" => nil }
181
165
  }
182
166
 
183
- expect(prepare_data(exception_info.enhanced_data)).to eq(expected_data)
167
+ assert_equal_with_diff expected_data, prepare_data(exception_info.enhanced_data)
184
168
  end
185
169
 
186
- it "generate exception data appropriately if exception message is nil" do
170
+ should "generate exception data appropriately if exception message is nil" do
187
171
  exception_with_nil_message = RuntimeError.new(nil)
188
- allow(exception_with_nil_message).to receive(:message).and_return(nil)
172
+ stub(exception_with_nil_message).message { nil }
189
173
  exception_info = ExceptionInfo.new(exception_with_nil_message, @exception_context, @timestamp)
190
174
  exception_data = exception_info.enhanced_data
191
- expect(exception_data["error_string"]).to eq("RuntimeError: ")
192
- expect(exception_data["error"]).to eq("RuntimeError: ")
175
+ assert_equal "RuntimeError: ", exception_data["error_string"]
176
+ assert_equal "RuntimeError: ", exception_data["error"]
193
177
  end
194
178
 
195
- it "include controller data when available" do
196
- exception_info = ExceptionInfo.new(@exception, @exception_context, @timestamp, controller: @controller)
179
+ should "include controller data when available" do
180
+ exception_info = ExceptionInfo.new(@exception, @exception_context, @timestamp, @controller)
197
181
  expected_data = {
198
182
  "error_class" => "StandardError",
199
183
  "error_string" => "StandardError: something went wrong",
@@ -210,10 +194,10 @@ module ExceptionHandling
210
194
  "location" => { "controller" => "dummy", "action" => "fail", "file" => "<no backtrace>", "line" => nil }
211
195
  }
212
196
 
213
- expect(prepare_data(exception_info.enhanced_data)).to eq(expected_data)
197
+ assert_equal_with_diff expected_data, prepare_data(exception_info.enhanced_data)
214
198
  end
215
199
 
216
- it "extract controller from rack specific exception context when not provided explicitly" do
200
+ should "extract controller from rack specific exception context when not provided explicitly" do
217
201
  @exception_context["action_controller.instance"] = @controller
218
202
  exception_info = ExceptionInfo.new(@exception, @exception_context, @timestamp)
219
203
  expected_data = {
@@ -232,11 +216,11 @@ module ExceptionHandling
232
216
  "location" => { "controller" => "dummy", "action" => "fail", "file" => "<no backtrace>", "line" => nil }
233
217
  }
234
218
 
235
- expect(prepare_data(exception_info.enhanced_data)).to eq(expected_data)
219
+ assert_equal_with_diff expected_data, prepare_data(exception_info.enhanced_data)
236
220
  end
237
221
 
238
- it "add to_s attribute to specific sections that have their content in hash format" do
239
- exception_info = ExceptionInfo.new(@exception, @exception_context, @timestamp, controller: @controller)
222
+ should "add to_s attribute to specific sections that have their content in hash format" do
223
+ exception_info = ExceptionInfo.new(@exception, @exception_context, @timestamp, @controller)
240
224
  expected_data = {
241
225
  "error_class" => "StandardError",
242
226
  "error_string" => "StandardError: something went wrong",
@@ -261,13 +245,13 @@ module ExceptionHandling
261
245
  "location" => { "controller" => "dummy", "action" => "fail", "file" => "<no backtrace>", "line" => nil }
262
246
  }
263
247
 
264
- expect(exception_info.enhanced_data).to eq(expected_data)
248
+ assert_equal_with_diff expected_data, exception_info.enhanced_data
265
249
  end
266
250
 
267
- it "filter out sensitive parameters like passwords" do
251
+ should "filter out sensitive parameters like passwords" do
268
252
  @controller.request.parameters[:password] = "super_secret"
269
253
  @controller.request.parameters[:user] = { "password" => "also super secret", "password_confirmation" => "also super secret" }
270
- exception_info = ExceptionInfo.new(@exception, @exception_context, @timestamp, controller: @controller)
254
+ exception_info = ExceptionInfo.new(@exception, @exception_context, @timestamp, @controller)
271
255
  expected_params = {
272
256
  "password" => "[FILTERED]",
273
257
  "advertiser_id" => 435, "controller" => "dummy",
@@ -277,11 +261,11 @@ module ExceptionHandling
277
261
  "password_confirmation" => "[FILTERED]"
278
262
  }
279
263
  }
280
- expect(exception_info.enhanced_data["request"]["params"]).to eq(expected_params)
264
+ assert_equal_with_diff expected_params, exception_info.enhanced_data["request"]["params"]
281
265
  end
282
266
 
283
- it "include the changes from the custom data callback" do
284
- exception_info = ExceptionInfo.new(@exception, @exception_context, @timestamp, controller: nil, data_callback: @data_callback)
267
+ should "include the changes from the custom data callback" do
268
+ exception_info = ExceptionInfo.new(@exception, @exception_context, @timestamp, nil, @data_callback)
285
269
  expected_data = {
286
270
  "error_class" => "StandardError",
287
271
  "error_string" => "StandardError: something went wrong",
@@ -294,11 +278,11 @@ module ExceptionHandling
294
278
  "location" => { "file" => "<no backtrace>", "line" => nil }
295
279
  }
296
280
 
297
- expect(prepare_data(exception_info.enhanced_data)).to eq(expected_data)
281
+ assert_equal_with_diff expected_data, prepare_data(exception_info.enhanced_data)
298
282
  end
299
283
 
300
- it "apply the custom_data_hook results" do
301
- allow(ExceptionHandling).to receive(:custom_data_hook).and_return(->(data) { data[:custom_hook] = "changes from custom hook" })
284
+ should "apply the custom_data_hook results" do
285
+ stub(ExceptionHandling).custom_data_hook { ->(data) { data[:custom_hook] = "changes from custom hook" } }
302
286
  exception_info = ExceptionInfo.new(@exception, @exception_context, @timestamp)
303
287
  expected_data = {
304
288
  "error_class" => "StandardError",
@@ -312,61 +296,61 @@ module ExceptionHandling
312
296
  "location" => { "file" => "<no backtrace>", "line" => nil }
313
297
  }
314
298
 
315
- expect(prepare_data(exception_info.enhanced_data)).to eq(expected_data)
299
+ assert_equal_with_diff expected_data, prepare_data(exception_info.enhanced_data)
316
300
  end
317
301
 
318
- it "log info if the custom data hook results in a nil message exception" do
302
+ should "log info if the custom data hook results in a nil message exception" do
319
303
  ExceptionHandling.custom_data_hook = ->(_data) do
320
304
  raise_exception_with_nil_message
321
305
  end
322
306
  log_info_messages = []
323
- allow(ExceptionHandling.logger).to receive(:info).with(any_args) do |message, _|
307
+ stub(ExceptionHandling.logger).info.with_any_args do |message, _|
324
308
  log_info_messages << message
325
309
  end
326
310
 
327
311
  exception_info = ExceptionInfo.new(@exception, @exception_context, @timestamp)
328
312
  exception_info.enhanced_data
329
- expect(log_info_messages.find { |message| message =~ /Unable to execute custom custom_data_hook callback/ }).to be_truthy
313
+ assert log_info_messages.find { |message| message =~ /Unable to execute custom custom_data_hook callback/ }
330
314
  ExceptionHandling.custom_data_hook = nil
331
315
  end
332
316
  end
333
317
 
334
318
  context "exception_description" do
335
- it "return the exception description from the global exception filter list" do
319
+ should "return the exception description from the global exception filter list" do
336
320
  exception = StandardError.new("No route matches")
337
321
  exception_info = ExceptionInfo.new(exception, {}, Time.now)
338
322
  description = exception_info.exception_description
339
- expect(description).to_not be_nil
340
- expect(description.filter_name).to eq(:NoRoute)
323
+ assert_not_nil description
324
+ assert_equal :NoRoute, description.filter_name
341
325
  end
342
326
 
343
- it "find the description when filter criteria includes section in hash format" do
327
+ should "find the description when filter criteria includes section in hash format" do
344
328
  env = { server: "fe98" }
345
329
  parameters = { advertiser_id: 435, controller: "sessions", action: "fail" }
346
330
  session = { username: "jsmith", id: "session_key" }
347
331
  request_uri = "host/path"
348
332
  controller = create_dummy_controller(env, parameters, session, request_uri)
349
333
  exception = StandardError.new("Request to click domain rejected")
350
- exception_info = ExceptionInfo.new(exception, nil, Time.now, controller: controller)
351
- expect(exception_info.enhanced_data[:request].is_a?(Hash)).to eq(true)
334
+ exception_info = ExceptionInfo.new(exception, {}, Time.now, controller)
335
+ assert_equal true, exception_info.enhanced_data[:request].is_a?(Hash)
352
336
  description = exception_info.exception_description
353
- expect(description).to_not be_nil
354
- expect(description.filter_name).to eq(:"Click Request Rejected")
337
+ assert_not_nil description
338
+ assert_equal :"Click Request Rejected", description.filter_name
355
339
  end
356
340
 
357
- it "return same description object for related errors (avoid reloading exception catalog from disk)" do
341
+ should "return same description object for related errors (avoid reloading exception catalog from disk)" do
358
342
  exception = StandardError.new("No route matches")
359
- exception_info = ExceptionInfo.new(exception, nil, Time.now)
343
+ exception_info = ExceptionInfo.new(exception, {}, Time.now)
360
344
  description = exception_info.exception_description
361
345
 
362
346
  repeat_ex = StandardError.new("No route matches 2")
363
- repeat_ex_info = ExceptionInfo.new(repeat_ex, nil, Time.now)
364
- expect(repeat_ex_info.exception_description.object_id).to eq(description.object_id)
347
+ repeat_ex_info = ExceptionInfo.new(repeat_ex, {}, Time.now)
348
+ assert_equal description.object_id, repeat_ex_info.exception_description.object_id
365
349
  end
366
350
  end
367
351
 
368
352
  context "controller_name" do
369
- before do
353
+ setup do
370
354
  @exception = StandardError.new('something went wrong')
371
355
  @timestamp = Time.now
372
356
  @exception_context = {
@@ -378,113 +362,73 @@ module ExceptionHandling
378
362
  }
379
363
  end
380
364
 
381
- it "returns honeybadger_grouping from the log context" do
382
- allow(ExceptionHandling.logger).to receive(:current_context_for_thread).and_return({ honeybadger_grouping: 'Group 1' })
383
- exception_info = ExceptionInfo.new(@exception, @exception_context, @timestamp)
384
-
385
- expect(exception_info.controller_name).to eq('Group 1')
386
- end
387
-
388
- it "returns honeybadger_grouping from log context even if controller is defined" do
389
- allow(ExceptionHandling.logger).to receive(:current_context_for_thread).and_return({ honeybadger_grouping: 'Group 1' })
390
-
365
+ should "return controller_name when controller is present" do
391
366
  env = { server: 'fe98' }
392
367
  parameters = { controller: 'some_controller' }
393
368
  session = { username: 'smith' }
394
369
  request_uri = "host/path"
395
370
  controller = create_dummy_controller(env, parameters, session, request_uri)
396
- exception_info = ExceptionInfo.new(@exception, @exception_context, @timestamp, controller: controller)
371
+ exception_info = ExceptionInfo.new(@exception, @exception_context, @timestamp, controller)
397
372
 
398
- expect(exception_info.controller_name).to eq('Group 1')
373
+ assert_equal 'some_controller', exception_info.controller_name
399
374
  end
400
375
 
401
- it "return controller_name when controller is present" do
402
- env = { server: 'fe98' }
403
- parameters = { controller: 'some_controller' }
404
- session = { username: 'smith' }
405
- request_uri = "host/path"
406
- controller = create_dummy_controller(env, parameters, session, request_uri)
407
- exception_info = ExceptionInfo.new(@exception, @exception_context, @timestamp, controller: controller)
408
-
409
- expect(exception_info.controller_name).to eq('some_controller')
410
- end
411
-
412
- it "return an empty string when controller is not present" do
376
+ should "return an empty string when controller is not present" do
413
377
  exception_info = ExceptionInfo.new(@exception, @exception_context, @timestamp)
414
378
 
415
- expect(exception_info.controller_name).to eq('')
379
+ assert_equal '', exception_info.controller_name
416
380
  end
417
381
  end
418
382
 
419
383
  context "send_to_honeybadger?" do
420
- it "be enabled when Honeybadger is defined and exception is not in the filter list" do
421
- allow(ExceptionHandling).to receive(:honeybadger_defined?).and_return(true)
384
+ should "be enabled when Honeybadger is defined and exception is not in the filter list" do
385
+ stub(ExceptionHandling).honeybadger_defined? { true }
422
386
  exception = StandardError.new("something went wrong")
423
- exception_info = ExceptionInfo.new(exception, nil, Time.now)
424
- expect(exception_info.exception_description).to be_nil
425
- expect(exception_info.send_to_honeybadger?).to eq(true)
387
+ exception_info = ExceptionInfo.new(exception, {}, Time.now)
388
+ assert_nil exception_info.exception_description
389
+ assert_equal true, exception_info.send_to_honeybadger?
426
390
  end
427
391
 
428
- it "be enabled when Honeybadger is defined and exception is on the filter list with the flag turned on" do
429
- allow(ExceptionHandling).to receive(:honeybadger_defined?).and_return(true)
392
+ should "be enabled when Honeybadger is defined and exception is on the filter list with the flag turned on" do
393
+ stub(ExceptionHandling).honeybadger_defined? { true }
430
394
  exception = StandardError.new("No route matches")
431
- exception_info = ExceptionInfo.new(exception, nil, Time.now)
432
- expect(exception_info.exception_description).to_not be_nil
433
- expect(exception_info.exception_description.send_to_honeybadger).to eq(true)
434
- expect(exception_info.send_to_honeybadger?).to eq(true)
395
+ exception_info = ExceptionInfo.new(exception, {}, Time.now)
396
+ assert_not_nil exception_info.exception_description
397
+ assert_equal true, exception_info.exception_description.send_to_honeybadger
398
+ assert_equal true, exception_info.send_to_honeybadger?
435
399
  end
436
400
 
437
- it "be disabled when Honeybadger is defined and exception is on the filter list with the flag turned off" do
438
- allow(ExceptionHandling).to receive(:honeybadger_defined?).and_return(true)
401
+ should "be disabled when Honeybadger is defined and exception is on the filter list with the flag turned off" do
402
+ stub(ExceptionHandling).honeybadger_defined? { true }
439
403
  exception = StandardError.new("No route matches")
440
- exception_info = ExceptionInfo.new(exception, nil, Time.now)
441
- expect(exception_info.exception_description).to_not be_nil
442
- allow(exception_info.exception_description).to receive(:send_to_honeybadger).and_return(false)
443
- expect(exception_info.send_to_honeybadger?).to eq(false)
404
+ exception_info = ExceptionInfo.new(exception, {}, Time.now)
405
+ assert_not_nil exception_info.exception_description
406
+ stub(exception_info.exception_description).send_to_honeybadger { false }
407
+ assert_equal false, exception_info.send_to_honeybadger?
444
408
  end
445
409
 
446
- it "be disabled when Honeybadger is not defined" do
447
- allow(ExceptionHandling).to receive(:honeybadger_defined?).and_return(false)
410
+ should "be disabled when Honeybadger is not defined" do
411
+ stub(ExceptionHandling).honeybadger_defined? { false }
448
412
  exception = StandardError.new("something went wrong")
449
- exception_info = ExceptionInfo.new(exception, nil, Time.now)
450
- expect(exception_info.exception_description).to be_nil
451
- expect(exception_info.send_to_honeybadger?).to eq(false)
413
+ exception_info = ExceptionInfo.new(exception, {}, Time.now)
414
+ assert_nil exception_info.exception_description
415
+ assert_equal false, exception_info.send_to_honeybadger?
452
416
  end
453
417
  end
454
418
 
455
419
  context "honeybadger_context_data" do
456
- before do
457
- allow(ExceptionHandling.logger).to receive(:current_context_for_thread).and_return({ cuid: 'ABCD' })
458
- end
459
-
460
- it "include thread_context when log_context: is nil" do
461
- exception_with_nil_message = RuntimeError.new(nil)
462
- allow(exception_with_nil_message).to receive(:message).and_return(nil)
463
- exception_info = ExceptionInfo.new(exception_with_nil_message, @exception_context, @timestamp)
464
- honeybadger_context_data = exception_info.honeybadger_context_data
465
- expect(honeybadger_context_data[:log_context]).to eq({ "cuid" => 'ABCD' })
466
- end
467
-
468
- it "include thread context merged with log_context:" do
469
- exception_with_nil_message = RuntimeError.new(nil)
470
- allow(exception_with_nil_message).to receive(:message).and_return(nil)
471
- exception_info = ExceptionInfo.new(exception_with_nil_message, @exception_context, @timestamp, log_context: { url: 'http://example.com' })
472
- honeybadger_context_data = exception_info.honeybadger_context_data
473
- expect(honeybadger_context_data[:log_context]).to eq({ "cuid" => 'ABCD', "url" => 'http://example.com' })
474
- end
475
-
476
- it "return the error details and relevant context data to be used as honeybadger notification context while filtering sensitive data" do
420
+ should "return the error details and relevant context data to be used as honeybadger notification context while filtering sensitive data" do
477
421
  env = { server: "fe98" }
478
422
  parameters = { advertiser_id: 435 }
479
423
  session = { username: "jsmith" }
480
424
  request_uri = "host/path"
481
425
  controller = create_dummy_controller(env, parameters, session, request_uri)
482
- allow(ExceptionHandling).to receive(:server_name).and_return("invoca_fe98")
426
+ stub(ExceptionHandling).server_name { "invoca_fe98" }
483
427
 
484
428
  exception = StandardError.new("Some Exception")
485
429
  exception.set_backtrace([
486
- "spec/unit/exception_handling_test.rb:847:in `exception_1'",
487
- "spec/unit/exception_handling_test.rb:455:in `block (4 levels) in <class:ExceptionHandlingTest>'"
430
+ "test/unit/exception_handling_test.rb:847:in `exception_1'",
431
+ "test/unit/exception_handling_test.rb:455:in `block (4 levels) in <class:ExceptionHandlingTest>'"
488
432
  ])
489
433
  exception_context = { "SERVER_NAME" => "exceptional.com" }
490
434
  data_callback = ->(data) do
@@ -494,7 +438,7 @@ module ExceptionHandling
494
438
  data[:other_section] = "This should not be included in the response"
495
439
  end
496
440
  timestamp = Time.now
497
- exception_info = ExceptionInfo.new(exception, exception_context, timestamp, controller: controller, data_callback: data_callback)
441
+ exception_info = ExceptionInfo.new(exception, exception_context, timestamp, controller, data_callback)
498
442
 
499
443
  expected_data = {
500
444
  timestamp: timestamp,
@@ -502,6 +446,7 @@ module ExceptionHandling
502
446
  exception_context: { "SERVER_NAME" => "exceptional.com" },
503
447
  server: "invoca_fe98",
504
448
  scm_revision: "5b24eac37aaa91f5784901e9aabcead36fd9df82",
449
+ notes: "this is used by a test",
505
450
  user_details: { "username" => "jsmith" },
506
451
  request: {
507
452
  "params" => { "advertiser_id" => 435 },
@@ -516,30 +461,28 @@ module ExceptionHandling
516
461
  "SERVER_NAME" => "exceptional.com"
517
462
  },
518
463
  backtrace: [
519
- "spec/unit/exception_handling_test.rb:847:in `exception_1'",
520
- "spec/unit/exception_handling_test.rb:455:in `block (4 levels) in <class:ExceptionHandlingTest>'"
464
+ "test/unit/exception_handling_test.rb:847:in `exception_1'",
465
+ "test/unit/exception_handling_test.rb:455:in `block (4 levels) in <class:ExceptionHandlingTest>'"
521
466
  ],
522
- event_response: "Event successfully received",
523
- log_context: { "cuid" => "ABCD" },
524
- notes: "this is used by a test"
467
+ event_response: "Event successfully received"
525
468
  }
526
- expect(exception_info.honeybadger_context_data).to eq(expected_data)
469
+ assert_equal_with_diff expected_data, exception_info.honeybadger_context_data
527
470
  end
528
471
 
529
472
  [['Hash', { 'cookie' => 'cookie_context' }],
530
473
  ['String', 'Entering Error State'],
531
474
  ['Array', ['Error1', 'Error2']]].each do |klass, value|
532
- it "extract context from exception_context when it is a #{klass}" do
475
+ should "extract context from exception_context when it is a #{klass}" do
533
476
  exception = StandardError.new("Exception")
534
477
  exception_context = value
535
478
  exception_info = ExceptionInfo.new(exception, exception_context, Time.now)
536
479
 
537
- expect(value.class.name).to eq(klass)
538
- expect(exception_info.honeybadger_context_data[:exception_context]).to eq(value)
480
+ assert_equal klass, value.class.name
481
+ assert_equal value, exception_info.honeybadger_context_data[:exception_context]
539
482
  end
540
483
  end
541
484
 
542
- it "filter out sensitive data from exception context such as [password, password_confirmation, oauth_token]" do
485
+ should "filter out sensitive data from exception context such as [password, password_confirmation, oauth_token]" do
543
486
  sensitive_data = {
544
487
  "password" => "super_secret",
545
488
  "password_confirmation" => "super_secret_confirmation",
@@ -574,14 +517,15 @@ module ExceptionHandling
574
517
  }
575
518
  }.merge(expected_sensitive_data)
576
519
 
577
- expect(exception_info.honeybadger_context_data[:exception_context]).to eq(expected_exception_context)
520
+ assert_equal_with_diff expected_exception_context, exception_info.honeybadger_context_data[:exception_context]
578
521
  end
579
522
 
580
- it "omit context if exception_context is empty" do
523
+ should "omit context if exception_context is empty" do
581
524
  exception = StandardError.new("Exception")
582
525
  exception_context = ""
583
526
  exception_info = ExceptionInfo.new(exception, exception_context, Time.now)
584
- expect(exception_info.honeybadger_context_data[:exception_context]).to be_nil
527
+
528
+ assert_nil exception_info.honeybadger_context_data[:exception_context]
585
529
  end
586
530
  end
587
531