debian-mirror-gitlab/spec/services/ci/create_pipeline_service/dry_run_spec.rb
2022-03-02 08:16:31 +05:30

120 lines
3.3 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Ci::CreatePipelineService do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
let(:ref) { 'refs/heads/master' }
let(:service) { described_class.new(project, user, { ref: ref }) }
subject { service.execute(:push, dry_run: true).payload }
before do
stub_ci_pipeline_yaml_file(config)
end
describe 'dry run' do
shared_examples 'returns a non persisted pipeline' do
it 'does not persist the pipeline' do
expect(subject).not_to be_persisted
expect(subject.id).to be_nil
end
it 'does not process the pipeline' do
expect(Ci::ProcessPipelineService).not_to receive(:new)
subject
end
it 'does not schedule merge request head pipeline update' do
expect(service).not_to receive(:schedule_head_pipeline_update)
subject
end
end
context 'when pipeline is valid' do
let(:config) { gitlab_ci_yaml }
it_behaves_like 'returns a non persisted pipeline'
it 'returns a valid pipeline' do
expect(subject.error_messages).to be_empty
expect(subject.yaml_errors).to be_nil
expect(subject.errors).to be_empty
end
end
context 'when pipeline is not valid' do
context 'when there are syntax errors' do
let(:config) do
<<~YAML
rspec:
script: echo
something: wrong
YAML
end
it_behaves_like 'returns a non persisted pipeline'
it 'returns a pipeline with errors', :aggregate_failures do
error_message = 'jobs:rspec config contains unknown keys: something'
expect(subject.error_messages.map(&:content)).to eq([error_message])
expect(subject.errors).not_to be_empty
expect(subject.yaml_errors).to eq(error_message)
end
end
context 'when there are logical errors' do
let(:config) do
<<~YAML
build:
script: echo
stage: build
needs: [test]
test:
script: echo
stage: test
YAML
end
it_behaves_like 'returns a non persisted pipeline'
it 'returns a pipeline with errors', :aggregate_failures do
error_message = 'build job: need test is not defined in current or prior stages'
expect(subject.error_messages.map(&:content)).to eq([error_message])
expect(subject.errors).not_to be_empty
end
end
context 'when there are errors at the seeding stage' do
let(:config) do
<<~YAML
build:
stage: build
script: echo
rules:
- if: '$CI_MERGE_REQUEST_ID'
test:
stage: test
script: echo
needs: ['build']
YAML
end
it_behaves_like 'returns a non persisted pipeline'
it 'returns a pipeline with errors', :aggregate_failures do
error_message = "'test' job needs 'build' job, but 'build' is not in any previous stage"
expect(subject.error_messages.map(&:content)).to eq([error_message])
expect(subject.errors).not_to be_empty
end
end
end
end
end