discourse/lib/turbo_tests.rb

111 lines
2.6 KiB
Ruby

# frozen_string_literal: true
require "bundler/setup"
require "open3"
require "fileutils"
require "json"
require "rspec"
require "rails"
require File.expand_path("../../config/environment", __FILE__)
require "parallel_tests"
require "parallel_tests/rspec/runner"
require "./lib/turbo_tests/reporter"
require "./lib/turbo_tests/runner"
require "./lib/turbo_tests/json_rows_formatter"
require "./lib/turbo_tests/documentation_formatter"
RSpec.configure do |config|
# this is an unusual config option because it is used by the formatter, not just the runner
config.full_cause_backtrace = true
end
module TurboTests
class FakeException < Exception
attr_reader :backtrace, :message, :cause
def initialize(backtrace, message, cause)
@backtrace = backtrace
@message = message
@cause = cause
end
def self.from_obj(obj)
if obj
obj = obj.symbolize_keys
klass = Class.new(FakeException) { define_singleton_method(:name) { obj[:class_name] } }
klass.new(obj[:backtrace], obj[:message], FakeException.from_obj(obj[:cause]))
end
end
end
FakeExecutionResult =
Struct.new(
:example_skipped?,
:pending_message,
:status,
:pending_fixed?,
:exception,
:pending_exception,
)
class FakeExecutionResult
def self.from_obj(obj)
obj = obj.symbolize_keys
new(
obj[:example_skipped?],
obj[:pending_message],
obj[:status].to_sym,
obj[:pending_fixed?],
FakeException.from_obj(obj[:exception]),
FakeException.from_obj(obj[:pending_exception]),
)
end
end
FakeExample =
Struct.new(
:execution_result,
:location,
:description,
:full_description,
:metadata,
:location_rerun_argument,
:process_id,
:command_string,
)
class FakeExample
def self.from_obj(obj, process_id:, command_string:)
obj = obj.symbolize_keys
metadata = obj[:metadata].symbolize_keys
metadata[:shared_group_inclusion_backtrace].map! do |frame|
frame = frame.symbolize_keys
RSpec::Core::SharedExampleGroupInclusionStackFrame.new(
frame[:shared_group_name],
frame[:inclusion_location],
)
end
new(
FakeExecutionResult.from_obj(obj[:execution_result]),
obj[:location],
obj[:description],
obj[:full_description],
metadata,
obj[:location_rerun_argument],
process_id,
command_string,
)
end
def notification
RSpec::Core::Notifications::ExampleNotification.for(self)
end
end
end