spec/lib/gitlab/version_spec.rb (288 lines of code) (raw):
require 'spec_helper'
require 'gitlab/version'
RSpec.describe Gitlab::Version do
before do
allow(ENV).to receive(:[]).and_call_original
stub_env_var('GITLAB_ALTERNATIVE_REPO', nil)
stub_env_var('ALTERNATIVE_PRIVATE_TOKEN', nil)
end
describe '.sources_channel' do
subject { described_class }
using RSpec::Parameterized::TableSyntax
where(:alternative_sources, :security_sources, :source_channel) do
nil | nil | "alternative"
nil | 'true' | "security"
nil | 'false' | "alternative"
'true' | nil | "alternative"
'true' | 'true' | "security"
'true' | 'false' | "alternative"
'false' | nil | "remote"
'false' | 'true' | "security"
'false' | 'false' | "remote"
end
with_them do
before do
stub_env_var('ALTERNATIVE_SOURCES', alternative_sources)
stub_env_var('SECURITY_SOURCES', security_sources)
end
context 'when checking the source channel environment variables' do
it 'uses the correct source channel' do
expect(subject.sources_channel).to eq(source_channel)
end
end
end
end
describe '.fallback_sources_channel' do
subject { described_class }
context 'with ALTERNATIVE_SOURCES=true' do
it 'returns "alternative"' do
stub_env_var('ALTERNATIVE_SOURCES', 'true')
expect(subject.fallback_sources_channel).to eq('alternative')
end
end
context 'with ALTERNATIVE_SOURCES not set true' do
it 'returns "remote"' do
stub_env_var('ALTERNATIVE_SOURCES', 'false')
expect(subject.fallback_sources_channel).to eq('remote')
end
end
end
describe '.security_channel?' do
subject { described_class }
it 'returns true when sources_channel is set for security' do
mock_sources_channel('security')
expect(subject.security_channel?).to be_truthy
end
it 'returns false when sources_channel is not set for security' do
mock_sources_channel
expect(subject.security_channel?).to be_falsey
end
end
describe :remote do
subject { Gitlab::Version.new(software) }
context 'with a valid software name' do
let(:software) { 'gitlab-rails-ee' }
it 'returns a link from custom_sources yml' do
mock_sources_channel
expect(subject.remote).to eq('git@dev.gitlab.org:gitlab/gitlab-ee.git')
end
end
context 'with an invalid software name' do
let(:software) { 'not a valid software' }
it 'outputs an empty string' do
expect(subject.remote).to eq('')
end
end
context 'with default fallback' do
let(:software) { 'gitlab-rails-ee' }
it 'returns "remote" link from custom_sources yml' do
mock_sources_channel
expect(subject.remote).to eq('git@dev.gitlab.org:gitlab/gitlab-ee.git')
end
end
context 'with alternative fallback' do
let(:software) { 'gitlab-rails-ee' }
it 'returns "alternative" link from custom_sources yml' do
mock_sources_channel('alternative')
expect(subject.remote).to eq('https://gitlab.com/gitlab-org/gitlab.git')
end
end
context 'with alternative env override' do
let(:software) { 'gitlab-rails-ee' }
it 'returns "alternative" link from the environment whenever present' do
stub_env_var('GITLAB_ALTERNATIVE_REPO', 'https://gitlab.example.com/gitlab.git')
expect(subject.remote).to eq('https://gitlab.example.com/gitlab.git')
end
it 'attaches credentials to alternative env links when present' do
stub_env_var('GITLAB_ALTERNATIVE_REPO', 'https://gitlab.example.com/gitlab.git')
stub_env_var('ALTERNATIVE_PRIVATE_TOKEN', 'APT')
expect(subject.remote).to eq('https://gitlab-ci-token:APT@gitlab.example.com/gitlab.git')
end
end
context 'with security source channel selected' do
before do
stub_env_var('CI_JOB_TOKEN', 'CJT')
mock_sources_channel('security')
end
context 'when security source is defined for the software' do
let(:software) { 'gitlab-rails-ee' }
it 'returns "security" link attached with credential from custom_sources yml' do
expect(subject.remote).to eq('https://gitlab-ci-token:CJT@gitlab.com/gitlab-org/security/gitlab.git')
end
context 'when "security" link is in not URI compliant' do
before do
allow(YAML).to receive(:load_file)
.and_return(software => { "security" => "git@dev.gitlab.org:gitlab/gitlab-ee.git" })
end
it 'returns "security" link without attaching credential' do
expect(subject.remote).to eq("git@dev.gitlab.org:gitlab/gitlab-ee.git")
end
end
end
context 'when security source is not defined for the software' do
let(:software) { 'prometheus' }
it 'returns "remote" link from custom_sources yml' do
mock_fallback_channel
expect(subject.remote).to eq('git@dev.gitlab.org:omnibus-mirror/prometheus.git')
end
it 'returns expected link from custom_sources yml when asked for a specific remote' do
mock_fallback_channel
expect(subject.remote('alternative')).to eq('https://gitlab.com/gitlab-org/build/omnibus-mirror/prometheus.git')
end
context 'with alternative fallback' do
it 'returns "alternative" link from custom_sources yml' do
mock_fallback_channel('alternative')
expect(subject.remote).to eq('https://gitlab.com/gitlab-org/build/omnibus-mirror/prometheus.git')
end
end
end
end
end
describe :read_version_from_file do
context 'when build facts exist' do
before do
allow(::File).to receive(:exist?).with(/build_facts.*_version/).and_return(true)
allow(::File).to receive(:read).with(/build_facts.*_version/).and_return('version-from-build-facts')
allow(::File).to receive(:read).with(/.*VERSION/).and_return('version-from-version-file')
end
it 'uses the version from build_facts' do
components = %w[
gitlab-rails
gitlab-rails-ee
gitlab-shell
gitlab-pages
gitaly
gitlab-elasticsearch-indexer
gitlab-kas
]
components.each do |software|
expect(Gitlab::Version.new(software).read_version_from_file).to eq('version-from-build-facts')
end
end
end
context 'when build facts do not exist' do
before do
allow(::File).to receive(:exist?).with(/build_facts.*_version/).and_return(false)
allow(::File).to receive(:read).with(/.*VERSION/).and_return('version-from-version-file')
end
it 'uses the version from version files' do
components = %w[
gitlab-rails
gitlab-rails-ee
gitlab-shell
gitlab-pages
gitaly
gitlab-elasticsearch-indexer
gitlab-kas
]
components.each do |software|
expect(Gitlab::Version.new(software).read_version_from_file).to eq('version-from-version-file')
end
end
end
end
describe :print do
subject { Gitlab::Version.new(software, version) }
context 'with a valid software name and version' do
let(:software) { 'gitlab-rails' }
let(:version) { '12.34.567' }
it 'returns correct version with v appended' do
expect(subject.print).to eq('v12.34.567')
end
end
context 'with a valid software name and version' do
let(:software) { 'gitlab-rails-ee' }
let(:version) { '12.34.567-ee' }
it 'returns correct version with v appended' do
expect(subject.print).to eq('v12.34.567-ee')
end
end
context 'with a valid software name and no version' do
let(:software) { 'ruby' }
let(:version) { nil }
it 'outputs an empty string' do
expect(subject.print).to eq(nil)
end
end
context 'with a valid software name and a version' do
let(:software) { 'ruby' }
let(:version) { '2.3.1' }
it 'adds a v prefix' do
expect(subject.print).to eq("v2.3.1")
end
it 'does not add a v prefix if explicitly set' do
expect(subject.print(false)).to eq("2.3.1")
end
end
context 'with a valid software name and a branch name' do
let(:software) { 'gitlab-rails' }
let(:version) { '9-0-stable' }
it 'does not add a v prefix' do
expect(subject.print).to eq("9-0-stable")
end
end
context 'with a valid software name and a branch name' do
let(:software) { 'gitlab-rails' }
let(:version) { 'master' }
it 'does not add a v prefix' do
expect(subject.print).to eq("master")
end
end
context 'with a valid software name and an rc tag ' do
let(:software) { 'gitlab-rails' }
let(:version) { '9.1.0-rc1' }
it 'add a v prefix' do
expect(subject.print).to eq("v9.1.0-rc1")
end
end
context 'with a valid software name and an rc tag ' do
let(:software) { 'gitlab-rails' }
let(:version) { '9.1.0-rc2-ee' }
it 'add a v prefix' do
expect(subject.print).to eq("v9.1.0-rc2-ee")
end
end
context 'with a valid software name and a branch name' do
let(:software) { 'gitlab-rails' }
let(:version) { '9.1.0-fix' }
it 'does not add a v prefix' do
expect(subject.print).to eq("9.1.0-fix")
end
end
context 'with a valid software name and a branch name' do
let(:software) { 'gitlab-rails' }
let(:version) { 'fix-9.1.0' }
it 'does not add a v prefix' do
expect(subject.print).to eq("fix-9.1.0")
end
end
context 'with a valid software name and a commit sha' do
let(:software) { 'gitlab-rails' }
let(:version) { '1076385cb57a03fa254be5604f6c6ceb6e39987f' }
it 'does not add a v prefix' do
expect(subject.print).to eq("1076385cb57a03fa254be5604f6c6ceb6e39987f")
end
end
end
describe :version do
subject { Gitlab::Version.new(software) }
context 'env variable for setting version' do
let(:software) { 'gitlab-rails' }
it 'identifies correct version from env variable' do
stub_env_var('GITLAB_VERSION', '5.6.7')
allow(File).to receive(:read).and_return("1.2.3")
expect(subject.print).to eq("v5.6.7")
end
it 'falls back to VERSION file if env variable not found' do
allow(File).to receive(:read).and_return("1.2.3")
expect(subject.print).to eq("v1.2.3")
end
end
end
def mock_sources_channel(channel = 'remote')
allow(::Gitlab::Version).to receive(:sources_channel).and_return(channel)
end
def mock_fallback_channel(channel = 'remote')
allow(::Gitlab::Version).to receive(:fallback_sources_channel).and_return(channel)
end
end