debian-mirror-gitlab/spec/services/ci/create_pipeline_service/include_spec.rb
2023-03-17 16:20:25 +05:30

136 lines
3.5 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Ci::CreatePipelineService,
:yaml_processor_feature_flag_corectness, feature_category: :pipeline_authoring do
include RepoHelpers
context 'include:' do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
let(:ref) { 'refs/heads/master' }
let(:variables_attributes) { [{ key: 'MYVAR', secret_value: 'hello' }] }
let(:source) { :push }
let(:service) { described_class.new(project, user, { ref: ref, variables_attributes: variables_attributes }) }
let(:pipeline) { service.execute(source).payload }
let(:file_location) { 'spec/fixtures/gitlab/ci/external_files/.gitlab-ci-template-1.yml' }
let(:project_files) do
{
'.gitlab-ci.yml' => config,
file_location => File.read(Rails.root.join(file_location))
}
end
around do |example|
create_and_delete_files(project, project_files) do
example.run
end
end
shared_examples 'not including the file' do
it 'does not include the job in the file' do
expect(pipeline).to be_created_successfully
expect(pipeline.processables.pluck(:name)).to contain_exactly('job')
end
end
shared_examples 'including the file' do
it 'includes the job in the file' do
expect(pipeline).to be_created_successfully
expect(pipeline.processables.pluck(:name)).to contain_exactly('job', 'rspec')
end
end
context 'with a local file' do
let(:config) do
<<~EOY
include: #{file_location}
job:
script: exit 0
EOY
end
it_behaves_like 'including the file'
end
context 'with a local file with rules with a project variable' do
let(:config) do
<<~EOY
include:
- local: #{file_location}
rules:
- if: $CI_PROJECT_ID == "#{project_id}"
job:
script: exit 0
EOY
end
context 'when the rules matches' do
let(:project_id) { project.id }
it_behaves_like 'including the file'
end
context 'when the rules does not match' do
let(:project_id) { non_existing_record_id }
it_behaves_like 'not including the file'
end
end
context 'with a local file with rules with a predefined pipeline variable' do
let(:config) do
<<~EOY
include:
- local: #{file_location}
rules:
- if: $CI_PIPELINE_SOURCE == "#{pipeline_source}"
job:
script: exit 0
EOY
end
context 'when the rules matches' do
let(:pipeline_source) { 'push' }
it_behaves_like 'including the file'
end
context 'when the rules does not match' do
let(:pipeline_source) { 'web' }
it_behaves_like 'not including the file'
end
end
context 'with a local file with rules with a run pipeline variable' do
let(:config) do
<<~EOY
include:
- local: #{file_location}
rules:
- if: $MYVAR == "#{my_var}"
job:
script: exit 0
EOY
end
context 'when the rules matches' do
let(:my_var) { 'hello' }
it_behaves_like 'including the file'
end
context 'when the rules does not match' do
let(:my_var) { 'mello' }
it_behaves_like 'not including the file'
end
end
end
end