diff options
Diffstat (limited to 'spec/models/merge_request_spec.rb')
-rw-r--r-- | spec/models/merge_request_spec.rb | 178 |
1 files changed, 139 insertions, 39 deletions
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index fc4590f7b22..c70ddac5da6 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -22,6 +22,8 @@ describe MergeRequest do it { is_expected.to belong_to(:iteration) } it { is_expected.to have_many(:resource_milestone_events) } it { is_expected.to have_many(:resource_state_events) } + it { is_expected.to have_many(:draft_notes) } + it { is_expected.to have_many(:reviews).inverse_of(:merge_request) } context 'for forks' do let!(:project) { create(:project) } @@ -721,11 +723,15 @@ describe MergeRequest do end describe '#note_positions_for_paths' do + let(:user) { create(:user) } let(:merge_request) { create(:merge_request, :with_diffs) } let(:project) { merge_request.project } let!(:diff_note) do create(:diff_note_on_merge_request, project: project, noteable: merge_request) end + let!(:draft_note) do + create(:draft_note_on_text_diff, author: user, merge_request: merge_request) + end let(:file_paths) { merge_request.diffs.diff_files.map(&:file_path) } @@ -758,6 +764,26 @@ describe MergeRequest do expect(subject.to_a).to be_empty end end + + context 'when user is given' do + subject do + merge_request.note_positions_for_paths(file_paths, user) + end + + it 'returns notes and draft notes positions' do + expect(subject).to match_array([draft_note.position, diff_note.position]) + end + end + + context 'when user is not given' do + subject do + merge_request.note_positions_for_paths(file_paths) + end + + it 'returns notes positions' do + expect(subject).to match_array([diff_note.position]) + end + end end describe '#discussions_diffs' do @@ -1625,14 +1651,6 @@ describe MergeRequest do let(:merge_request) { create(:merge_request, :with_accessibility_reports, source_project: project) } it { is_expected.to be_truthy } - - context 'when feature flag is disabled' do - before do - stub_feature_flags(accessibility_report_view: false) - end - - it { is_expected.to be_falsey } - end end context 'when head pipeline does not have accessibility reports' do @@ -2018,7 +2036,7 @@ describe MergeRequest do describe '#can_be_reverted?' do context 'when there is no merge_commit for the MR' do before do - subject.metrics.update!(merged_at: Time.now.utc) + subject.metrics.update!(merged_at: Time.current.utc) end it 'returns false' do @@ -2157,7 +2175,34 @@ describe MergeRequest do end end - context 'when merging note is persisted, but no metrics or merge event exists' do + context 'when state event tracking is disabled' do + before do + stub_feature_flags(track_resource_state_change_events: false) + end + + context 'when merging note is persisted, but no metrics or merge event exists' do + let(:user) { create(:user) } + let(:merge_request) { create(:merge_request, :merged) } + + before do + merge_request.metrics.destroy! + + SystemNoteService.change_status(merge_request, + merge_request.target_project, + user, + merge_request.state, nil) + end + + it 'returns merging note creation date' do + expect(merge_request.reload.metrics).to be_nil + expect(merge_request.merge_event).to be_nil + expect(merge_request.notes.count).to eq(1) + expect(merge_request.merged_at).to eq(merge_request.notes.first.created_at) + end + end + end + + context 'when state event tracking is enabled' do let(:user) { create(:user) } let(:merge_request) { create(:merge_request, :merged) } @@ -2170,11 +2215,8 @@ describe MergeRequest do merge_request.state, nil) end - it 'returns merging note creation date' do - expect(merge_request.reload.metrics).to be_nil - expect(merge_request.merge_event).to be_nil - expect(merge_request.notes.count).to eq(1) - expect(merge_request.merged_at).to eq(merge_request.notes.first.created_at) + it 'does not create a system note' do + expect(merge_request.notes).to be_empty end end end @@ -2327,24 +2369,10 @@ describe MergeRequest do end context 'when async is true' do - context 'and async_merge_request_check_mergeability feature flag is enabled' do - it 'executes MergeabilityCheckService asynchronously' do - expect(mergeability_service).to receive(:async_execute) - - subject.check_mergeability(async: true) - end - end - - context 'and async_merge_request_check_mergeability feature flag is disabled' do - before do - stub_feature_flags(async_merge_request_check_mergeability: false) - end - - it 'executes MergeabilityCheckService' do - expect(mergeability_service).to receive(:execute) + it 'executes MergeabilityCheckService asynchronously' do + expect(mergeability_service).to receive(:async_execute) - subject.check_mergeability(async: true) - end + subject.check_mergeability(async: true) end end end @@ -2489,12 +2517,13 @@ describe MergeRequest do end describe '#mergeable_ci_state?' do - let(:project) { create(:project, only_allow_merge_if_pipeline_succeeds: true) } let(:pipeline) { create(:ci_empty_pipeline) } - subject { build(:merge_request, target_project: project) } - context 'when it is only allowed to merge when build is green' do + let(:project) { create(:project, only_allow_merge_if_pipeline_succeeds: true) } + + subject { build(:merge_request, target_project: project) } + context 'and a failed pipeline is associated' do before do pipeline.update(status: 'failed', sha: subject.diff_head_sha) @@ -2516,7 +2545,7 @@ describe MergeRequest do context 'and a skipped pipeline is associated' do before do pipeline.update(status: 'skipped', sha: subject.diff_head_sha) - allow(subject).to receive(:head_pipeline) { pipeline } + allow(subject).to receive(:head_pipeline).and_return(pipeline) end it { expect(subject.mergeable_ci_state?).to be_falsey } @@ -2524,7 +2553,48 @@ describe MergeRequest do context 'when no pipeline is associated' do before do - allow(subject).to receive(:head_pipeline) { nil } + allow(subject).to receive(:head_pipeline).and_return(nil) + end + + it { expect(subject.mergeable_ci_state?).to be_falsey } + end + end + + context 'when it is only allowed to merge when build is green or skipped' do + let(:project) { create(:project, only_allow_merge_if_pipeline_succeeds: true, allow_merge_on_skipped_pipeline: true) } + + subject { build(:merge_request, target_project: project) } + + context 'and a failed pipeline is associated' do + before do + pipeline.update!(status: 'failed', sha: subject.diff_head_sha) + allow(subject).to receive(:head_pipeline).and_return(pipeline) + end + + it { expect(subject.mergeable_ci_state?).to be_falsey } + end + + context 'and a successful pipeline is associated' do + before do + pipeline.update!(status: 'success', sha: subject.diff_head_sha) + allow(subject).to receive(:head_pipeline).and_return(pipeline) + end + + it { expect(subject.mergeable_ci_state?).to be_truthy } + end + + context 'and a skipped pipeline is associated' do + before do + pipeline.update!(status: 'skipped', sha: subject.diff_head_sha) + allow(subject).to receive(:head_pipeline).and_return(pipeline) + end + + it { expect(subject.mergeable_ci_state?).to be_truthy } + end + + context 'when no pipeline is associated' do + before do + allow(subject).to receive(:head_pipeline).and_return(nil) end it { expect(subject.mergeable_ci_state?).to be_falsey } @@ -2532,7 +2602,9 @@ describe MergeRequest do end context 'when merges are not restricted to green builds' do - subject { build(:merge_request, target_project: create(:project, only_allow_merge_if_pipeline_succeeds: false)) } + let(:project) { create(:project, only_allow_merge_if_pipeline_succeeds: false) } + + subject { build(:merge_request, target_project: project) } context 'and a failed pipeline is associated' do before do @@ -2550,6 +2622,23 @@ describe MergeRequest do it { expect(subject.mergeable_ci_state?).to be_truthy } end + + context 'and a skipped pipeline is associated' do + before do + pipeline.update!(status: 'skipped', sha: subject.diff_head_sha) + allow(subject).to receive(:head_pipeline).and_return(pipeline) + end + + it { expect(subject.mergeable_ci_state?).to be_truthy } + end + + context 'when no pipeline is associated' do + before do + allow(subject).to receive(:head_pipeline).and_return(nil) + end + + it { expect(subject.mergeable_ci_state?).to be_truthy } + end end end @@ -2581,7 +2670,7 @@ describe MergeRequest do context 'with no discussions' do before do - merge_request.notes.destroy_all # rubocop: disable DestroyAll + merge_request.notes.destroy_all # rubocop: disable Cop/DestroyAll end it 'returns true' do @@ -3876,4 +3965,15 @@ describe MergeRequest do expect(count).to eq(0) end end + + describe 'banzai_render_context' do + let(:project) { build(:project_empty_repo) } + let(:merge_request) { build :merge_request, target_project: project, source_project: project } + + subject(:context) { merge_request.banzai_render_context(:title) } + + it 'sets the label_url_method in the context' do + expect(context[:label_url_method]).to eq(:project_merge_requests_url) + end + end end |