diff options
Diffstat (limited to 'spec/lib/gitlab/ci/config/entry/cache_spec.rb')
-rw-r--r-- | spec/lib/gitlab/ci/config/entry/cache_spec.rb | 352 |
1 files changed, 142 insertions, 210 deletions
diff --git a/spec/lib/gitlab/ci/config/entry/cache_spec.rb b/spec/lib/gitlab/ci/config/entry/cache_spec.rb index cec1c97085b..247f4b63910 100644 --- a/spec/lib/gitlab/ci/config/entry/cache_spec.rb +++ b/spec/lib/gitlab/ci/config/entry/cache_spec.rb @@ -7,295 +7,227 @@ RSpec.describe Gitlab::Ci::Config::Entry::Cache do subject(:entry) { described_class.new(config) } - context 'with multiple caches' do + describe 'validations' do before do entry.compose! end - describe '#valid?' do - context 'with an empty hash as cache' do - let(:config) { {} } - - it 'is valid' do - expect(entry).to be_valid - end - end - - context 'when configuration is valid with a single cache' do - let(:config) { { key: 'key', paths: ["logs/"], untracked: true } } - - it 'is valid' do - expect(entry).to be_valid + context 'when entry config value is correct' do + let(:policy) { nil } + let(:key) { 'some key' } + let(:when_config) { nil } + + let(:config) do + { + key: key, + untracked: true, + paths: ['some/path/'] + }.tap do |config| + config[:policy] = policy if policy + config[:when] = when_config if when_config end end - context 'when configuration is valid with multiple caches' do - let(:config) do - [ - { key: 'key', paths: ["logs/"], untracked: true }, - { key: 'key2', paths: ["logs/"], untracked: true }, - { key: 'key3', paths: ["logs/"], untracked: true } - ] + describe '#value' do + shared_examples 'hash key value' do + it 'returns hash value' do + expect(entry.value).to eq(key: key, untracked: true, paths: ['some/path/'], policy: 'pull-push', when: 'on_success') + end end - it 'is valid' do - expect(entry).to be_valid - end - end + it_behaves_like 'hash key value' - context 'when configuration is not a Hash or Array' do - let(:config) { 'invalid' } + context 'with files' do + let(:key) { { files: %w[a-file other-file] } } - it 'is invalid' do - expect(entry).not_to be_valid + it_behaves_like 'hash key value' end - end - context 'when entry values contain more than four caches' do - let(:config) do - [ - { key: 'key', paths: ["logs/"], untracked: true }, - { key: 'key2', paths: ["logs/"], untracked: true }, - { key: 'key3', paths: ["logs/"], untracked: true }, - { key: 'key4', paths: ["logs/"], untracked: true }, - { key: 'key5', paths: ["logs/"], untracked: true } - ] - end + context 'with files and prefix' do + let(:key) { { files: %w[a-file other-file], prefix: 'prefix-value' } } - it 'is invalid' do - expect(entry.errors).to eq(["caches config no more than 4 caches can be created"]) - expect(entry).not_to be_valid + it_behaves_like 'hash key value' end - end - end - end - context 'with a single cache' do - before do - stub_feature_flags(multiple_cache_per_job: false) - end - describe 'validations' do - before do - entry.compose! - end - - context 'when entry config value is correct' do - let(:policy) { nil } - let(:key) { 'some key' } - let(:when_config) { nil } + context 'with prefix' do + let(:key) { { prefix: 'prefix-value' } } - let(:config) do - { - key: key, - untracked: true, - paths: ['some/path/'] - }.tap do |config| - config[:policy] = policy if policy - config[:when] = when_config if when_config + it 'key is nil' do + expect(entry.value).to match(a_hash_including(key: nil)) end end - describe '#value' do - shared_examples 'hash key value' do - it 'returns hash value' do - expect(entry.value).to eq(key: key, untracked: true, paths: ['some/path/'], policy: 'pull-push', when: 'on_success') - end - end - - it_behaves_like 'hash key value' - - context 'with files' do - let(:key) { { files: %w[a-file other-file] } } - - it_behaves_like 'hash key value' - end - - context 'with files and prefix' do - let(:key) { { files: %w[a-file other-file], prefix: 'prefix-value' } } - - it_behaves_like 'hash key value' + context 'with `policy`' do + where(:policy, :result) do + 'pull-push' | 'pull-push' + 'push' | 'push' + 'pull' | 'pull' + 'unknown' | 'unknown' # invalid end - context 'with prefix' do - let(:key) { { prefix: 'prefix-value' } } - - it 'key is nil' do - expect(entry.value).to match(a_hash_including(key: nil)) - end + with_them do + it { expect(entry.value).to include(policy: result) } end + end - context 'with `policy`' do - where(:policy, :result) do - 'pull-push' | 'pull-push' - 'push' | 'push' - 'pull' | 'pull' - 'unknown' | 'unknown' # invalid - end - - with_them do - it { expect(entry.value).to include(policy: result) } - end + context 'without `policy`' do + it 'assigns policy to default' do + expect(entry.value).to include(policy: 'pull-push') end + end - context 'without `policy`' do - it 'assigns policy to default' do - expect(entry.value).to include(policy: 'pull-push') - end + context 'with `when`' do + where(:when_config, :result) do + 'on_success' | 'on_success' + 'on_failure' | 'on_failure' + 'always' | 'always' + 'unknown' | 'unknown' # invalid end - context 'with `when`' do - where(:when_config, :result) do - 'on_success' | 'on_success' - 'on_failure' | 'on_failure' - 'always' | 'always' - 'unknown' | 'unknown' # invalid - end - - with_them do - it { expect(entry.value).to include(when: result) } - end + with_them do + it { expect(entry.value).to include(when: result) } end + end - context 'without `when`' do - it 'assigns when to default' do - expect(entry.value).to include(when: 'on_success') - end + context 'without `when`' do + it 'assigns when to default' do + expect(entry.value).to include(when: 'on_success') end end + end - describe '#valid?' do - it { is_expected.to be_valid } + describe '#valid?' do + it { is_expected.to be_valid } - context 'with files' do - let(:key) { { files: %w[a-file other-file] } } + context 'with files' do + let(:key) { { files: %w[a-file other-file] } } - it { is_expected.to be_valid } - end + it { is_expected.to be_valid } end + end - context 'with `policy`' do - where(:policy, :valid) do - 'pull-push' | true - 'push' | true - 'pull' | true - 'unknown' | false - end + context 'with `policy`' do + where(:policy, :valid) do + 'pull-push' | true + 'push' | true + 'pull' | true + 'unknown' | false + end - with_them do - it 'returns expected validity' do - expect(entry.valid?).to eq(valid) - end + with_them do + it 'returns expected validity' do + expect(entry.valid?).to eq(valid) end end + end - context 'with `when`' do - where(:when_config, :valid) do - 'on_success' | true - 'on_failure' | true - 'always' | true - 'unknown' | false - end + context 'with `when`' do + where(:when_config, :valid) do + 'on_success' | true + 'on_failure' | true + 'always' | true + 'unknown' | false + end - with_them do - it 'returns expected validity' do - expect(entry.valid?).to eq(valid) - end + with_them do + it 'returns expected validity' do + expect(entry.valid?).to eq(valid) end end + end - context 'with key missing' do - let(:config) do - { untracked: true, - paths: ['some/path/'] } - end + context 'with key missing' do + let(:config) do + { untracked: true, + paths: ['some/path/'] } + end - describe '#value' do - it 'sets key with the default' do - expect(entry.value[:key]) - .to eq(Gitlab::Ci::Config::Entry::Key.default) - end + describe '#value' do + it 'sets key with the default' do + expect(entry.value[:key]) + .to eq(Gitlab::Ci::Config::Entry::Key.default) end end end + end - context 'when entry value is not correct' do - describe '#errors' do - subject { entry.errors } + context 'when entry value is not correct' do + describe '#errors' do + subject { entry.errors } - context 'when is not a hash' do - let(:config) { 'ls' } + context 'when is not a hash' do + let(:config) { 'ls' } - it 'reports errors with config value' do - is_expected.to include 'cache config should be a hash' - end + it 'reports errors with config value' do + is_expected.to include 'cache config should be a hash' end + end - context 'when policy is unknown' do - let(:config) { { policy: 'unknown' } } + context 'when policy is unknown' do + let(:config) { { policy: 'unknown' } } - it 'reports error' do - is_expected.to include('cache policy should be pull-push, push, or pull') - end + it 'reports error' do + is_expected.to include('cache policy should be pull-push, push, or pull') end + end - context 'when `when` is unknown' do - let(:config) { { when: 'unknown' } } + context 'when `when` is unknown' do + let(:config) { { when: 'unknown' } } - it 'reports error' do - is_expected.to include('cache when should be on_success, on_failure or always') - end + it 'reports error' do + is_expected.to include('cache when should be on_success, on_failure or always') end + end - context 'when descendants are invalid' do - context 'with invalid keys' do - let(:config) { { key: 1 } } - - it 'reports error with descendants' do - is_expected.to include 'key should be a hash, a string or a symbol' - end - end - - context 'with empty key' do - let(:config) { { key: {} } } + context 'when descendants are invalid' do + context 'with invalid keys' do + let(:config) { { key: 1 } } - it 'reports error with descendants' do - is_expected.to include 'key config missing required keys: files' - end + it 'reports error with descendants' do + is_expected.to include 'key should be a hash, a string or a symbol' end + end - context 'with invalid files' do - let(:config) { { key: { files: 'a-file' } } } + context 'with empty key' do + let(:config) { { key: {} } } - it 'reports error with descendants' do - is_expected.to include 'key:files config should be an array of strings' - end + it 'reports error with descendants' do + is_expected.to include 'key config missing required keys: files' end + end - context 'with prefix without files' do - let(:config) { { key: { prefix: 'a-prefix' } } } + context 'with invalid files' do + let(:config) { { key: { files: 'a-file' } } } - it 'reports error with descendants' do - is_expected.to include 'key config missing required keys: files' - end + it 'reports error with descendants' do + is_expected.to include 'key:files config should be an array of strings' end + end - context 'when there is an unknown key present' do - let(:config) { { key: { unknown: 'a-file' } } } + context 'with prefix without files' do + let(:config) { { key: { prefix: 'a-prefix' } } } - it 'reports error with descendants' do - is_expected.to include 'key config contains unknown keys: unknown' - end + it 'reports error with descendants' do + is_expected.to include 'key config missing required keys: files' end end context 'when there is an unknown key present' do - let(:config) { { invalid: true } } + let(:config) { { key: { unknown: 'a-file' } } } it 'reports error with descendants' do - is_expected.to include 'cache config contains unknown keys: invalid' + is_expected.to include 'key config contains unknown keys: unknown' end end end + + context 'when there is an unknown key present' do + let(:config) { { invalid: true } } + + it 'reports error with descendants' do + is_expected.to include 'cache config contains unknown keys: invalid' + end + end end end end |