exception_handling 2.16.0 → 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 +114 -109
  6. data/README.md +21 -61
  7. data/Rakefile +11 -8
  8. data/exception_handling.gemspec +10 -12
  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 -95
  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} +42 -63
  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 +60 -100
  29. data/.github/CODEOWNERS +0 -1
  30. data/.github/workflows/pipeline.yml +0 -40
  31. data/.rspec +0 -3
  32. data/.tool-versions +0 -1
  33. data/Appraisals +0 -19
  34. data/CHANGELOG.md +0 -136
  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 -1361
  48. /data/{spec → test}/helpers/controller_helpers.rb +0 -0
@@ -1,15 +1,65 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'active_support/concern'
4
- require_relative 'logging_methods'
5
4
 
6
5
  module ExceptionHandling
7
6
  module Methods # included on models and controllers
8
7
  extend ActiveSupport::Concern
9
- include ExceptionHandling::LoggingMethods
10
8
 
11
9
  protected
12
10
 
11
+ def log_error(exception_or_string, exception_context = '')
12
+ controller = self if respond_to?(:request) && respond_to?(:session)
13
+ ExceptionHandling.log_error(exception_or_string, exception_context, controller)
14
+ end
15
+
16
+ def log_error_rack(exception_or_string, exception_context = '', rack_filter = '')
17
+ ExceptionHandling.log_error_rack(exception_or_string, exception_context, rack_filter)
18
+ end
19
+
20
+ def log_warning(message)
21
+ ExceptionHandling.log_warning(message)
22
+ end
23
+
24
+ def log_info(message)
25
+ ExceptionHandling.logger.info(message)
26
+ end
27
+
28
+ def log_debug(message)
29
+ ExceptionHandling.logger.debug(message)
30
+ end
31
+
32
+ def ensure_safe(exception_context = "")
33
+ yield
34
+ rescue => ex
35
+ log_error ex, exception_context
36
+ nil
37
+ end
38
+
39
+ def escalate_error(exception_or_string, email_subject)
40
+ ExceptionHandling.escalate_error(exception_or_string, email_subject)
41
+ end
42
+
43
+ def escalate_warning(message, email_subject)
44
+ ExceptionHandling.escalate_warning(message, email_subject)
45
+ end
46
+
47
+ def ensure_escalation(*args)
48
+ ExceptionHandling.ensure_escalation(*args) do
49
+ yield
50
+ end
51
+ end
52
+
53
+ def alert_warning(*args)
54
+ ExceptionHandling.alert_warning(*args)
55
+ end
56
+
57
+ def ensure_alert(*args)
58
+ ExceptionHandling.ensure_alert(*args) do
59
+ yield
60
+ end
61
+ end
62
+
13
63
  def long_controller_action_timeout
14
64
  if defined?(Rails) && Rails.respond_to?(:env) && Rails.env == 'test'
15
65
  300
@@ -38,10 +88,7 @@ module ExceptionHandling
38
88
  end
39
89
 
40
90
  included do
41
- Deprecation3_0.deprecation_warning('ExceptionHandling::Methods', 'include LoggingMethods; in controllers, set your own around_filter to set logging context')
42
- if respond_to? :around_filter
43
- around_filter :set_current_controller
44
- end
91
+ around_filter :set_current_controller if respond_to? :around_filter
45
92
  end
46
93
 
47
94
  class_methods do
@@ -4,7 +4,7 @@
4
4
 
5
5
  module ExceptionHandling
6
6
  module Testing
7
- class ControllerStubBase
7
+ class ControllerStub
8
8
 
9
9
  class Request
10
10
  attr_accessor :parameters, :protocol, :host, :request_uri, :env, :session_options
@@ -25,7 +25,7 @@ module ExceptionHandling
25
25
  attr_accessor :around_filter_method
26
26
 
27
27
  def around_filter(method)
28
- self.around_filter_method = method
28
+ ControllerStub.around_filter_method = method
29
29
  end
30
30
  end
31
31
 
@@ -44,6 +44,14 @@ module ExceptionHandling
44
44
  end
45
45
  end
46
46
 
47
+ def simulate_around_filter(&block)
48
+ set_current_controller(&block)
49
+ end
50
+
51
+ def controller_name
52
+ "ControllerStub"
53
+ end
54
+
47
55
  def action_name
48
56
  "test_action"
49
57
  end
@@ -51,27 +59,9 @@ module ExceptionHandling
51
59
  def complete_request_uri
52
60
  "#{@request.protocol}#{@request.host}#{@request.request_uri}"
53
61
  end
54
- end
55
-
56
- class LoggingMethodsControllerStub < ControllerStubBase
57
- include ExceptionHandling::LoggingMethods
58
-
59
- def controller_name
60
- "LoggingMethodsControllerStub"
61
- end
62
- end
63
62
 
64
- class MethodsControllerStub < ControllerStubBase
65
63
  include ExceptionHandling::Methods
66
64
  set_long_controller_action_timeout 2
67
-
68
- def simulate_around_filter(&block)
69
- set_current_controller(&block)
70
- end
71
-
72
- def controller_name
73
- "MethodsControllerStub"
74
- end
75
65
  end
76
66
  end
77
67
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ExceptionHandling
4
- VERSION = '2.16.0'
4
+ VERSION = '3.0.pre.1'
5
5
  end
@@ -1,21 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'digest'
4
3
  require 'timeout'
5
4
  require 'active_support'
6
- require 'active_support/core_ext'
5
+ require 'active_support/core_ext/hash'
7
6
  require 'contextual_logger'
8
7
 
9
8
  require 'invoca/utils'
10
9
 
11
- require 'exception_handling/mailer'
12
- require 'exception_handling/sensu'
13
- require 'exception_handling/methods'
14
- require 'exception_handling/log_stub_error'
15
- require 'exception_handling/exception_description'
16
- require 'exception_handling/exception_catalog'
17
- require 'exception_handling/exception_info'
18
- require 'exception_handling/escalate_callback'
10
+ require "exception_handling/mailer"
11
+ require "exception_handling/sensu"
12
+ require "exception_handling/methods"
13
+ require "exception_handling/log_stub_error"
14
+ require "exception_handling/exception_description"
15
+ require "exception_handling/exception_catalog"
16
+ require "exception_handling/exception_info"
17
+ require "exception_handling/honeybadger_callbacks.rb"
19
18
 
20
19
  _ = ActiveSupport::HashWithIndifferentAccess
21
20
 
@@ -30,8 +29,6 @@ module ExceptionHandling # never included
30
29
  AUTHENTICATION_HEADERS = ['HTTP_AUTHORIZATION', 'X-HTTP_AUTHORIZATION', 'X_HTTP_AUTHORIZATION', 'REDIRECT_X_HTTP_AUTHORIZATION'].freeze
31
30
  HONEYBADGER_STATUSES = [:success, :failure, :skipped].freeze
32
31
 
33
- Deprecation3_0 = ActiveSupport::Deprecation.new('3.0', 'exception_handling')
34
-
35
32
  class << self
36
33
 
37
34
  #
@@ -53,28 +50,15 @@ module ExceptionHandling # never included
53
50
  @exception_recipients or raise ArgumentError, "You must assign a value to #{name}.exception_recipients"
54
51
  end
55
52
 
56
- def configured?
57
- !@logger.nil?
58
- end
59
-
60
53
  def logger
61
54
  @logger or raise ArgumentError, "You must assign a value to #{name}.logger"
62
55
  end
63
56
 
64
57
  def logger=(logger)
65
- @logger = if logger.nil? || logger.is_a?(ContextualLogger::LoggerMixin)
66
- logger
67
- else
68
- Deprecation3_0.deprecation_warning('implicit extend with ContextualLogger::LoggerMixin', 'extend your logger instance or include into your logger class first')
69
- logger.extend(ContextualLogger::LoggerMixin)
70
- end
71
- EscalateCallback.register_if_configured!
58
+ @logger = logger.is_a?(ContextualLogger) ? logger : ContextualLogger.new(logger)
72
59
  end
73
60
 
74
- def default_metric_name(exception_data, exception, treat_like_warning, include_prefix: true)
75
- include_prefix and Deprecation3_0.deprecation_warning("the 'expection_handling.' prefix in ExceptionHandling::default_metric_name",
76
- "do not rely on metric names including the 'exception_handling.' prefix.")
77
-
61
+ def default_metric_name(exception_data, exception, treat_like_warning)
78
62
  metric_name = if exception_data['metric_name']
79
63
  exception_data['metric_name']
80
64
  elsif exception.is_a?(ExceptionHandling::Warning)
@@ -86,7 +70,7 @@ module ExceptionHandling # never included
86
70
  "exception"
87
71
  end
88
72
 
89
- "#{'exception_handling.' if include_prefix}#{metric_name}"
73
+ "exception_handling.#{metric_name}"
90
74
  end
91
75
 
92
76
  def default_honeybadger_metric_name(honeybadger_status)
@@ -114,7 +98,6 @@ module ExceptionHandling # never included
114
98
  attr_reader :filter_list_filename
115
99
  attr_reader :eventmachine_safe
116
100
  attr_reader :eventmachine_synchrony
117
- attr_reader :honeybadger_auto_tagger
118
101
 
119
102
  @filter_list_filename = "./config/exception_filters.yml"
120
103
  @email_environment = ""
@@ -155,14 +138,6 @@ module ExceptionHandling # never included
155
138
  @exception_catalog ||= ExceptionCatalog.new(@filter_list_filename)
156
139
  end
157
140
 
158
- # rubocop:disable Style/TrivialAccessors
159
- # @param value [Proc|nil] Proc that accepts 1 parameter that will be the exception object or nil to disable the auto-tagger.
160
- # The proc is always expected to return an array of strings. The array can be empty.
161
- def honeybadger_auto_tagger=(value)
162
- @honeybadger_auto_tagger = value
163
- end
164
- # rubocop:enable Style/TrivialAccessors
165
-
166
141
  #
167
142
  # internal settings (don't set directly)
168
143
  #
@@ -202,18 +177,13 @@ module ExceptionHandling # never included
202
177
  # Called directly by our code, usually from rescue blocks.
203
178
  # Writes to log file and may send to honeybadger
204
179
  #
205
- # TODO: the **log_context means we can never have context named treat_like_warning. In general, keyword args will be conflated with log_context.
206
- # Ideally we'd separate to log_context from the other keywords so they don't interfere in any way. Or have no keyword args.
207
- #
208
180
  # Functional Test Operation:
209
181
  # Calls into handle_stub_log_error and returns. no log file. no honeybadger
210
182
  #
211
- def log_error(exception_or_string, exception_context = '', controller = nil, treat_like_warning: false, **log_context, &data_callback)
183
+ def log_error(exception_or_string, exception_context = '', treat_like_warning: false, **log_context, &data_callback)
212
184
  ex = make_exception(exception_or_string)
213
185
  timestamp = set_log_error_timestamp
214
- exception_info = ExceptionInfo.new(ex, exception_context, timestamp,
215
- controller: controller || current_controller, data_callback: data_callback,
216
- log_context: log_context)
186
+ exception_info = ExceptionInfo.new(ex, exception_context, timestamp, current_controller, data_callback)
217
187
 
218
188
  if stub_handler
219
189
  stub_handler.handle_stub_log_error(exception_info.data)
@@ -240,13 +210,7 @@ module ExceptionHandling # never included
240
210
  #
241
211
  def write_exception_to_log(ex, exception_context, timestamp, log_context = {})
242
212
  ActiveSupport::Deprecation.silence do
243
- log_message = "#{exception_context}\n#{ex.class}: (#{encode_utf8(ex.message.to_s)}):\n " + clean_backtrace(ex).join("\n ") + "\n\n"
244
-
245
- if ex.is_a?(Warning)
246
- ExceptionHandling.logger.warn("\nExceptionHandlingWarning (Warning:#{timestamp}) #{log_message}", **log_context)
247
- else
248
- ExceptionHandling.logger.fatal("\nExceptionHandlingError (Error:#{timestamp}) #{log_message}", **log_context)
249
- end
213
+ ExceptionHandling.logger.fatal("\nExceptionHandlingError (Error:#{timestamp}) #{ex.class} #{exception_context} (#{encode_utf8(ex.message.to_s)}):\n " + clean_backtrace(ex).join("\n ") + "\n\n", log_context)
250
214
  end
251
215
  end
252
216
 
@@ -279,16 +243,11 @@ module ExceptionHandling # never included
279
243
  def send_exception_to_honeybadger(exception_info)
280
244
  exception = exception_info.exception
281
245
  exception_description = exception_info.exception_description
282
-
283
- # Note: Both commas and spaces are treated as delimiters for the :tags string. Space-delimiters are not officially documented.
284
- # https://github.com/honeybadger-io/honeybadger-ruby/pull/422
285
- tags = (honeybadger_auto_tags(exception) + exception_info.honeybadger_tags).join(' ')
286
246
  response = Honeybadger.notify(error_class: exception_description ? exception_description.filter_name : exception.class.name,
287
247
  error_message: exception.message.to_s,
288
248
  exception: exception,
289
249
  context: exception_info.honeybadger_context_data,
290
- controller: exception_info.controller_name,
291
- tags: tags)
250
+ controller: exception_info.controller_name)
292
251
  response ? :success : :failure
293
252
  rescue Exception => ex
294
253
  warn("ExceptionHandling.send_exception_to_honeybadger rescued exception while logging #{exception_info.exception_context}:\n#{exception.class}: #{exception.message}:\n#{ex.class}: #{ex.message}\n#{ex.backtrace.join("\n")}")
@@ -296,18 +255,6 @@ module ExceptionHandling # never included
296
255
  :failure
297
256
  end
298
257
 
299
- # @param exception [Exception]
300
- #
301
- # @return [Array<String>]
302
- def honeybadger_auto_tags(exception)
303
- @honeybadger_auto_tagger&.call(exception) || []
304
- rescue => ex
305
- traces = ex.backtrace.join("\n")
306
- message = "Unable to execute honeybadger_auto_tags callback. #{ExceptionHandling.encode_utf8(ex.message.to_s)} #{traces}\n"
307
- ExceptionHandling.log_info(message)
308
- []
309
- end
310
-
311
258
  #
312
259
  # Check if Honeybadger defined.
313
260
  #
@@ -318,41 +265,38 @@ module ExceptionHandling # never included
318
265
  #
319
266
  # Expects passed in hash to only include keys which be directly set on the Honeybadger config
320
267
  #
321
- def enable_honeybadger(**config)
268
+ def enable_honeybadger(config = {})
322
269
  Bundler.require(:honeybadger)
270
+ HoneybadgerCallbacks.register_callbacks
323
271
  Honeybadger.configure do |config_klass|
324
272
  config.each do |k, v|
325
- if k == :before_notify
326
- config_klass.send(k, v)
327
- else
328
- config_klass.send(:"#{k}=", v)
329
- end
273
+ config_klass.send(:"#{k}=", v)
330
274
  end
331
275
  end
332
276
  end
333
277
 
334
- def log_warning(message, **log_context)
278
+ def log_warning(message, log_context = {})
335
279
  warning = Warning.new(message)
336
280
  warning.set_backtrace([])
337
281
  log_error(warning, **log_context)
338
282
  end
339
283
 
340
- def log_info(message, **log_context)
341
- ExceptionHandling.logger.info(message, **log_context)
284
+ def log_info(message, log_context = {})
285
+ ExceptionHandling.logger.info(message, log_context)
342
286
  end
343
287
 
344
- def log_debug(message, **log_context)
345
- ExceptionHandling.logger.debug(message, **log_context)
288
+ def log_debug(message, log_context = {})
289
+ ExceptionHandling.logger.debug(message, log_context)
346
290
  end
347
291
 
348
- def ensure_safe(exception_context = "", **log_context)
292
+ def ensure_safe(exception_context = "", log_context = {})
349
293
  yield
350
294
  rescue => ex
351
295
  log_error(ex, exception_context, **log_context)
352
296
  nil
353
297
  end
354
298
 
355
- def ensure_completely_safe(exception_context = "", **log_context)
299
+ def ensure_completely_safe(exception_context = "", log_context = {})
356
300
  yield
357
301
  rescue SystemExit, SystemStackError, NoMemoryError, SecurityError, SignalException
358
302
  raise
@@ -367,29 +311,26 @@ module ExceptionHandling # never included
367
311
  escalate(email_subject, ex, last_exception_timestamp, production_support_recipients)
368
312
  end
369
313
 
370
- def escalate_error(exception_or_string, email_subject, custom_recipients = nil, **log_context)
314
+ def escalate_error(exception_or_string, email_subject, custom_recipients = nil, log_context = {})
371
315
  ex = make_exception(exception_or_string)
372
316
  log_error(ex, **log_context)
373
317
  escalate(email_subject, ex, last_exception_timestamp, custom_recipients)
374
318
  end
375
319
 
376
- def escalate_warning(message, email_subject, custom_recipients = nil, **log_context)
320
+ def escalate_warning(message, email_subject, custom_recipients = nil, log_context = {})
377
321
  ex = Warning.new(message)
378
322
  log_error(ex, **log_context)
379
323
  escalate(email_subject, ex, last_exception_timestamp, custom_recipients)
380
324
  end
381
325
 
382
- def ensure_escalation(email_subject, custom_recipients = nil, **log_context)
326
+ def ensure_escalation(email_subject, custom_recipients = nil, log_context = {})
383
327
  yield
384
328
  rescue => ex
385
- escalate_error(ex, email_subject, custom_recipients, **log_context)
329
+ escalate_error(ex, email_subject, custom_recipients, log_context)
386
330
  nil
387
331
  end
388
332
 
389
- deprecate :escalate_to_production_support, :escalate_error, :escalate_warning, :ensure_escalation,
390
- deprecator: ActiveSupport::Deprecation.new('3.0', 'ExceptionHandling')
391
-
392
- def alert_warning(exception_or_string, alert_name, exception_context, **log_context)
333
+ def alert_warning(exception_or_string, alert_name, exception_context, log_context)
393
334
  ex = make_exception(exception_or_string)
394
335
  log_error(ex, exception_context, **log_context)
395
336
  begin
@@ -399,10 +340,10 @@ module ExceptionHandling # never included
399
340
  end
400
341
  end
401
342
 
402
- def ensure_alert(alert_name, exception_context, **log_context)
343
+ def ensure_alert(alert_name, exception_context, log_context = {})
403
344
  yield
404
345
  rescue => ex
405
- alert_warning(ex, alert_name, exception_context, **log_context)
346
+ alert_warning(ex, alert_name, exception_context, log_context)
406
347
  nil
407
348
  end
408
349
 
@@ -419,7 +360,7 @@ module ExceptionHandling # never included
419
360
  result
420
361
  end
421
362
 
422
- def log_periodically(exception_key, interval, message, **log_context)
363
+ def log_periodically(exception_key, interval, message, log_context = {})
423
364
  self.periodic_exception_intervals ||= {}
424
365
  last_logged = self.periodic_exception_intervals[exception_key]
425
366
  if !last_logged || ((last_logged + interval) < Time.now)
@@ -522,6 +463,4 @@ module ExceptionHandling # never included
522
463
  end
523
464
  end
524
465
  end
525
-
526
- EscalateCallback.register_if_configured!
527
466
  end
@@ -0,0 +1,3 @@
1
+ #!/bin/sh -x
2
+
3
+ bundle install --path vendor/bundle
@@ -7,7 +7,7 @@ module ExceptionHelpers
7
7
 
8
8
  def exception_with_nil_message
9
9
  exception_with_nil_message = RuntimeError.new(nil)
10
- allow(exception_with_nil_message).to receive(:message).and_return(nil)
10
+ stub(exception_with_nil_message).message { nil }
11
11
  exception_with_nil_message
12
12
  end
13
13
 
@@ -15,6 +15,6 @@ module ExceptionHelpers
15
15
 
16
16
  def capture_notifications
17
17
  @sent_notifications = []
18
- allow(ExceptionHandling).to receive(:send_exception_to_honeybadger).with(any_args) { |exception_info| @sent_notifications << exception_info }
18
+ stub(ExceptionHandling).send_exception_to_honeybadger(anything) { |exception_info| @sent_notifications << exception_info }
19
19
  end
20
20
  end
@@ -1,9 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rspec'
4
- require 'rspec/mocks'
5
- require 'rspec_junit_formatter'
6
-
3
+ require 'active_support'
4
+ require 'active_support/time'
5
+ require 'active_support/test_case'
6
+ require 'active_model'
7
+ require 'action_mailer'
8
+ require 'action_dispatch'
9
+ require 'hobo_support'
10
+ require 'shoulda'
11
+ require 'rr'
12
+ require 'minitest/autorun'
7
13
  require 'pry'
8
14
  require 'honeybadger'
9
15
  require 'contextual_logger'
@@ -11,31 +17,26 @@ require 'contextual_logger'
11
17
  require 'exception_handling'
12
18
  require 'exception_handling/testing'
13
19
 
20
+ ActiveSupport::TestCase.test_order = :sorted
21
+
14
22
  class LoggerStub
15
- include ContextualLogger::LoggerMixin
16
- attr_accessor :logged, :level
23
+ include ContextualLogger
24
+ attr_accessor :logged
17
25
 
18
26
  def initialize
19
- @level = Logger::Severity::DEBUG
20
- @progname = nil
21
- @logdev = nil
22
27
  clear
23
28
  end
24
29
 
25
- def debug(message, log_context = {})
26
- logged << { message: message, context: log_context, severity: 'DEBUG' }
27
- end
28
-
29
30
  def info(message, log_context = {})
30
- logged << { message: message, context: log_context, severity: 'INFO' }
31
+ logged << { message: message, context: log_context }
31
32
  end
32
33
 
33
34
  def warn(message, log_context = {})
34
- logged << { message: message, context: log_context, severity: 'WARN' }
35
+ logged << { message: message, context: log_context }
35
36
  end
36
37
 
37
38
  def fatal(message, log_context = {})
38
- logged << { message: message, context: log_context, severity: 'FATAL' }
39
+ logged << { message: message, context: log_context }
39
40
  end
40
41
 
41
42
  def clear
@@ -76,17 +77,27 @@ end
76
77
 
77
78
  ActionMailer::Base.delivery_method = :test
78
79
 
80
+ _ = ActiveSupport
81
+ _ = ActiveSupport::TestCase
79
82
 
80
- module TestHelper
81
- @constant_overrides = []
82
- class << self
83
- attr_accessor :constant_overrides
84
- end
83
+ class ActiveSupport::TestCase
84
+ @@constant_overrides = []
85
+
86
+ setup do
87
+ unless @@constant_overrides.nil? || @@constant_overrides.empty?
88
+ raise "Uh-oh! constant_overrides left over: #{@@constant_overrides.inspect}"
89
+ end
85
90
 
