diff options
Diffstat (limited to 'spec/models/merge_request_spec.rb')
-rw-r--r-- | spec/models/merge_request_spec.rb | 160 |
1 files changed, 155 insertions, 5 deletions
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index da3f691b63a..b36737fc19d 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -135,10 +135,22 @@ RSpec.describe MergeRequest, factory_default: :keep, feature_category: :code_rev let_it_be(:user1) { create(:user) } let_it_be(:user2) { create(:user) } - let_it_be(:merge_request1) { create(:merge_request, :unique_branches, reviewers: [user1]) } - let_it_be(:merge_request2) { create(:merge_request, :unique_branches, reviewers: [user2]) } - let_it_be(:merge_request3) { create(:merge_request, :unique_branches, reviewers: []) } - let_it_be(:merge_request4) { create(:merge_request, :draft_merge_request) } + let_it_be(:merge_request1) do + create(:merge_request, :prepared, :unique_branches, reviewers: [user1], created_at: + 2.days.ago) + end + + let_it_be(:merge_request2) do + create(:merge_request, :unprepared, :unique_branches, reviewers: [user2], created_at: + 3.hours.ago) + end + + let_it_be(:merge_request3) do + create(:merge_request, :unprepared, :unique_branches, reviewers: [], created_at: + Time.current) + end + + let_it_be(:merge_request4) { create(:merge_request, :prepared, :draft_merge_request) } describe '.preload_target_project_with_namespace' do subject(:mr) { described_class.preload_target_project_with_namespace.first } @@ -180,6 +192,14 @@ RSpec.describe MergeRequest, factory_default: :keep, feature_category: :code_rev end end + describe '.recently_unprepared' do + it 'only returns the recently unprepared mrs' do + merge_request5 = create(:merge_request, :unprepared, :unique_branches, created_at: merge_request3.created_at) + + expect(described_class.recently_unprepared).to eq([merge_request3, merge_request5]) + end + end + describe '.by_sorted_source_branches' do let(:fork_for_project) { fork_project(project) } @@ -340,6 +360,23 @@ RSpec.describe MergeRequest, factory_default: :keep, feature_category: :code_rev end end + describe "#validate_reviewer_size_length" do + let(:merge_request) { build(:merge_request, transitioning: transitioning) } + + where(:transitioning, :to_or_not_to) do + false | :to + true | :not_to + end + + with_them do + it do + expect(merge_request).send(to_or_not_to, receive(:validate_reviewer_size_length)) + + merge_request.valid? + end + end + end + describe '#validate_target_project' do let(:merge_request) do build(:merge_request, source_project: project, target_project: project, importing: importing) @@ -366,6 +403,23 @@ RSpec.describe MergeRequest, factory_default: :keep, feature_category: :code_rev it { expect(merge_request.valid?(false)).to eq true } end end + + context "with the skip_validations_during_transition_feature_flag" do + let(:merge_request) { build(:merge_request, transitioning: transitioning) } + + where(:transitioning, :to_or_not_to) do + false | :to + true | :not_to + end + + with_them do + it do + expect(merge_request).send(to_or_not_to, receive(:validate_target_project)) + + merge_request.valid? + end + end + end end end @@ -2099,6 +2153,16 @@ RSpec.describe MergeRequest, factory_default: :keep, feature_category: :code_rev subject.mark_as_merged! end + context 'and merged_commit_sha is present' do + before do + subject.update_attribute(:merged_commit_sha, pipeline.sha) + end + + it 'returns the pipeline associated with that merge request' do + expect(subject.merge_pipeline).to eq(pipeline) + end + end + context 'and there is a merge commit' do before do subject.update_attribute(:merge_commit_sha, pipeline.sha) @@ -2850,6 +2914,12 @@ RSpec.describe MergeRequest, factory_default: :keep, feature_category: :code_rev subject.mark_as_merged! end + it 'returns merged_commit_sha when there is a merged_commit_sha' do + subject.update_attribute(:merged_commit_sha, sha) + + expect(subject.merged_commit_sha).to eq(sha) + end + it 'returns merge_commit_sha when there is a merge_commit_sha' do subject.update_attribute(:merge_commit_sha, sha) @@ -3275,6 +3345,31 @@ RSpec.describe MergeRequest, factory_default: :keep, feature_category: :code_rev subject.mergeable?(check_mergeability_retry_lease: true) end end + + context 'with skip_rebase_check option' do + before do + allow(subject).to receive_messages( + mergeable_state?: true, + check_mergeability: nil, + can_be_merged?: true + ) + end + + where(:should_be_rebased, :skip_rebase_check, :expected_mergeable) do + false | false | true + false | true | true + true | false | false + true | true | true + end + + with_them do + it 'overrides should_be_rebased?' do + allow(subject).to receive(:should_be_rebased?) { should_be_rebased } + + expect(subject.mergeable?(skip_rebase_check: skip_rebase_check)).to eq(expected_mergeable) + end + end + end end describe '#skipped_mergeable_checks' do @@ -4442,6 +4537,7 @@ RSpec.describe MergeRequest, factory_default: :keep, feature_category: :code_rev shared_examples 'for an invalid state transition' do specify 'is not a valid state transition' do expect { transition! }.to raise_error(StateMachines::InvalidTransition) + expect(subject.transitioning?).to be_falsey end end @@ -4451,6 +4547,7 @@ RSpec.describe MergeRequest, factory_default: :keep, feature_category: :code_rev .to change { subject.merge_status } .from(merge_status.to_s) .to(expected_merge_status) + expect(subject.transitioning?).to be_falsey end end @@ -5493,7 +5590,8 @@ RSpec.describe MergeRequest, factory_default: :keep, feature_category: :code_rev let(:ref) { subject.target_project.repository.commit.id } before do - expect(subject.target_project).to receive(:mark_primary_write_location) + expect(subject.target_project.sticking).to receive(:stick) + .with(:project, subject.target_project.id) end it 'updates commit ID' do @@ -5806,4 +5904,56 @@ RSpec.describe MergeRequest, factory_default: :keep, feature_category: :code_rev it { is_expected.to eq(false) } end end + + describe '#supports_lock_on_merge?' do + let(:merge_request) { build_stubbed(:merge_request) } + + subject { merge_request.supports_lock_on_merge? } + + context 'when MR is open' do + it { is_expected.to eq(false) } + end + + context 'when MR is merged' do + before do + merge_request.state = :merged + end + + it { is_expected.to eq(true) } + + context 'when feature flag is disabled' do + before do + stub_feature_flags(enforce_locked_labels_on_merge: false) + end + + it { is_expected.to eq(false) } + end + end + end + + describe '#missing_required_squash?' do + using RSpec::Parameterized::TableSyntax + + where(:squash, :project_requires_squash, :expected) do + false | true | true + false | false | false + true | true | false + true | false | false + end + + with_them do + let(:merge_request) { build_stubbed(:merge_request, squash: squash) } + + subject { merge_request.missing_required_squash? } + + before do + allow(merge_request.target_project).to( + receive(:squash_always?) + .and_return(project_requires_squash) + ) + end + + it { is_expected.to eq(expected) } + end + end end |