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/services')
-rw-r--r--spec/services/ci/create_pipeline_service_spec.rb3
-rw-r--r--spec/services/merge_requests/push_options_handler_service_spec.rb404
2 files changed, 2 insertions, 405 deletions
diff --git a/spec/services/ci/create_pipeline_service_spec.rb b/spec/services/ci/create_pipeline_service_spec.rb
index 101b91e9cd8..866d709d446 100644
--- a/spec/services/ci/create_pipeline_service_spec.rb
+++ b/spec/services/ci/create_pipeline_service_spec.rb
@@ -418,7 +418,8 @@ describe Ci::CreatePipelineService do
context 'when push options contain ci.skip' do
let(:push_options) do
- { 'ci' => { 'skip' => true } }
+ ['ci.skip',
+ 'another push option']
end
it 'creates a pipline in the skipped state' do
diff --git a/spec/services/merge_requests/push_options_handler_service_spec.rb b/spec/services/merge_requests/push_options_handler_service_spec.rb
deleted file mode 100644
index 686b4b49f24..00000000000
--- a/spec/services/merge_requests/push_options_handler_service_spec.rb
+++ /dev/null
@@ -1,404 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-describe MergeRequests::PushOptionsHandlerService do
- include ProjectForksHelper
-
- let(:user) { create(:user) }
- let(:project) { create(:project, :public, :repository) }
- let(:forked_project) { fork_project(project, user, repository: true) }
- let(:service) { described_class.new(project, user, changes, push_options) }
- let(:source_branch) { 'fix' }
- let(:target_branch) { 'feature' }
- let(:new_branch_changes) { "#{Gitlab::Git::BLANK_SHA} 570e7b2abdd848b95f2f578043fc23bd6f6fd24d refs/heads/#{source_branch}" }
- let(:existing_branch_changes) { "d14d6c0abdd253381df51a723d58691b2ee1ab08 570e7b2abdd848b95f2f578043fc23bd6f6fd24d refs/heads/#{source_branch}" }
- let(:deleted_branch_changes) { "d14d6c0abdd253381df51a723d58691b2ee1ab08 #{Gitlab::Git::BLANK_SHA} refs/heads/#{source_branch}" }
- let(:default_branch_changes) { "d14d6c0abdd253381df51a723d58691b2ee1ab08 570e7b2abdd848b95f2f578043fc23bd6f6fd24d refs/heads/#{project.default_branch}" }
-
- before do
- project.add_developer(user)
- end
-
- shared_examples_for 'a service that can create a merge request' do
- subject(:last_mr) { MergeRequest.last }
-
- it 'creates a merge request' do
- expect { service.execute }.to change { MergeRequest.count }.by(1)
- end
-
- it 'sets the correct target branch' do
- branch = push_options[:target] || project.default_branch
-
- service.execute
-
- expect(last_mr.target_branch).to eq(branch)
- end
-
- it 'assigns the MR to the user' do
- service.execute
-
- expect(last_mr.assignee).to eq(user)
- end
-
- context 'when project has been forked' do
- let(:forked_project) { fork_project(project, user, repository: true) }
- let(:service) { described_class.new(forked_project, user, changes, push_options) }
-
- before do
- allow(forked_project).to receive(:empty_repo?).and_return(false)
- end
-
- it 'sets the correct source project' do
- service.execute
-
- expect(last_mr.source_project).to eq(forked_project)
- end
-
- it 'sets the correct target project' do
- service.execute
-
- expect(last_mr.target_project).to eq(project)
- end
- end
- end
-
- shared_examples_for 'a service that can set the target of a merge request' do
- subject(:last_mr) { MergeRequest.last }
-
- it 'sets the target_branch' do
- service.execute
-
- expect(last_mr.target_branch).to eq(target_branch)
- end
- end
-
- shared_examples_for 'a service that can set the merge request to merge when pipeline succeeds' do
- subject(:last_mr) { MergeRequest.last }
-
- it 'sets merge_when_pipeline_succeeds' do
- service.execute
-
- expect(last_mr.merge_when_pipeline_succeeds).to eq(true)
- end
-
- it 'sets merge_user to the user' do
- service.execute
-
- expect(last_mr.merge_user).to eq(user)
- end
- end
-
- shared_examples_for 'a service that does not create a merge request' do
- it do
- expect { service.execute }.not_to change { MergeRequest.count }
- end
- end
-
- shared_examples_for 'a service that does not update a merge request' do
- it do
- expect { service.execute }.not_to change { MergeRequest.maximum(:updated_at) }
- end
- end
-
- shared_examples_for 'a service that does nothing' do
- include_examples 'a service that does not create a merge request'
- include_examples 'a service that does not update a merge request'
- end
-
- describe '`create` push option' do
- let(:push_options) { { create: true } }
-
- context 'with a new branch' do
- let(:changes) { new_branch_changes }
-
- it_behaves_like 'a service that can create a merge request'
- end
-
- context 'with an existing branch but no open MR' do
- let(:changes) { existing_branch_changes }
-
- it_behaves_like 'a service that can create a merge request'
- end
-
- context 'with an existing branch that has a merge request open' do
- let(:changes) { existing_branch_changes }
- let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch)}
-
- it_behaves_like 'a service that does not create a merge request'
- end
-
- context 'with a deleted branch' do
- let(:changes) { deleted_branch_changes }
-
- it_behaves_like 'a service that does nothing'
- end
-
- context 'with the project default branch' do
- let(:changes) { default_branch_changes }
-
- it_behaves_like 'a service that does nothing'
- end
- end
-
- describe '`merge_when_pipeline_succeeds` push option' do
- let(:push_options) { { merge_when_pipeline_succeeds: true } }
-
- context 'with a new branch' do
- let(:changes) { new_branch_changes }
-
- it_behaves_like 'a service that does not create a merge request'
-
- it 'adds an error to the service' do
- error = "A merge_request.create push option is required to create a merge request for branch #{source_branch}"
-
- service.execute
-
- expect(service.errors).to include(error)
- end
-
- context 'when coupled with the `create` push option' do
- let(:push_options) { { create: true, merge_when_pipeline_succeeds: true } }
-
- it_behaves_like 'a service that can create a merge request'
- it_behaves_like 'a service that can set the merge request to merge when pipeline succeeds'
- end
- end
-
- context 'with an existing branch but no open MR' do
- let(:changes) { existing_branch_changes }
-
- it_behaves_like 'a service that does not create a merge request'
-
- it 'adds an error to the service' do
- error = "A merge_request.create push option is required to create a merge request for branch #{source_branch}"
-
- service.execute
-
- expect(service.errors).to include(error)
- end
-
- context 'when coupled with the `create` push option' do
- let(:push_options) { { create: true, merge_when_pipeline_succeeds: true } }
-
- it_behaves_like 'a service that can create a merge request'
- it_behaves_like 'a service that can set the merge request to merge when pipeline succeeds'
- end
- end
-
- context 'with an existing branch that has a merge request open' do
- let(:changes) { existing_branch_changes }
- let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch)}
-
- it_behaves_like 'a service that does not create a merge request'
- it_behaves_like 'a service that can set the merge request to merge when pipeline succeeds'
- end
-
- context 'with a deleted branch' do
- let(:changes) { deleted_branch_changes }
-
- it_behaves_like 'a service that does nothing'
- end
-
- context 'with the project default branch' do
- let(:changes) { default_branch_changes }
-
- it_behaves_like 'a service that does nothing'
- end
- end
-
- describe '`target` push option' do
- let(:push_options) { { target: target_branch } }
-
- context 'with a new branch' do
- let(:changes) { new_branch_changes }
-
- it_behaves_like 'a service that does not create a merge request'
-
- it 'adds an error to the service' do
- error = "A merge_request.create push option is required to create a merge request for branch #{source_branch}"
-
- service.execute
-
- expect(service.errors).to include(error)
- end
-
- context 'when coupled with the `create` push option' do
- let(:push_options) { { create: true, target: target_branch } }
-
- it_behaves_like 'a service that can create a merge request'
- it_behaves_like 'a service that can set the target of a merge request'
- end
- end
-
- context 'with an existing branch but no open MR' do
- let(:changes) { existing_branch_changes }
-
- it_behaves_like 'a service that does not create a merge request'
-
- it 'adds an error to the service' do
- error = "A merge_request.create push option is required to create a merge request for branch #{source_branch}"
-
- service.execute
-
- expect(service.errors).to include(error)
- end
-
- context 'when coupled with the `create` push option' do
- let(:push_options) { { create: true, target: target_branch } }
-
- it_behaves_like 'a service that can create a merge request'
- it_behaves_like 'a service that can set the target of a merge request'
- end
- end
-
- context 'with an existing branch that has a merge request open' do
- let(:changes) { existing_branch_changes }
- let!(:merge_request) { create(:merge_request, source_project: project, source_branch: source_branch)}
-
- it_behaves_like 'a service that does not create a merge request'
- it_behaves_like 'a service that can set the target of a merge request'
- end
-
- context 'with a deleted branch' do
- let(:changes) { deleted_branch_changes }
-
- it_behaves_like 'a service that does nothing'
- end
-
- context 'with the project default branch' do
- let(:changes) { default_branch_changes }
-
- it_behaves_like 'a service that does nothing'
- end
- end
-
- describe 'multiple pushed branches' do
- let(:push_options) { { create: true } }
- let(:changes) do
- [
- new_branch_changes,
- "#{Gitlab::Git::BLANK_SHA} 570e7b2abdd848b95f2f578043fc23bd6f6fd24d refs/heads/feature_conflict"
- ]
- end
-
- it 'creates a merge request per branch' do
- expect { service.execute }.to change { MergeRequest.count }.by(2)
- end
-
- context 'when there are too many pushed branches' do
- let(:limit) { MergeRequests::PushOptionsHandlerService::LIMIT }
- let(:changes) do
- TestEnv::BRANCH_SHA.to_a[0..limit].map do |x|
- "#{Gitlab::Git::BLANK_SHA} #{x.first} refs/heads/#{x.last}"
- end
- end
-
- it 'records an error' do
- service.execute
-
- expect(service.errors).to eq(["Too many branches pushed (#{limit + 1} were pushed, limit is #{limit})"])
- end
- end
- end
-
- describe 'no push options' do
- let(:push_options) { {} }
- let(:changes) { new_branch_changes }
-
- it_behaves_like 'a service that does nothing'
- end
-
- describe 'no user' do
- let(:user) { nil }
- let(:push_options) { { create: true } }
- let(:changes) { new_branch_changes }
-
- it 'records an error' do
- service.execute
-
- expect(service.errors).to eq(['User is required'])
- end
- end
-
- describe 'unauthorized user' do
- let(:push_options) { { create: true } }
- let(:changes) { new_branch_changes }
-
- it 'records an error' do
- Members::DestroyService.new(user).execute(ProjectMember.find_by!(user_id: user.id))
-
- service.execute
-
- expect(service.errors).to eq(['User access was denied'])
- end
- end
-
- describe 'handling unexpected exceptions' do
- let(:push_options) { { create: true } }
- let(:changes) { new_branch_changes }
- let(:exception) { StandardError.new('My standard error') }
-
- def run_service_with_exception
- allow_any_instance_of(
- MergeRequests::BuildService
- ).to receive(:execute).and_raise(exception)
-
- service.execute
- end
-
- it 'records an error' do
- run_service_with_exception
-
- expect(service.errors).to eq(['An unknown error occurred'])
- end
-
- it 'writes to Gitlab::AppLogger' do
- expect(Gitlab::AppLogger).to receive(:error).with(exception)
-
- run_service_with_exception
- end
- end
-
- describe 'when target is not a valid branch name' do
- let(:push_options) { { create: true, target: 'my-branch' } }
- let(:changes) { new_branch_changes }
-
- it 'records an error' do
- service.execute
-
- expect(service.errors).to eq(['Branch my-branch does not exist'])
- end
- end
-
- describe 'when MRs are not enabled' do
- let(:push_options) { { create: true } }
- let(:changes) { new_branch_changes }
-
- it 'records an error' do
- expect(project).to receive(:merge_requests_enabled?).and_return(false)
-
- service.execute
-
- expect(service.errors).to eq(["Merge requests are not enabled for project #{project.full_path}"])
- end
- end
-
- describe 'when MR has ActiveRecord errors' do
- let(:push_options) { { create: true } }
- let(:changes) { new_branch_changes }
-
- it 'adds the error to its errors property' do
- invalid_merge_request = MergeRequest.new
- invalid_merge_request.errors.add(:base, 'my error')
-
- expect_any_instance_of(
- MergeRequests::CreateService
- ).to receive(:execute).and_return(invalid_merge_request)
-
- service.execute
-
- expect(service.errors).to eq(['my error'])
- end
- end
-end