Files
gitlab-foss/gems/gitlab-backup-cli/spec/gitlab/backup/cli/utils/tar_spec.rb
2024-10-31 03:14:13 +00:00

138 lines
4.3 KiB
Ruby

# frozen_string_literal: true
RSpec.describe Gitlab::Backup::Cli::Utils::Tar do
subject(:tar) { described_class.new }
def tar_tempdir
Dir.mktmpdir('tar-test') { |dir| yield Pathname(dir) }
end
describe '#version' do
it 'returns a tar version' do
expect(tar.version).to match(/tar \(GNU tar\) \d+\.\d+/)
end
end
describe '#pack_cmd' do
it 'instantiate a Shell::Command with default required params' do
tar_tempdir do |tempdir|
archive_file = tempdir.join('testarchive.tar')
target_basepath = tempdir
target = tempdir.join('*')
result = nil
expect do
result = tar.pack_cmd(archive_file: archive_file, target_directory: target_basepath, target: target)
end.not_to raise_exception
expect(result).to be_a(Gitlab::Backup::Cli::Shell::Command)
end
end
it 'assigns required params to tar option flags' do
tar_tempdir do |tempdir|
archive_file = tempdir.join('testarchive.tar')
target_basepath = tempdir
target = tempdir.join('*')
cmd = tar.pack_cmd(archive_file: archive_file, target_directory: target_basepath, target: target)
expect(cmd.cmd_args).to include("--file=#{archive_file}")
expect(cmd.cmd_args).to include("--directory=#{target_basepath}")
expect(cmd.cmd_args.last).to eq(target.to_s)
end
end
it 'accepts multiple targets' do
tar_tempdir do |tempdir|
archive_file = tempdir.join('testarchive.tar')
target_basepath = tempdir
targets = [tempdir.join('*.txt'), tempdir.join('*.md')]
cmd = tar.pack_cmd(archive_file: archive_file, target_directory: target_basepath, target: targets)
expect(cmd.cmd_args).to include("--file=#{archive_file}")
expect(cmd.cmd_args).to include("--directory=#{target_basepath}")
expect(cmd.cmd_args.last(2)).to eq(targets.map(&:to_s))
end
end
context 'with excludes' do
it 'assigns default excludes via tar option flags' do
tar_tempdir do |tempdir|
archive_file = tempdir.join('testarchive.tar')
target_basepath = tempdir
target = tempdir.join('*')
cmd = tar.pack_cmd(archive_file: archive_file, target_directory: target_basepath, target: target)
expect(cmd.cmd_args).to include("--exclude=lost+found")
end
end
it 'assigns provided excludes via tar option flags' do
tar_tempdir do |tempdir|
archive_file = tempdir.join('testarchive.tar')
target_basepath = tempdir
target = tempdir.join('*')
excludes = %w[@pages.tmp ignorethis]
cmd = tar.pack_cmd(archive_file: archive_file, target_directory: target_basepath,
target: target, excludes: excludes)
expect(cmd.cmd_args).to include("--exclude=./@pages.tmp")
expect(cmd.cmd_args).to include("--exclude=./ignorethis")
end
end
end
end
describe '#pack_from_stdin_cmd' do
it 'delegates parameters to pack_cmd passing archive_files: as -' do
tar_tempdir do |tempdir|
target_basepath = tempdir
target = tempdir.join('*')
excludes = ['lost+found']
expect(tar).to receive(:pack_cmd).with(
archive_file: '-',
target_directory: target_basepath,
target: target,
excludes: excludes)
tar.pack_from_stdin_cmd(target_directory: target_basepath, target: target, excludes: excludes)
end
end
end
describe '#extract_cmd' do
it 'instantiate a Shell::Command with default required params' do
tar_tempdir do |tempdir|
archive_file = tempdir.join('testarchive.tar')
target_basepath = tempdir
result = nil
expect do
result = tar.extract_cmd(archive_file: archive_file, target_directory: target_basepath)
end.not_to raise_exception
expect(result).to be_a(Gitlab::Backup::Cli::Shell::Command)
end
end
end
describe 'extract_from_stdin_cmd' do
it 'delegates parameters to extract_cmd passing archive_files: as -' do
tar_tempdir do |tempdir|
target_basepath = tempdir
expect(tar).to receive(:extract_cmd).with(archive_file: '-', target_directory: target_basepath)
tar.extract_from_stdin_cmd(target_directory: target_basepath)
end
end
end
end