2018-10-02 14:31:39 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2020-09-24 23:09:30 -04:00
|
|
|
RSpec.describe QA::Runtime::Env do
|
2019-02-11 04:04:59 -05:00
|
|
|
include Helpers::StubENV
|
2018-01-08 07:44:32 -05:00
|
|
|
|
2018-10-23 14:54:00 -04:00
|
|
|
shared_examples 'boolean method' do |**kwargs|
|
|
|
|
it_behaves_like 'boolean method with parameter', kwargs
|
|
|
|
end
|
|
|
|
|
|
|
|
shared_examples 'boolean method with parameter' do |method:, param: nil, env_key:, default:|
|
2018-01-08 07:44:32 -05:00
|
|
|
context 'when there is an env variable set' do
|
|
|
|
it 'returns false when falsey values specified' do
|
2018-10-08 14:56:32 -04:00
|
|
|
stub_env(env_key, 'false')
|
2018-10-23 14:54:00 -04:00
|
|
|
expect(described_class.public_send(method, *param)).to be_falsey
|
2018-01-08 07:44:32 -05:00
|
|
|
|
2018-10-08 14:56:32 -04:00
|
|
|
stub_env(env_key, 'no')
|
2018-10-23 14:54:00 -04:00
|
|
|
expect(described_class.public_send(method, *param)).to be_falsey
|
2018-01-08 07:44:32 -05:00
|
|
|
|
2018-10-08 14:56:32 -04:00
|
|
|
stub_env(env_key, '0')
|
2018-10-23 14:54:00 -04:00
|
|
|
expect(described_class.public_send(method, *param)).to be_falsey
|
2018-01-08 07:44:32 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns true when anything else specified' do
|
2018-10-08 14:56:32 -04:00
|
|
|
stub_env(env_key, 'true')
|
2018-10-23 14:54:00 -04:00
|
|
|
expect(described_class.public_send(method, *param)).to be_truthy
|
2018-01-08 07:44:32 -05:00
|
|
|
|
2018-10-08 14:56:32 -04:00
|
|
|
stub_env(env_key, '1')
|
2018-10-23 14:54:00 -04:00
|
|
|
expect(described_class.public_send(method, *param)).to be_truthy
|
2018-01-08 07:44:32 -05:00
|
|
|
|
2018-10-08 14:56:32 -04:00
|
|
|
stub_env(env_key, 'anything')
|
2018-10-23 14:54:00 -04:00
|
|
|
expect(described_class.public_send(method, *param)).to be_truthy
|
2018-01-08 07:44:32 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when there is no env variable set' do
|
2018-10-08 14:56:32 -04:00
|
|
|
it "returns the default, #{default}" do
|
|
|
|
stub_env(env_key, nil)
|
2018-10-23 14:54:00 -04:00
|
|
|
expect(described_class.public_send(method, *param)).to be(default)
|
2018-01-08 07:44:32 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-10-08 14:56:32 -04:00
|
|
|
describe '.signup_disabled?' do
|
2018-10-23 14:54:00 -04:00
|
|
|
it_behaves_like 'boolean method',
|
|
|
|
method: :signup_disabled?,
|
|
|
|
env_key: 'SIGNUP_DISABLED',
|
|
|
|
default: false
|
2018-10-08 14:56:32 -04:00
|
|
|
end
|
|
|
|
|
2018-10-02 14:31:39 -04:00
|
|
|
describe '.debug?' do
|
2018-10-23 14:54:00 -04:00
|
|
|
it_behaves_like 'boolean method',
|
|
|
|
method: :debug?,
|
|
|
|
env_key: 'QA_DEBUG',
|
|
|
|
default: false
|
2018-10-02 14:31:39 -04:00
|
|
|
end
|
|
|
|
|
2018-10-08 14:56:32 -04:00
|
|
|
describe '.chrome_headless?' do
|
2018-10-23 14:54:00 -04:00
|
|
|
it_behaves_like 'boolean method',
|
|
|
|
method: :chrome_headless?,
|
|
|
|
env_key: 'CHROME_HEADLESS',
|
|
|
|
default: true
|
2018-10-08 14:56:32 -04:00
|
|
|
end
|
|
|
|
|
2018-01-08 07:44:32 -05:00
|
|
|
describe '.running_in_ci?' do
|
|
|
|
context 'when there is an env variable set' do
|
|
|
|
it 'returns true if CI' do
|
|
|
|
stub_env('CI', 'anything')
|
|
|
|
expect(described_class.running_in_ci?).to be_truthy
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns true if CI_SERVER' do
|
|
|
|
stub_env('CI_SERVER', 'anything')
|
|
|
|
expect(described_class.running_in_ci?).to be_truthy
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when there is no env variable set' do
|
|
|
|
it 'returns true' do
|
|
|
|
stub_env('CI', nil)
|
|
|
|
stub_env('CI_SERVER', nil)
|
|
|
|
expect(described_class.running_in_ci?).to be_falsey
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2018-02-10 17:20:44 -05:00
|
|
|
|
2018-10-17 14:08:20 -04:00
|
|
|
describe '.personal_access_token' do
|
|
|
|
around do |example|
|
|
|
|
described_class.instance_variable_set(:@personal_access_token, nil)
|
|
|
|
example.run
|
|
|
|
described_class.instance_variable_set(:@personal_access_token, nil)
|
|
|
|
end
|
|
|
|
|
2019-03-28 04:15:14 -04:00
|
|
|
context 'when GITLAB_QA_ACCESS_TOKEN is set' do
|
2018-10-17 14:08:20 -04:00
|
|
|
before do
|
2019-03-28 04:15:14 -04:00
|
|
|
stub_env('GITLAB_QA_ACCESS_TOKEN', 'a_token_too')
|
2018-10-17 14:08:20 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns specified token from env' do
|
2019-03-28 04:15:14 -04:00
|
|
|
expect(described_class.personal_access_token).to eq 'a_token_too'
|
2018-10-17 14:08:20 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when @personal_access_token is set' do
|
|
|
|
before do
|
|
|
|
described_class.personal_access_token = 'another_token'
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns the instance variable value' do
|
|
|
|
expect(described_class.personal_access_token).to eq 'another_token'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '.personal_access_token=' do
|
|
|
|
around do |example|
|
|
|
|
described_class.instance_variable_set(:@personal_access_token, nil)
|
|
|
|
example.run
|
|
|
|
described_class.instance_variable_set(:@personal_access_token, nil)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'saves the token' do
|
|
|
|
described_class.personal_access_token = 'a_token'
|
|
|
|
|
|
|
|
expect(described_class.personal_access_token).to eq 'a_token'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-08-08 13:05:13 -04:00
|
|
|
describe '.forker?' do
|
2018-10-17 14:08:20 -04:00
|
|
|
before do
|
|
|
|
stub_env('GITLAB_FORKER_USERNAME', nil)
|
|
|
|
stub_env('GITLAB_FORKER_PASSWORD', nil)
|
|
|
|
end
|
|
|
|
|
2018-08-08 13:05:13 -04:00
|
|
|
it 'returns false if no forker credentials are defined' do
|
|
|
|
expect(described_class).not_to be_forker
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns false if only forker username is defined' do
|
|
|
|
stub_env('GITLAB_FORKER_USERNAME', 'foo')
|
|
|
|
|
|
|
|
expect(described_class).not_to be_forker
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns false if only forker password is defined' do
|
|
|
|
stub_env('GITLAB_FORKER_PASSWORD', 'bar')
|
|
|
|
|
|
|
|
expect(described_class).not_to be_forker
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns true if forker username and password are defined' do
|
|
|
|
stub_env('GITLAB_FORKER_USERNAME', 'foo')
|
|
|
|
stub_env('GITLAB_FORKER_PASSWORD', 'bar')
|
|
|
|
|
|
|
|
expect(described_class).to be_forker
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-06-18 11:05:42 -04:00
|
|
|
describe '.github_access_token' do
|
|
|
|
it 'returns "" if GITHUB_ACCESS_TOKEN is not defined' do
|
2018-08-03 07:25:14 -04:00
|
|
|
stub_env('GITHUB_ACCESS_TOKEN', nil)
|
|
|
|
|
2018-06-18 11:05:42 -04:00
|
|
|
expect(described_class.github_access_token).to eq('')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns stripped string if GITHUB_ACCESS_TOKEN is defined' do
|
|
|
|
stub_env('GITHUB_ACCESS_TOKEN', ' abc123 ')
|
|
|
|
expect(described_class.github_access_token).to eq('abc123')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-06-03 06:37:43 -04:00
|
|
|
describe '.knapsack?' do
|
2019-08-14 04:22:15 -04:00
|
|
|
it 'returns true if KNAPSACK_GENERATE_REPORT is defined' do
|
|
|
|
stub_env('KNAPSACK_GENERATE_REPORT', 'true')
|
|
|
|
|
|
|
|
expect(described_class.knapsack?).to be_truthy
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns true if KNAPSACK_REPORT_PATH is defined' do
|
|
|
|
stub_env('KNAPSACK_REPORT_PATH', '/a/path')
|
|
|
|
|
|
|
|
expect(described_class.knapsack?).to be_truthy
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns true if KNAPSACK_TEST_FILE_PATTERN is defined' do
|
|
|
|
stub_env('KNAPSACK_TEST_FILE_PATTERN', '/a/**/pattern')
|
|
|
|
|
|
|
|
expect(described_class.knapsack?).to be_truthy
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns false if neither KNAPSACK_GENERATE_REPORT nor KNAPSACK_REPORT_PATH nor KNAPSACK_TEST_FILE_PATTERN are defined' do
|
|
|
|
expect(described_class.knapsack?).to be_falsey
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '.knapsack?' do
|
2019-06-03 06:37:43 -04:00
|
|
|
it 'returns true if KNAPSACK_GENERATE_REPORT is defined' do
|
|
|
|
stub_env('KNAPSACK_GENERATE_REPORT', 'true')
|
|
|
|
|
|
|
|
expect(described_class.knapsack?).to be_truthy
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns true if KNAPSACK_REPORT_PATH is defined' do
|
|
|
|
stub_env('KNAPSACK_REPORT_PATH', '/a/path')
|
|
|
|
|
|
|
|
expect(described_class.knapsack?).to be_truthy
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns true if KNAPSACK_TEST_FILE_PATTERN is defined' do
|
|
|
|
stub_env('KNAPSACK_TEST_FILE_PATTERN', '/a/**/pattern')
|
|
|
|
|
|
|
|
expect(described_class.knapsack?).to be_truthy
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns false if neither KNAPSACK_GENERATE_REPORT nor KNAPSACK_REPORT_PATH nor KNAPSACK_TEST_FILE_PATTERN are defined' do
|
|
|
|
expect(described_class.knapsack?).to be_falsey
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-06-18 11:05:42 -04:00
|
|
|
describe '.require_github_access_token!' do
|
|
|
|
it 'raises ArgumentError if GITHUB_ACCESS_TOKEN is not defined' do
|
2018-08-03 07:25:14 -04:00
|
|
|
stub_env('GITHUB_ACCESS_TOKEN', nil)
|
|
|
|
|
2018-06-18 11:05:42 -04:00
|
|
|
expect { described_class.require_github_access_token! }.to raise_error(ArgumentError)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'does not raise if GITHUB_ACCESS_TOKEN is defined' do
|
|
|
|
stub_env('GITHUB_ACCESS_TOKEN', ' abc123 ')
|
|
|
|
|
|
|
|
expect { described_class.require_github_access_token! }.not_to raise_error
|
|
|
|
end
|
|
|
|
end
|
2018-10-02 14:31:39 -04:00
|
|
|
|
2019-12-20 04:24:38 -05:00
|
|
|
describe '.require_admin_access_token!' do
|
|
|
|
it 'raises ArgumentError if GITLAB_QA_ADMIN_ACCESS_TOKEN is not specified' do
|
2021-03-09 07:08:52 -05:00
|
|
|
described_class.instance_variable_set(:@admin_personal_access_token, nil)
|
2019-12-20 04:24:38 -05:00
|
|
|
stub_env('GITLAB_QA_ADMIN_ACCESS_TOKEN', nil)
|
|
|
|
|
|
|
|
expect { described_class.require_admin_access_token! }.to raise_error(ArgumentError)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'does not raise exception if GITLAB_QA_ADMIN_ACCESS_TOKEN is specified' do
|
|
|
|
stub_env('GITLAB_QA_ADMIN_ACCESS_TOKEN', 'foobar123')
|
|
|
|
|
|
|
|
expect { described_class.require_admin_access_token! }.not_to raise_error
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-10-02 14:31:39 -04:00
|
|
|
describe '.log_destination' do
|
|
|
|
it 'returns $stdout if QA_LOG_PATH is not defined' do
|
|
|
|
stub_env('QA_LOG_PATH', nil)
|
|
|
|
|
|
|
|
expect(described_class.log_destination).to eq($stdout)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns the path if QA_LOG_PATH is defined' do
|
|
|
|
stub_env('QA_LOG_PATH', 'path/to_file')
|
|
|
|
|
|
|
|
expect(described_class.log_destination).to eq('path/to_file')
|
|
|
|
end
|
|
|
|
end
|
2018-10-23 14:54:00 -04:00
|
|
|
|
|
|
|
describe '.can_test?' do
|
|
|
|
it_behaves_like 'boolean method with parameter',
|
|
|
|
method: :can_test?,
|
|
|
|
param: :git_protocol_v2,
|
|
|
|
env_key: 'QA_CAN_TEST_GIT_PROTOCOL_V2',
|
|
|
|
default: true
|
|
|
|
|
2019-06-17 23:37:05 -04:00
|
|
|
it_behaves_like 'boolean method with parameter',
|
|
|
|
method: :can_test?,
|
|
|
|
param: :admin,
|
|
|
|
env_key: 'QA_CAN_TEST_ADMIN_FEATURES',
|
|
|
|
default: true
|
|
|
|
|
2020-03-23 20:09:24 -04:00
|
|
|
it_behaves_like 'boolean method with parameter',
|
|
|
|
method: :can_test?,
|
|
|
|
param: :praefect,
|
|
|
|
env_key: 'QA_CAN_TEST_PRAEFECT',
|
|
|
|
default: true
|
|
|
|
|
2018-10-23 14:54:00 -04:00
|
|
|
it 'raises ArgumentError if feature is unknown' do
|
|
|
|
expect { described_class.can_test? :foo }.to raise_error(ArgumentError, 'Unknown feature "foo"')
|
|
|
|
end
|
|
|
|
end
|
2019-01-08 16:44:23 -05:00
|
|
|
|
|
|
|
describe 'remote grid credentials' do
|
|
|
|
it 'is blank if username is empty' do
|
|
|
|
stub_env('QA_REMOTE_GRID_USERNAME', nil)
|
|
|
|
|
|
|
|
expect(described_class.send(:remote_grid_credentials)).to eq('')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'throws ArgumentError if GRID_ACCESS_KEY is not specified with USERNAME' do
|
|
|
|
stub_env('QA_REMOTE_GRID_USERNAME', 'foo')
|
|
|
|
|
|
|
|
expect { described_class.send(:remote_grid_credentials) }.to raise_error(ArgumentError, 'Please provide an access key for user "foo"')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns a user:key@ combination when all args are satiated' do
|
|
|
|
stub_env('QA_REMOTE_GRID_USERNAME', 'foo')
|
|
|
|
stub_env('QA_REMOTE_GRID_ACCESS_KEY', 'bar')
|
|
|
|
|
|
|
|
expect(described_class.send(:remote_grid_credentials)).to eq('foo:bar@')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '.remote_grid_protocol' do
|
|
|
|
it 'defaults protocol to http' do
|
|
|
|
stub_env('QA_REMOTE_GRID_PROTOCOL', nil)
|
|
|
|
expect(described_class.remote_grid_protocol).to eq('http')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '.remote_grid' do
|
|
|
|
it 'is falsey if QA_REMOTE_GRID is not set' do
|
|
|
|
expect(described_class.remote_grid).to be_falsey
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'accepts https protocol' do
|
|
|
|
stub_env('QA_REMOTE_GRID', 'localhost:4444')
|
|
|
|
stub_env('QA_REMOTE_GRID_PROTOCOL', 'https')
|
|
|
|
|
|
|
|
expect(described_class.remote_grid).to eq('https://localhost:4444/wd/hub')
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with credentials' do
|
|
|
|
it 'has a grid of http://user:key@grid/wd/hub' do
|
|
|
|
stub_env('QA_REMOTE_GRID_USERNAME', 'foo')
|
|
|
|
stub_env('QA_REMOTE_GRID_ACCESS_KEY', 'bar')
|
|
|
|
stub_env('QA_REMOTE_GRID', 'localhost:4444')
|
|
|
|
|
|
|
|
expect(described_class.remote_grid).to eq('http://foo:bar@localhost:4444/wd/hub')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'without credentials' do
|
|
|
|
it 'has a grid of http://grid/wd/hub' do
|
|
|
|
stub_env('QA_REMOTE_GRID', 'localhost:4444')
|
|
|
|
|
|
|
|
expect(described_class.remote_grid).to eq('http://localhost:4444/wd/hub')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2020-04-06 17:09:19 -04:00
|
|
|
|
2020-10-11 20:08:43 -04:00
|
|
|
describe '.context_matches?' do
|
2020-04-06 17:09:19 -04:00
|
|
|
it 'returns true when url has .com' do
|
|
|
|
QA::Runtime::Scenario.define(:gitlab_address, "https://staging.gitlab.com")
|
|
|
|
|
|
|
|
expect(described_class.dot_com?).to be_truthy
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns false when url does not have .com' do
|
|
|
|
QA::Runtime::Scenario.define(:gitlab_address, "https://gitlab.test")
|
|
|
|
|
2020-07-13 14:09:16 -04:00
|
|
|
expect(described_class.dot_com?).to be_falsey
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with arguments' do
|
|
|
|
it 'returns true when :subdomain is set' do
|
|
|
|
QA::Runtime::Scenario.define(:gitlab_address, "https://staging.gitlab.com")
|
|
|
|
|
|
|
|
expect(described_class.dot_com?(subdomain: :staging)).to be_truthy
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'matches multiple subdomains' do
|
|
|
|
QA::Runtime::Scenario.define(:gitlab_address, "https://staging.gitlab.com")
|
|
|
|
|
2020-10-11 20:08:43 -04:00
|
|
|
expect(described_class.context_matches?(subdomain: [:release, :staging])).to be_truthy
|
|
|
|
expect(described_class.context_matches?(:production, subdomain: [:release, :staging])).to be_truthy
|
2020-07-13 14:09:16 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'matches :production' do
|
|
|
|
QA::Runtime::Scenario.define(:gitlab_address, "https://gitlab.com/")
|
|
|
|
|
2020-10-11 20:08:43 -04:00
|
|
|
expect(described_class.context_matches?(:production)).to be_truthy
|
2020-07-13 14:09:16 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'doesnt match with mismatching switches' do
|
|
|
|
QA::Runtime::Scenario.define(:gitlab_address, 'https://gitlab.test')
|
|
|
|
|
|
|
|
aggregate_failures do
|
2020-10-11 20:08:43 -04:00
|
|
|
expect(described_class.context_matches?(tld: '.net')).to be_falsey
|
|
|
|
expect(described_class.context_matches?(:production)).to be_falsey
|
|
|
|
expect(described_class.context_matches?(subdomain: [:staging])).to be_falsey
|
|
|
|
expect(described_class.context_matches?(domain: 'example')).to be_falsey
|
2020-07-13 14:09:16 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns false for mismatching' do
|
|
|
|
QA::Runtime::Scenario.define(:gitlab_address, "https://staging.gitlab.com")
|
|
|
|
|
2020-10-11 20:08:43 -04:00
|
|
|
expect(described_class.context_matches?(:production)).to be_falsey
|
2020-04-06 17:09:19 -04:00
|
|
|
end
|
|
|
|
end
|
2018-01-08 07:44:32 -05:00
|
|
|
end
|