Merge branch 'ci-job-only-except-conflict-specs' into 'master'

Added specs for CI Job inclusion when only: and except: both match

See merge request gitlab-org/gitlab-ce!30057
This commit is contained in:
Thong Kuah 2019-07-16 21:21:52 +00:00
commit 3fcf951c8b
1 changed files with 184 additions and 62 deletions

View File

@ -1,32 +1,30 @@
# frozen_string_literal: true
require 'spec_helper' require 'spec_helper'
describe Gitlab::Ci::Pipeline::Seed::Build do describe Gitlab::Ci::Pipeline::Seed::Build do
let(:project) { create(:project, :repository) } let(:project) { create(:project, :repository) }
let(:pipeline) { create(:ci_empty_pipeline, project: project) } let(:pipeline) { create(:ci_empty_pipeline, project: project) }
let(:attributes) { { name: 'rspec', ref: 'master' } }
let(:attributes) do let(:seed_build) { described_class.new(pipeline, attributes) }
{ name: 'rspec', ref: 'master' }
end
subject do
described_class.new(pipeline, attributes)
end
describe '#attributes' do describe '#attributes' do
it 'returns hash attributes of a build' do subject { seed_build.attributes }
expect(subject.attributes).to be_a Hash
expect(subject.attributes) it { is_expected.to be_a(Hash) }
.to include(:name, :project, :ref) it { is_expected.to include(:name, :project, :ref) }
end
end end
describe '#bridge?' do describe '#bridge?' do
subject { seed_build.bridge? }
context 'when job is a bridge' do context 'when job is a bridge' do
let(:attributes) do let(:attributes) do
{ name: 'rspec', ref: 'master', options: { trigger: 'my/project' } } { name: 'rspec', ref: 'master', options: { trigger: 'my/project' } }
end end
it { is_expected.to be_bridge } it { is_expected.to be_truthy }
end end
context 'when trigger definition is empty' do context 'when trigger definition is empty' do
@ -34,20 +32,20 @@ describe Gitlab::Ci::Pipeline::Seed::Build do
{ name: 'rspec', ref: 'master', options: { trigger: '' } } { name: 'rspec', ref: 'master', options: { trigger: '' } }
end end
it { is_expected.not_to be_bridge } it { is_expected.to be_falsey }
end end
context 'when job is not a bridge' do context 'when job is not a bridge' do
it { is_expected.not_to be_bridge } it { is_expected.to be_falsey }
end end
end end
describe '#to_resource' do describe '#to_resource' do
subject { seed_build.to_resource }
context 'when job is not a bridge' do context 'when job is not a bridge' do
it 'returns a valid build resource' do it { is_expected.to be_a(::Ci::Build) }
expect(subject.to_resource).to be_a(::Ci::Build) it { is_expected.to be_valid }
expect(subject.to_resource).to be_valid
end
end end
context 'when job is a bridge' do context 'when job is a bridge' do
@ -55,71 +53,117 @@ describe Gitlab::Ci::Pipeline::Seed::Build do
{ name: 'rspec', ref: 'master', options: { trigger: 'my/project' } } { name: 'rspec', ref: 'master', options: { trigger: 'my/project' } }
end end
it 'returns a valid bridge resource' do it { is_expected.to be_a(::Ci::Bridge) }
expect(subject.to_resource).to be_a(::Ci::Bridge) it { is_expected.to be_valid }
expect(subject.to_resource).to be_valid
end
end end
it 'memoizes a resource object' do it 'memoizes a resource object' do
build = subject.to_resource expect(subject.object_id).to eq seed_build.to_resource.object_id
expect(build.object_id).to eq subject.to_resource.object_id
end end
it 'can not be persisted without explicit assignment' do it 'can not be persisted without explicit assignment' do
build = subject.to_resource
pipeline.save! pipeline.save!
expect(build).not_to be_persisted expect(subject).not_to be_persisted
end end
end end
describe 'applying only/except policies' do describe 'applying job inclusion policies' do
subject { seed_build }
context 'when no branch policy is specified' do context 'when no branch policy is specified' do
let(:attributes) { { name: 'rspec' } } let(:attributes) do
{ name: 'rspec' }
end
it { is_expected.to be_included } it { is_expected.to be_included }
end end
context 'when branch policy does not match' do context 'when branch policy does not match' do
context 'when using only' do context 'when using only' do
let(:attributes) { { name: 'rspec', only: { refs: ['deploy'] } } } let(:attributes) do
{ name: 'rspec', only: { refs: ['deploy'] } }
end
it { is_expected.not_to be_included } it { is_expected.not_to be_included }
end end
context 'when using except' do context 'when using except' do
let(:attributes) { { name: 'rspec', except: { refs: ['deploy'] } } } let(:attributes) do
{ name: 'rspec', except: { refs: ['deploy'] } }
end
it { is_expected.to be_included } it { is_expected.to be_included }
end end
context 'with both only and except policies' do
let(:attributes) do
{
name: 'rspec',
only: { refs: %w[deploy] },
except: { refs: %w[deploy] }
}
end
it { is_expected.not_to be_included }
end
end end
context 'when branch regexp policy does not match' do context 'when branch regexp policy does not match' do
context 'when using only' do context 'when using only' do
let(:attributes) { { name: 'rspec', only: { refs: ['/^deploy$/'] } } } let(:attributes) do
{ name: 'rspec', only: { refs: %w[/^deploy$/] } }
end
it { is_expected.not_to be_included } it { is_expected.not_to be_included }
end end
context 'when using except' do context 'when using except' do
let(:attributes) { { name: 'rspec', except: { refs: ['/^deploy$/'] } } } let(:attributes) do
{ name: 'rspec', except: { refs: %w[/^deploy$/] } }
end
it { is_expected.to be_included } it { is_expected.to be_included }
end end
context 'with both only and except policies' do
let(:attributes) do
{
name: 'rspec',
only: { refs: %w[/^deploy$/] },
except: { refs: %w[/^deploy$/] }
}
end
it { is_expected.not_to be_included }
end
end end
context 'when branch policy matches' do context 'when branch policy matches' do
context 'when using only' do context 'when using only' do
let(:attributes) { { name: 'rspec', only: { refs: %w[deploy master] } } } let(:attributes) do
{ name: 'rspec', only: { refs: %w[deploy master] } }
end
it { is_expected.to be_included } it { is_expected.to be_included }
end end
context 'when using except' do context 'when using except' do
let(:attributes) { { name: 'rspec', except: { refs: %w[deploy master] } } } let(:attributes) do
{ name: 'rspec', except: { refs: %w[deploy master] } }
end
it { is_expected.not_to be_included }
end
context 'when using both only and except policies' do
let(:attributes) do
{
name: 'rspec',
only: { refs: %w[deploy master] },
except: { refs: %w[deploy master] }
}
end
it { is_expected.not_to be_included } it { is_expected.not_to be_included }
end end
@ -127,13 +171,29 @@ describe Gitlab::Ci::Pipeline::Seed::Build do
context 'when keyword policy matches' do context 'when keyword policy matches' do
context 'when using only' do context 'when using only' do
let(:attributes) { { name: 'rspec', only: { refs: ['branches'] } } } let(:attributes) do
{ name: 'rspec', only: { refs: %w[branches] } }
end
it { is_expected.to be_included } it { is_expected.to be_included }
end end
context 'when using except' do context 'when using except' do
let(:attributes) { { name: 'rspec', except: { refs: ['branches'] } } } let(:attributes) do
{ name: 'rspec', except: { refs: %w[branches] } }
end
it { is_expected.not_to be_included }
end
context 'when using both only and except policies' do
let(:attributes) do
{
name: 'rspec',
only: { refs: %w[branches] },
except: { refs: %w[branches] }
}
end
it { is_expected.not_to be_included } it { is_expected.not_to be_included }
end end
@ -141,50 +201,78 @@ describe Gitlab::Ci::Pipeline::Seed::Build do
context 'when keyword policy does not match' do context 'when keyword policy does not match' do
context 'when using only' do context 'when using only' do
let(:attributes) { { name: 'rspec', only: { refs: ['tags'] } } } let(:attributes) do
{ name: 'rspec', only: { refs: %w[tags] } }
end
it { is_expected.not_to be_included } it { is_expected.not_to be_included }
end end
context 'when using except' do context 'when using except' do
let(:attributes) { { name: 'rspec', except: { refs: ['tags'] } } } let(:attributes) do
{ name: 'rspec', except: { refs: %w[tags] } }
end
it { is_expected.to be_included } it { is_expected.to be_included }
end end
context 'when using both only and except policies' do
let(:attributes) do
{
name: 'rspec',
only: { refs: %w[tags] },
except: { refs: %w[tags] }
}
end
it { is_expected.not_to be_included }
end
end end
context 'with source-keyword policy' do context 'with source-keyword policy' do
using RSpec::Parameterized using RSpec::Parameterized
let(:pipeline) { build(:ci_empty_pipeline, ref: 'deploy', tag: false, source: source) } let(:pipeline) do
build(:ci_empty_pipeline, ref: 'deploy', tag: false, source: source)
end
context 'matches' do context 'matches' do
where(:keyword, :source) do where(:keyword, :source) do
[ [
%w(pushes push), %w[pushes push],
%w(web web), %w[web web],
%w(triggers trigger), %w[triggers trigger],
%w(schedules schedule), %w[schedules schedule],
%w(api api), %w[api api],
%w(external external) %w[external external]
] ]
end end
with_them do with_them do
context 'using an only policy' do context 'using an only policy' do
let(:attributes) { { name: 'rspec', only: { refs: [keyword] } } } let(:attributes) do
{ name: 'rspec', only: { refs: [keyword] } }
end
it { is_expected.to be_included } it { is_expected.to be_included }
end end
context 'using an except policy' do context 'using an except policy' do
let(:attributes) { { name: 'rspec', except: { refs: [keyword] } } } let(:attributes) do
{ name: 'rspec', except: { refs: [keyword] } }
end
it { is_expected.not_to be_included } it { is_expected.not_to be_included }
end end
context 'using both only and except policies' do context 'using both only and except policies' do
let(:attributes) { { name: 'rspec', only: { refs: [keyword] }, except: { refs: [keyword] } } } let(:attributes) do
{
name: 'rspec',
only: { refs: [keyword] },
except: { refs: [keyword] }
}
end
it { is_expected.not_to be_included } it { is_expected.not_to be_included }
end end
@ -193,29 +281,39 @@ describe Gitlab::Ci::Pipeline::Seed::Build do
context 'non-matches' do context 'non-matches' do
where(:keyword, :source) do where(:keyword, :source) do
%w(web trigger schedule api external).map { |source| ['pushes', source] } + %w[web trigger schedule api external].map { |source| ['pushes', source] } +
%w(push trigger schedule api external).map { |source| ['web', source] } + %w[push trigger schedule api external].map { |source| ['web', source] } +
%w(push web schedule api external).map { |source| ['triggers', source] } + %w[push web schedule api external].map { |source| ['triggers', source] } +
%w(push web trigger api external).map { |source| ['schedules', source] } + %w[push web trigger api external].map { |source| ['schedules', source] } +
%w(push web trigger schedule external).map { |source| ['api', source] } + %w[push web trigger schedule external].map { |source| ['api', source] } +
%w(push web trigger schedule api).map { |source| ['external', source] } %w[push web trigger schedule api].map { |source| ['external', source] }
end end
with_them do with_them do
context 'using an only policy' do context 'using an only policy' do
let(:attributes) { { name: 'rspec', only: { refs: [keyword] } } } let(:attributes) do
{ name: 'rspec', only: { refs: [keyword] } }
end
it { is_expected.not_to be_included } it { is_expected.not_to be_included }
end end
context 'using an except policy' do context 'using an except policy' do
let(:attributes) { { name: 'rspec', except: { refs: [keyword] } } } let(:attributes) do
{ name: 'rspec', except: { refs: [keyword] } }
end
it { is_expected.to be_included } it { is_expected.to be_included }
end end
context 'using both only and except policies' do context 'using both only and except policies' do
let(:attributes) { { name: 'rspec', only: { refs: [keyword] }, except: { refs: [keyword] } } } let(:attributes) do
{
name: 'rspec',
only: { refs: [keyword] },
except: { refs: [keyword] }
}
end
it { is_expected.not_to be_included } it { is_expected.not_to be_included }
end end
@ -239,12 +337,24 @@ describe Gitlab::Ci::Pipeline::Seed::Build do
it { is_expected.not_to be_included } it { is_expected.not_to be_included }
end end
context 'when using both only and except policies' do
let(:attributes) do
{
name: 'rspec',
only: { refs: ["branches@#{pipeline.project_full_path}"] },
except: { refs: ["branches@#{pipeline.project_full_path}"] }
}
end
it { is_expected.not_to be_included }
end
end end
context 'when repository path does not matches' do context 'when repository path does not matches' do
context 'when using only' do context 'when using only' do
let(:attributes) do let(:attributes) do
{ name: 'rspec', only: { refs: ['branches@fork'] } } { name: 'rspec', only: { refs: %w[branches@fork] } }
end end
it { is_expected.not_to be_included } it { is_expected.not_to be_included }
@ -252,11 +362,23 @@ describe Gitlab::Ci::Pipeline::Seed::Build do
context 'when using except' do context 'when using except' do
let(:attributes) do let(:attributes) do
{ name: 'rspec', except: { refs: ['branches@fork'] } } { name: 'rspec', except: { refs: %w[branches@fork] } }
end end
it { is_expected.to be_included } it { is_expected.to be_included }
end end
context 'when using both only and except policies' do
let(:attributes) do
{
name: 'rspec',
only: { refs: %w[branches@fork] },
except: { refs: %w[branches@fork] }
}
end
it { is_expected.not_to be_included }
end
end end
end end
end end