summaryrefslogtreecommitdiff
path: root/spec/models/merge_request_spec.rb
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-06-18 11:18:50 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-06-18 11:18:50 +0000
commit8c7f4e9d5f36cff46365a7f8c4b9c21578c1e781 (patch)
treea77e7fe7a93de11213032ed4ab1f33a3db51b738 /spec/models/merge_request_spec.rb
parent00b35af3db1abfe813a778f643dad221aad51fca (diff)
downloadgitlab-ce-8c7f4e9d5f36cff46365a7f8c4b9c21578c1e781.tar.gz
Add latest changes from gitlab-org/gitlab@13-1-stable-ee
Diffstat (limited to 'spec/models/merge_request_spec.rb')
-rw-r--r--spec/models/merge_request_spec.rb178
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