Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/tooling/danger/stable_branch_spec.rb')
-rw-r--r--spec/tooling/danger/stable_branch_spec.rb137
1 files changed, 128 insertions, 9 deletions
diff --git a/spec/tooling/danger/stable_branch_spec.rb b/spec/tooling/danger/stable_branch_spec.rb
index 08fd25b30e0..9eee077d493 100644
--- a/spec/tooling/danger/stable_branch_spec.rb
+++ b/spec/tooling/danger/stable_branch_spec.rb
@@ -12,6 +12,8 @@ RSpec.describe Tooling::Danger::StableBranch, feature_category: :delivery do
include_context 'with dangerfile'
let(:fake_danger) { DangerSpecHelper.fake_danger.include(described_class) }
+ let(:fake_api) { double('Api') } # rubocop:disable RSpec/VerifiedDoubles
+ let(:gitlab_gem_client) { double('gitlab') } # rubocop:disable RSpec/VerifiedDoubles
let(:stable_branch) { fake_danger.new(helper: fake_helper) }
@@ -34,6 +36,28 @@ RSpec.describe Tooling::Danger::StableBranch, feature_category: :delivery do
end
end
+ shared_examples 'with a warning' do |warning_message|
+ it 'warns' do
+ expect(stable_branch).to receive(:warn).with(warning_message)
+
+ subject
+ end
+ end
+
+ shared_examples 'bypassing when flaky test or docs only' do
+ context 'when failure::flaky-test label is present' do
+ let(:flaky_test_label_present) { true }
+
+ it_behaves_like 'without a failure'
+ end
+
+ context 'with only docs changes' do
+ let(:changes_by_category_response) { { docs: ['foo.md'] } }
+
+ it_behaves_like 'without a failure'
+ end
+ end
+
context 'when not applicable' do
where(:stable_branch?, :security_mr?) do
true | true
@@ -47,15 +71,32 @@ RSpec.describe Tooling::Danger::StableBranch, feature_category: :delivery do
allow(fake_helper).to receive(:security_mr?).and_return(security_mr?)
end
- it_behaves_like "without a failure"
+ it_behaves_like 'without a failure'
end
end
context 'when applicable' do
let(:target_branch) { '15-1-stable-ee' }
+ let(:source_branch) { 'my_bug_branch' }
let(:feature_label_present) { false }
let(:bug_label_present) { true }
+ let(:pipeline_expedite_label_present) { false }
+ let(:flaky_test_label_present) { false }
let(:response_success) { true }
+
+ let(:changes_by_category_response) do
+ {
+ graphql: ['bar.rb']
+ }
+ end
+
+ let(:pipeline_bridges_response) do
+ [
+ { 'name' => 'e2e:package-and-test',
+ 'status' => 'success' }
+ ]
+ end
+
let(:parsed_response) do
[
{ 'version' => '15.1.1' },
@@ -79,14 +120,27 @@ RSpec.describe Tooling::Danger::StableBranch, feature_category: :delivery do
before do
allow(fake_helper).to receive(:mr_target_branch).and_return(target_branch)
+ allow(fake_helper).to receive(:mr_source_branch).and_return(source_branch)
allow(fake_helper).to receive(:security_mr?).and_return(false)
+ allow(fake_helper).to receive(:mr_target_project_id).and_return(1)
allow(fake_helper).to receive(:mr_has_labels?).with('type::feature').and_return(feature_label_present)
allow(fake_helper).to receive(:mr_has_labels?).with('type::bug').and_return(bug_label_present)
+ allow(fake_helper).to receive(:mr_has_labels?).with('pipeline:expedite')
+ .and_return(pipeline_expedite_label_present)
+ allow(fake_helper).to receive(:mr_has_labels?).with('failure::flaky-test')
+ .and_return(flaky_test_label_present)
+ allow(fake_helper).to receive(:changes_by_category).and_return(changes_by_category_response)
allow(HTTParty).to receive(:get).with(/page=1/).and_return(version_response)
+ allow(fake_helper).to receive(:api).and_return(fake_api)
+ allow(stable_branch).to receive(:gitlab).and_return(gitlab_gem_client)
+ allow(gitlab_gem_client).to receive(:mr_json).and_return({ 'head_pipeline' => { 'id' => '1' } })
+ allow(gitlab_gem_client).to receive(:api).and_return(fake_api)
+ allow(fake_api).to receive(:pipeline_bridges).with(1, '1')
+ .and_return(pipeline_bridges_response)
end
# the stubbed behavior above is the success path
- it_behaves_like "without a failure"
+ it_behaves_like 'without a failure'
context 'with a feature label' do
let(:feature_label_present) { true }
@@ -100,20 +154,65 @@ RSpec.describe Tooling::Danger::StableBranch, feature_category: :delivery do
it_behaves_like 'with a failure', described_class::BUG_ERROR_MESSAGE
end
+ context 'with a pipeline:expedite label' do
+ let(:pipeline_expedite_label_present) { true }
+
+ it_behaves_like 'with a failure', described_class::PIPELINE_EXPEDITE_ERROR_MESSAGE
+ it_behaves_like 'bypassing when flaky test or docs only'
+ end
+
+ context 'when no package-and-test job is found' do
+ let(:pipeline_bridges_response) { nil }
+
+ it_behaves_like 'with a failure', described_class::NEEDS_PACKAGE_AND_TEST_MESSAGE
+ it_behaves_like 'bypassing when flaky test or docs only'
+ end
+
+ context 'when package-and-test job is in manual state' do
+ described_class::FAILING_PACKAGE_AND_TEST_STATUSES.each do |status|
+ let(:pipeline_bridges_response) do
+ [
+ { 'name' => 'e2e:package-and-test',
+ 'status' => status }
+ ]
+ end
+
+ it_behaves_like 'with a failure', described_class::NEEDS_PACKAGE_AND_TEST_MESSAGE
+ it_behaves_like 'bypassing when flaky test or docs only'
+ end
+ end
+
+ context 'when package-and-test job is in a non-successful state' do
+ let(:pipeline_bridges_response) do
+ [
+ { 'name' => 'e2e:package-and-test',
+ 'status' => 'running' }
+ ]
+ end
+
+ it_behaves_like 'with a warning', described_class::WARN_PACKAGE_AND_TEST_MESSAGE
+ it_behaves_like 'bypassing when flaky test or docs only'
+ end
+
+ context 'when no pipeline is found' do
+ before do
+ allow(gitlab_gem_client).to receive(:mr_json).and_return({})
+ end
+
+ it_behaves_like 'with a failure', described_class::NEEDS_PACKAGE_AND_TEST_MESSAGE
+ it_behaves_like 'bypassing when flaky test or docs only'
+ end
+
context 'when not an applicable version' do
let(:target_branch) { '14-9-stable-ee' }
- it_behaves_like 'with a failure', described_class::VERSION_ERROR_MESSAGE
+ it_behaves_like 'with a warning', described_class::VERSION_WARNING_MESSAGE
end
context 'when the version API request fails' do
let(:response_success) { false }
- it 'adds a warning' do
- expect(stable_branch).to receive(:warn).with(described_class::FAILED_VERSION_REQUEST_MESSAGE)
-
- subject
- end
+ it_behaves_like 'with a warning', described_class::FAILED_VERSION_REQUEST_MESSAGE
end
context 'when more than one page of versions is needed' do
@@ -151,7 +250,7 @@ RSpec.describe Tooling::Danger::StableBranch, feature_category: :delivery do
allow(HTTParty).to receive(:get).with(/page=2/).and_return(second_version_response)
end
- it_behaves_like "without a failure"
+ it_behaves_like 'without a failure'
end
context 'when too many version API requests are made' do
@@ -166,4 +265,24 @@ RSpec.describe Tooling::Danger::StableBranch, feature_category: :delivery do
end
end
end
+
+ describe '#non_security_stable_branch?' do
+ subject { stable_branch.non_security_stable_branch? }
+
+ where(:stable_branch?, :security_mr?, :expected_result) do
+ true | true | false
+ false | true | false
+ true | false | true
+ false | false | false
+ end
+
+ with_them do
+ before do
+ allow(fake_helper).to receive(:mr_target_branch).and_return(stable_branch? ? '15-1-stable-ee' : 'main')
+ allow(fake_helper).to receive(:security_mr?).and_return(security_mr?)
+ end
+
+ it { is_expected.to eq(expected_result) }
+ end
+ end
end