143 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
require 'spec_helper'
 | 
						|
 | 
						|
describe Gitlab::Ci::Pipeline::Chain::Validate::Abilities do
 | 
						|
  set(:project) { create(:project, :repository) }
 | 
						|
  set(:user) { create(:user) }
 | 
						|
 | 
						|
  let(:pipeline) do
 | 
						|
    build_stubbed(:ci_pipeline, ref: ref, project: project)
 | 
						|
  end
 | 
						|
 | 
						|
  let(:command) do
 | 
						|
    double('command', project: project, current_user: user)
 | 
						|
  end
 | 
						|
 | 
						|
  let(:step) { described_class.new(pipeline, command) }
 | 
						|
 | 
						|
  let(:ref) { 'master' }
 | 
						|
 | 
						|
  context 'when users has no ability to run a pipeline' do
 | 
						|
    before do
 | 
						|
      step.perform!
 | 
						|
    end
 | 
						|
 | 
						|
    it 'adds an error about insufficient permissions' do
 | 
						|
      expect(pipeline.errors.to_a)
 | 
						|
        .to include /Insufficient permissions/
 | 
						|
    end
 | 
						|
 | 
						|
    it 'breaks the pipeline builder chain' do
 | 
						|
      expect(step.break?).to eq true
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  context 'when user has ability to create a pipeline' do
 | 
						|
    before do
 | 
						|
      project.add_developer(user)
 | 
						|
 | 
						|
      step.perform!
 | 
						|
    end
 | 
						|
 | 
						|
    it 'does not invalidate the pipeline' do
 | 
						|
      expect(pipeline).to be_valid
 | 
						|
    end
 | 
						|
 | 
						|
    it 'does not break the chain' do
 | 
						|
      expect(step.break?).to eq false
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  describe '#allowed_to_create?' do
 | 
						|
    subject { step.allowed_to_create? }
 | 
						|
 | 
						|
    context 'when user is a developer' do
 | 
						|
      before do
 | 
						|
        project.add_developer(user)
 | 
						|
      end
 | 
						|
 | 
						|
      it { is_expected.to be_truthy }
 | 
						|
 | 
						|
      context 'when the branch is protected' do
 | 
						|
        let!(:protected_branch) do
 | 
						|
          create(:protected_branch, project: project, name: ref)
 | 
						|
        end
 | 
						|
 | 
						|
        it { is_expected.to be_falsey }
 | 
						|
 | 
						|
        context 'when developers are allowed to merge' do
 | 
						|
          let!(:protected_branch) do
 | 
						|
            create(:protected_branch,
 | 
						|
                   :developers_can_merge,
 | 
						|
                   project: project,
 | 
						|
                   name: ref)
 | 
						|
          end
 | 
						|
 | 
						|
          it { is_expected.to be_truthy }
 | 
						|
        end
 | 
						|
      end
 | 
						|
 | 
						|
      context 'when the tag is protected' do
 | 
						|
        let(:ref) { 'v1.0.0' }
 | 
						|
 | 
						|
        let!(:protected_tag) do
 | 
						|
          create(:protected_tag, project: project, name: ref)
 | 
						|
        end
 | 
						|
 | 
						|
        it { is_expected.to be_falsey }
 | 
						|
 | 
						|
        context 'when developers are allowed to create the tag' do
 | 
						|
          let!(:protected_tag) do
 | 
						|
            create(:protected_tag,
 | 
						|
                   :developers_can_create,
 | 
						|
                   project: project,
 | 
						|
                   name: ref)
 | 
						|
          end
 | 
						|
 | 
						|
          it { is_expected.to be_truthy }
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    context 'when user is a master' do
 | 
						|
      before do
 | 
						|
        project.add_master(user)
 | 
						|
      end
 | 
						|
 | 
						|
      it { is_expected.to be_truthy }
 | 
						|
 | 
						|
      context 'when the branch is protected' do
 | 
						|
        let!(:protected_branch) do
 | 
						|
          create(:protected_branch, project: project, name: ref)
 | 
						|
        end
 | 
						|
 | 
						|
        it { is_expected.to be_truthy }
 | 
						|
      end
 | 
						|
 | 
						|
      context 'when the tag is protected' do
 | 
						|
        let(:ref) { 'v1.0.0' }
 | 
						|
 | 
						|
        let!(:protected_tag) do
 | 
						|
          create(:protected_tag, project: project, name: ref)
 | 
						|
        end
 | 
						|
 | 
						|
        it { is_expected.to be_truthy }
 | 
						|
 | 
						|
        context 'when no one can create the tag' do
 | 
						|
          let!(:protected_tag) do
 | 
						|
            create(:protected_tag,
 | 
						|
                   :no_one_can_create,
 | 
						|
                   project: project,
 | 
						|
                   name: ref)
 | 
						|
          end
 | 
						|
 | 
						|
          it { is_expected.to be_falsey }
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    context 'when owner cannot create pipeline' do
 | 
						|
      it { is_expected.to be_falsey }
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |