114 lines
3.8 KiB
Ruby
114 lines
3.8 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
require 'spec_helper'
|
||
|
|
||
|
RSpec.describe Gitlab::Ci::Matching::RunnerMatcher do
|
||
|
let(:dummy_attributes) do
|
||
|
{
|
||
|
runner_type: 'instance_type',
|
||
|
public_projects_minutes_cost_factor: 0,
|
||
|
private_projects_minutes_cost_factor: 1,
|
||
|
run_untagged: false,
|
||
|
access_level: 'ref_protected',
|
||
|
tag_list: %w[tag1 tag2]
|
||
|
}
|
||
|
end
|
||
|
|
||
|
subject(:matcher) { described_class.new(attributes) }
|
||
|
|
||
|
describe '.new' do
|
||
|
context 'when attributes are missing' do
|
||
|
let(:attributes) { {} }
|
||
|
|
||
|
it { expect { matcher }.to raise_error(KeyError) }
|
||
|
end
|
||
|
|
||
|
context 'with attributes' do
|
||
|
let(:attributes) { dummy_attributes }
|
||
|
|
||
|
it { expect(matcher.runner_type).to eq('instance_type') }
|
||
|
|
||
|
it { expect(matcher.public_projects_minutes_cost_factor).to eq(0) }
|
||
|
|
||
|
it { expect(matcher.private_projects_minutes_cost_factor).to eq(1) }
|
||
|
|
||
|
it { expect(matcher.run_untagged).to eq(false) }
|
||
|
|
||
|
it { expect(matcher.access_level).to eq('ref_protected') }
|
||
|
|
||
|
it { expect(matcher.tag_list).to eq(%w[tag1 tag2]) }
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe '#instance_type?' do
|
||
|
let(:attributes) { dummy_attributes }
|
||
|
|
||
|
it { expect(matcher.instance_type?).to be_truthy }
|
||
|
|
||
|
context 'context with private runners' do
|
||
|
let(:attributes) { dummy_attributes.merge(runner_type: 'project_type') }
|
||
|
|
||
|
it { expect(matcher.instance_type?).to be_falsey }
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe '#matches?' do
|
||
|
let(:build) { build_stubbed(:ci_build, build_attributes) }
|
||
|
let(:runner_matcher) { described_class.new(dummy_attributes.merge(runner_attributes)) }
|
||
|
|
||
|
subject { runner_matcher.matches?(record) }
|
||
|
|
||
|
context 'with an instance of BuildMatcher' do
|
||
|
using RSpec::Parameterized::TableSyntax
|
||
|
|
||
|
where(:ref_protected, :build_protected, :run_untagged, :runner_tags, :build_tags, :result) do
|
||
|
# the `ref_protected? && !build.protected?` part:
|
||
|
true | true | true | [] | [] | true
|
||
|
true | false | true | [] | [] | false
|
||
|
false | true | true | [] | [] | true
|
||
|
false | false | true | [] | [] | true
|
||
|
# `accepting_tags?(build)` bit:
|
||
|
true | true | true | [] | [] | true
|
||
|
true | true | true | [] | ['a'] | false
|
||
|
true | true | true | %w[a b] | ['a'] | true
|
||
|
true | true | true | ['a'] | %w[a b] | false
|
||
|
true | true | true | ['a'] | ['a'] | true
|
||
|
true | true | false | ['a'] | ['a'] | true
|
||
|
true | true | false | ['b'] | ['a'] | false
|
||
|
true | true | false | %w[a b] | ['a'] | true
|
||
|
end
|
||
|
|
||
|
with_them do
|
||
|
let(:build_attributes) do
|
||
|
{
|
||
|
tag_list: build_tags,
|
||
|
protected: build_protected
|
||
|
}
|
||
|
end
|
||
|
|
||
|
let(:runner_attributes) do
|
||
|
{
|
||
|
access_level: ref_protected ? 'ref_protected' : 'not_protected',
|
||
|
run_untagged: run_untagged,
|
||
|
tag_list: runner_tags
|
||
|
}
|
||
|
end
|
||
|
|
||
|
let(:record) { build.build_matcher }
|
||
|
|
||
|
it { is_expected.to eq(result) }
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with an instance of Ci::Build' do
|
||
|
let(:runner_attributes) { {} }
|
||
|
let(:build_attributes) { {} }
|
||
|
let(:record) { build }
|
||
|
|
||
|
it 'raises ArgumentError' do
|
||
|
expect { subject }.to raise_error ArgumentError, /BuildMatcher are allowed/
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|