summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/config/entry/composable_hash_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib/gitlab/config/entry/composable_hash_spec.rb')
-rw-r--r--spec/lib/gitlab/config/entry/composable_hash_spec.rb108
1 files changed, 108 insertions, 0 deletions
diff --git a/spec/lib/gitlab/config/entry/composable_hash_spec.rb b/spec/lib/gitlab/config/entry/composable_hash_spec.rb
new file mode 100644
index 00000000000..15bbf2047c5
--- /dev/null
+++ b/spec/lib/gitlab/config/entry/composable_hash_spec.rb
@@ -0,0 +1,108 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Config::Entry::ComposableHash, :aggregate_failures do
+ let(:valid_config) do
+ {
+ DATABASE_SECRET: 'passw0rd',
+ API_TOKEN: 'passw0rd2'
+ }
+ end
+
+ let(:config) { valid_config }
+
+ shared_examples 'composes a hash' do
+ describe '#valid?' do
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+
+ context 'is invalid' do
+ let(:config) { %w[one two] }
+
+ it { expect(entry).not_to be_valid }
+ end
+ end
+
+ describe '#value' do
+ context 'when config is a hash' do
+ it 'returns key value' do
+ expect(entry.value).to eq config
+ end
+ end
+ end
+
+ describe '#compose!' do
+ before do
+ entry.compose!
+ end
+
+ it 'composes child entry with configured value' do
+ expect(entry.value).to eq(config)
+ end
+
+ it 'composes child entries with configured values' do
+ expect(entry[:DATABASE_SECRET]).to be_a(Gitlab::Config::Entry::Node)
+ expect(entry[:DATABASE_SECRET].description).to eq('DATABASE_SECRET node definition')
+ expect(entry[:DATABASE_SECRET].key).to eq(:DATABASE_SECRET)
+ expect(entry[:DATABASE_SECRET].metadata).to eq(name: :DATABASE_SECRET)
+ expect(entry[:DATABASE_SECRET].parent.class).to eq(Gitlab::Config::Entry::ComposableHash)
+ expect(entry[:DATABASE_SECRET].value).to eq('passw0rd')
+ expect(entry[:API_TOKEN]).to be_a(Gitlab::Config::Entry::Node)
+ expect(entry[:API_TOKEN].description).to eq('API_TOKEN node definition')
+ expect(entry[:API_TOKEN].key).to eq(:API_TOKEN)
+ expect(entry[:API_TOKEN].metadata).to eq(name: :API_TOKEN)
+ expect(entry[:API_TOKEN].parent.class).to eq(Gitlab::Config::Entry::ComposableHash)
+ expect(entry[:API_TOKEN].value).to eq('passw0rd2')
+ end
+
+ describe '#descendants' do
+ it 'creates descendant nodes' do
+ expect(entry.descendants.first).to be_a(Gitlab::Config::Entry::Node)
+ expect(entry.descendants.first.value).to eq('passw0rd')
+ expect(entry.descendants.second).to be_a(Gitlab::Config::Entry::Node)
+ expect(entry.descendants.second.value).to eq('passw0rd2')
+ end
+ end
+ end
+ end
+
+ context 'when ComposableHash is instantiated' do
+ let(:entry) { described_class.new(config) }
+
+ before do
+ allow(entry).to receive(:composable_class).and_return(Gitlab::Config::Entry::Node)
+ end
+
+ it_behaves_like 'composes a hash'
+ end
+
+ context 'when ComposableHash entry is configured in the parent class' do
+ let(:composable_hash_parent_class) do
+ Class.new(Gitlab::Config::Entry::Node) do
+ include ::Gitlab::Config::Entry::Configurable
+
+ entry :secrets, ::Gitlab::Config::Entry::ComposableHash,
+ description: 'Configured secrets for this job',
+ inherit: false,
+ default: { hello: :world },
+ metadata: { composable_class: Gitlab::Config::Entry::Node }
+ end
+ end
+
+ let(:entry) do
+ parent_entry = composable_hash_parent_class.new(secrets: config)
+ parent_entry.compose!
+
+ parent_entry[:secrets]
+ end
+
+ it_behaves_like 'composes a hash'
+
+ it 'creates entry with configuration from parent class' do
+ expect(entry.default).to eq({ hello: :world })
+ expect(entry.metadata).to eq(composable_class: Gitlab::Config::Entry::Node)
+ end
+ end
+end