discourse/spec/lib/turbo_tests/flaky/manager_spec.rb
Alan Guo Xiang Tan c437b9f5f2
DEV: Include exception details for each test in flaky tests report (#24892)
Why this change?

The exception message and name is useful when analyzing why a test
failed.
2023-12-14 11:11:11 +08:00

130 lines
4.4 KiB
Ruby

# frozen_string_literal: true
RSpec.describe TurboTests::Flaky::Manager do
fab!(:rspec_example_1) do
RSpec::Core::Example
.describe
.example("rspec example 1")
.tap do |example|
example.execution_result.status = :failed
example.execution_result.exception =
StandardError
.new(
"some error\n\n#{TurboTests::Flaky::FailedExample::SCREENSHOT_PREFIX}/some/path/to/screenshot.png",
)
.tap { |exception| exception.set_backtrace(["some backtrace"]) }
end
end
fab!(:rspec_example_2) do
RSpec::Core::Example
.describe
.example("rspec example 2")
.tap do |example|
example.execution_result.status = :failed
example.execution_result.exception =
StandardError
.new("some error")
.tap { |exception| exception.set_backtrace(["some backtrace"]) }
end
end
fab!(:fake_example_1) do
TurboTests::FakeExample.from_obj(
TurboTests::JsonExample.new(rspec_example_1).to_json,
process_id: 1,
command_string: "some command string",
)
end
fab!(:fake_example_2) do
TurboTests::FakeExample.from_obj(
TurboTests::JsonExample.new(rspec_example_2).to_json,
process_id: 2,
command_string: "some other command string",
)
end
def with_fake_path
tmp_file = Tempfile.new
stub_const(TurboTests::Flaky::Manager, "PATH", tmp_file.path) { yield }
ensure
tmp_file.delete
end
describe ".potential_flaky_tests" do
it "should return the failed examples' `location_rerun_argument`" do
with_fake_path do
TurboTests::Flaky::Manager.log_potential_flaky_tests([fake_example_1, fake_example_2])
expect(TurboTests::Flaky::Manager.potential_flaky_tests).to eq(
%w[
./spec/lib/turbo_tests/flaky/manager_spec.rb:7
./spec/lib/turbo_tests/flaky/manager_spec.rb:22
],
)
end
end
end
describe ".log_potential_flaky_tests" do
it "should log the failed examples correctly" do
with_fake_path do
TurboTests::Flaky::Manager.log_potential_flaky_tests([fake_example_1, fake_example_2])
expect(JSON.parse(File.read(TurboTests::Flaky::Manager::PATH))).to eq(
[
{
"message_lines" =>
"Failure/Error: Unable to infer file and line number from backtrace\n\nStandardError:\n some error\n\n [Screenshot Image]: /some/path/to/screenshot.png",
"description" => "rspec example 1",
"exception_message" =>
"some error\n\n[Screenshot Image]: /some/path/to/screenshot.png",
"exception_name" => "StandardError",
"backtrace" => ["some backtrace"],
"failure_screenshot_path" => "/some/path/to/screenshot.png",
"location_rerun_argument" => "./spec/lib/turbo_tests/flaky/manager_spec.rb:7",
"rerun_command" => "some command string",
},
{
"message_lines" =>
"Failure/Error: Unable to infer file and line number from backtrace\n\nStandardError:\n some error",
"description" => "rspec example 2",
"exception_message" => "some error",
"exception_name" => "StandardError",
"backtrace" => ["some backtrace"],
"failure_screenshot_path" => nil,
"location_rerun_argument" => "./spec/lib/turbo_tests/flaky/manager_spec.rb:22",
"rerun_command" => "some other command string",
},
],
)
end
end
end
describe ".remove_example" do
it "should remove the from the log file" do
with_fake_path do
TurboTests::Flaky::Manager.log_potential_flaky_tests([fake_example_1, fake_example_2])
TurboTests::Flaky::Manager.remove_example([rspec_example_1])
parsed_json = JSON.parse(File.read(TurboTests::Flaky::Manager::PATH))
expect(parsed_json.size).to eq(1)
expect(parsed_json.first["description"]).to eq("rspec example 2")
end
end
it "should delete the log file if there are no more examples" do
with_fake_path do
TurboTests::Flaky::Manager.log_potential_flaky_tests([fake_example_1, fake_example_2])
TurboTests::Flaky::Manager.remove_example([rspec_example_1, rspec_example_2])
expect(File.exist?(TurboTests::Flaky::Manager::PATH)).to eq(false)
end
end
end
end