diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2019-12-03 18:06:49 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2019-12-03 18:06:49 +0000 |
commit | ab7cf450ba19cf80b9534f25dc707b33845e3014 (patch) | |
tree | bbfa6aba83c48aea68d79c4179ce576b6eec326d /spec/services/branches | |
parent | 4204cf308596e0e26f578a6e2da88f49c0f4aad9 (diff) | |
download | gitlab-ce-ab7cf450ba19cf80b9534f25dc707b33845e3014.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/services/branches')
-rw-r--r-- | spec/services/branches/create_service_spec.rb | 41 | ||||
-rw-r--r-- | spec/services/branches/delete_merged_service_spec.rb | 84 | ||||
-rw-r--r-- | spec/services/branches/delete_service_spec.rb | 47 | ||||
-rw-r--r-- | spec/services/branches/validate_new_service_spec.rb | 40 |
4 files changed, 212 insertions, 0 deletions
diff --git a/spec/services/branches/create_service_spec.rb b/spec/services/branches/create_service_spec.rb new file mode 100644 index 00000000000..444491ed6f3 --- /dev/null +++ b/spec/services/branches/create_service_spec.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Branches::CreateService do + let(:user) { create(:user) } + subject(:service) { described_class.new(project, user) } + + describe '#execute' do + context 'when repository is empty' do + let(:project) { create(:project_empty_repo) } + + it 'creates master branch' do + service.execute('my-feature', 'master') + + expect(project.repository.branch_exists?('master')).to be_truthy + end + + it 'creates my-feature branch' do + service.execute('my-feature', 'master') + + expect(project.repository.branch_exists?('my-feature')).to be_truthy + end + end + + context 'when creating a branch fails' do + let(:project) { create(:project_empty_repo) } + + before do + allow(project.repository).to receive(:add_branch).and_return(false) + end + + it 'returns an error with the branch name' do + result = service.execute('my-feature', 'master') + + expect(result[:status]).to eq(:error) + expect(result[:message]).to eq("Invalid reference name: my-feature") + end + end + end +end diff --git a/spec/services/branches/delete_merged_service_spec.rb b/spec/services/branches/delete_merged_service_spec.rb new file mode 100644 index 00000000000..962af8110f7 --- /dev/null +++ b/spec/services/branches/delete_merged_service_spec.rb @@ -0,0 +1,84 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Branches::DeleteMergedService do + include ProjectForksHelper + + subject(:service) { described_class.new(project, project.owner) } + + let(:project) { create(:project, :repository) } + + context '#execute' do + it 'deletes a branch that was merged' do + service.execute + + expect(project.repository.branch_names).not_to include('improve/awesome') + end + + it 'keeps branch that is unmerged' do + service.execute + + expect(project.repository.branch_names).to include('feature') + end + + it 'keeps "master"' do + service.execute + + expect(project.repository.branch_names).to include('master') + end + + it 'keeps protected branches' do + create(:protected_branch, project: project, name: 'improve/awesome') + + service.execute + + expect(project.repository.branch_names).to include('improve/awesome') + end + + it 'keeps wildcard protected branches' do + create(:protected_branch, project: project, name: 'improve/*') + + service.execute + + expect(project.repository.branch_names).to include('improve/awesome') + end + + it 'ignores protected tags' do + create(:protected_tag, project: project, name: 'improve/*') + + service.execute + + expect(project.repository.branch_names).not_to include('improve/awesome') + end + + context 'user without rights' do + let(:user) { create(:user) } + + it 'cannot execute' do + expect { described_class.new(project, user).execute }.to raise_error(Gitlab::Access::AccessDeniedError) + end + end + + context 'open merge requests' do + it 'does not delete branches from open merge requests' do + forked_project = fork_project(project) + create(:merge_request, :opened, source_project: project, target_project: project, source_branch: 'branch-merged', target_branch: 'master') + create(:merge_request, :opened, source_project: forked_project, target_project: project, target_branch: 'improve/awesome', source_branch: 'master') + + service.execute + + expect(project.repository.branch_names).to include('branch-merged') + expect(project.repository.branch_names).to include('improve/awesome') + end + end + end + + context '#async_execute' do + it 'calls DeleteMergedBranchesWorker async' do + expect(DeleteMergedBranchesWorker).to receive(:perform_async) + + service.async_execute + end + end +end diff --git a/spec/services/branches/delete_service_spec.rb b/spec/services/branches/delete_service_spec.rb new file mode 100644 index 00000000000..b4848978a6f --- /dev/null +++ b/spec/services/branches/delete_service_spec.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Branches::DeleteService do + let(:project) { create(:project, :repository) } + let(:repository) { project.repository } + let(:user) { create(:user) } + subject(:service) { described_class.new(project, user) } + + shared_examples 'a deleted branch' do |branch_name| + it 'removes the branch' do + expect(branch_exists?(branch_name)).to be true + + result = service.execute(branch_name) + + expect(result.status).to eq :success + expect(branch_exists?(branch_name)).to be false + end + end + + describe '#execute' do + context 'when user has access to push to repository' do + before do + project.add_developer(user) + end + + it_behaves_like 'a deleted branch', 'feature' + end + + context 'when user does not have access to push to repository' do + it 'does not remove branch' do + expect(branch_exists?('feature')).to be true + + result = service.execute('feature') + + expect(result.status).to eq :error + expect(result.message).to eq 'You dont have push access to repo' + expect(branch_exists?('feature')).to be true + end + end + end + + def branch_exists?(branch_name) + repository.ref_exists?("refs/heads/#{branch_name}") + end +end diff --git a/spec/services/branches/validate_new_service_spec.rb b/spec/services/branches/validate_new_service_spec.rb new file mode 100644 index 00000000000..460f28b5844 --- /dev/null +++ b/spec/services/branches/validate_new_service_spec.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Branches::ValidateNewService do + let(:project) { create(:project, :repository) } + subject(:service) { described_class.new(project) } + + describe '#execute' do + context 'validation' do + it 'returns error with an invalid branch name' do + result = service.execute('refs/heads/invalid_branch') + + expect(result[:status]).to eq(:error) + expect(result[:message]).to eq('Branch name is invalid') + end + + it 'returns success with a valid branch name' do + result = service.execute('valid_branch_name') + + expect(result[:status]).to eq(:success) + end + end + + context 'branch exist' do + it 'returns error when branch exists' do + result = service.execute('master') + + expect(result[:status]).to eq(:error) + expect(result[:message]).to eq('Branch already exists') + end + + it 'returns success when branch name is available' do + result = service.execute('valid_branch_name') + + expect(result[:status]).to eq(:success) + end + end + end +end |