Skip to content
Snippets Groups Projects
Commit d9142f2c authored by Grzegorz Bizon's avatar Grzegorz Bizon
Browse files

Add CI config known stage validation for job stage

parent 1ac62de2
No related branches found
No related tags found
1 merge request!5087Move CI job config entries from legacy to new config
Pipeline #
Loading
Loading
@@ -11,6 +11,19 @@ module Gitlab
validations do
validates :config, key: true
validates :global, required_attribute: true
validate :known_stage, on: :after
def known_stage
unless known?
stages_list = global.stages.join(', ')
errors.add(:config,
"should be one of defined stages (#{stages_list})")
end
end
end
def known?
@global.stages.include?(@config)
end
 
def self.default
Loading
Loading
require 'spec_helper'
 
describe Gitlab::Ci::Config::Node::Stage do
let(:entry) { described_class.new(config, global: global) }
let(:stage) { described_class.new(config, global: global) }
let(:global) { spy('Global') }
 
describe 'validations' do
context 'when entry config value is correct' do
context 'when stage config value is correct' do
let(:config) { :build }
 
describe '#value' do
it 'returns a stage key' do
expect(entry.value).to eq config
expect(stage.value).to eq config
end
end
 
describe '#valid?' do
it 'is valid' do
expect(entry).to be_valid
expect(stage).to be_valid
end
end
end
 
context 'when entry config is incorrect' do
context 'when stage config is incorrect' do
describe '#errors' do
context 'when reference to global node is not set' do
let(:entry) { described_class.new(config) }
let(:stage) { described_class.new(config) }
 
it 'raises error' do
expect { entry }.to raise_error(
expect { stage }.to raise_error(
Gitlab::Ci::Config::Node::Entry::InvalidError,
/Entry needs global attribute set internally./
)
Loading
Loading
@@ -38,21 +38,53 @@ describe Gitlab::Ci::Config::Node::Stage do
let(:config) { { test: true } }
 
it 'reports errors about wrong type' do
expect(entry.errors)
expect(stage.errors)
.to include 'stage config should be a string or symbol'
end
end
 
context 'when stage is not present in global configuration' do
pending 'reports error about missing stage' do
expect(entry.errors)
.to include 'stage config should be one of test, stage'
let(:config) { :unknown }
before do
allow(global)
.to receive(:stages).and_return([:test, :deploy])
end
it 'reports error about missing stage' do
stage.validate!
expect(stage.errors)
.to include 'stage config should be one of ' \
'defined stages (test, deploy)'
end
end
end
end
end
 
describe '#known?' do
before do
allow(global).to receive(:stages).and_return([:test, :deploy])
end
context 'when stage is not known' do
let(:config) { :unknown }
it 'returns false' do
expect(stage.known?).to be false
end
end
context 'when stage is known' do
let(:config) { :test }
it 'returns false' do
expect(stage.known?).to be true
end
end
end
describe '.default' do
it 'returns default stage' do
expect(described_class.default).to eq :test
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment