summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/ci/variables/collection_spec.rb
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-11-18 13:16:36 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2021-11-18 13:16:36 +0000
commit311b0269b4eb9839fa63f80c8d7a58f32b8138a0 (patch)
tree07e7870bca8aed6d61fdcc810731c50d2c40af47 /spec/lib/gitlab/ci/variables/collection_spec.rb
parent27909cef6c4170ed9205afa7426b8d3de47cbb0c (diff)
downloadgitlab-ce-311b0269b4eb9839fa63f80c8d7a58f32b8138a0.tar.gz
Add latest changes from gitlab-org/gitlab@14-5-stable-eev14.5.0-rc42
Diffstat (limited to 'spec/lib/gitlab/ci/variables/collection_spec.rb')
-rw-r--r--spec/lib/gitlab/ci/variables/collection_spec.rb482
1 files changed, 195 insertions, 287 deletions
diff --git a/spec/lib/gitlab/ci/variables/collection_spec.rb b/spec/lib/gitlab/ci/variables/collection_spec.rb
index 7ba98380986..26c560565e0 100644
--- a/spec/lib/gitlab/ci/variables/collection_spec.rb
+++ b/spec/lib/gitlab/ci/variables/collection_spec.rb
@@ -358,302 +358,210 @@ RSpec.describe Gitlab::Ci::Variables::Collection do
end
describe '#sort_and_expand_all' do
- context 'when FF :variable_inside_variable is disabled' do
- let_it_be(:project_with_flag_disabled) { create(:project) }
- let_it_be(:project_with_flag_enabled) { create(:project) }
-
- before do
- stub_feature_flags(variable_inside_variable: [project_with_flag_enabled])
- end
+ context 'table tests' do
+ using RSpec::Parameterized::TableSyntax
- context 'table tests' do
- using RSpec::Parameterized::TableSyntax
-
- where do
- {
- "empty array": {
- variables: [],
- keep_undefined: false
- },
- "simple expansions": {
- variables: [
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'result' },
- { key: 'variable3', value: 'key$variable$variable2' }
- ],
- keep_undefined: false
- },
- "complex expansion": {
- variables: [
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'key${variable}' }
- ],
- keep_undefined: false
- },
- "out-of-order variable reference": {
- variables: [
- { key: 'variable2', value: 'key${variable}' },
- { key: 'variable', value: 'value' }
- ],
- keep_undefined: false
- },
- "complex expansions with raw variable": {
- variables: [
- { key: 'variable3', value: 'key_${variable}_${variable2}' },
- { key: 'variable', value: '$variable2', raw: true },
- { key: 'variable2', value: 'value2' }
- ],
- keep_undefined: false
- },
- "escaped characters in complex expansions are kept intact": {
- variables: [
- { key: 'variable3', value: 'key_${variable}_$${HOME}_%%HOME%%' },
- { key: 'variable', value: '$variable2' },
- { key: 'variable2', value: 'value2' }
- ],
- keep_undefined: false
- },
- "array with cyclic dependency": {
- variables: [
- { key: 'variable', value: '$variable2' },
- { key: 'variable2', value: '$variable3' },
- { key: 'variable3', value: 'key$variable$variable2' }
- ],
- keep_undefined: true
- }
+ where do
+ {
+ "empty array": {
+ variables: [],
+ keep_undefined: false,
+ result: []
+ },
+ "simple expansions": {
+ variables: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable2', value: 'result' },
+ { key: 'variable3', value: 'key$variable$variable2' },
+ { key: 'variable4', value: 'key$variable$variable3' }
+ ],
+ keep_undefined: false,
+ result: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable2', value: 'result' },
+ { key: 'variable3', value: 'keyvalueresult' },
+ { key: 'variable4', value: 'keyvaluekeyvalueresult' }
+ ]
+ },
+ "complex expansion": {
+ variables: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable2', value: 'key${variable}' }
+ ],
+ keep_undefined: false,
+ result: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable2', value: 'keyvalue' }
+ ]
+ },
+ "unused variables": {
+ variables: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable2', value: 'result2' },
+ { key: 'variable3', value: 'result3' },
+ { key: 'variable4', value: 'key$variable$variable3' }
+ ],
+ keep_undefined: false,
+ result: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable2', value: 'result2' },
+ { key: 'variable3', value: 'result3' },
+ { key: 'variable4', value: 'keyvalueresult3' }
+ ]
+ },
+ "complex expansions": {
+ variables: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable2', value: 'result' },
+ { key: 'variable3', value: 'key${variable}${variable2}' }
+ ],
+ keep_undefined: false,
+ result: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable2', value: 'result' },
+ { key: 'variable3', value: 'keyvalueresult' }
+ ]
+ },
+ "escaped characters in complex expansions keeping undefined are kept intact": {
+ variables: [
+ { key: 'variable3', value: 'key_${variable}_$${HOME}_%%HOME%%' },
+ { key: 'variable', value: '$variable2' },
+ { key: 'variable2', value: 'value' }
+ ],
+ keep_undefined: true,
+ result: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable2', value: 'value' },
+ { key: 'variable3', value: 'key_value_$${HOME}_%%HOME%%' }
+ ]
+ },
+ "escaped characters in complex expansions discarding undefined are kept intact": {
+ variables: [
+ { key: 'variable2', value: 'key_${variable4}_$${HOME}_%%HOME%%' },
+ { key: 'variable', value: 'value_$${HOME}_%%HOME%%' }
+ ],
+ keep_undefined: false,
+ result: [
+ { key: 'variable', value: 'value_$${HOME}_%%HOME%%' },
+ { key: 'variable2', value: 'key__$${HOME}_%%HOME%%' }
+ ]
+ },
+ "out-of-order expansion": {
+ variables: [
+ { key: 'variable3', value: 'key$variable2$variable' },
+ { key: 'variable', value: 'value' },
+ { key: 'variable2', value: 'result' }
+ ],
+ keep_undefined: false,
+ result: [
+ { key: 'variable2', value: 'result' },
+ { key: 'variable', value: 'value' },
+ { key: 'variable3', value: 'keyresultvalue' }
+ ]
+ },
+ "out-of-order complex expansion": {
+ variables: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable2', value: 'result' },
+ { key: 'variable3', value: 'key${variable2}${variable}' }
+ ],
+ keep_undefined: false,
+ result: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable2', value: 'result' },
+ { key: 'variable3', value: 'keyresultvalue' }
+ ]
+ },
+ "missing variable discarding original": {
+ variables: [
+ { key: 'variable2', value: 'key$variable' }
+ ],
+ keep_undefined: false,
+ result: [
+ { key: 'variable2', value: 'key' }
+ ]
+ },
+ "missing variable keeping original": {
+ variables: [
+ { key: 'variable2', value: 'key$variable' }
+ ],
+ keep_undefined: true,
+ result: [
+ { key: 'variable2', value: 'key$variable' }
+ ]
+ },
+ "complex expansions with missing variable keeping original": {
+ variables: [
+ { key: 'variable4', value: 'key${variable}${variable2}${variable3}' },
+ { key: 'variable', value: 'value' },
+ { key: 'variable3', value: 'value3' }
+ ],
+ keep_undefined: true,
+ result: [
+ { key: 'variable', value: 'value' },
+ { key: 'variable3', value: 'value3' },
+ { key: 'variable4', value: 'keyvalue${variable2}value3' }
+ ]
+ },
+ "complex expansions with raw variable": {
+ variables: [
+ { key: 'variable3', value: 'key_${variable}_${variable2}' },
+ { key: 'variable', value: '$variable2', raw: true },
+ { key: 'variable2', value: 'value2' }
+ ],
+ keep_undefined: false,
+ result: [
+ { key: 'variable', value: '$variable2', raw: true },
+ { key: 'variable2', value: 'value2' },
+ { key: 'variable3', value: 'key_$variable2_value2' }
+ ]
+ },
+ "variable value referencing password with special characters": {
+ variables: [
+ { key: 'VAR', value: '$PASSWORD' },
+ { key: 'PASSWORD', value: 'my_password$$_%%_$A' },
+ { key: 'A', value: 'value' }
+ ],
+ keep_undefined: false,
+ result: [
+ { key: 'VAR', value: 'my_password$$_%%_value' },
+ { key: 'PASSWORD', value: 'my_password$$_%%_value' },
+ { key: 'A', value: 'value' }
+ ]
+ },
+ "cyclic dependency causes original array to be returned": {
+ variables: [
+ { key: 'variable', value: '$variable2' },
+ { key: 'variable2', value: '$variable3' },
+ { key: 'variable3', value: 'key$variable$variable2' }
+ ],
+ keep_undefined: false,
+ result: [
+ { key: 'variable', value: '$variable2' },
+ { key: 'variable2', value: '$variable3' },
+ { key: 'variable3', value: 'key$variable$variable2' }
+ ]
}
- end
-
- with_them do
- let(:collection) { Gitlab::Ci::Variables::Collection.new(variables, keep_undefined: keep_undefined) }
-
- subject { collection.sort_and_expand_all(project_with_flag_disabled) }
-
- it 'returns Collection' do
- is_expected.to be_an_instance_of(Gitlab::Ci::Variables::Collection)
- end
-
- it 'does not expand variables' do
- var_hash = variables.pluck(:key, :value).to_h
- expect(subject.to_hash).to eq(var_hash)
- end
- end
+ }
end
- end
- context 'when FF :variable_inside_variable is enabled' do
- let_it_be(:project_with_flag_disabled) { create(:project) }
- let_it_be(:project_with_flag_enabled) { create(:project) }
+ with_them do
+ let(:collection) { Gitlab::Ci::Variables::Collection.new(variables) }
- before do
- stub_feature_flags(variable_inside_variable: [project_with_flag_enabled])
- end
+ subject { collection.sort_and_expand_all(keep_undefined: keep_undefined) }
- context 'table tests' do
- using RSpec::Parameterized::TableSyntax
-
- where do
- {
- "empty array": {
- variables: [],
- keep_undefined: false,
- result: []
- },
- "simple expansions": {
- variables: [
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'result' },
- { key: 'variable3', value: 'key$variable$variable2' },
- { key: 'variable4', value: 'key$variable$variable3' }
- ],
- keep_undefined: false,
- result: [
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'result' },
- { key: 'variable3', value: 'keyvalueresult' },
- { key: 'variable4', value: 'keyvaluekeyvalueresult' }
- ]
- },
- "complex expansion": {
- variables: [
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'key${variable}' }
- ],
- keep_undefined: false,
- result: [
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'keyvalue' }
- ]
- },
- "unused variables": {
- variables: [
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'result2' },
- { key: 'variable3', value: 'result3' },
- { key: 'variable4', value: 'key$variable$variable3' }
- ],
- keep_undefined: false,
- result: [
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'result2' },
- { key: 'variable3', value: 'result3' },
- { key: 'variable4', value: 'keyvalueresult3' }
- ]
- },
- "complex expansions": {
- variables: [
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'result' },
- { key: 'variable3', value: 'key${variable}${variable2}' }
- ],
- keep_undefined: false,
- result: [
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'result' },
- { key: 'variable3', value: 'keyvalueresult' }
- ]
- },
- "escaped characters in complex expansions keeping undefined are kept intact": {
- variables: [
- { key: 'variable3', value: 'key_${variable}_$${HOME}_%%HOME%%' },
- { key: 'variable', value: '$variable2' },
- { key: 'variable2', value: 'value' }
- ],
- keep_undefined: true,
- result: [
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'value' },
- { key: 'variable3', value: 'key_value_$${HOME}_%%HOME%%' }
- ]
- },
- "escaped characters in complex expansions discarding undefined are kept intact": {
- variables: [
- { key: 'variable2', value: 'key_${variable4}_$${HOME}_%%HOME%%' },
- { key: 'variable', value: 'value_$${HOME}_%%HOME%%' }
- ],
- keep_undefined: false,
- result: [
- { key: 'variable', value: 'value_$${HOME}_%%HOME%%' },
- { key: 'variable2', value: 'key__$${HOME}_%%HOME%%' }
- ]
- },
- "out-of-order expansion": {
- variables: [
- { key: 'variable3', value: 'key$variable2$variable' },
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'result' }
- ],
- keep_undefined: false,
- result: [
- { key: 'variable2', value: 'result' },
- { key: 'variable', value: 'value' },
- { key: 'variable3', value: 'keyresultvalue' }
- ]
- },
- "out-of-order complex expansion": {
- variables: [
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'result' },
- { key: 'variable3', value: 'key${variable2}${variable}' }
- ],
- keep_undefined: false,
- result: [
- { key: 'variable', value: 'value' },
- { key: 'variable2', value: 'result' },
- { key: 'variable3', value: 'keyresultvalue' }
- ]
- },
- "missing variable discarding original": {
- variables: [
- { key: 'variable2', value: 'key$variable' }
- ],
- keep_undefined: false,
- result: [
- { key: 'variable2', value: 'key' }
- ]
- },
- "missing variable keeping original": {
- variables: [
- { key: 'variable2', value: 'key$variable' }
- ],
- keep_undefined: true,
- result: [
- { key: 'variable2', value: 'key$variable' }
- ]
- },
- "complex expansions with missing variable keeping original": {
- variables: [
- { key: 'variable4', value: 'key${variable}${variable2}${variable3}' },
- { key: 'variable', value: 'value' },
- { key: 'variable3', value: 'value3' }
- ],
- keep_undefined: true,
- result: [
- { key: 'variable', value: 'value' },
- { key: 'variable3', value: 'value3' },
- { key: 'variable4', value: 'keyvalue${variable2}value3' }
- ]
- },
- "complex expansions with raw variable": {
- variables: [
- { key: 'variable3', value: 'key_${variable}_${variable2}' },
- { key: 'variable', value: '$variable2', raw: true },
- { key: 'variable2', value: 'value2' }
- ],
- keep_undefined: false,
- result: [
- { key: 'variable', value: '$variable2', raw: true },
- { key: 'variable2', value: 'value2' },
- { key: 'variable3', value: 'key_$variable2_value2' }
- ]
- },
- "variable value referencing password with special characters": {
- variables: [
- { key: 'VAR', value: '$PASSWORD' },
- { key: 'PASSWORD', value: 'my_password$$_%%_$A' },
- { key: 'A', value: 'value' }
- ],
- keep_undefined: false,
- result: [
- { key: 'VAR', value: 'my_password$$_%%_value' },
- { key: 'PASSWORD', value: 'my_password$$_%%_value' },
- { key: 'A', value: 'value' }
- ]
- },
- "cyclic dependency causes original array to be returned": {
- variables: [
- { key: 'variable', value: '$variable2' },
- { key: 'variable2', value: '$variable3' },
- { key: 'variable3', value: 'key$variable$variable2' }
- ],
- keep_undefined: false,
- result: [
- { key: 'variable', value: '$variable2' },
- { key: 'variable2', value: '$variable3' },
- { key: 'variable3', value: 'key$variable$variable2' }
- ]
- }
- }
+ it 'returns Collection' do
+ is_expected.to be_an_instance_of(Gitlab::Ci::Variables::Collection)
end
- with_them do
- let(:collection) { Gitlab::Ci::Variables::Collection.new(variables) }
-
- subject { collection.sort_and_expand_all(project_with_flag_enabled, keep_undefined: keep_undefined) }
-
- it 'returns Collection' do
- is_expected.to be_an_instance_of(Gitlab::Ci::Variables::Collection)
- end
-
- it 'expands variables' do
- var_hash = result.to_h { |env| [env.fetch(:key), env.fetch(:value)] }
- .with_indifferent_access
- expect(subject.to_hash).to eq(var_hash)
- end
+ it 'expands variables' do
+ var_hash = result.to_h { |env| [env.fetch(:key), env.fetch(:value)] }
+ .with_indifferent_access
+ expect(subject.to_hash).to eq(var_hash)
+ end
- it 'preserves raw attribute' do
- expect(subject.pluck(:key, :raw).to_h).to eq(collection.pluck(:key, :raw).to_h)
- end
+ it 'preserves raw attribute' do
+ expect(subject.pluck(:key, :raw).to_h).to eq(collection.pluck(:key, :raw).to_h)
end
end
end