diff options
Diffstat (limited to 'spec/lib/gitlab/ci/reports')
-rw-r--r-- | spec/lib/gitlab/ci/reports/test_case_spec.rb | 23 | ||||
-rw-r--r-- | spec/lib/gitlab/ci/reports/test_failure_history_spec.rb | 45 | ||||
-rw-r--r-- | spec/lib/gitlab/ci/reports/test_reports_spec.rb | 6 | ||||
-rw-r--r-- | spec/lib/gitlab/ci/reports/test_suite_comparer_spec.rb | 146 | ||||
-rw-r--r-- | spec/lib/gitlab/ci/reports/test_suite_spec.rb | 4 |
5 files changed, 203 insertions, 21 deletions
diff --git a/spec/lib/gitlab/ci/reports/test_case_spec.rb b/spec/lib/gitlab/ci/reports/test_case_spec.rb index a142846fc18..668a475514e 100644 --- a/spec/lib/gitlab/ci/reports/test_case_spec.rb +++ b/spec/lib/gitlab/ci/reports/test_case_spec.rb @@ -2,13 +2,13 @@ require 'spec_helper' -RSpec.describe Gitlab::Ci::Reports::TestCase do +RSpec.describe Gitlab::Ci::Reports::TestCase, :aggregate_failures do describe '#initialize' do let(:test_case) { described_class.new(params) } context 'when required params are given' do let(:job) { build(:ci_build) } - let(:params) { attributes_for(:test_case).merge!(job: job) } + let(:params) { attributes_for(:report_test_case).merge!(job: job) } it 'initializes an instance', :aggregate_failures do expect { test_case }.not_to raise_error @@ -31,7 +31,7 @@ RSpec.describe Gitlab::Ci::Reports::TestCase do shared_examples 'param is missing' do |param| let(:job) { build(:ci_build) } - let(:params) { attributes_for(:test_case).merge!(job: job) } + let(:params) { attributes_for(:report_test_case).merge!(job: job) } it 'raises an error' do params.delete(param) @@ -55,7 +55,7 @@ RSpec.describe Gitlab::Ci::Reports::TestCase do context 'when attachment is present' do let_it_be(:job) { create(:ci_build) } - let(:attachment_test_case) { build(:test_case, :failed_with_attachment, job: job) } + let(:attachment_test_case) { build(:report_test_case, :failed_with_attachment, job: job) } it "initializes the attachment if present" do expect(attachment_test_case.attachment).to eq("some/path.png") @@ -71,7 +71,7 @@ RSpec.describe Gitlab::Ci::Reports::TestCase do end context 'when attachment is missing' do - let(:test_case) { build(:test_case) } + let(:test_case) { build(:report_test_case) } it '#has_attachment?' do expect(test_case.has_attachment?).to be_falsy @@ -82,4 +82,17 @@ RSpec.describe Gitlab::Ci::Reports::TestCase do end end end + + describe '#set_recent_failures' do + it 'sets the recent_failures information' do + test_case = build(:report_test_case) + + test_case.set_recent_failures(1, 'master') + + expect(test_case.recent_failures).to eq( + count: 1, + base_branch: 'master' + ) + end + end end diff --git a/spec/lib/gitlab/ci/reports/test_failure_history_spec.rb b/spec/lib/gitlab/ci/reports/test_failure_history_spec.rb new file mode 100644 index 00000000000..8df34eddffd --- /dev/null +++ b/spec/lib/gitlab/ci/reports/test_failure_history_spec.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::Ci::Reports::TestFailureHistory, :aggregate_failures do + include TestReportsHelper + + describe '#load!' do + let_it_be(:project) { create(:project) } + let(:failed_rspec) { create_test_case_rspec_failed } + let(:failed_java) { create_test_case_java_failed } + + subject(:load_history) { described_class.new([failed_rspec, failed_java], project).load! } + + before do + allow(Ci::TestCaseFailure) + .to receive(:recent_failures_count) + .with(project: project, test_case_keys: [failed_rspec.key, failed_java.key]) + .and_return( + failed_rspec.key => 2, + failed_java.key => 1 + ) + end + + it 'sets the recent failures for each matching failed test case in all test suites' do + load_history + + expect(failed_rspec.recent_failures).to eq(count: 2, base_branch: 'master') + expect(failed_java.recent_failures).to eq(count: 1, base_branch: 'master') + end + + context 'when feature flag is disabled' do + before do + stub_feature_flags(test_failure_history: false) + end + + it 'does not set recent failures' do + load_history + + expect(failed_rspec.recent_failures).to be_nil + expect(failed_java.recent_failures).to be_nil + end + end + end +end diff --git a/spec/lib/gitlab/ci/reports/test_reports_spec.rb b/spec/lib/gitlab/ci/reports/test_reports_spec.rb index 502859852f2..24c00de3731 100644 --- a/spec/lib/gitlab/ci/reports/test_reports_spec.rb +++ b/spec/lib/gitlab/ci/reports/test_reports_spec.rb @@ -110,7 +110,7 @@ RSpec.describe Gitlab::Ci::Reports::TestReports do end describe '#with_attachment' do - let(:test_case) { build(:test_case, :failed) } + let(:test_case) { build(:report_test_case, :failed) } subject { test_reports.with_attachment! } @@ -126,8 +126,8 @@ RSpec.describe Gitlab::Ci::Reports::TestReports do end context 'when test suites contain an attachment' do - let(:test_case_succes) { build(:test_case) } - let(:test_case_with_attachment) { build(:test_case, :failed_with_attachment) } + let(:test_case_succes) { build(:report_test_case) } + let(:test_case_with_attachment) { build(:report_test_case, :failed_with_attachment) } before do test_reports.get_suite('rspec').add_test_case(test_case_succes) diff --git a/spec/lib/gitlab/ci/reports/test_suite_comparer_spec.rb b/spec/lib/gitlab/ci/reports/test_suite_comparer_spec.rb index 6bb6771678a..c44d32ddb7d 100644 --- a/spec/lib/gitlab/ci/reports/test_suite_comparer_spec.rb +++ b/spec/lib/gitlab/ci/reports/test_suite_comparer_spec.rb @@ -2,11 +2,11 @@ require 'spec_helper' -RSpec.describe Gitlab::Ci::Reports::TestSuiteComparer do +RSpec.describe Gitlab::Ci::Reports::TestSuiteComparer, :aggregate_failures do include TestReportsHelper let(:comparer) { described_class.new(name, base_suite, head_suite) } - let(:name) { 'rpsec' } + let(:name) { 'rspec' } let(:base_suite) { Gitlab::Ci::Reports::TestSuite.new(name) } let(:head_suite) { Gitlab::Ci::Reports::TestSuite.new(name) } let(:test_case_success) { create_test_case_java_success } @@ -16,7 +16,7 @@ RSpec.describe Gitlab::Ci::Reports::TestSuiteComparer do describe '#new_failures' do subject { comparer.new_failures } - context 'when head sutie has a newly failed test case which does not exist in base' do + context 'when head suite has a newly failed test case which does not exist in base' do before do base_suite.add_test_case(test_case_success) head_suite.add_test_case(test_case_failed) @@ -27,7 +27,7 @@ RSpec.describe Gitlab::Ci::Reports::TestSuiteComparer do end end - context 'when head sutie still has a failed test case which failed in base' do + context 'when head suite still has a failed test case which failed in base' do before do base_suite.add_test_case(test_case_failed) head_suite.add_test_case(test_case_failed) @@ -38,7 +38,7 @@ RSpec.describe Gitlab::Ci::Reports::TestSuiteComparer do end end - context 'when head sutie has a success test case which failed in base' do + context 'when head suite has a success test case which failed in base' do before do base_suite.add_test_case(test_case_failed) head_suite.add_test_case(test_case_success) @@ -53,7 +53,7 @@ RSpec.describe Gitlab::Ci::Reports::TestSuiteComparer do describe '#existing_failures' do subject { comparer.existing_failures } - context 'when head sutie has a newly failed test case which does not exist in base' do + context 'when head suite has a newly failed test case which does not exist in base' do before do base_suite.add_test_case(test_case_success) head_suite.add_test_case(test_case_failed) @@ -64,7 +64,7 @@ RSpec.describe Gitlab::Ci::Reports::TestSuiteComparer do end end - context 'when head sutie still has a failed test case which failed in base' do + context 'when head suite still has a failed test case which failed in base' do before do base_suite.add_test_case(test_case_failed) head_suite.add_test_case(test_case_failed) @@ -75,7 +75,7 @@ RSpec.describe Gitlab::Ci::Reports::TestSuiteComparer do end end - context 'when head sutie has a success test case which failed in base' do + context 'when head suite has a success test case which failed in base' do before do base_suite.add_test_case(test_case_failed) head_suite.add_test_case(test_case_success) @@ -90,7 +90,7 @@ RSpec.describe Gitlab::Ci::Reports::TestSuiteComparer do describe '#resolved_failures' do subject { comparer.resolved_failures } - context 'when head sutie has a newly failed test case which does not exist in base' do + context 'when head suite has a newly failed test case which does not exist in base' do before do base_suite.add_test_case(test_case_success) head_suite.add_test_case(test_case_failed) @@ -105,7 +105,7 @@ RSpec.describe Gitlab::Ci::Reports::TestSuiteComparer do end end - context 'when head sutie still has a failed test case which failed in base' do + context 'when head suite still has a failed test case which failed in base' do before do base_suite.add_test_case(test_case_failed) head_suite.add_test_case(test_case_failed) @@ -120,7 +120,7 @@ RSpec.describe Gitlab::Ci::Reports::TestSuiteComparer do end end - context 'when head sutie has a success test case which failed in base' do + context 'when head suite has a success test case which failed in base' do before do base_suite.add_test_case(test_case_failed) head_suite.add_test_case(test_case_success) @@ -347,4 +347,128 @@ RSpec.describe Gitlab::Ci::Reports::TestSuiteComparer do end end end + + describe '#limited_tests' do + subject(:limited_tests) { comparer.limited_tests } + + context 'limits amount of tests returned' do + before do + stub_const("#{described_class}::DEFAULT_MAX_TESTS", 2) + stub_const("#{described_class}::DEFAULT_MIN_TESTS", 1) + end + + context 'prefers new over existing and resolved' do + before do + 3.times { add_new_failure } + 3.times { add_new_error } + 3.times { add_existing_failure } + 3.times { add_existing_error } + 3.times { add_resolved_failure } + 3.times { add_resolved_error } + end + + it 'returns 2 of each new category, and 1 of each resolved and existing' do + expect(limited_tests.new_failures.count).to eq(2) + expect(limited_tests.new_errors.count).to eq(2) + expect(limited_tests.existing_failures.count).to eq(1) + expect(limited_tests.existing_errors.count).to eq(1) + expect(limited_tests.resolved_failures.count).to eq(1) + expect(limited_tests.resolved_errors.count).to eq(1) + end + + it 'does not affect the overall count' do + expect(summary).to include(total: 18, resolved: 6, failed: 6, errored: 6) + end + end + + context 'prefers existing over resolved' do + before do + 3.times { add_existing_failure } + 3.times { add_existing_error } + 3.times { add_resolved_failure } + 3.times { add_resolved_error } + end + + it 'returns 2 of each existing category, and 1 of each resolved' do + expect(limited_tests.new_failures.count).to eq(0) + expect(limited_tests.new_errors.count).to eq(0) + expect(limited_tests.existing_failures.count).to eq(2) + expect(limited_tests.existing_errors.count).to eq(2) + expect(limited_tests.resolved_failures.count).to eq(1) + expect(limited_tests.resolved_errors.count).to eq(1) + end + + it 'does not affect the overall count' do + expect(summary).to include(total: 12, resolved: 6, failed: 3, errored: 3) + end + end + + context 'limits amount of resolved' do + before do + 3.times { add_resolved_failure } + 3.times { add_resolved_error } + end + + it 'returns 2 of each resolved category' do + expect(limited_tests.new_failures.count).to eq(0) + expect(limited_tests.new_errors.count).to eq(0) + expect(limited_tests.existing_failures.count).to eq(0) + expect(limited_tests.existing_errors.count).to eq(0) + expect(limited_tests.resolved_failures.count).to eq(2) + expect(limited_tests.resolved_errors.count).to eq(2) + end + + it 'does not affect the overall count' do + expect(summary).to include(total: 6, resolved: 6, failed: 0, errored: 0) + end + end + end + + def summary + { + total: comparer.total_count, + resolved: comparer.resolved_count, + failed: comparer.failed_count, + errored: comparer.error_count + } + end + + def add_new_failure + failed_case = create_test_case_rspec_failed(SecureRandom.hex) + head_suite.add_test_case(failed_case) + end + + def add_new_error + error_case = create_test_case_rspec_error(SecureRandom.hex) + head_suite.add_test_case(error_case) + end + + def add_existing_failure + failed_case = create_test_case_rspec_failed(SecureRandom.hex) + base_suite.add_test_case(failed_case) + head_suite.add_test_case(failed_case) + end + + def add_existing_error + error_case = create_test_case_rspec_error(SecureRandom.hex) + base_suite.add_test_case(error_case) + head_suite.add_test_case(error_case) + end + + def add_resolved_failure + case_name = SecureRandom.hex + failed_case = create_test_case_java_failed(case_name) + success_case = create_test_case_java_success(case_name) + base_suite.add_test_case(failed_case) + head_suite.add_test_case(success_case) + end + + def add_resolved_error + case_name = SecureRandom.hex + error_case = create_test_case_java_error(case_name) + success_case = create_test_case_java_success(case_name) + base_suite.add_test_case(error_case) + head_suite.add_test_case(success_case) + end + end end diff --git a/spec/lib/gitlab/ci/reports/test_suite_spec.rb b/spec/lib/gitlab/ci/reports/test_suite_spec.rb index 50d1595da73..1d6b39a7831 100644 --- a/spec/lib/gitlab/ci/reports/test_suite_spec.rb +++ b/spec/lib/gitlab/ci/reports/test_suite_spec.rb @@ -91,7 +91,7 @@ RSpec.describe Gitlab::Ci::Reports::TestSuite do subject { test_suite.with_attachment! } context 'when test cases do not contain an attachment' do - let(:test_case) { build(:test_case, :failed)} + let(:test_case) { build(:report_test_case, :failed)} before do test_suite.add_test_case(test_case) @@ -103,7 +103,7 @@ RSpec.describe Gitlab::Ci::Reports::TestSuite do end context 'when test cases contain an attachment' do - let(:test_case_with_attachment) { build(:test_case, :failed_with_attachment)} + let(:test_case_with_attachment) { build(:report_test_case, :failed_with_attachment)} before do test_suite.add_test_case(test_case_with_attachment) |