91
+ unless defined?(Rails) && defined?(Rails.env)
92
+ module ::Rails
93
+ class << self
94
+ attr_writer :env
86
95
 
87
- def setup_constant_overrides
88
- unless TestHelper.constant_overrides.nil? || TestHelper.constant_overrides.empty?
89
- raise "Uh-oh! constant_overrides left over: #{TestHelper.constant_overrides.inspect}"
96
+ def env
97
+ @env ||= 'test'
98
+ end
99
+ end
100
+ end
90
101
  end
91
102
 
92
103
  Time.now_override = nil
@@ -106,8 +117,8 @@ module TestHelper
106
117
  ExceptionHandling.sensu_prefix = ""
107
118
  end
108
119
 
109
- def teardown_constant_overrides
110
- TestHelper.constant_overrides&.reverse&.each do |parent_module, k, v|
120
+ teardown do
121
+ @@constant_overrides&.reverse&.each do |parent_module, k, v|
111
122
  ExceptionHandling.ensure_safe "constant cleanup #{k.inspect}, #{parent_module}(#{parent_module.class})::#{v.inspect}(#{v.class})" do
112
123
  silence_warnings do
113
124
  if v == :never_defined
@@ -118,7 +129,7 @@ module TestHelper
118
129
  end
119
130
  end
120
131
  end
121
- TestHelper.constant_overrides = []
132
+ @@constant_overrides = []
122
133
  end
123
134
 
124
135
  def set_test_const(const_name, value)
@@ -138,7 +149,7 @@ module TestHelper
138
149
  end
139
150
  end
140
151
 
141
- TestHelper.constant_overrides << [final_parent_module, final_const_name, original_value]
152
+ @@constant_overrides << [final_parent_module, final_const_name, original_value]
142
153
 
143
154
  silence_warnings { final_parent_module.const_set(final_const_name, value) }
144
155
  end
@@ -150,15 +161,15 @@ module TestHelper
150
161
  else
151
162
  original_count = 0
152
163
  end
153
- expect(ActionMailer::Base.deliveries.size - original_count).to eq(expected), "wrong number of emails#{': ' + message.to_s if message}"
164
+ assert_equal expected, ActionMailer::Base.deliveries.size - original_count, "wrong number of emails#{': ' + message.to_s if message}"
154
165
  end
155
166
  end
156
167
 
157
168
  def assert_equal_with_diff(arg1, arg2, msg = '')
158
169
  if arg1 == arg2
159
- expect(true).to be_truthy # To keep the assertion count accurate
170
+ assert true # To keep the assertion count accurate
160
171
  else
161
- expect(arg1).to eq(arg2), "#{msg}\n#{Diff.compare(arg1, arg2)}"
172
+ assert_equal arg1, arg2, "#{msg}\n#{Diff.compare(arg1, arg2)}"
162
173
  end
163
174
  end
164
175
 
@@ -189,35 +200,3 @@ class Time
189
200
  end
190
201
  end
191
202
  end
192
-
193
- RSpec.configure do |config|
194
- config.add_formatter(RspecJunitFormatter, 'spec/reports/rspec.xml')
195
- config.include TestHelper
196
-
197
- config.before(:each) do
198
- setup_constant_overrides
199
- unless defined?(Rails) && defined?(Rails.env)
200
- module Rails
201
- class << self
202
- attr_writer :env
203
-
204
- def env
205
- @env ||= 'test'
206
- end
207
- end
208
- end
209
- end
210
- end
211
-
212
- config.after(:each) do
213
- teardown_constant_overrides
214
- end
215
-
216
- config.mock_with :rspec do |mocks|
217
- mocks.verify_partial_doubles = true
218
- end
219
-
220
- config.expect_with(:rspec, :test_unit)
221
-
222
- RSpec::Support::ObjectFormatter.default_instance.max_formatted_output_length = 2_000
223
- end