Commit e1b3ab5a authored by Kamil Trzcinski's avatar Kamil Trzcinski

Verify expandability of variables defined as part of environment

parent 2cc9a785
...@@ -23,13 +23,13 @@ class CreateDeploymentService < BaseService ...@@ -23,13 +23,13 @@ class CreateDeploymentService < BaseService
private private
def expanded_name def expanded_name
name.expand_variables(variables) ExpandVariables.expand(name, variables)
end end
def expanded_url def expanded_url
return unless url return unless url
@expanded_url ||= url.expand_variables(variables) @expanded_url ||= ExpandVariables.expand(url, variables)
end end
def name def name
......
String.instance_eval module ExpandVariables
def expand_variables(variables) class << self
# Convert hash array to variables def expand_variables(value, variables)
if variables.is_a?(Array) # Convert hash array to variables
variables = variables.reduce({}) do |hash, variable| if variables.is_a?(Array)
hash[variable[:key]] = variable[:value] variables = variables.reduce({}) do |hash, variable|
hash hash[variable[:key]] = variable[:value]
hash
end
end end
end
self.gsub(/\$([a-zA-Z_][a-zA-Z0-9_]*)|\${\g<1>}|%\g<1>%/) do value.gsub(/\$([a-zA-Z_][a-zA-Z0-9_]*)|\${\g<1>}|%\g<1>%/) do
variables[$1 || $2] variables[$1 || $2]
end
end end
end end
end end
require 'spec_helper'
describe ExpandVariables do
describe '#expand' do
subject { described_class.expand(value, variables) }
tests = [
{ value: 'key',
result: 'key',
variables: []
},
{ value: 'key$variable',
result: 'key',
variables: []
},
{ value: 'key$variable',
result: 'keyvalue',
variables: [
{ key: 'variable', value: 'value' }
]
},
{ value: 'key${variable}',
result: 'keyvalue',
variables: [
{ key: 'variable', value: 'value' }
]
},
{ value: 'key$variable$variable2',
result: 'keyvalueresult',
variables: [
{ key: 'variable', value: 'value' },
{ key: 'variable2', value: 'result' },
]
},
{ value: 'key${variable}${variable2}',
result: 'keyvalueresult',
variables: [
{ key: 'variable', value: 'value' },
{ key: 'variable2', value: 'result' }
]
},
{ value: 'key$variable2$variable',
result: 'keyresultvalue',
variables: [
{ key: 'variable', value: 'value' },
{ key: 'variable2', value: 'result' },
]
},
{ value: 'key${variable2}${variable}',
result: 'keyresultvalue',
variables: [
{ key: 'variable', value: 'value' },
{ key: 'variable2', value: 'result' }
]
},
{ value: 'review/$CI_BUILD_REF_NAME',
result: 'review/feature/add-review-apps',
variables: [
{ key: 'CI_BUILD_REF_NAME', value: 'feature/add-review-apps' }
]
},
]
tests.each do |test|
context "#{test[:value]} resolves to #{test[:result]}" do
let(:value) { test[:value] }
let(:variables) { test[:variables] }
it { is_expected.to eq(test[:result]) }
end
end
end
end
...@@ -63,4 +63,20 @@ describe Environment, models: true do ...@@ -63,4 +63,20 @@ describe Environment, models: true do
end end
end end
end end
describe '#environment_type' do
subject { environment.environment_type }
it 'sets a environment type if name has multiple segments' do
environment.update(name: 'production/worker.gitlab.com')
is_expected.to eq('production')
end
it 'nullifies a type if it\'s a simple name' do
environment.update(name: 'production')
is_expected.to be_nil
end
end
end end
...@@ -56,8 +56,38 @@ describe CreateDeploymentService, services: true do ...@@ -56,8 +56,38 @@ describe CreateDeploymentService, services: true do
expect(subject).not_to be_persisted expect(subject).not_to be_persisted
end end
end end
context 'when variables are used' do
let(:params) do
{ environment: 'review-apps/$CI_BUILD_REF_NAME',
ref: 'master',
tag: false,
sha: '97de212e80737a608d939f648d959671fb0a0142',
options: {
environment: {
name: 'review-apps/$CI_BUILD_REF_NAME',
url: 'http://$CI_BUILD_REF_NAME.review-apps.gitlab.com'
}
},
variables: [
{ key: 'CI_BUILD_REF_NAME', value: 'feature-review-apps' }
]
}
end
it 'does create a new environment' do
expect { subject }.to change { Environment.count }.by(1)
expect(subject.environment.name).to eq('review-apps/feature-review-apps')
expect(subject.environment.external_url).to eq('http://feature-review-apps.review-apps.gitlab.com')
end
it 'does create a new deployment' do
expect(subject).not_to be_persisted
end
end
end end
describe 'processing of builds' do describe 'processing of builds' do
let(:environment) { nil } let(:environment) { nil }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment