2019-08-08 14:51:52 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
require 'spec_helper'
|
|
|
|
|
2020-06-24 14:09:03 -04:00
|
|
|
RSpec.describe HasEnvironmentScope do
|
2022-02-17 07:12:30 -05:00
|
|
|
let_it_be(:project) { create(:project) }
|
|
|
|
|
2019-08-08 14:51:52 -04:00
|
|
|
subject { build(:ci_variable) }
|
|
|
|
|
|
|
|
it { is_expected.to allow_value('*').for(:environment_scope) }
|
|
|
|
it { is_expected.to allow_value('review/*').for(:environment_scope) }
|
|
|
|
it { is_expected.not_to allow_value('').for(:environment_scope) }
|
|
|
|
it { is_expected.not_to allow_value('!!()()').for(:environment_scope) }
|
|
|
|
|
|
|
|
it do
|
|
|
|
is_expected.to validate_uniqueness_of(:key)
|
|
|
|
.scoped_to(:project_id, :environment_scope)
|
|
|
|
.with_message(/\(\w+\) has already been taken/)
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '.on_environment' do
|
|
|
|
it 'returns scoped objects' do
|
|
|
|
variable1 = create(:ci_variable, project: project, environment_scope: '*')
|
|
|
|
variable2 = create(:ci_variable, project: project, environment_scope: 'product/*')
|
|
|
|
create(:ci_variable, project: project, environment_scope: 'staging/*')
|
|
|
|
|
|
|
|
expect(project.variables.on_environment('product/canary-1')).to eq([variable1, variable2])
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns only the most relevant object if relevant_only is true' do
|
|
|
|
create(:ci_variable, project: project, environment_scope: '*')
|
|
|
|
variable2 = create(:ci_variable, project: project, environment_scope: 'product/*')
|
|
|
|
create(:ci_variable, project: project, environment_scope: 'staging/*')
|
|
|
|
|
|
|
|
expect(project.variables.on_environment('product/canary-1', relevant_only: true)).to eq([variable2])
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns scopes ordered by lowest precedence first' do
|
|
|
|
create(:ci_variable, project: project, environment_scope: '*')
|
|
|
|
create(:ci_variable, project: project, environment_scope: 'production*')
|
|
|
|
create(:ci_variable, project: project, environment_scope: 'production')
|
|
|
|
|
|
|
|
result = project.variables.on_environment('production').map(&:environment_scope)
|
|
|
|
|
|
|
|
expect(result).to eq(['*', 'production*', 'production'])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#environment_scope=' do
|
|
|
|
context 'when the new environment_scope is nil' do
|
|
|
|
it 'strips leading and trailing whitespaces' do
|
|
|
|
subject.environment_scope = nil
|
|
|
|
|
|
|
|
expect(subject.environment_scope).to eq('')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the new environment_scope has leadind and trailing whitespaces' do
|
|
|
|
it 'strips leading and trailing whitespaces' do
|
|
|
|
subject.environment_scope = ' * '
|
|
|
|
|
|
|
|
expect(subject.environment_scope).to eq('*')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2022-02-17 07:12:30 -05:00
|
|
|
|
|
|
|
describe '.for_environment' do
|
|
|
|
subject { project.variables.for_environment(environment) }
|
|
|
|
|
|
|
|
let_it_be(:variable1) do
|
|
|
|
create(:ci_variable, project: project, environment_scope: '*')
|
|
|
|
end
|
|
|
|
|
|
|
|
let_it_be(:variable2) do
|
|
|
|
create(:ci_variable, project: project, environment_scope: 'production/*')
|
|
|
|
end
|
|
|
|
|
|
|
|
let_it_be(:variable3) do
|
|
|
|
create(:ci_variable, project: project, environment_scope: 'staging/*')
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the environment is present' do
|
|
|
|
let(:environment) { 'production/canary-1' }
|
|
|
|
|
|
|
|
it { is_expected.to eq([variable1, variable2]) }
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the environment is nil' do
|
|
|
|
let(:environment) {}
|
|
|
|
|
|
|
|
it { is_expected.to eq([variable1]) }
|
|
|
|
end
|
|
|
|
end
|
2019-08-08 14:51:52 -04:00
|
|
|
end
|