Commit d9142f2c authored by Grzegorz Bizon's avatar Grzegorz Bizon

Add CI config known stage validation for job stage

parent 1ac62de2
...@@ -11,6 +11,19 @@ module Gitlab ...@@ -11,6 +11,19 @@ module Gitlab
validations do validations do
validates :config, key: true validates :config, key: true
validates :global, required_attribute: 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 end
def self.default def self.default
......
require 'spec_helper' require 'spec_helper'
describe Gitlab::Ci::Config::Node::Stage do 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') } let(:global) { spy('Global') }
describe 'validations' do describe 'validations' do
context 'when entry config value is correct' do context 'when stage config value is correct' do
let(:config) { :build } let(:config) { :build }
describe '#value' do describe '#value' do
it 'returns a stage key' do it 'returns a stage key' do
expect(entry.value).to eq config expect(stage.value).to eq config
end end
end end
describe '#valid?' do describe '#valid?' do
it 'is valid' do it 'is valid' do
expect(entry).to be_valid expect(stage).to be_valid
end end
end end
end end
context 'when entry config is incorrect' do context 'when stage config is incorrect' do
describe '#errors' do describe '#errors' do
context 'when reference to global node is not set' 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 it 'raises error' do
expect { entry }.to raise_error( expect { stage }.to raise_error(
Gitlab::Ci::Config::Node::Entry::InvalidError, Gitlab::Ci::Config::Node::Entry::InvalidError,
/Entry needs global attribute set internally./ /Entry needs global attribute set internally./
) )
...@@ -38,21 +38,53 @@ describe Gitlab::Ci::Config::Node::Stage do ...@@ -38,21 +38,53 @@ describe Gitlab::Ci::Config::Node::Stage do
let(:config) { { test: true } } let(:config) { { test: true } }
it 'reports errors about wrong type' do it 'reports errors about wrong type' do
expect(entry.errors) expect(stage.errors)
.to include 'stage config should be a string or symbol' .to include 'stage config should be a string or symbol'
end end
end end
context 'when stage is not present in global configuration' do context 'when stage is not present in global configuration' do
pending 'reports error about missing stage' do let(:config) { :unknown }
expect(entry.errors)
.to include 'stage config should be one of test, stage' 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 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 describe '.default' do
it 'returns default stage' do it 'returns default stage' do
expect(described_class.default).to eq :test expect(described_class.default).to eq :test
......
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