diff options
Diffstat (limited to 'spec/models/merge_request_spec.rb')
-rw-r--r-- | spec/models/merge_request_spec.rb | 239 |
1 files changed, 197 insertions, 42 deletions
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index 1cf197322f5..ebe2cd2ac03 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -271,8 +271,6 @@ RSpec.describe MergeRequest, factory_default: :keep do stub_feature_flags(stricter_mr_branch_name: false) end - using RSpec::Parameterized::TableSyntax - where(:branch_name, :valid) do 'foo' | true 'foo:bar' | false @@ -367,7 +365,7 @@ RSpec.describe MergeRequest, factory_default: :keep do describe '.by_commit_sha' do subject(:by_commit_sha) { described_class.by_commit_sha(sha) } - let!(:merge_request) { create(:merge_request, :with_diffs) } + let!(:merge_request) { create(:merge_request) } context 'with sha contained in latest merge request diff' do let(:sha) { 'b83d6e391c22777fca1ed3012fce84f633d7fed0' } @@ -433,7 +431,7 @@ RSpec.describe MergeRequest, factory_default: :keep do end context 'when commit is a part of the merge request' do - let!(:merge_request) { create(:merge_request, :with_diffs) } + let!(:merge_request) { create(:merge_request) } let(:sha) { 'b83d6e391c22777fca1ed3012fce84f633d7fed0' } it { is_expected.to eq([merge_request]) } @@ -451,6 +449,17 @@ RSpec.describe MergeRequest, factory_default: :keep do it { is_expected.to be_empty } end + + context 'when commit is part of the merge request and a squash commit at the same time' do + let!(:merge_request) { create(:merge_request) } + let(:sha) { merge_request.commits.first.id } + + before do + merge_request.update!(squash_commit_sha: sha) + end + + it { is_expected.to eq([merge_request]) } + end end describe '.by_cherry_pick_sha' do @@ -480,6 +489,7 @@ RSpec.describe MergeRequest, factory_default: :keep do create(:merge_request, params).tap do |mr| diffs.times { mr.merge_request_diffs.create } + mr.create_merge_head_diff end end @@ -705,6 +715,10 @@ RSpec.describe MergeRequest, factory_default: :keep do end context 'when external issue tracker is enabled' do + let(:project) { create(:project, :repository) } + + subject { create(:merge_request, source_project: project) } + before do subject.project.has_external_issue_tracker = true subject.project.save! @@ -754,9 +768,8 @@ RSpec.describe MergeRequest, factory_default: :keep do context 'when both internal and external issue trackers are enabled' do before do - subject.project.has_external_issue_tracker = true - subject.project.save! create(:jira_service, project: subject.project) + subject.project.reload end it 'does not cache issues from external trackers' do @@ -779,6 +792,10 @@ RSpec.describe MergeRequest, factory_default: :keep do end context 'when only external issue tracker enabled' do + let(:project) { create(:project, :repository) } + + subject { create(:merge_request, source_project: project) } + before do subject.project.has_external_issue_tracker = true subject.project.issues_enabled = false @@ -808,7 +825,7 @@ RSpec.describe MergeRequest, factory_default: :keep do let(:last_branch_commit) { subject.source_project.repository.commit(Gitlab::Git::BRANCH_REF_PREFIX + subject.source_branch) } context 'with diffs' do - subject { create(:merge_request, :with_diffs) } + subject { create(:merge_request) } it 'returns the sha of the source branch last commit' do expect(subject.source_branch_sha).to eq(last_branch_commit.sha) @@ -875,7 +892,7 @@ RSpec.describe MergeRequest, factory_default: :keep do let(:options) { { paths: ['a/b', 'b/a', 'c/*'] } } context 'when there are MR diffs' do - let(:merge_request) { create(:merge_request, :with_diffs) } + let(:merge_request) { create(:merge_request) } it 'delegates to the MR diffs' do expect(merge_request.merge_request_diff).to receive(:raw_diffs).with(options) @@ -924,7 +941,7 @@ RSpec.describe MergeRequest, factory_default: :keep do describe '#note_positions_for_paths' do let(:user) { create(:user) } - let(:merge_request) { create(:merge_request, :with_diffs) } + let(:merge_request) { create(:merge_request) } let(:project) { merge_request.project } let!(:diff_note) do create(:diff_note_on_merge_request, project: project, noteable: merge_request) @@ -1263,7 +1280,6 @@ RSpec.describe MergeRequest, factory_default: :keep do describe '#issues_mentioned_but_not_closing' do let(:closing_issue) { create :issue, project: subject.project } let(:mentioned_issue) { create :issue, project: subject.project } - let(:commit) { double('commit', safe_message: "Fixes #{closing_issue.to_reference}") } it 'detects issues mentioned in description but not closed' do @@ -1279,13 +1295,12 @@ RSpec.describe MergeRequest, factory_default: :keep do end context 'when the project has an external issue tracker' do - subject { create(:merge_request, source_project: create(:project, :repository)) } - before do subject.project.add_developer(subject.author) commit = double(:commit, safe_message: 'Fixes TEST-3') create(:jira_service, project: subject.project) + subject.project.reload allow(subject).to receive(:commits).and_return([commit]) allow(subject).to receive(:description).and_return('Is related to TEST-2 and TEST-3') @@ -1645,7 +1660,7 @@ RSpec.describe MergeRequest, factory_default: :keep do end it_behaves_like 'an editable mentionable' do - subject { create(:merge_request, :simple) } + subject { create(:merge_request, :simple, source_project: create(:project, :repository)) } let(:backref_text) { "merge request #{subject.to_reference}" } let(:set_mentionable_text) { ->(txt) { subject.description = txt } } @@ -1971,6 +1986,30 @@ RSpec.describe MergeRequest, factory_default: :keep do end end + describe '#has_codequality_mr_diff_report?' do + subject { merge_request.has_codequality_mr_diff_report? } + + context 'when head pipeline has codequality mr diff report' do + let(:merge_request) { create(:merge_request, :with_codequality_mr_diff_reports) } + + it { is_expected.to be_truthy } + + context 'when feature flag is disabled' do + before do + stub_feature_flags(codequality_mr_diff: false) + end + + it { is_expected.to be_falsey } + end + end + + context 'when head pipeline does not have codeqquality mr diff report' do + let(:merge_request) { create(:merge_request) } + + it { is_expected.to be_falsey } + end + end + describe '#has_codequality_reports?' do subject { merge_request.has_codequality_reports? } @@ -1983,7 +2022,7 @@ RSpec.describe MergeRequest, factory_default: :keep do context 'when feature flag is disabled' do before do - stub_feature_flags(codequality_mr_diff: false) + stub_feature_flags(codequality_backend_comparison: false) end it { is_expected.to be_falsey } @@ -2015,6 +2054,50 @@ RSpec.describe MergeRequest, factory_default: :keep do end end + describe '#has_sast_reports?' do + subject { merge_request.has_sast_reports? } + + let(:project) { create(:project, :repository) } + + before do + stub_licensed_features(sast: true) + end + + context 'when head pipeline has sast reports' do + let(:merge_request) { create(:merge_request, :with_sast_reports, source_project: project) } + + it { is_expected.to be_truthy } + end + + context 'when head pipeline does not have sast reports' do + let(:merge_request) { create(:merge_request, source_project: project) } + + it { is_expected.to be_falsey } + end + end + + describe '#has_secret_detection_reports?' do + subject { merge_request.has_secret_detection_reports? } + + let(:project) { create(:project, :repository) } + + before do + stub_licensed_features(secret_detection: true) + end + + context 'when head pipeline has secret detection reports' do + let(:merge_request) { create(:merge_request, :with_secret_detection_reports, source_project: project) } + + it { is_expected.to be_truthy } + end + + context 'when head pipeline does not have secrets detection reports' do + let(:merge_request) { create(:merge_request, source_project: project) } + + it { is_expected.to be_falsey } + end + end + describe '#calculate_reactive_cache' do let(:merge_request) { create(:merge_request) } @@ -2144,6 +2227,54 @@ RSpec.describe MergeRequest, factory_default: :keep do end end + describe '#find_codequality_mr_diff_reports' do + let(:project) { create(:project, :repository) } + let(:merge_request) { create(:merge_request, :with_codequality_mr_diff_reports, source_project: project) } + let(:pipeline) { merge_request.head_pipeline } + + subject(:mr_diff_report) { merge_request.find_codequality_mr_diff_reports } + + context 'when head pipeline has coverage reports' do + context 'when reactive cache worker is parsing results asynchronously' do + it 'returns status' do + expect(mr_diff_report[:status]).to eq(:parsing) + end + end + + context 'when reactive cache worker is inline' do + before do + synchronous_reactive_cache(merge_request) + end + + it 'returns status and data' do + expect(mr_diff_report[:status]).to eq(:parsed) + end + + context 'when an error occurrs' do + before do + merge_request.update!(head_pipeline: nil) + end + + it 'returns an error message' do + expect(mr_diff_report[:status]).to eq(:error) + end + end + + context 'when cached results is not latest' do + before do + allow_next_instance_of(Ci::GenerateCodequalityMrDiffReportService) do |service| + allow(service).to receive(:latest?).and_return(false) + end + end + + it 'raises and InvalidateReactiveCache error' do + expect { mr_diff_report }.to raise_error(ReactiveCaching::InvalidateReactiveCache) + end + end + end + end + end + describe '#compare_test_reports' do subject { merge_request.compare_test_reports } @@ -2765,8 +2896,6 @@ RSpec.describe MergeRequest, factory_default: :keep do end context 'with skip_ci_check option' do - using RSpec::Parameterized::TableSyntax - before do allow(subject).to receive_messages(check_mergeability: nil, can_be_merged?: true, @@ -2790,8 +2919,6 @@ RSpec.describe MergeRequest, factory_default: :keep do end context 'with skip_discussions_check option' do - using RSpec::Parameterized::TableSyntax - before do allow(subject).to receive_messages(mergeable_ci_state?: true, check_mergeability: nil, @@ -3345,6 +3472,10 @@ RSpec.describe MergeRequest, factory_default: :keep do end context 'when resolve_outdated_diff_discussions is set' do + let(:project) { create(:project, :repository) } + + subject { create(:merge_request, source_project: project) } + before do discussion @@ -3365,7 +3496,7 @@ RSpec.describe MergeRequest, factory_default: :keep do describe '#branch_merge_base_commit' do let(:project) { create(:project, :repository) } - subject { create(:merge_request, :with_diffs, source_project: project) } + subject { create(:merge_request, source_project: project) } context 'source and target branch exist' do it { expect(subject.branch_merge_base_commit.sha).to eq('ae73cb07c9eeaf35924a10f713b364d32b2dd34f') } @@ -3388,7 +3519,7 @@ RSpec.describe MergeRequest, factory_default: :keep do context "with diffs" do let(:project) { create(:project, :repository) } - subject { create(:merge_request, :with_diffs, source_project: project) } + subject { create(:merge_request, source_project: project) } let(:expected_diff_refs) do Gitlab::Diff::DiffRefs.new( @@ -3792,7 +3923,7 @@ RSpec.describe MergeRequest, factory_default: :keep do describe '#fetch_ref!' do let(:project) { create(:project, :repository) } - subject { create(:merge_request, :with_diffs, source_project: project) } + subject { create(:merge_request, source_project: project) } it 'fetches the ref correctly' do expect { subject.target_project.repository.delete_refs(subject.ref_path) }.not_to raise_error @@ -4367,37 +4498,41 @@ RSpec.describe MergeRequest, factory_default: :keep do end describe '#diffable_merge_ref?' do + let(:merge_request) { create(:merge_request) } + context 'merge request can be merged' do - context 'merge_to_ref is not calculated' do + context 'merge_head diff is not created' do it 'returns true' do - expect(subject.diffable_merge_ref?).to eq(false) + expect(merge_request.diffable_merge_ref?).to eq(false) end end - context 'merge_to_ref is calculated' do + context 'merge_head diff is created' do before do - MergeRequests::MergeToRefService.new(subject.project, subject.author).execute(subject) + create(:merge_request_diff, :merge_head, merge_request: merge_request) end it 'returns true' do - expect(subject.diffable_merge_ref?).to eq(true) + expect(merge_request.diffable_merge_ref?).to eq(true) end context 'merge request is merged' do - subject { build_stubbed(:merge_request, :merged, project: project) } + before do + merge_request.mark_as_merged! + end it 'returns false' do - expect(subject.diffable_merge_ref?).to eq(false) + expect(merge_request.diffable_merge_ref?).to eq(false) end end context 'merge request cannot be merged' do before do - subject.mark_as_unchecked! + merge_request.mark_as_unchecked! end it 'returns false' do - expect(subject.diffable_merge_ref?).to eq(true) + expect(merge_request.diffable_merge_ref?).to eq(true) end context 'display_merge_conflicts_in_diff is disabled' do @@ -4406,7 +4541,7 @@ RSpec.describe MergeRequest, factory_default: :keep do end it 'returns false' do - expect(subject.diffable_merge_ref?).to eq(false) + expect(merge_request.diffable_merge_ref?).to eq(false) end end end @@ -4476,17 +4611,7 @@ RSpec.describe MergeRequest, factory_default: :keep do end describe '#allows_reviewers?' do - it 'returns false without merge_request_reviewers feature' do - stub_feature_flags(merge_request_reviewers: false) - - merge_request = build_stubbed(:merge_request) - - expect(merge_request.allows_reviewers?).to be(false) - end - - it 'returns true with merge_request_reviewers feature' do - stub_feature_flags(merge_request_reviewers: true) - + it 'returns true' do merge_request = build_stubbed(:merge_request) expect(merge_request.allows_reviewers?).to be(true) @@ -4506,4 +4631,34 @@ RSpec.describe MergeRequest, factory_default: :keep do .from(nil).to(ref) end end + + describe '#enabled_reports' do + let(:project) { create(:project, :repository) } + + where(:report_type, :with_reports, :feature) do + :sast | :with_sast_reports | :sast + :secret_detection | :with_secret_detection_reports | :secret_detection + end + + with_them do + subject { merge_request.enabled_reports[report_type] } + + before do + stub_feature_flags(drop_license_management_artifact: false) + stub_licensed_features({ feature => true }) + end + + context "when head pipeline has reports" do + let(:merge_request) { create(:merge_request, with_reports, source_project: project) } + + it { is_expected.to be_truthy } + end + + context "when head pipeline does not have reports" do + let(:merge_request) { create(:merge_request, source_project: project) } + + it { is_expected.to be_falsy } + end + end + end end |