Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/graphql/mutations/merge_requests/accept_spec.rb')
-rw-r--r--spec/graphql/mutations/merge_requests/accept_spec.rb157
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