Skip to content

Commit

Permalink
Add prototype for custom test reporter for minitest
Browse files Browse the repository at this point in the history
  • Loading branch information
andyw8 committed Feb 14, 2025
1 parent c4d7e7b commit 30a66c9
Show file tree
Hide file tree
Showing 3 changed files with 176 additions and 0 deletions.
95 changes: 95 additions & 0 deletions lib/minitest/reporters/ruby_lsp_reporter.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# typed: strict
# frozen_string_literal: true

require "ruby_lsp/test_reporting"

module Minitest
module Reporters
class RubyLspReporter < ::Minitest::Reporters::BaseReporter
extend T::Sig

sig { void }
def initialize
@reporting = T.let(RubyLsp::TestReporting.new, RubyLsp::TestReporting)
super
end

sig { params(test: Minitest::Test).void }
def before_test(test)
@reporting.before_test(
class_name: T.must(test.class.name),
test_name: test.name,
file: file_for_class_name(test),
)
super
end

sig { params(test: Minitest::Test).void }
def after_test(test)
@reporting.after_test(
class_name: T.must(test.class.name),
test_name: test.name,
file: file_for_class_name(test),
)
super
end

sig { params(test: Minitest::Result).void }
def record(test)
super

# This follows the pattern used by Minitest::Reporters::DefaultReporter
on_record(test)
end

sig { params(test: Minitest::Result).void }
def on_record(test)
if test.passed?
record_pass(test)
elsif test.skipped?
record_skip(test)
elsif test.failure
record_fail(test)
end
end

sig { params(result: Minitest::Result).void }
def record_pass(result)
info = {
test_name: result.name,
class_name: result.klass,
file: result.source_location[0],
}
@reporting.record_pass(**info)
end

sig { params(result: Minitest::Result).void }
def record_skip(result)
info = {
test_name: result.name,
class_name: result.klass,
message: result.failure.message,
file: result.source_location[0],
}
@reporting.record_skip(**info)
end

sig { params(result: Minitest::Result).void }
def record_fail(result)
info = {
class_name: result.klass,
test_name: result.name,
type: result.failure.class.name,
message: result.failure.message,
file: result.source_location[0],
}
@reporting.record_fail(**info)
end

sig { params(test: Minitest::Test).returns(String) }
def file_for_class_name(test)
T.must(Kernel.const_source_location(test.class_name)).first
end
end
end
end
75 changes: 75 additions & 0 deletions lib/ruby_lsp/test_reporting.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# typed: strict
# frozen_string_literal: true

require "json"

module RubyLsp
class TestReporting
extend T::Sig

sig { params(class_name: String, test_name: String, file: String).void }
def before_test(class_name:, test_name:, file:)
full_name = "#{class_name}##{test_name}"
result = {
event: "before_test",
full_name: full_name,
file: file,
}
puts result.to_json
end

sig { params(class_name: String, test_name: String, file: String).void }
def after_test(class_name:, test_name:, file:)
full_name = "#{class_name}##{test_name}"
result = {
event: "after_test",
full_name: full_name,
file: file,
}
puts result.to_json
end

sig { params(class_name: String, test_name: String, file: String).void }
def record_pass(class_name:, test_name:, file:)
full_name = "#{class_name}##{test_name}"
result = {
event: "pass",
full_name: full_name,
file: file,
}
puts result.to_json
end

sig do
params(
class_name: String,
test_name: String,
type: T.untyped, # TODO: what type should this be?
message: String,
file: String,
).void
end
def record_fail(class_name:, test_name:, type:, message:, file:)
result = {
event: "fail",
type: type,
message: message,
class_name: class_name,
test_name: test_name,
file: file,
}
puts result.to_json
end

sig { params(class_name: String, test_name: String, message: T.nilable(String), file: String).void }
def record_skip(class_name:, test_name:, message:, file:)
result = {
event: "skip",
message: message,
classname: class_name,
file: file,
}
puts result.to_json
end
end
end
6 changes: 6 additions & 0 deletions test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,12 @@
end
Minitest::Reporters.use!(minitest_reporter)

# Temporary for verification
if ENV["RUBY_LSP"]
require "minitest/reporters/ruby_lsp_reporter"
Minitest::Reporters.use!(Minitest::Reporters::RubyLspReporter.new)
end

module Minitest
class Test
extend T::Sig
Expand Down

0 comments on commit 30a66c9

Please sign in to comment.