Commit 585e6a99 authored by Grzegorz Bizon's avatar Grzegorz Bizon

Add specs for chain element that populates a pipeline

parent e79ebabb
...@@ -3,6 +3,8 @@ module Gitlab ...@@ -3,6 +3,8 @@ module Gitlab
module Pipeline module Pipeline
module Chain module Chain
class Populate < Chain::Base class Populate < Chain::Base
include Chain::Helpers
PopulateError = Class.new(StandardError) PopulateError = Class.new(StandardError)
def perform! def perform!
...@@ -19,11 +21,15 @@ module Gitlab ...@@ -19,11 +21,15 @@ module Gitlab
pipeline.stages << seed.to_resource pipeline.stages << seed.to_resource
end end
if pipeline.invalid?
error('Failed to build the pipeline!')
end
raise Populate::PopulateError if pipeline.persisted? raise Populate::PopulateError if pipeline.persisted?
end end
def break? def break?
pipeline.persisted? pipeline.invalid?
end end
end end
end end
......
...@@ -5,23 +5,23 @@ describe Gitlab::Ci::Pipeline::Chain::Create do ...@@ -5,23 +5,23 @@ describe Gitlab::Ci::Pipeline::Chain::Create do
set(:user) { create(:user) } set(:user) { create(:user) }
let(:pipeline) do let(:pipeline) do
build(:ci_pipeline_with_one_job, project: project, build(:ci_empty_pipeline, project: project, ref: 'master')
ref: 'master')
end end
let(:command) do let(:command) do
Gitlab::Ci::Pipeline::Chain::Command.new( Gitlab::Ci::Pipeline::Chain::Command.new(
project: project, project: project, current_user: user)
current_user: user, seeds_block: nil)
end end
let(:step) { described_class.new(pipeline, command) } let(:step) { described_class.new(pipeline, command) }
context 'when pipeline is ready to be saved' do
before do before do
pipeline.stages.build(name: 'test', project: project)
step.perform! step.perform!
end end
context 'when pipeline is ready to be saved' do
it 'saves a pipeline' do it 'saves a pipeline' do
expect(pipeline).to be_persisted expect(pipeline).to be_persisted
end end
...@@ -32,6 +32,7 @@ describe Gitlab::Ci::Pipeline::Chain::Create do ...@@ -32,6 +32,7 @@ describe Gitlab::Ci::Pipeline::Chain::Create do
it 'creates stages' do it 'creates stages' do
expect(pipeline.reload.stages).to be_one expect(pipeline.reload.stages).to be_one
expect(pipeline.stages.first).to be_persisted
end end
end end
...@@ -40,6 +41,10 @@ describe Gitlab::Ci::Pipeline::Chain::Create do ...@@ -40,6 +41,10 @@ describe Gitlab::Ci::Pipeline::Chain::Create do
build(:ci_pipeline, project: project, ref: nil) build(:ci_pipeline, project: project, ref: nil)
end end
before do
step.perform!
end
it 'breaks the chain' do it 'breaks the chain' do
expect(step.break?).to be true expect(step.break?).to be true
end end
...@@ -49,18 +54,4 @@ describe Gitlab::Ci::Pipeline::Chain::Create do ...@@ -49,18 +54,4 @@ describe Gitlab::Ci::Pipeline::Chain::Create do
.to include /Failed to persist the pipeline/ .to include /Failed to persist the pipeline/
end end
end end
context 'when there is a seed block present' do
let(:seeds) { spy('pipeline seeds') }
let(:command) do
double('command', project: project,
current_user: user,
seeds_block: seeds)
end
it 'executes the block' do
expect(seeds).to have_received(:call).with(pipeline)
end
end
end end
require 'spec_helper'
describe Gitlab::Ci::Pipeline::Chain::Populate do
set(:project) { create(:project) }
set(:user) { create(:user) }
let(:pipeline) do
build(:ci_pipeline_with_one_job, project: project,
ref: 'master')
end
let(:command) do
Gitlab::Ci::Pipeline::Chain::Command.new(
project: project,
current_user: user,
seeds_block: nil)
end
let(:step) { described_class.new(pipeline, command) }
context 'when pipeline doesn not have seeds block' do
before do
step.perform!
end
it 'does not persist the pipeline' do
expect(pipeline).not_to be_persisted
end
it 'does not break the chain' do
expect(step.break?).to be false
end
it 'populates pipeline with stages' do
expect(pipeline.stages).to be_one
expect(pipeline.stages.first).not_to be_persisted
end
it 'populates pipeline with builds' do
expect(pipeline.stages.first.builds).to be_one
expect(pipeline.stages.first.builds.first).not_to be_persisted
end
end
context 'when pipeline has validation errors' do
let(:pipeline) do
build(:ci_pipeline, project: project, ref: nil)
end
before do
step.perform!
end
it 'breaks the chain' do
expect(step.break?).to be true
end
it 'appends validation error' do
expect(pipeline.errors.to_a)
.to include 'Failed to build the pipeline!'
end
end
context 'when there is a seed blocks present' do
let(:command) do
Gitlab::Ci::Pipeline::Chain::Command.new(
project: project,
current_user: user,
seeds_block: seeds_block)
end
context 'when seeds block builds some resources' do
let(:seeds_block) do
->(pipeline) { pipeline.variables.build(key: 'VAR', value: '123') }
end
it 'populates pipeline with resources described in the seeds block' do
step.perform!
expect(pipeline).not_to be_persisted
expect(pipeline.variables).not_to be_empty
expect(pipeline.variables.first).not_to be_persisted
expect(pipeline.variables.first.key).to eq 'VAR'
expect(pipeline.variables.first.value).to eq '123'
end
end
context 'when seeds block tries to persist some resources' do
let(:seeds_block) do
->(pipeline) { pipeline.variables.create!(key: 'VAR', value: '123') }
end
it 'raises exception' do
expect { step.perform! }.to raise_error(ActiveRecord::RecordNotSaved)
end
end
end
context 'when pipeline gets persisted during the process' do
let(:pipeline) { create(:ci_pipeline, project: project) }
it 'raises error' do
expect { step.perform! }.to raise_error(described_class::PopulateError)
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment