0be52bf32f
This will be default in Ruby 3, so will be good to apply in QA ahead of time to be consistent.
121 lines
3.8 KiB
Ruby
121 lines
3.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
describe QA::Git::Repository do
|
|
include Helpers::StubENV
|
|
|
|
shared_context 'git directory' do
|
|
let(:repository) { described_class.new }
|
|
let(:tmp_git_dir) { Dir.mktmpdir }
|
|
let(:tmp_netrc_dir) { Dir.mktmpdir }
|
|
|
|
before do
|
|
stub_env('GITLAB_USERNAME', 'root')
|
|
cd_empty_temp_directory
|
|
set_bad_uri
|
|
|
|
allow(repository).to receive(:tmp_home_dir).and_return(tmp_netrc_dir)
|
|
end
|
|
|
|
after do
|
|
# Switch to a safe dir before deleting tmp dirs to avoid dir access errors
|
|
FileUtils.cd __dir__
|
|
FileUtils.remove_entry_secure(tmp_git_dir, true)
|
|
FileUtils.remove_entry_secure(tmp_netrc_dir, true)
|
|
end
|
|
|
|
def cd_empty_temp_directory
|
|
FileUtils.cd tmp_git_dir
|
|
end
|
|
|
|
def set_bad_uri
|
|
repository.uri = 'http://foo/bar.git'
|
|
end
|
|
end
|
|
|
|
context 'with default credentials' do
|
|
include_context 'git directory' do
|
|
before do
|
|
repository.use_default_credentials
|
|
end
|
|
end
|
|
|
|
describe '#clone' do
|
|
it 'is unable to resolve host' do
|
|
expect { repository.clone }.to raise_error(described_class::RepositoryCommandError, /The command .* failed \(128\) with the following output/)
|
|
end
|
|
end
|
|
|
|
describe '#push_changes' do
|
|
before do
|
|
`git init` # need a repo to push from
|
|
end
|
|
|
|
it 'fails to push changes' do
|
|
expect { repository.push_changes }.to raise_error(described_class::RepositoryCommandError, /The command .* failed \(1\) with the following output/)
|
|
end
|
|
end
|
|
|
|
describe '#git_protocol=' do
|
|
[0, 1, 2].each do |version|
|
|
it "configures git to use protocol version #{version}" do
|
|
expect(repository).to receive(:run).with("git config protocol.version #{version}")
|
|
repository.git_protocol = version
|
|
end
|
|
end
|
|
|
|
it 'raises an error if the version is unsupported' do
|
|
expect { repository.git_protocol = 'foo' }.to raise_error(ArgumentError, "Please specify the protocol you would like to use: 0, 1, or 2")
|
|
end
|
|
end
|
|
|
|
describe '#fetch_supported_git_protocol' do
|
|
it "reports the detected version" do
|
|
expect(repository).to receive(:run).and_return("packet: git< version 2")
|
|
expect(repository.fetch_supported_git_protocol).to eq('2')
|
|
end
|
|
|
|
it 'reports unknown if version is unknown' do
|
|
expect(repository).to receive(:run).and_return("packet: git< version -1")
|
|
expect(repository.fetch_supported_git_protocol).to eq('unknown')
|
|
end
|
|
|
|
it 'reports unknown if content does not identify a version' do
|
|
expect(repository).to receive(:run).and_return("foo")
|
|
expect(repository.fetch_supported_git_protocol).to eq('unknown')
|
|
end
|
|
end
|
|
|
|
describe '#use_default_credentials' do
|
|
it 'adds credentials to .netrc' do
|
|
expect(File.read(File.join(tmp_netrc_dir, '.netrc')))
|
|
.to eq("machine foo login #{QA::Runtime::User.default_username} password #{QA::Runtime::User.default_password}\n")
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'with specific credentials' do
|
|
include_context 'git directory'
|
|
|
|
context 'before setting credentials' do
|
|
it 'does not add credentials to .netrc' do
|
|
expect(repository).not_to receive(:save_netrc_content)
|
|
end
|
|
end
|
|
|
|
describe '#password=' do
|
|
it 'raises an error if no username was given' do
|
|
expect { repository.password = 'foo' }
|
|
.to raise_error(QA::Git::Repository::InvalidCredentialsError,
|
|
"Please provide a username when setting a password")
|
|
end
|
|
|
|
it 'adds credentials to .netrc' do
|
|
repository.username = 'user'
|
|
repository.password = 'foo'
|
|
|
|
expect(File.read(File.join(tmp_netrc_dir, '.netrc')))
|
|
.to eq("machine foo login user password foo\n")
|
|
end
|
|
end
|
|
end
|
|
end
|