Skip to content

Commit

Permalink
test(backtrace_cleaner): add #clean specs
Browse files Browse the repository at this point in the history
  • Loading branch information
marian13 committed Dec 10, 2023
1 parent 14733f3 commit d6864cd
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 1 deletion.
5 changes: 4 additions & 1 deletion lib/convenient_service/logger.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ module ConvenientService
##
# @internal
# TODO: Custom matcher to track log messages.
# TODO: Fallback for logging methods. Just like with `#clean` in backtrace cleaner.
# TODO: Highlight vertical bars.
# TODO: Highlight tag brackets.
#
class Logger < ::Logger
include ::Singleton
Expand Down Expand Up @@ -92,7 +95,7 @@ def colored_formatter
#
# NOTE: Early return is NOT used, since it is NOT possible to return custom values from `writer` methods.
#
# NOTE: `Warning.warn` is chosen over `Kernel.warn` in order to have a simple to track delegation from RSpec.
# NOTE: `Warning.warn` is chosen over `Kernel.warn` in order to have a simple way to track delegation from RSpec.
# - https://ruby-doc.org/core-2.7.0/Warning.html#method-i-warn
#
# TODO: Tag/prefix for all Convenient Service logs.
Expand Down
29 changes: 29 additions & 0 deletions lib/convenient_service/support/backtrace_cleaner.rb
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,35 @@ def initialize(...)
def add_convenient_service_silencer
add_silencer { |line| /convenient_service/.match?(line) }
end

##
# Works exactly in the same way as the original `clean`, except it falls back to an empty array in case of any exceptions inside filters or silencers.
# Also returns an empty array, when `backtrace` is `nil`.
#
# @return [Array<String>]
#
# @see https://api.rubyonrails.org/classes/ActiveSupport/BacktraceCleaner.html#method-i-clean
#
# @internal
# IMPORTANT: Sometimes `exception.backtrace` can be `nil`.
# - https://blog.kalina.tech/2019/04/exception-without-backtrace-in-ruby.html
# - https://github.com/jruby/jruby/issues/4467
#
def clean(backtrace, *args)
if backtrace.nil?
::ConvenientService.logger.warn { "[BacktraceCleaner] `nil` backtrace | Empty array is used as fallback" }

return []
end

begin
super
rescue
::ConvenientService.logger.warn { "[BacktraceCleaner] Some filter or silencer is broken | Original backtrace is used as fallback" }

backtrace
end
end
end
end
end
56 changes: 56 additions & 0 deletions spec/lib/convenient_service/support/backtrace_cleaner_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# frozen_string_literal: true

require "spec_helper"

require "convenient_service"

# rubocop:disable RSpec/NestedGroups, RSpec/MultipleMemoizedHelpers
RSpec.describe ConvenientService::Support::BacktraceCleaner do
##
# example_group "class methods" do
# ##
# # NOTE: `.new` is tested indirectly by `add_convenient_service_silencer`.
# #
# describe ".new" do
# # ...
# end
# end
#
example_group "instance methods" do
let(:backtrace_cleaner) { described_class.new }
let(:backtrace) { ["foo", "convenient_service"] }

describe "#clean" do
it "calls super" do
backtrace_cleaner.clean(backtrace)

expect(backtrace_cleaner.clean(backtrace)).to eq(["foo"])
end

context "when backtrace is `nil`" do
let(:backtrace) { nil }

it "returns empty array" do
expect(backtrace_cleaner.clean(backtrace)).to eq([])
end

##
# TODO: `it "logs warning message"`.
#
end

context "when exception is raised" do
let(:backtrace) { Enumerator.new { raise ArgumentError } }

it "returns original backtrace" do
expect(backtrace_cleaner.clean(backtrace)).to eq(backtrace)
end

##
# TODO: `it "logs warning message"`.
#
end
end
end
end
# rubocop:enable RSpec/NestedGroups, RSpec/MultipleMemoizedHelpers

0 comments on commit d6864cd

Please sign in to comment.