Files
ps-module-giteautilities/Tests/Invoke-GiteaFileDownload.Tests.ps1
Raymond LaRose ed8f3ab02e
Some checks failed
Publish Powershell Module to Gitea Repository / test (push) Failing after 10s
Publish Powershell Module to Gitea Repository / deploy (push) Has been skipped
Update pester tests
2025-05-27 13:23:37 -04:00

150 lines
6.1 KiB
PowerShell

# Invoke-GiteaFileDownload.Tests.ps1
# Import the module under test
$modulePath = Join-Path -Path $PSScriptRoot -ChildPath '..\PS-GiteaUtilities\PS-GiteaUtilities.psm1'
Import-Module -Name $modulePath -Force
Describe 'Invoke-GiteaFileDownload' {
BeforeEach {
# Always mock Get-GiteaConfiguration to avoid needing real config
Mock -CommandName Get-GiteaConfiguration -ModuleName PS-GiteaUtilities -MockWith {
return @{ token = 'mocktoken' }
}
# Correct webClient Mock: headers, download, dispose
Mock -CommandName New-Object -ModuleName PS-GiteaUtilities -ParameterFilter { $TypeName -eq 'System.Net.WebClient' } -MockWith {
$headers = New-Object System.Net.WebHeaderCollection
# Create a real object
$webClient = New-Object PSObject
# Add Headers
Add-Member -InputObject $webClient -MemberType NoteProperty -Name Headers -Value $headers
# Add a DownloadFile method
Add-Member -InputObject $webClient -MemberType ScriptMethod -Name DownloadFile -Value {
param($url, $path)
# Fake download (do nothing)
}
# Add a Dispose method
Add-Member -InputObject $webClient -MemberType ScriptMethod -Name Dispose -Value {
# Fake dispose (do nothing)
}
return $webClient
}
# Mock filesystem behavior
Mock -CommandName Test-Path -ModuleName PS-GiteaUtilities -MockWith { $false }
Mock -CommandName New-Item -ModuleName PS-GiteaUtilities -MockWith { }
# Clean captured download data before each test
$script:LastDownloadUrl = $null
$script:LastDownloadPath = $null
}
Context 'When all parameters are valid' {
It 'Should download a file successfully' {
$result = Invoke-GiteaFileDownload -downloadURL 'https://gitea.example.com/raw/path/to/file.txt' -token 'abc123'
$result | Should -Not -BeNullOrEmpty
$result.Result | Should -Be 'Success'
$result.Path | Should -Match 'file\.txt$'
}
}
Context 'When specifying an outputPath' {
It 'Should create a path based on outputPath' {
$result = Invoke-GiteaFileDownload -downloadURL 'https://gitea.example.com/raw/path/to/file.txt' `
-outputPath 'docs/manual/' -token 'abc123'
$result.Path | Should -Match 'docs[\\/]+manual[\\/]+file\.txt$'
$result.Result | Should -Be 'Success'
}
}
Context 'When specifying an outputName' {
It 'Should download file and name it based on outputName' {
$result = Invoke-GiteaFileDownload -downloadURL 'https://gitea.example.com/raw/path/to/file.txt' `
-outputName 'newfile.txt' -token 'abc123'
$result.Path | Should -Match 'newfile\.txt$'
$result.Result | Should -Be 'Success'
}
}
Context 'When specifying an outputName and outputPath' {
It 'Should download file and name it based on outputName' {
$result = Invoke-GiteaFileDownload -downloadURL 'https://gitea.example.com/raw/path/to/file.txt' `
-outputPath 'docs/manual/' -outputName 'newfile.txt' -token 'abc123'
$result.Path | Should -Match 'docs[\\/]+manual[\\/]+newfile\.txt$'
$result.Result | Should -Be 'Success'
}
}
Context 'When using -PreserveRelativePath' {
It 'Should preserve the relative path structure' {
$result = Invoke-GiteaFileDownload -downloadURL 'https://gitea.example.com/raw/path/to/file.txt' `
-PreserveRelativePath -token 'abc123'
$result.Path | Should -Match 'path[\\/]+to[\\/]+file\.txt$'
$result.Result | Should -Be 'Success'
}
}
Context 'When skipping directories' {
It 'Should skip items with type = dir' {
$result = Invoke-GiteaFileDownload -outputPath 'docs/' -type 'dir' -token 'abc123'
$result.Result | Should -Be 'Skipped'
}
}
Context 'When file exists and -Force is not used' {
BeforeEach {
# Simulate file already exists
Mock -CommandName Test-Path -ModuleName PS-GiteaUtilities -MockWith {
param($Path, $PathType)
if ($PathType -eq 'Leaf') { return $true } else { return $false }
}
Mock -CommandName Write-Error -ModuleName PS-GiteaUtilities -MockWith { }
}
It 'Should not overwrite existing file without Force' {
$result = Invoke-GiteaFileDownload -downloadURL 'https://gitea.example.com/raw/path/to/existingfile.txt' -token 'abc123'
$result.Result | Should -Be 'Skipped'
}
}
Context 'When download fails' {
BeforeEach {
Mock -CommandName New-Object -ModuleName PS-GiteaUtilities -ParameterFilter { $TypeName -eq 'System.Net.WebClient' } -MockWith {
$headers = New-Object System.Net.WebHeaderCollection
$webClient = New-Object PSObject
Add-Member -InputObject $webClient -MemberType NoteProperty -Name Headers -Value $headers
Add-Member -InputObject $webClient -MemberType ScriptMethod -Name DownloadFile -Value {
throw "Download failed intentionally"
}
Add-Member -InputObject $webClient -MemberType ScriptMethod -Name Dispose -Value {
return $true
}
return $webClient
}
Mock -CommandName Test-Path -ModuleName PS-GiteaUtilities -MockWith { $false }
Mock -CommandName New-Item -ModuleName PS-GiteaUtilities -MockWith { }
Mock -CommandName Write-Error -ModuleName PS-GiteaUtilities -MockWith { }
}
It 'Should capture error and mark download as failed' {
$result = Invoke-GiteaFileDownload -downloadURL 'https://gitea.example.com/raw/path/to/badfile.txt' -token 'abc123'
$result.Result | Should -Be 'Failure'
$result.Error | Should -Match 'Failed to download'
}
}
}