feat: add timeout for WinGet uninstall to prevent hanging (#731)

This commit is contained in:
Jeffrey
2026-08-09 01:24:27 +02:00
committed by GitHub
parent 5c838384d6
commit c0599cba1f
2 changed files with 51 additions and 8 deletions
+26 -1
View File
@@ -2,7 +2,7 @@ BeforeAll {
function Get-TargetUserForAppRemoval { 'AllUsers' }
function Get-WingetInstalledApps { param($TimeOut, [switch]$NonBlocking) @() }
function Test-AppInWingetList { param($appId, $InstalledList) $false }
function Invoke-NonBlocking { param($ScriptBlock, $ArgumentList) }
function Invoke-NonBlocking { param($ScriptBlock, $ArgumentList, $TimeoutSeconds) }
function Get-UserName { 'Alice' }
function Invoke-ForceRemoveEdge {}
function Show-MessageBox { 'No' }
@@ -109,6 +109,31 @@ Describe 'Remove-WinGetApp' {
Should -Invoke Invoke-NonBlocking -Times 1 -Exactly -ParameterFilter { $ArgumentList -eq 'One.App' }
Should -Invoke Set-RunOnceWingetTask -Times $Scheduled -Exactly -ParameterFilter { $appId -eq 'One.App' }
}
It 'limits a foreground winget uninstall to two minutes' {
Remove-WinGetApp -app 'One.App'
Should -Invoke Invoke-NonBlocking -Times 1 -Exactly -ParameterFilter {
$ArgumentList -eq 'One.App' -and $TimeoutSeconds -eq 120
}
}
It 'passes a specified foreground winget uninstall timeout' {
Remove-WinGetApp -app 'One.App' -TimeoutSeconds 30
Should -Invoke Invoke-NonBlocking -Times 1 -Exactly -ParameterFilter {
$ArgumentList -eq 'One.App' -and $TimeoutSeconds -eq 30
}
}
It 'reports a timed-out winget uninstall and continues' {
$script:Params = @{ User = 'Alice' }
Mock Invoke-NonBlocking { throw 'Operation timed out after 120 seconds' }
{ Remove-WinGetApp -app 'One.App' } | Should -Not -Throw
Should -Invoke Set-RunOnceWingetTask -Times 1 -Exactly
Should -Invoke Write-Host -Times 1 -Exactly -ParameterFilter {
$Object -like '*did not complete within 120 seconds*' -and $ForegroundColor -eq 'Red'
}
}
}
Describe 'Remove-AppxApp' {