2016-06-16 23:09:34 +05:30
|
|
|
require 'spec_helper'
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
describe Gitlab::Ci::Config::Entry::Global do
|
2016-06-16 23:09:34 +05:30
|
|
|
let(:global) { described_class.new(hash) }
|
|
|
|
|
2016-08-24 12:49:21 +05:30
|
|
|
describe '.nodes' do
|
2017-08-17 22:00:37 +05:30
|
|
|
it 'returns a hash' do
|
|
|
|
expect(described_class.nodes).to be_a(Hash)
|
2016-06-16 23:09:34 +05:30
|
|
|
end
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
context 'when filtering all the entry/node names' do
|
|
|
|
it 'contains the expected node names' do
|
|
|
|
expect(described_class.nodes.keys)
|
|
|
|
.to match_array(%i[before_script image services
|
|
|
|
after_script variables stages
|
2019-05-30 16:15:17 +05:30
|
|
|
types cache])
|
2017-08-17 22:00:37 +05:30
|
|
|
end
|
2016-06-16 23:09:34 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
context 'when configuration is valid' do
|
2016-09-29 09:46:39 +05:30
|
|
|
context 'when some entries defined' do
|
2016-08-24 12:49:21 +05:30
|
|
|
let(:hash) do
|
2017-08-17 22:00:37 +05:30
|
|
|
{ before_script: %w(ls pwd),
|
2016-08-24 12:49:21 +05:30
|
|
|
image: 'ruby:2.2',
|
|
|
|
services: ['postgres:9.1', 'mysql:5.5'],
|
|
|
|
variables: { VAR: 'value' },
|
|
|
|
after_script: ['make clean'],
|
2017-08-17 22:00:37 +05:30
|
|
|
stages: %w(build pages),
|
2016-09-13 17:45:13 +05:30
|
|
|
cache: { key: 'k', untracked: true, paths: ['public/'] },
|
|
|
|
rspec: { script: %w[rspec ls] },
|
2016-09-29 09:46:39 +05:30
|
|
|
spinach: { before_script: [], variables: {}, script: 'spinach' } }
|
2016-08-24 12:49:21 +05:30
|
|
|
end
|
2016-06-16 23:09:34 +05:30
|
|
|
|
2016-09-29 09:46:39 +05:30
|
|
|
describe '#compose!' do
|
2017-09-10 17:25:29 +05:30
|
|
|
before do
|
|
|
|
global.compose!
|
|
|
|
end
|
2016-08-24 12:49:21 +05:30
|
|
|
|
|
|
|
it 'creates nodes hash' do
|
2016-09-13 17:45:13 +05:30
|
|
|
expect(global.descendants).to be_an Array
|
2016-08-24 12:49:21 +05:30
|
|
|
end
|
2016-06-16 23:09:34 +05:30
|
|
|
|
2016-08-24 12:49:21 +05:30
|
|
|
it 'creates node object for each entry' do
|
2019-05-30 16:15:17 +05:30
|
|
|
expect(global.descendants.count).to eq 8
|
2016-08-24 12:49:21 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
it 'creates node object using valid class' do
|
2016-09-13 17:45:13 +05:30
|
|
|
expect(global.descendants.first)
|
2017-08-17 22:00:37 +05:30
|
|
|
.to be_an_instance_of Gitlab::Ci::Config::Entry::Script
|
2016-09-13 17:45:13 +05:30
|
|
|
expect(global.descendants.second)
|
2017-08-17 22:00:37 +05:30
|
|
|
.to be_an_instance_of Gitlab::Ci::Config::Entry::Image
|
2016-08-24 12:49:21 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
it 'sets correct description for nodes' do
|
2016-09-13 17:45:13 +05:30
|
|
|
expect(global.descendants.first.description)
|
2016-08-24 12:49:21 +05:30
|
|
|
.to eq 'Script that will be executed before each job.'
|
2016-09-13 17:45:13 +05:30
|
|
|
expect(global.descendants.second.description)
|
2016-08-24 12:49:21 +05:30
|
|
|
.to eq 'Docker image that will be used to execute jobs.'
|
|
|
|
end
|
2016-06-16 23:09:34 +05:30
|
|
|
|
2016-09-13 17:45:13 +05:30
|
|
|
describe '#leaf?' do
|
|
|
|
it 'is not leaf' do
|
|
|
|
expect(global).not_to be_leaf
|
|
|
|
end
|
2016-08-24 12:49:21 +05:30
|
|
|
end
|
2016-06-16 23:09:34 +05:30
|
|
|
end
|
|
|
|
|
2016-09-29 09:46:39 +05:30
|
|
|
context 'when not composed' do
|
2017-08-17 22:00:37 +05:30
|
|
|
describe '#before_script_value' do
|
2016-08-24 12:49:21 +05:30
|
|
|
it 'returns nil' do
|
2017-08-17 22:00:37 +05:30
|
|
|
expect(global.before_script_value).to be nil
|
2016-08-24 12:49:21 +05:30
|
|
|
end
|
|
|
|
end
|
2016-09-13 17:45:13 +05:30
|
|
|
|
|
|
|
describe '#leaf?' do
|
|
|
|
it 'is leaf' do
|
|
|
|
expect(global).to be_leaf
|
|
|
|
end
|
|
|
|
end
|
2016-06-16 23:09:34 +05:30
|
|
|
end
|
|
|
|
|
2016-09-29 09:46:39 +05:30
|
|
|
context 'when composed' do
|
2017-09-10 17:25:29 +05:30
|
|
|
before do
|
|
|
|
global.compose!
|
|
|
|
end
|
2016-09-29 09:46:39 +05:30
|
|
|
|
|
|
|
describe '#errors' do
|
|
|
|
it 'has no errors' do
|
|
|
|
expect(global.errors).to be_empty
|
|
|
|
end
|
|
|
|
end
|
2016-08-24 12:49:21 +05:30
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
describe '#before_script_value' do
|
2016-08-24 12:49:21 +05:30
|
|
|
it 'returns correct script' do
|
2017-08-17 22:00:37 +05:30
|
|
|
expect(global.before_script_value).to eq %w(ls pwd)
|
2016-08-24 12:49:21 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
describe '#image_value' do
|
2016-08-24 12:49:21 +05:30
|
|
|
it 'returns valid image' do
|
2017-09-10 17:25:29 +05:30
|
|
|
expect(global.image_value).to eq(name: 'ruby:2.2')
|
2016-08-24 12:49:21 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
describe '#services_value' do
|
2016-08-24 12:49:21 +05:30
|
|
|
it 'returns array of services' do
|
2017-09-10 17:25:29 +05:30
|
|
|
expect(global.services_value).to eq [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }]
|
2016-08-24 12:49:21 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
describe '#after_script_value' do
|
2016-08-24 12:49:21 +05:30
|
|
|
it 'returns after script' do
|
2017-08-17 22:00:37 +05:30
|
|
|
expect(global.after_script_value).to eq ['make clean']
|
2016-08-24 12:49:21 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
describe '#variables_value' do
|
2016-08-24 12:49:21 +05:30
|
|
|
it 'returns variables' do
|
2017-09-10 17:25:29 +05:30
|
|
|
expect(global.variables_value).to eq('VAR' => 'value')
|
2016-08-24 12:49:21 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
describe '#stages_value' do
|
2016-08-24 12:49:21 +05:30
|
|
|
context 'when stages key defined' do
|
|
|
|
it 'returns array of stages' do
|
2017-08-17 22:00:37 +05:30
|
|
|
expect(global.stages_value).to eq %w[build pages]
|
2016-08-24 12:49:21 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when deprecated types key defined' do
|
2016-09-13 17:45:13 +05:30
|
|
|
let(:hash) do
|
2017-08-17 22:00:37 +05:30
|
|
|
{ types: %w(test deploy),
|
2016-09-13 17:45:13 +05:30
|
|
|
rspec: { script: 'rspec' } }
|
|
|
|
end
|
2016-08-24 12:49:21 +05:30
|
|
|
|
|
|
|
it 'returns array of types as stages' do
|
2017-08-17 22:00:37 +05:30
|
|
|
expect(global.stages_value).to eq %w[test deploy]
|
2016-08-24 12:49:21 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
describe '#cache_value' do
|
2016-08-24 12:49:21 +05:30
|
|
|
it 'returns cache configuration' do
|
2017-08-17 22:00:37 +05:30
|
|
|
expect(global.cache_value)
|
2017-09-10 17:25:29 +05:30
|
|
|
.to eq(key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push')
|
2016-08-24 12:49:21 +05:30
|
|
|
end
|
|
|
|
end
|
2016-09-13 17:45:13 +05:30
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
describe '#jobs_value' do
|
2016-09-13 17:45:13 +05:30
|
|
|
it 'returns jobs configuration' do
|
2017-08-17 22:00:37 +05:30
|
|
|
expect(global.jobs_value).to eq(
|
2016-09-13 17:45:13 +05:30
|
|
|
rspec: { name: :rspec,
|
|
|
|
script: %w[rspec ls],
|
2017-08-17 22:00:37 +05:30
|
|
|
before_script: %w(ls pwd),
|
2017-09-10 17:25:29 +05:30
|
|
|
image: { name: 'ruby:2.2' },
|
|
|
|
services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
|
2016-09-29 09:46:39 +05:30
|
|
|
stage: 'test',
|
2017-09-10 17:25:29 +05:30
|
|
|
cache: { key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push' },
|
|
|
|
variables: { 'VAR' => 'value' },
|
2017-08-17 22:00:37 +05:30
|
|
|
ignore: false,
|
2019-02-15 15:39:39 +05:30
|
|
|
after_script: ['make clean'],
|
2019-03-02 22:35:43 +05:30
|
|
|
only: { refs: %w[branches tags] } },
|
2016-09-13 17:45:13 +05:30
|
|
|
spinach: { name: :spinach,
|
2016-09-29 09:46:39 +05:30
|
|
|
before_script: [],
|
2016-09-13 17:45:13 +05:30
|
|
|
script: %w[spinach],
|
2017-09-10 17:25:29 +05:30
|
|
|
image: { name: 'ruby:2.2' },
|
|
|
|
services: [{ name: 'postgres:9.1' }, { name: 'mysql:5.5' }],
|
2016-09-29 09:46:39 +05:30
|
|
|
stage: 'test',
|
2017-09-10 17:25:29 +05:30
|
|
|
cache: { key: 'k', untracked: true, paths: ['public/'], policy: 'pull-push' },
|
2016-09-29 09:46:39 +05:30
|
|
|
variables: {},
|
2017-08-17 22:00:37 +05:30
|
|
|
ignore: false,
|
2019-02-15 15:39:39 +05:30
|
|
|
after_script: ['make clean'],
|
2019-03-02 22:35:43 +05:30
|
|
|
only: { refs: %w[branches tags] } }
|
2016-09-13 17:45:13 +05:30
|
|
|
)
|
|
|
|
end
|
|
|
|
end
|
2016-06-16 23:09:34 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-08-24 12:49:21 +05:30
|
|
|
context 'when most of entires not defined' do
|
2017-09-10 17:25:29 +05:30
|
|
|
before do
|
|
|
|
global.compose!
|
|
|
|
end
|
2016-09-29 09:46:39 +05:30
|
|
|
|
|
|
|
let(:hash) do
|
|
|
|
{ cache: { key: 'a' }, rspec: { script: %w[ls] } }
|
|
|
|
end
|
2016-08-24 12:49:21 +05:30
|
|
|
|
|
|
|
describe '#nodes' do
|
|
|
|
it 'instantizes all nodes' do
|
2019-05-30 16:15:17 +05:30
|
|
|
expect(global.descendants.count).to eq 8
|
2016-08-24 12:49:21 +05:30
|
|
|
end
|
|
|
|
|
2016-09-29 09:46:39 +05:30
|
|
|
it 'contains unspecified nodes' do
|
2016-09-13 17:45:13 +05:30
|
|
|
expect(global.descendants.first)
|
2017-08-17 22:00:37 +05:30
|
|
|
.not_to be_specified
|
2016-08-24 12:49:21 +05:30
|
|
|
end
|
2016-06-16 23:09:34 +05:30
|
|
|
end
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
describe '#variables_value' do
|
2016-08-24 12:49:21 +05:30
|
|
|
it 'returns default value for variables' do
|
2017-08-17 22:00:37 +05:30
|
|
|
expect(global.variables_value).to eq({})
|
2016-08-24 12:49:21 +05:30
|
|
|
end
|
|
|
|
end
|
2016-06-16 23:09:34 +05:30
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
describe '#stages_value' do
|
2016-08-24 12:49:21 +05:30
|
|
|
it 'returns an array of default stages' do
|
2017-08-17 22:00:37 +05:30
|
|
|
expect(global.stages_value).to eq %w[build test deploy]
|
2016-06-16 23:09:34 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
describe '#cache_value' do
|
2016-08-24 12:49:21 +05:30
|
|
|
it 'returns correct cache definition' do
|
2017-09-10 17:25:29 +05:30
|
|
|
expect(global.cache_value).to eq(key: 'a', policy: 'pull-push')
|
2016-08-24 12:49:21 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
|
|
|
# When nodes are specified but not defined, we assume that
|
2018-12-13 13:39:08 +05:30
|
|
|
# configuration is valid, and we assume that entry is simply undefined,
|
2016-08-24 12:49:21 +05:30
|
|
|
# despite the fact, that key is present. See issue #18775 for more
|
|
|
|
# details.
|
|
|
|
#
|
|
|
|
context 'when entires specified but not defined' do
|
2017-09-10 17:25:29 +05:30
|
|
|
before do
|
|
|
|
global.compose!
|
|
|
|
end
|
2016-09-29 09:46:39 +05:30
|
|
|
|
|
|
|
let(:hash) do
|
|
|
|
{ variables: nil, rspec: { script: 'rspec' } }
|
|
|
|
end
|
2016-08-24 12:49:21 +05:30
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
describe '#variables_value' do
|
2016-08-24 12:49:21 +05:30
|
|
|
it 'undefined entry returns a default value' do
|
2017-08-17 22:00:37 +05:30
|
|
|
expect(global.variables_value).to eq({})
|
2016-06-16 23:09:34 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
context 'when configuration is not valid' do
|
2017-09-10 17:25:29 +05:30
|
|
|
before do
|
|
|
|
global.compose!
|
|
|
|
end
|
2016-06-16 23:09:34 +05:30
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
context 'when before script is not an array' do
|
|
|
|
let(:hash) do
|
|
|
|
{ before_script: 'ls' }
|
|
|
|
end
|
2016-06-16 23:09:34 +05:30
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
describe '#valid?' do
|
|
|
|
it 'is not valid' do
|
|
|
|
expect(global).not_to be_valid
|
|
|
|
end
|
2016-06-16 23:09:34 +05:30
|
|
|
end
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
describe '#errors' do
|
|
|
|
it 'reports errors from child nodes' do
|
|
|
|
expect(global.errors)
|
|
|
|
.to include 'before_script config should be an array of strings'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#before_script_value' do
|
|
|
|
it 'returns nil' do
|
|
|
|
expect(global.before_script_value).to be_nil
|
|
|
|
end
|
2016-06-16 23:09:34 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
context 'when job does not have commands' do
|
|
|
|
let(:hash) do
|
|
|
|
{ before_script: ['echo 123'], rspec: { stage: 'test' } }
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#errors' do
|
|
|
|
it 'reports errors about missing script' do
|
|
|
|
expect(global.errors)
|
|
|
|
.to include "jobs:rspec script can't be blank"
|
|
|
|
end
|
2016-06-16 23:09:34 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when value is not a hash' do
|
|
|
|
let(:hash) { [] }
|
|
|
|
|
|
|
|
describe '#valid?' do
|
|
|
|
it 'is not valid' do
|
|
|
|
expect(global).not_to be_valid
|
|
|
|
end
|
|
|
|
end
|
2016-08-24 12:49:21 +05:30
|
|
|
|
|
|
|
describe '#errors' do
|
|
|
|
it 'returns error about invalid type' do
|
|
|
|
expect(global.errors.first).to match /should be a hash/
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-09-13 17:45:13 +05:30
|
|
|
describe '#specified?' do
|
2016-08-24 12:49:21 +05:30
|
|
|
it 'is concrete entry that is defined' do
|
2016-09-13 17:45:13 +05:30
|
|
|
expect(global.specified?).to be true
|
2016-08-24 12:49:21 +05:30
|
|
|
end
|
2016-06-16 23:09:34 +05:30
|
|
|
end
|
2016-09-29 09:46:39 +05:30
|
|
|
|
|
|
|
describe '#[]' do
|
2017-09-10 17:25:29 +05:30
|
|
|
before do
|
|
|
|
global.compose!
|
|
|
|
end
|
2016-09-29 09:46:39 +05:30
|
|
|
|
|
|
|
let(:hash) do
|
|
|
|
{ cache: { key: 'a' }, rspec: { script: 'ls' } }
|
|
|
|
end
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
context 'when entry exists' do
|
2016-09-29 09:46:39 +05:30
|
|
|
it 'returns correct entry' do
|
|
|
|
expect(global[:cache])
|
2017-08-17 22:00:37 +05:30
|
|
|
.to be_an_instance_of Gitlab::Ci::Config::Entry::Cache
|
2016-09-29 09:46:39 +05:30
|
|
|
expect(global[:jobs][:rspec][:script].value).to eq ['ls']
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-17 22:00:37 +05:30
|
|
|
context 'when entry does not exist' do
|
2016-09-29 09:46:39 +05:30
|
|
|
it 'always return unspecified node' do
|
|
|
|
expect(global[:some][:unknown][:node])
|
|
|
|
.not_to be_specified
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2016-06-16 23:09:34 +05:30
|
|
|
end
|