diff options
Diffstat (limited to 'spec/lib/gitlab/ci/pipeline')
-rw-r--r-- | spec/lib/gitlab/ci/pipeline/chain/build_spec.rb | 114 | ||||
-rw-r--r-- | spec/lib/gitlab/ci/pipeline/chain/command_spec.rb | 26 | ||||
-rw-r--r-- | spec/lib/gitlab/ci/pipeline/chain/seed_block_spec.rb | 12 | ||||
-rw-r--r-- | spec/lib/gitlab/ci/pipeline/chain/seed_spec.rb | 39 | ||||
-rw-r--r-- | spec/lib/gitlab/ci/pipeline/chain/template_usage_spec.rb | 37 | ||||
-rw-r--r-- | spec/lib/gitlab/ci/pipeline/seed/build_spec.rb | 2 | ||||
-rw-r--r-- | spec/lib/gitlab/ci/pipeline/seed/pipeline_spec.rb | 3 |
7 files changed, 170 insertions, 63 deletions
diff --git a/spec/lib/gitlab/ci/pipeline/chain/build_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/build_spec.rb index 6da565a2bf6..20406acb658 100644 --- a/spec/lib/gitlab/ci/pipeline/chain/build_spec.rb +++ b/spec/lib/gitlab/ci/pipeline/chain/build_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' RSpec.describe Gitlab::Ci::Pipeline::Chain::Build do - let_it_be(:project) { create(:project, :repository) } + let_it_be(:project, reload: true) { create(:project, :repository) } let_it_be(:user) { create(:user, developer_projects: [project]) } let(:pipeline) { Ci::Pipeline.new } @@ -29,29 +29,96 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Build do let(:step) { described_class.new(pipeline, command) } - before do - stub_ci_pipeline_yaml_file(gitlab_ci_yaml) + shared_examples 'builds pipeline' do + it 'builds a pipeline with the expected attributes' do + step.perform! + + expect(pipeline.sha).not_to be_empty + expect(pipeline.sha).to eq project.commit.id + expect(pipeline.ref).to eq 'master' + expect(pipeline.tag).to be false + expect(pipeline.user).to eq user + expect(pipeline.project).to eq project + end end - it 'never breaks the chain' do - step.perform! + shared_examples 'breaks the chain' do + it 'returns true' do + step.perform! + + expect(step.break?).to be true + end + end + + shared_examples 'does not break the chain' do + it 'returns false' do + step.perform! + + expect(step.break?).to be false + end + end - expect(step.break?).to be false + before do + stub_ci_pipeline_yaml_file(gitlab_ci_yaml) end - it 'fills pipeline object with data' do + it_behaves_like 'does not break the chain' + it_behaves_like 'builds pipeline' + + it 'sets pipeline variables' do step.perform! - expect(pipeline.sha).not_to be_empty - expect(pipeline.sha).to eq project.commit.id - expect(pipeline.ref).to eq 'master' - expect(pipeline.tag).to be false - expect(pipeline.user).to eq user - expect(pipeline.project).to eq project expect(pipeline.variables.map { |var| var.slice(:key, :secret_value) }) .to eq variables_attributes.map(&:with_indifferent_access) end + context 'when project setting restrict_user_defined_variables is enabled' do + before do + project.update!(restrict_user_defined_variables: true) + end + + context 'when user is developer' do + it_behaves_like 'breaks the chain' + it_behaves_like 'builds pipeline' + + it 'returns an error on variables_attributes', :aggregate_failures do + step.perform! + + expect(pipeline.errors.full_messages).to eq(['Insufficient permissions to set pipeline variables']) + expect(pipeline.variables).to be_empty + end + + context 'when variables_attributes is not specified' do + let(:variables_attributes) { nil } + + it_behaves_like 'does not break the chain' + it_behaves_like 'builds pipeline' + + it 'assigns empty variables' do + step.perform! + + expect(pipeline.variables).to be_empty + end + end + end + + context 'when user is maintainer' do + before do + project.add_maintainer(user) + end + + it_behaves_like 'does not break the chain' + it_behaves_like 'builds pipeline' + + it 'assigns variables_attributes' do + step.perform! + + expect(pipeline.variables.map { |var| var.slice(:key, :secret_value) }) + .to eq variables_attributes.map(&:with_indifferent_access) + end + end + end + it 'returns a valid pipeline' do step.perform! @@ -157,4 +224,25 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Build do expect(pipeline.target_sha).to eq(external_pull_request.target_sha) end end + + context 'when keep_latest_artifact is set' do + using RSpec::Parameterized::TableSyntax + + where(:keep_latest_artifact, :locking_result) do + true | 'artifacts_locked' + false | 'unlocked' + end + + with_them do + before do + project.update!(ci_keep_latest_artifact: keep_latest_artifact) + end + + it 'builds a pipeline with appropriate locked value' do + step.perform! + + expect(pipeline.locked).to eq(locking_result) + end + end + end end diff --git a/spec/lib/gitlab/ci/pipeline/chain/command_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/command_spec.rb index bc2012e83bd..9ca5aeeea58 100644 --- a/spec/lib/gitlab/ci/pipeline/chain/command_spec.rb +++ b/spec/lib/gitlab/ci/pipeline/chain/command_spec.rb @@ -295,4 +295,30 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Command do it { is_expected.to eq(false) } end end + + describe '#creates_child_pipeline?' do + let(:command) { described_class.new(bridge: bridge) } + + subject { command.creates_child_pipeline? } + + context 'when bridge is present' do + context 'when bridge triggers a child pipeline' do + let(:bridge) { double(:bridge, triggers_child_pipeline?: true) } + + it { is_expected.to be_truthy } + end + + context 'when bridge triggers a multi-project pipeline' do + let(:bridge) { double(:bridge, triggers_child_pipeline?: false) } + + it { is_expected.to be_falsey } + end + end + + context 'when bridge is not present' do + let(:bridge) { nil } + + it { is_expected.to be_falsey } + end + end end diff --git a/spec/lib/gitlab/ci/pipeline/chain/seed_block_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/seed_block_spec.rb index 85c8e20767f..fabfbd779f3 100644 --- a/spec/lib/gitlab/ci/pipeline/chain/seed_block_spec.rb +++ b/spec/lib/gitlab/ci/pipeline/chain/seed_block_spec.rb @@ -51,18 +51,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::SeedBlock do expect(pipeline.variables.size).to eq(1) end - - context 'when FF ci_seed_block_run_before_workflow_rules is disabled' do - before do - stub_feature_flags(ci_seed_block_run_before_workflow_rules: false) - end - - it 'does not execute the block' do - run_chain - - expect(pipeline.variables.size).to eq(0) - end - end end context 'when the seeds_block tries to save the pipelie' do diff --git a/spec/lib/gitlab/ci/pipeline/chain/seed_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/seed_spec.rb index 0ce8b80902e..80013cab6ee 100644 --- a/spec/lib/gitlab/ci/pipeline/chain/seed_spec.rb +++ b/spec/lib/gitlab/ci/pipeline/chain/seed_spec.rb @@ -20,6 +20,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Seed do describe '#perform!' do before do stub_ci_pipeline_yaml_file(YAML.dump(config)) + run_chain end let(:config) do @@ -36,20 +37,14 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Seed do end it 'allocates next IID' do - run_chain - expect(pipeline.iid).to be_present end it 'ensures ci_ref' do - run_chain - expect(pipeline.ci_ref).to be_present end it 'sets the seeds in the command object' do - run_chain - expect(command.pipeline_seed).to be_a(Gitlab::Ci::Pipeline::Seed::Pipeline) expect(command.pipeline_seed.size).to eq 1 end @@ -64,8 +59,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Seed do end it 'correctly fabricates stages and builds' do - run_chain - seed = command.pipeline_seed expect(seed.stages.size).to eq 2 @@ -91,8 +84,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Seed do end it 'returns pipeline seed with jobs only assigned to master' do - run_chain - seed = command.pipeline_seed expect(seed.size).to eq 1 @@ -112,8 +103,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Seed do end it 'returns pipeline seed with jobs only assigned to schedules' do - run_chain - seed = command.pipeline_seed expect(seed.size).to eq 1 @@ -141,8 +130,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Seed do let(:pipeline) { build(:ci_pipeline, project: project) } it 'returns seeds for kubernetes dependent job' do - run_chain - seed = command.pipeline_seed expect(seed.size).to eq 2 @@ -154,8 +141,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Seed do context 'when kubernetes is not active' do it 'does not return seeds for kubernetes dependent job' do - run_chain - seed = command.pipeline_seed expect(seed.size).to eq 1 @@ -173,8 +158,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Seed do end it 'returns stage seeds only when variables expression is truthy' do - run_chain - seed = command.pipeline_seed expect(seed.size).to eq 1 @@ -187,24 +170,8 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Seed do ->(pipeline) { pipeline.variables.build(key: 'VAR', value: '123') } end - context 'when FF ci_seed_block_run_before_workflow_rules is enabled' do - it 'does not execute the block' do - run_chain - - expect(pipeline.variables.size).to eq(0) - end - end - - context 'when FF ci_seed_block_run_before_workflow_rules is disabled' do - before do - stub_feature_flags(ci_seed_block_run_before_workflow_rules: false) - end - - it 'executes the block' do - run_chain - - expect(pipeline.variables.size).to eq(1) - end + it 'does not execute the block' do + expect(pipeline.variables.size).to eq(0) end end end diff --git a/spec/lib/gitlab/ci/pipeline/chain/template_usage_spec.rb b/spec/lib/gitlab/ci/pipeline/chain/template_usage_spec.rb new file mode 100644 index 00000000000..3616461d94f --- /dev/null +++ b/spec/lib/gitlab/ci/pipeline/chain/template_usage_spec.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::Ci::Pipeline::Chain::TemplateUsage do + let_it_be(:project) { create(:project) } + let_it_be(:user) { create(:user) } + let(:pipeline) { create(:ci_pipeline, project: project) } + + let(:command) do + Gitlab::Ci::Pipeline::Chain::Command.new(project: project, current_user: user) + end + + let(:step) { described_class.new(pipeline, command) } + + describe '#perform!' do + subject(:perform) { step.perform! } + + it 'tracks the included templates' do + expect(command).to( + receive(:yaml_processor_result) + .and_return( + double(included_templates: %w(Template-1 Template-2)) + ) + ) + + %w(Template-1 Template-2).each do |expected_template| + expect(Gitlab::UsageDataCounters::CiTemplateUniqueCounter).to( + receive(:track_unique_project_event) + .with(project_id: project.id, template: expected_template) + ) + end + + perform + end + end +end diff --git a/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb b/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb index bc10e94c81d..cf020fc343c 100644 --- a/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb +++ b/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb @@ -966,7 +966,7 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Build do it "returns an error" do expect(subject.errors).to contain_exactly( - "rspec: needs 'build'") + "'rspec' job needs 'build' job, but it was not added to the pipeline") end end diff --git a/spec/lib/gitlab/ci/pipeline/seed/pipeline_spec.rb b/spec/lib/gitlab/ci/pipeline/seed/pipeline_spec.rb index 1790388da03..860b07647bd 100644 --- a/spec/lib/gitlab/ci/pipeline/seed/pipeline_spec.rb +++ b/spec/lib/gitlab/ci/pipeline/seed/pipeline_spec.rb @@ -62,7 +62,8 @@ RSpec.describe Gitlab::Ci::Pipeline::Seed::Pipeline do needs_attributes: [{ name: 'non-existent', artifacts: true }] } - expect(seed.errors).to contain_exactly("invalid_job: needs 'non-existent'") + expect(seed.errors).to contain_exactly( + "'invalid_job' job needs 'non-existent' job, but it was not added to the pipeline") end end end |