2019-12-04 20:38:33 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2021-04-17 20:07:23 +05:30
|
|
|
require_relative '../../support/helpers/stub_env'
|
2022-01-26 12:08:38 +05:30
|
|
|
require_relative '../../support/time_travel'
|
2021-04-17 20:07:23 +05:30
|
|
|
|
|
|
|
require_relative '../../../tooling/rspec_flaky/flaky_example'
|
2018-03-17 18:26:18 +05:30
|
|
|
|
2020-07-28 23:09:34 +05:30
|
|
|
RSpec.describe RspecFlaky::FlakyExample, :aggregate_failures do
|
2021-04-17 20:07:23 +05:30
|
|
|
include ActiveSupport::Testing::TimeHelpers
|
|
|
|
include StubENV
|
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
let(:flaky_example_attrs) do
|
|
|
|
{
|
|
|
|
example_id: 'spec/foo/bar_spec.rb:2',
|
|
|
|
file: 'spec/foo/bar_spec.rb',
|
|
|
|
line: 2,
|
|
|
|
description: 'hello world',
|
|
|
|
first_flaky_at: 1234,
|
|
|
|
last_flaky_at: 2345,
|
2019-12-04 20:38:33 +05:30
|
|
|
last_flaky_job: 'https://gitlab.com/gitlab-org/gitlab-foss/-/jobs/12',
|
2018-03-17 18:26:18 +05:30
|
|
|
last_attempts_count: 2,
|
|
|
|
flaky_reports: 1
|
|
|
|
}
|
|
|
|
end
|
2020-10-24 23:57:45 +05:30
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
let(:example_attrs) do
|
|
|
|
{
|
|
|
|
uid: 'abc123',
|
|
|
|
example_id: flaky_example_attrs[:example_id],
|
|
|
|
file: flaky_example_attrs[:file],
|
|
|
|
line: flaky_example_attrs[:line],
|
|
|
|
description: flaky_example_attrs[:description],
|
|
|
|
status: 'passed',
|
|
|
|
exception: 'BOOM!',
|
|
|
|
attempts: flaky_example_attrs[:last_attempts_count]
|
|
|
|
}
|
|
|
|
end
|
2020-10-24 23:57:45 +05:30
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
before do
|
|
|
|
# Stub these env variables otherwise specs don't behave the same on the CI
|
2022-01-26 12:08:38 +05:30
|
|
|
stub_env('CI_JOB_URL', nil)
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
|
|
|
|
2022-01-26 12:08:38 +05:30
|
|
|
describe '#initialize', :freeze_time do
|
2018-03-17 18:26:18 +05:30
|
|
|
shared_examples 'a valid FlakyExample instance' do
|
|
|
|
let(:flaky_example) { described_class.new(args) }
|
|
|
|
|
|
|
|
it 'returns valid attributes' do
|
2022-01-26 12:08:38 +05:30
|
|
|
attrs = flaky_example.to_h
|
|
|
|
|
|
|
|
expect(attrs[:uid]).to eq(flaky_example_attrs[:uid])
|
|
|
|
expect(attrs[:file]).to eq(flaky_example_attrs[:file])
|
|
|
|
expect(attrs[:line]).to eq(flaky_example_attrs[:line])
|
|
|
|
expect(attrs[:description]).to eq(flaky_example_attrs[:description])
|
|
|
|
expect(attrs[:first_flaky_at]).to eq(expected_first_flaky_at)
|
|
|
|
expect(attrs[:last_flaky_at]).to eq(expected_last_flaky_at)
|
|
|
|
expect(attrs[:last_attempts_count]).to eq(flaky_example_attrs[:last_attempts_count])
|
|
|
|
expect(attrs[:flaky_reports]).to eq(expected_flaky_reports)
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-01-26 12:08:38 +05:30
|
|
|
context 'when given an Example hash' do
|
2018-03-17 18:26:18 +05:30
|
|
|
it_behaves_like 'a valid FlakyExample instance' do
|
2022-01-26 12:08:38 +05:30
|
|
|
let(:args) { example_attrs }
|
|
|
|
let(:expected_first_flaky_at) { Time.now }
|
|
|
|
let(:expected_last_flaky_at) { Time.now }
|
2018-03-17 18:26:18 +05:30
|
|
|
let(:expected_flaky_reports) { 0 }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-01-26 12:08:38 +05:30
|
|
|
context 'when given a FlakyExample hash' do
|
2018-03-17 18:26:18 +05:30
|
|
|
it_behaves_like 'a valid FlakyExample instance' do
|
|
|
|
let(:args) { flaky_example_attrs }
|
|
|
|
let(:expected_flaky_reports) { flaky_example_attrs[:flaky_reports] }
|
|
|
|
let(:expected_first_flaky_at) { flaky_example_attrs[:first_flaky_at] }
|
|
|
|
let(:expected_last_flaky_at) { flaky_example_attrs[:last_flaky_at] }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#update_flakiness!' do
|
|
|
|
shared_examples 'an up-to-date FlakyExample instance' do
|
|
|
|
let(:flaky_example) { described_class.new(args) }
|
|
|
|
|
2021-04-17 20:07:23 +05:30
|
|
|
it 'sets the first_flaky_at if none exists' do
|
|
|
|
args[:first_flaky_at] = nil
|
2018-03-17 18:26:18 +05:30
|
|
|
|
2021-04-17 20:07:23 +05:30
|
|
|
freeze_time do
|
|
|
|
flaky_example.update_flakiness!
|
|
|
|
|
2022-01-26 12:08:38 +05:30
|
|
|
expect(flaky_example.to_h[:first_flaky_at]).to eq(Time.now)
|
2021-04-17 20:07:23 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'maintains the first_flaky_at if exists' do
|
|
|
|
flaky_example.update_flakiness!
|
2022-01-26 12:08:38 +05:30
|
|
|
expected_first_flaky_at = flaky_example.to_h[:first_flaky_at]
|
2021-04-17 20:07:23 +05:30
|
|
|
|
|
|
|
travel_to(Time.now + 42) do
|
|
|
|
flaky_example.update_flakiness!
|
2022-01-26 12:08:38 +05:30
|
|
|
expect(flaky_example.to_h[:first_flaky_at]).to eq(expected_first_flaky_at)
|
2021-04-17 20:07:23 +05:30
|
|
|
end
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
it 'updates the last_flaky_at' do
|
2021-04-17 20:07:23 +05:30
|
|
|
travel_to(Time.now + 42) do
|
|
|
|
the_future = Time.now
|
|
|
|
flaky_example.update_flakiness!
|
2018-03-17 18:26:18 +05:30
|
|
|
|
2022-01-26 12:08:38 +05:30
|
|
|
expect(flaky_example.to_h[:last_flaky_at]).to eq(the_future)
|
2021-04-17 20:07:23 +05:30
|
|
|
end
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
it 'updates the flaky_reports' do
|
2022-01-26 12:08:38 +05:30
|
|
|
expected_flaky_reports = flaky_example.to_h[:first_flaky_at] ? flaky_example.to_h[:flaky_reports] + 1 : 1
|
2018-03-17 18:26:18 +05:30
|
|
|
|
2022-01-26 12:08:38 +05:30
|
|
|
expect { flaky_example.update_flakiness! }.to change { flaky_example.to_h[:flaky_reports] }.by(1)
|
|
|
|
expect(flaky_example.to_h[:flaky_reports]).to eq(expected_flaky_reports)
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
context 'when passed a :last_attempts_count' do
|
|
|
|
it 'updates the last_attempts_count' do
|
|
|
|
flaky_example.update_flakiness!(last_attempts_count: 42)
|
|
|
|
|
2022-01-26 12:08:38 +05:30
|
|
|
expect(flaky_example.to_h[:last_attempts_count]).to eq(42)
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when run on the CI' do
|
2022-01-26 12:08:38 +05:30
|
|
|
let(:job_url) { 'https://gitlab.com/gitlab-org/gitlab-foss/-/jobs/42' }
|
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
before do
|
2022-01-26 12:08:38 +05:30
|
|
|
stub_env('CI_JOB_URL', job_url)
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
it 'updates the last_flaky_job' do
|
|
|
|
flaky_example.update_flakiness!
|
|
|
|
|
2022-01-26 12:08:38 +05:30
|
|
|
expect(flaky_example.to_h[:last_flaky_job]).to eq(job_url)
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-01-26 12:08:38 +05:30
|
|
|
context 'when given an Example hash' do
|
2018-03-17 18:26:18 +05:30
|
|
|
it_behaves_like 'an up-to-date FlakyExample instance' do
|
2022-01-26 12:08:38 +05:30
|
|
|
let(:args) { example_attrs }
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-01-26 12:08:38 +05:30
|
|
|
context 'when given a FlakyExample hash' do
|
2018-03-17 18:26:18 +05:30
|
|
|
it_behaves_like 'an up-to-date FlakyExample instance' do
|
|
|
|
let(:args) { flaky_example_attrs }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-01-26 12:08:38 +05:30
|
|
|
describe '#to_h', :freeze_time do
|
2018-03-17 18:26:18 +05:30
|
|
|
shared_examples 'a valid FlakyExample hash' do
|
|
|
|
let(:additional_attrs) { {} }
|
|
|
|
|
|
|
|
it 'returns a valid hash' do
|
|
|
|
flaky_example = described_class.new(args)
|
|
|
|
final_hash = flaky_example_attrs.merge(additional_attrs)
|
|
|
|
|
|
|
|
expect(flaky_example.to_h).to eq(final_hash)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-01-26 12:08:38 +05:30
|
|
|
context 'when given an Example hash' do
|
|
|
|
let(:args) { example_attrs }
|
2018-03-17 18:26:18 +05:30
|
|
|
|
|
|
|
it_behaves_like 'a valid FlakyExample hash' do
|
|
|
|
let(:additional_attrs) do
|
2022-01-26 12:08:38 +05:30
|
|
|
{ first_flaky_at: Time.now, last_flaky_at: Time.now, last_flaky_job: nil, flaky_reports: 0 }
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-01-26 12:08:38 +05:30
|
|
|
context 'when given a FlakyExample hash' do
|
2018-03-17 18:26:18 +05:30
|
|
|
let(:args) { flaky_example_attrs }
|
|
|
|
|
|
|
|
it_behaves_like 'a valid FlakyExample hash'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|