diff options
Diffstat (limited to 'spec/graphql/mutations/merge_requests/accept_spec.rb')
-rw-r--r-- | spec/graphql/mutations/merge_requests/accept_spec.rb | 157 |
1 files changed, 45 insertions, 112 deletions
diff --git a/spec/graphql/mutations/merge_requests/accept_spec.rb b/spec/graphql/mutations/merge_requests/accept_spec.rb index c99b1d988c5..b0d2a9e9c22 100644 --- a/spec/graphql/mutations/merge_requests/accept_spec.rb +++ b/spec/graphql/mutations/merge_requests/accept_spec.rb @@ -28,7 +28,7 @@ RSpec.describe Mutations::MergeRequests::Accept do project.add_maintainer(user) end - def common_args(merge_request) + let(:common_args) do { project_path: project.full_path, iid: merge_request.iid.to_s, @@ -37,136 +37,69 @@ RSpec.describe Mutations::MergeRequests::Accept do } end - it 'merges the merge request' do - merge_request = create(:merge_request, source_project: project) + let(:args) { common_args.merge(additional_args) } + let(:additional_args) { {} } + let(:result) { mutation.resolve(**args) } + let!(:merge_request) { create(:merge_request, source_project: project) } - result = mutation.resolve(**common_args(merge_request)) - - expect(result).to include(errors: be_empty, merge_request: be_merged) - end - - it 'rejects the mutation if the SHA is a mismatch' do - merge_request = create(:merge_request, source_project: project) - args = common_args(merge_request).merge(sha: 'not a good sha') - - result = mutation.resolve(**args) - - expect(result).not_to include(merge_request: be_merged) - expect(result).to include(errors: [described_class::SHA_MISMATCH]) - end - - it 'respects the merge commit message' do - merge_request = create(:merge_request, source_project: project) - args = common_args(merge_request).merge(commit_message: 'my super custom message') - - result = mutation.resolve(**args) - - expect(result).to include(merge_request: be_merged) - expect(project.repository.commit(merge_request.target_branch)).to have_attributes( - message: args[:commit_message] - ) + it 'merges the merge request asynchronously' do + expect_next_found_instance_of(MergeRequest) do |instance| + expect(instance).to receive(:merge_async).with(user.id, args.except(:project_path, :iid)) + end + expect(result).to include(errors: be_empty) end - it 'respects the squash flag' do - merge_request = create(:merge_request, source_project: project) - args = common_args(merge_request).merge(squash: true) + context 'when the squash flag is specified' do + let(:additional_args) { { squash: true } } - result = mutation.resolve(**args) - - expect(result).to include(merge_request: be_merged) - expect(result[:merge_request].squash_commit_sha).to be_present + it 'sets squash on the merge request' do + expect { result }.to change { merge_request.reload.squash }.from(false).to(true) + end end - it 'respects the squash_commit_message argument' do - merge_request = create(:merge_request, source_project: project) - args = common_args(merge_request).merge(squash: true, squash_commit_message: 'squish') - - result = mutation.resolve(**args) - sha = result[:merge_request].squash_commit_sha + context 'when the sha is a mismatch' do + let(:additional_args) { { sha: 'not a good sha' } } - expect(result).to include(merge_request: be_merged) - expect(project.repository.commit(sha)).to have_attributes(message: "squish\n") + it 'rejects the mutation' do + expect_next_found_instance_of(MergeRequest) do |instance| + expect(instance).not_to receive(:merge_async) + end + expect(result).to include(errors: [described_class::SHA_MISMATCH]) + end end - it 'respects the should_remove_source_branch argument when true' do - b = project.repository.add_branch(user, generate(:branch), 'master') - merge_request = create(:merge_request, source_branch: b.name, source_project: project) - args = common_args(merge_request).merge(should_remove_source_branch: true) - - expect(::MergeRequests::DeleteSourceBranchWorker).to receive(:perform_async) - - result = mutation.resolve(**args) - - expect(result).to include(merge_request: be_merged) - end - - it 'respects the should_remove_source_branch argument when false' do - b = project.repository.add_branch(user, generate(:branch), 'master') - merge_request = create(:merge_request, source_branch: b.name, source_project: project) - args = common_args(merge_request).merge(should_remove_source_branch: false) - - expect(::MergeRequests::DeleteSourceBranchWorker).not_to receive(:perform_async) - - result = mutation.resolve(**args) + context 'when MR is unmergeable' do + let(:merge_request) { create(:merge_request, :closed, source_project: project) } - expect(result).to include(merge_request: be_merged) - end - - it 'rejects unmergeable MRs' do - merge_request = create(:merge_request, :closed, source_project: project) - args = common_args(merge_request) - - result = mutation.resolve(**args) - - expect(result).not_to include(merge_request: be_merged) - expect(result).to include(errors: [described_class::NOT_MERGEABLE]) + it 'rejects the MRs' do + expect_next_found_instance_of(MergeRequest) do |instance| + expect(instance).not_to receive(:merge_async) + end + expect(result).to include(errors: [described_class::NOT_MERGEABLE]) + end end it 'rejects merges when we cannot validate the hooks' do - merge_request = create(:merge_request, source_project: project) - args = common_args(merge_request) expect_next(::MergeRequests::MergeService) .to receive(:hooks_validation_pass?).with(merge_request).and_return(false) - result = mutation.resolve(**args) - - expect(result).not_to include(merge_request: be_merged) + expect_next_found_instance_of(MergeRequest) do |instance| + expect(instance).not_to receive(:merge_async) + end expect(result).to include(errors: [described_class::HOOKS_VALIDATION_ERROR]) end - it 'rejects merges when the merge service returns an error' do - merge_request = create(:merge_request, source_project: project) - args = common_args(merge_request) - expect_next(::MergeRequests::MergeService) - .to receive(:execute).with(merge_request).and_return(:failed) - - result = mutation.resolve(**args) - - expect(result).not_to include(merge_request: be_merged) - expect(result).to include(errors: [described_class::MERGE_FAILED]) - end - - it 'rejects merges when the merge service raises merge error' do - merge_request = create(:merge_request, source_project: project) - args = common_args(merge_request) - expect_next(::MergeRequests::MergeService) - .to receive(:execute).and_raise(::MergeRequests::MergeBaseService::MergeError, 'boom') - - result = mutation.resolve(**args) - - expect(result).not_to include(merge_request: be_merged) - expect(result).to include(errors: ['boom']) - end - - it "can use the MERGE_WHEN_PIPELINE_SUCCEEDS strategy" do - enum = ::Types::MergeStrategyEnum.values['MERGE_WHEN_PIPELINE_SUCCEEDS'] - merge_request = create(:merge_request, :with_head_pipeline, source_project: project) - args = common_args(merge_request).merge(auto_merge_strategy: enum.value) - - result = mutation.resolve(**args) - - expect(result).not_to include(merge_request: be_merged) - expect(result).to include(errors: be_empty, merge_request: be_auto_merge_enabled) + context 'when MR has head pipeline' do + let(:merge_request) { create(:merge_request, :with_head_pipeline, source_project: project) } + let(:strategy) { ::Types::MergeStrategyEnum.values['MERGE_WHEN_PIPELINE_SUCCEEDS'].value } + let(:additional_args) { { auto_merge_strategy: strategy } } + + it "can use the MERGE_WHEN_PIPELINE_SUCCEEDS strategy" do + expect_next_found_instance_of(MergeRequest) do |instance| + expect(instance).not_to receive(:merge_async) + end + expect(result).to include(errors: be_empty, merge_request: be_auto_merge_enabled) + end end end end |