mirror of
https://github.com/ScoopInstaller/Scoop.git
synced 2025-10-30 06:07:56 +00:00
396 lines
14 KiB
PowerShell
396 lines
14 KiB
PowerShell
BeforeAll {
|
|
. "$PSScriptRoot\Scoop-TestLib.ps1"
|
|
. "$PSScriptRoot\..\lib\core.ps1"
|
|
. "$PSScriptRoot\..\lib\system.ps1"
|
|
. "$PSScriptRoot\..\lib\install.ps1"
|
|
}
|
|
|
|
Describe 'Get-AppFilePath' -Tag 'Scoop' {
|
|
BeforeAll {
|
|
$working_dir = setup_working 'is_directory'
|
|
Mock currentdir { 'local' } -Verifiable -ParameterFilter { $global -eq $false }
|
|
Mock currentdir { 'global' } -Verifiable -ParameterFilter { $global -eq $true }
|
|
}
|
|
|
|
It 'should return locally installed program' {
|
|
Mock Test-Path { $true } -Verifiable -ParameterFilter { $Path -eq 'local\i_am_a_file.txt' }
|
|
Mock Test-Path { $false } -Verifiable -ParameterFilter { $Path -eq 'global\i_am_a_file.txt' }
|
|
Get-AppFilePath -App 'is_directory' -File 'i_am_a_file.txt' | Should -Be 'local\i_am_a_file.txt'
|
|
}
|
|
|
|
It 'should return globally installed program' {
|
|
Mock Test-Path { $false } -Verifiable -ParameterFilter { $Path -eq 'local\i_am_a_file.txt' }
|
|
Mock Test-Path { $true } -Verifiable -ParameterFilter { $Path -eq 'global\i_am_a_file.txt' }
|
|
Get-AppFilePath -App 'is_directory' -File 'i_am_a_file.txt' | Should -Be 'global\i_am_a_file.txt'
|
|
}
|
|
|
|
It 'should return null if program is not installed' {
|
|
Get-AppFilePath -App 'is_directory' -File 'i_do_not_exist' | Should -BeNullOrEmpty
|
|
}
|
|
|
|
It 'should throw if parameter is wrong or missing' {
|
|
{ Get-AppFilePath -App 'is_directory' -File } | Should -Throw
|
|
{ Get-AppFilePath -App -File 'i_am_a_file.txt' } | Should -Throw
|
|
{ Get-AppFilePath -App -File } | Should -Throw
|
|
}
|
|
}
|
|
|
|
Describe 'Get-HelperPath' -Tag 'Scoop' {
|
|
BeforeAll {
|
|
$working_dir = setup_working 'is_directory'
|
|
}
|
|
It 'should return path if program is installed' {
|
|
Mock Get-AppFilePath { '7zip\current\7z.exe' }
|
|
Get-HelperPath -Helper 7zip | Should -Be '7zip\current\7z.exe'
|
|
}
|
|
|
|
It 'should return null if program is not installed' {
|
|
Mock Get-AppFilePath { $null }
|
|
Get-HelperPath -Helper 7zip | Should -BeNullOrEmpty
|
|
}
|
|
|
|
It 'should throw if parameter is wrong or missing' {
|
|
{ Get-HelperPath -Helper } | Should -Throw
|
|
{ Get-HelperPath -Helper Wrong } | Should -Throw
|
|
}
|
|
}
|
|
|
|
|
|
Describe 'Test-HelperInstalled' -Tag 'Scoop' {
|
|
It 'should return true if program is installed' {
|
|
Mock Get-HelperPath { '7z.exe' }
|
|
Test-HelperInstalled -Helper 7zip | Should -BeTrue
|
|
}
|
|
|
|
It 'should return false if program is not installed' {
|
|
Mock Get-HelperPath { $null }
|
|
Test-HelperInstalled -Helper 7zip | Should -BeFalse
|
|
}
|
|
|
|
It 'should throw if parameter is wrong or missing' {
|
|
{ Test-HelperInstalled -Helper } | Should -Throw
|
|
{ Test-HelperInstalled -Helper Wrong } | Should -Throw
|
|
}
|
|
}
|
|
|
|
Describe 'Test-CommandAvailable' -Tag 'Scoop' {
|
|
It 'should return true if command exists' {
|
|
Test-CommandAvailable 'Write-Host' | Should -BeTrue
|
|
}
|
|
|
|
It "should return false if command doesn't exist" {
|
|
Test-CommandAvailable 'Write-ThisWillProbablyNotExist' | Should -BeFalse
|
|
}
|
|
|
|
It 'should throw if parameter is wrong or missing' {
|
|
{ Test-CommandAvailable } | Should -Throw
|
|
}
|
|
}
|
|
|
|
|
|
Describe 'is_directory' -Tag 'Scoop' {
|
|
BeforeAll {
|
|
$working_dir = setup_working 'is_directory'
|
|
}
|
|
|
|
It 'is_directory recognize directories' {
|
|
is_directory "$working_dir\i_am_a_directory" | Should -Be $true
|
|
}
|
|
It 'is_directory recognize files' {
|
|
is_directory "$working_dir\i_am_a_file.txt" | Should -Be $false
|
|
}
|
|
|
|
It 'is_directory is falsey on unknown path' {
|
|
is_directory "$working_dir\i_do_not_exist" | Should -Be $false
|
|
}
|
|
}
|
|
|
|
Describe 'movedir' -Tag 'Scoop', 'Windows' {
|
|
BeforeAll {
|
|
$working_dir = setup_working 'movedir'
|
|
$extract_dir = 'subdir'
|
|
$extract_to = $null
|
|
}
|
|
|
|
It 'moves directories with no spaces in path' {
|
|
$dir = "$working_dir\user"
|
|
movedir "$dir\_tmp\$extract_dir" "$dir\$extract_to"
|
|
|
|
"$dir\test.txt" | Should -FileContentMatch 'this is the one'
|
|
"$dir\_tmp\$extract_dir" | Should -Not -Exist
|
|
}
|
|
|
|
It 'moves directories with spaces in path' {
|
|
$dir = "$working_dir\user with space"
|
|
movedir "$dir\_tmp\$extract_dir" "$dir\$extract_to"
|
|
|
|
"$dir\test.txt" | Should -FileContentMatch 'this is the one'
|
|
"$dir\_tmp\$extract_dir" | Should -Not -Exist
|
|
|
|
# test trailing \ in from dir
|
|
movedir "$dir\_tmp\$null" "$dir\another"
|
|
"$dir\another\test.txt" | Should -FileContentMatch 'testing'
|
|
"$dir\_tmp" | Should -Not -Exist
|
|
}
|
|
|
|
It 'moves directories with quotes in path' {
|
|
$dir = "$working_dir\user with 'quote"
|
|
movedir "$dir\_tmp\$extract_dir" "$dir\$extract_to"
|
|
|
|
"$dir\test.txt" | Should -FileContentMatch 'this is the one'
|
|
"$dir\_tmp\$extract_dir" | Should -Not -Exist
|
|
}
|
|
}
|
|
|
|
Describe 'shim' -Tag 'Scoop', 'Windows' {
|
|
BeforeAll {
|
|
$working_dir = setup_working 'shim'
|
|
$shimdir = shimdir
|
|
Add-Path $shimdir
|
|
}
|
|
|
|
It "links a file onto the user's path" {
|
|
{ Get-Command 'shim-test' -ea stop } | Should -Throw
|
|
{ Get-Command 'shim-test.ps1' -ea stop } | Should -Throw
|
|
{ Get-Command 'shim-test.cmd' -ea stop } | Should -Throw
|
|
{ shim-test } | Should -Throw
|
|
|
|
shim "$working_dir\shim-test.ps1" $false 'shim-test'
|
|
{ Get-Command 'shim-test' -ea stop } | Should -Not -Throw
|
|
{ Get-Command 'shim-test.ps1' -ea stop } | Should -Not -Throw
|
|
{ Get-Command 'shim-test.cmd' -ea stop } | Should -Not -Throw
|
|
shim-test | Should -Be 'Hello, world!'
|
|
}
|
|
|
|
It 'shims a file with quote in path' {
|
|
{ Get-Command 'shim-test' -ea stop } | Should -Throw
|
|
{ shim-test } | Should -Throw
|
|
|
|
shim "$working_dir\user with 'quote\shim-test.ps1" $false 'shim-test'
|
|
{ Get-Command 'shim-test' -ea stop } | Should -Not -Throw
|
|
shim-test | Should -Be 'Hello, world!'
|
|
}
|
|
|
|
AfterEach {
|
|
rm_shim 'shim-test' $shimdir
|
|
}
|
|
}
|
|
|
|
Describe 'rm_shim' -Tag 'Scoop', 'Windows' {
|
|
BeforeAll {
|
|
$working_dir = setup_working 'shim'
|
|
$shimdir = shimdir
|
|
Add-Path $shimdir
|
|
}
|
|
|
|
It 'removes shim from path' {
|
|
shim "$working_dir\shim-test.ps1" $false 'shim-test'
|
|
|
|
rm_shim 'shim-test' $shimdir
|
|
|
|
{ Get-Command 'shim-test' -ea stop } | Should -Throw
|
|
{ Get-Command 'shim-test.ps1' -ea stop } | Should -Throw
|
|
{ Get-Command 'shim-test.cmd' -ea stop } | Should -Throw
|
|
{ shim-test } | Should -Throw
|
|
}
|
|
}
|
|
|
|
Describe 'get_app_name_from_shim' -Tag 'Scoop', 'Windows' {
|
|
BeforeAll {
|
|
$working_dir = setup_working 'shim'
|
|
$shimdir = shimdir
|
|
Add-Path $shimdir
|
|
Mock appsdir { $working_dir }
|
|
}
|
|
|
|
It 'returns empty string if file does not exist' {
|
|
get_app_name_from_shim 'non-existent-file' | Should -Be ''
|
|
}
|
|
|
|
It 'returns app name if file exists and is a shim to an app' {
|
|
ensure "$working_dir/mockapp/current/"
|
|
Write-Output '' | Out-File "$working_dir/mockapp/current/mockapp1.ps1"
|
|
shim "$working_dir/mockapp/current/mockapp1.ps1" $false 'shim-test1'
|
|
$shim_path1 = (Get-Command 'shim-test1.ps1').Path
|
|
get_app_name_from_shim "$shim_path1" | Should -Be 'mockapp'
|
|
ensure "$working_dir/mockapp/1.0.0/"
|
|
Write-Output '' | Out-File "$working_dir/mockapp/1.0.0/mockapp2.ps1"
|
|
shim "$working_dir/mockapp/1.0.0/mockapp2.ps1" $false 'shim-test2'
|
|
$shim_path2 = (Get-Command 'shim-test2.ps1').Path
|
|
get_app_name_from_shim "$shim_path2" | Should -Be 'mockapp'
|
|
}
|
|
|
|
It 'returns empty string if file exists and is not a shim' {
|
|
Write-Output 'lorem ipsum' | Out-File -Encoding ascii "$working_dir/mock-shim.ps1"
|
|
get_app_name_from_shim "$working_dir/mock-shim.ps1" | Should -Be ''
|
|
}
|
|
|
|
AfterAll {
|
|
if (Get-Command 'shim-test1' -ErrorAction SilentlyContinue) {
|
|
rm_shim 'shim-test1' $shimdir -ErrorAction SilentlyContinue
|
|
}
|
|
if (Get-Command 'shim-test2' -ErrorAction SilentlyContinue) {
|
|
rm_shim 'shim-test2' $shimdir -ErrorAction SilentlyContinue
|
|
}
|
|
Remove-Item -Force -Recurse -ErrorAction SilentlyContinue "$working_dir/mockapp"
|
|
Remove-Item -Force -ErrorAction SilentlyContinue "$working_dir/moch-shim.ps1"
|
|
}
|
|
}
|
|
|
|
Describe 'cache_path' -Tag 'Scoop' {
|
|
It 'returns the correct cache path for a given input' {
|
|
$url = 'https://example.com/git.zip'
|
|
$ret = cache_path 'git' '2.44.0' $url
|
|
$inputStream = [System.IO.MemoryStream]::new([System.Text.Encoding]::UTF8.GetBytes($url))
|
|
$sha = (Get-FileHash -Algorithm SHA256 -InputStream $inputStream).Hash.ToLower().Substring(0, 7)
|
|
$ret | Should -Be "$cachedir\git#2.44.0#$sha.zip"
|
|
}
|
|
|
|
# # NOTE: Remove this 6 months after the feature ships.
|
|
It 'returns the old format cache path for a given input' {
|
|
Mock Test-Path { $true }
|
|
$ret = cache_path 'git' '2.44.0' 'https://example.com/git.zip'
|
|
$ret | Should -Be "$cachedir\git#2.44.0#https_example.com_git.zip"
|
|
}
|
|
}
|
|
|
|
Describe 'sanitary_path' -Tag 'Scoop' {
|
|
It 'removes invalid path characters from a string' {
|
|
$path = 'test?.json'
|
|
$valid_path = sanitary_path $path
|
|
|
|
$valid_path | Should -Be 'test.json'
|
|
}
|
|
}
|
|
|
|
Describe 'app' -Tag 'Scoop' {
|
|
It 'parses the bucket name from an app query' {
|
|
$query = 'C:\test.json'
|
|
$app, $bucket, $version = parse_app $query
|
|
$app | Should -Be 'C:\test.json'
|
|
$bucket | Should -BeNullOrEmpty
|
|
$version | Should -BeNullOrEmpty
|
|
|
|
$query = 'test.json'
|
|
$app, $bucket, $version = parse_app $query
|
|
$app | Should -Be 'test.json'
|
|
$bucket | Should -BeNullOrEmpty
|
|
$version | Should -BeNullOrEmpty
|
|
|
|
$query = '.\test.json'
|
|
$app, $bucket, $version = parse_app $query
|
|
$app | Should -Be '.\test.json'
|
|
$bucket | Should -BeNullOrEmpty
|
|
$version | Should -BeNullOrEmpty
|
|
|
|
$query = '..\test.json'
|
|
$app, $bucket, $version = parse_app $query
|
|
$app | Should -Be '..\test.json'
|
|
$bucket | Should -BeNullOrEmpty
|
|
$version | Should -BeNullOrEmpty
|
|
|
|
$query = '\\share\test.json'
|
|
$app, $bucket, $version = parse_app $query
|
|
$app | Should -Be '\\share\test.json'
|
|
$bucket | Should -BeNullOrEmpty
|
|
$version | Should -BeNullOrEmpty
|
|
|
|
$query = 'https://example.com/test.json'
|
|
$app, $bucket, $version = parse_app $query
|
|
$app | Should -Be 'https://example.com/test.json'
|
|
$bucket | Should -BeNullOrEmpty
|
|
$version | Should -BeNullOrEmpty
|
|
|
|
$query = 'test'
|
|
$app, $bucket, $version = parse_app $query
|
|
$app | Should -Be 'test'
|
|
$bucket | Should -BeNullOrEmpty
|
|
$version | Should -BeNullOrEmpty
|
|
|
|
$query = 'extras/enso'
|
|
$app, $bucket, $version = parse_app $query
|
|
$app | Should -Be 'enso'
|
|
$bucket | Should -Be 'extras'
|
|
$version | Should -BeNullOrEmpty
|
|
|
|
$query = 'test-app'
|
|
$app, $bucket, $version = parse_app $query
|
|
$app | Should -Be 'test-app'
|
|
$bucket | Should -BeNullOrEmpty
|
|
$version | Should -BeNullOrEmpty
|
|
|
|
$query = 'test-bucket/test-app'
|
|
$app, $bucket, $version = parse_app $query
|
|
$app | Should -Be 'test-app'
|
|
$bucket | Should -Be 'test-bucket'
|
|
$version | Should -BeNullOrEmpty
|
|
|
|
$query = 'test-bucket/test-app@1.8.0'
|
|
$app, $bucket, $version = parse_app $query
|
|
$app | Should -Be 'test-app'
|
|
$bucket | Should -Be 'test-bucket'
|
|
$version | Should -Be '1.8.0'
|
|
|
|
$query = 'test-bucket/test-app@1.8.0-rc2'
|
|
$app, $bucket, $version = parse_app $query
|
|
$app | Should -Be 'test-app'
|
|
$bucket | Should -Be 'test-bucket'
|
|
$version | Should -Be '1.8.0-rc2'
|
|
|
|
$query = 'test-bucket/test_app'
|
|
$app, $bucket, $version = parse_app $query
|
|
$app | Should -Be 'test_app'
|
|
$bucket | Should -Be 'test-bucket'
|
|
$version | Should -BeNullOrEmpty
|
|
|
|
$query = 'test-bucket/test_app@1.8.0'
|
|
$app, $bucket, $version = parse_app $query
|
|
$app | Should -Be 'test_app'
|
|
$bucket | Should -Be 'test-bucket'
|
|
$version | Should -Be '1.8.0'
|
|
|
|
$query = 'test-bucket/test_app@1.8.0-rc2'
|
|
$app, $bucket, $version = parse_app $query
|
|
$app | Should -Be 'test_app'
|
|
$bucket | Should -Be 'test-bucket'
|
|
$version | Should -Be '1.8.0-rc2'
|
|
}
|
|
}
|
|
|
|
Describe 'Format Architecture String' -Tag 'Scoop' {
|
|
It 'should keep correct architectures' {
|
|
Format-ArchitectureString '32bit' | Should -Be '32bit'
|
|
Format-ArchitectureString '32' | Should -Be '32bit'
|
|
Format-ArchitectureString 'x86' | Should -Be '32bit'
|
|
Format-ArchitectureString 'X86' | Should -Be '32bit'
|
|
Format-ArchitectureString 'i386' | Should -Be '32bit'
|
|
Format-ArchitectureString '386' | Should -Be '32bit'
|
|
Format-ArchitectureString 'i686' | Should -Be '32bit'
|
|
|
|
Format-ArchitectureString '64bit' | Should -Be '64bit'
|
|
Format-ArchitectureString '64' | Should -Be '64bit'
|
|
Format-ArchitectureString 'x64' | Should -Be '64bit'
|
|
Format-ArchitectureString 'X64' | Should -Be '64bit'
|
|
Format-ArchitectureString 'amd64' | Should -Be '64bit'
|
|
Format-ArchitectureString 'AMD64' | Should -Be '64bit'
|
|
Format-ArchitectureString 'x86_64' | Should -Be '64bit'
|
|
Format-ArchitectureString 'x86-64' | Should -Be '64bit'
|
|
|
|
Format-ArchitectureString 'arm64' | Should -Be 'arm64'
|
|
Format-ArchitectureString 'arm' | Should -Be 'arm64'
|
|
Format-ArchitectureString 'aarch64' | Should -Be 'arm64'
|
|
Format-ArchitectureString 'ARM64' | Should -Be 'arm64'
|
|
Format-ArchitectureString 'ARM' | Should -Be 'arm64'
|
|
Format-ArchitectureString 'AARCH64' | Should -Be 'arm64'
|
|
}
|
|
|
|
It 'should fallback to the default architecture on empty input' {
|
|
Format-ArchitectureString '' | Should -Be $(Get-DefaultArchitecture)
|
|
Format-ArchitectureString $null | Should -Be $(Get-DefaultArchitecture)
|
|
}
|
|
|
|
It 'should show an error with an invalid architecture' {
|
|
{ Format-ArchitectureString 'PPC' } | Should -Throw "Invalid architecture: 'ppc'"
|
|
}
|
|
}
|