ps/Modules/Alkami.PowerShell.Choco/Public/Remove-PackagesThatAreAlreadyInstalled.Tests.ps1

377 lines
14 KiB
PowerShell
Raw Normal View History

2023-05-30 22:51:22 -07:00
. $PSScriptRoot\..\..\Load-PesterModules.ps1
$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.tests\.', '.'
$functionPath = Join-Path -Path $here -ChildPath $sut
Write-Host "Overriding SUT: $functionPath"
Import-Module $functionPath -Force
$moduleForMock = ""
Describe "Remove-PackagesThatAreAlreadyInstalled" {
function Get-PackageObject{
param(
$packageName,
$packageVersion,
[switch]$forceSameVersion
)
if($forceSameVersion){
$properties = @{ Name = $packageName; Version = $packageVersion; Feed = $null; Tags = $null; IsService = $null; StartMode = $null; ForceSameVersion = $true}
} else {
$properties = @{ Name = $packageName; Version = $packageVersion; Feed = $null; Tags = $null; IsService = $null; StartMode = $null; ForceSameVersion = $false}
}
$package = New-Object -TypeName PSObject -Prop $properties;
return $package
}
Context "When Provided A Null Or Empty Package List" {
$AppPackagesToInstall = @()
It "Returns Null"{
Remove-PackagesThatAreAlreadyInstalled -PackagesToInstall $AppPackagesToInstall | Should -Be $null
Remove-PackagesThatAreAlreadyInstalled -PackagesToInstall $null | Should -Be $null
}
}
Context "When Provided Packages That Aren't Installed" {
$packages = [System.Collections.ArrayList]::new()
$packageObject1 = Get-PackageObject -packageName "alkami.fake.package1" -packageVersion "1.1.1"
$packageObject2 = Get-PackageObject -packageName "alkami.fake.package2" -packageVersion "1.1.1"
$packages.Add($packageObject1)
$packages.Add($packageObject2)
$metadata = New-Object psobject -property @{
WebPackagesToInstall = @()
AppPackagesToInstall = @($pkg1, $pkg2)
WebPackagesToUninstall = @()
AppPackagesToUninstall = @()
HasWebUninstalls = $false
HasAppUninstalls = $false
HasMicUninstalls = $false
WebServers = @()
AppServers = @("MyTestServer")
MicServers = @()
FabServers = @()
ForceReinstallPackages = ""
PackageToVersions = @{}
PackageToServers = @{}
}
It "Returns Those Packages"{
[array]$results = Remove-PackagesThatAreAlreadyInstalled -PackagesToInstall $packages -PackageMetadata $metadata
$results.Count | Should -Be 2
$results[0].Name | Should -Be "alkami.fake.package1"
$results[0].Version | Should -Be "1.1.1"
$results[1].Name | Should -Be "alkami.fake.package2"
$results[1].Version | Should -Be "1.1.1"
}
}
Context "When Provided Packages To Install That Are Also On The Uninstall List"{
$packages = [System.Collections.ArrayList]::new()
$packageObject1 = Get-PackageObject -packageName "alkami.fake.package1" -packageVersion "1.1.1"
$packageObject2 = Get-PackageObject -packageName "alkami.fake.package2" -packageVersion "1.1.1"
$packages.Add($packageObject1)
$packages.Add($packageObject2)
$metadata = New-Object psobject -property @{
WebPackagesToInstall = @()
AppPackagesToInstall = @()
WebPackagesToUninstall = @()
AppPackagesToUninstall = @($pkg1, $pkg2)
HasWebUninstalls = $false
HasAppUninstalls = $false
HasMicUninstalls = $false
WebServers = @()
AppServers = @("MyTestServer")
MicServers = @()
FabServers = @()
ForceReinstallPackages = ""
PackageToVersions = @{}
PackageToServers = @{}
}
It "Returns Those Packages"{
[array]$results = Remove-PackagesThatAreAlreadyInstalled -PackagesToInstall $packages -PackageMetadata $metadata
$results.Count | Should -Be 2
$results[0].Name | Should -Be "alkami.fake.package1"
$results[0].Version | Should -Be "1.1.1"
$results[1].Name | Should -Be "alkami.fake.package2"
$results[1].Version | Should -Be "1.1.1"
}
}
Context "When Provided Force Reinstall Packages" {
$packages = [System.Collections.ArrayList]::new()
$packageName1 = "alkami.fake.package1"
$packageVersion1 = "1.1.1"
$packageName2 = "alkami.fake.package2"
$packageVersion2 = "1.1.1"
$packageObject1 = Get-PackageObject -packageName $packageName1 -packageVersion $packageVersion1 -forceSameVersion
$packageObject2 = Get-PackageObject -packageName $packageName2 -packageVersion $packageVersion2 -forceSameVersion
$packages.Add($packageObject1)
$packages.Add($packageObject2)
Mock -CommandName Write-Host -MockWith {} -ModuleName $moduleForMock
It "Returns Those Packages If We Are Force Reinstalling"{
$metadata = New-Object psobject -property @{
WebPackagesToInstall = @()
AppPackagesToInstall = @($pkg1, $pkg2)
WebPackagesToUninstall = @()
AppPackagesToUninstall = @()
HasWebUninstalls = $false
HasAppUninstalls = $false
HasMicUninstalls = $false
WebServers = @()
AppServers = @("MyTestServer")
MicServers = @()
FabServers = @()
ForceReinstallPackages = $true
PackageToVersions = @{$packageName1 = $packageVersion1; $packageName2 = $packageVersion2}
PackageToServers = @{}
}
[array]$results = Remove-PackagesThatAreAlreadyInstalled -PackagesToInstall $packages -PackageMetadata $metadata
$results.Count | Should -Be 2
$results[0].Name | Should -Be "alkami.fake.package1"
$results[0].Version | Should -Be "1.1.1"
$results[1].Name | Should -Be "alkami.fake.package2"
$results[1].Version | Should -Be "1.1.1"
}
It "Does Not Return Those Packages If We Are Not Force Installing"{
$metadata = New-Object psobject -property @{
WebPackagesToInstall = @()
AppPackagesToInstall = @($pkg1, $pkg2)
WebPackagesToUninstall = @()
AppPackagesToUninstall = @()
HasWebUninstalls = $false
HasAppUninstalls = $false
HasMicUninstalls = $false
WebServers = @()
AppServers = @("MyTestServer")
MicServers = @()
FabServers = @()
ForceReinstallPackages = $false
PackageToVersions = @{$packageName1 = $packageVersion1; $packageName2 = $packageVersion2}
PackageToServers = @{}
}
[array]$results = Remove-PackagesThatAreAlreadyInstalled -PackagesToInstall $packages -PackageMetadata $metadata
$results.Count | Should -Be 0
}
}
Context "When Provided A Package Which Has Multiple Versions Installed"{
$packages = [System.Collections.ArrayList]::new()
$packageName1 = "alkami.fake.package1"
$packageVersion1 = "1.1.1"
$packageVersion2 = "1.1.2"
$packageVersion3 = "1.1.3"
$packageObject1 = Get-PackageObject -packageName $packageName1 -packageVersion $packageVersion1 -forceSameVersion
$packages.Add($packageObject1)
$metadata = New-Object psobject -property @{
WebPackagesToInstall = @()
AppPackagesToInstall = @($pkg1)
WebPackagesToUninstall = @()
AppPackagesToUninstall = @()
HasWebUninstalls = $false
HasAppUninstalls = $false
HasMicUninstalls = $false
WebServers = @()
AppServers = @("MyTestServer")
MicServers = @()
FabServers = @()
ForceReinstallPackages = ""
PackageToVersions = @{}
PackageToServers = @{}
}
$metadata.PackageToVersions[$packageName1] = @($packageVersion1)
$metadata.PackageToVersions[$packageName1] = $metadata.PackageToVersions[$packageName1] + $packageVersion2
$metadata.PackageToVersions[$packageName1] = $metadata.PackageToVersions[$packageName1] + $packageVersion3
It "Returns That Package"{
[array]$results = Remove-PackagesThatAreAlreadyInstalled -PackagesToInstall $packages -PackageMetadata $metadata
$results.Count | Should -Be 1
$results[0].Name | Should -Be "alkami.fake.package1"
# This should match whatever was in $packages. The currently installed packages don't matter.
$results[0].Version | Should -Be "1.1.1"
}
}
Context "When Provided A New Version Of An Already Installed Package"{
$packages = [System.Collections.ArrayList]::new()
$packageName1 = "alkami.fake.package1"
$packageVersion1 = "1.1.1"
$packageVersion2 = "1.1.3"
$packageObject1 = Get-PackageObject -packageName $packageName1 -packageVersion $packageVersion2 -forceSameVersion
$packages.Add($packageObject1)
$metadata = New-Object psobject -property @{
WebPackagesToInstall = @()
AppPackagesToInstall = @($pkg1)
WebPackagesToUninstall = @()
AppPackagesToUninstall = @()
HasWebUninstalls = $false
HasAppUninstalls = $false
HasMicUninstalls = $false
WebServers = @()
AppServers = @("MyTestServer")
MicServers = @()
FabServers = @()
ForceReinstallPackages = ""
PackageToVersions = @{}
PackageToServers = @{}
}
$metadata.PackageToVersions[$packageName1] = @($packageVersion1)
It "Returns That Package"{
[array]$results = Remove-PackagesThatAreAlreadyInstalled -PackagesToInstall $packages -PackageMetadata $metadata
$results.Count | Should -Be 1
$results[0].Name | Should -Be "alkami.fake.package1"
# This should match whatever was in $packages.
$results[0].Version | Should -Be "1.1.3"
}
}
Context "When Provided A Package Already Installed On Some Servers But Not All"{
$packages = [System.Collections.ArrayList]::new()
$packageName1 = "alkami.fake.package1"
$packageVersion1 = "1.1.1"
# leaving this one alone because it's the only place that needs this one property. Easier than modifying the function further.
$properties1 = @{ Name = $packageName1; Version = $packageVersion1; Feed = $null; Tags = $null; IsService = $null; StartMode = $null; InstallToMic = $true}
$pkg1 = New-Object -TypeName PSObject -Prop $properties1;
$packages.Add($pkg1)
$metadata = New-Object psobject -property @{
WebPackagesToInstall = @()
AppPackagesToInstall = @($pkg1)
WebPackagesToUninstall = @()
AppPackagesToUninstall = @()
HasWebUninstalls = $false
HasAppUninstalls = $false
HasMicUninstalls = $false
WebServers = @()
AppServers = @("MyAppTestServer")
MicServers = @("MyMicTestServer")
FabServers = @()
ForceReinstallPackages = ""
PackageToVersions = @{}
PackageToServers = @{}
}
$metadata.PackageToVersions[$packageName1] = @($packageVersion1)
It "Returns That Package"{
[array]$results = Remove-PackagesThatAreAlreadyInstalled -PackagesToInstall $packages -PackageMetadata $metadata
$results.Count | Should -Be 1
$results[0].Name | Should -Be "alkami.fake.package1"
$results[0].Version | Should -Be "1.1.1"
}
}
Context "When Provided A Package And Version Already On All Specified Servers" {
$packages = [System.Collections.ArrayList]::new()
$packageName1 = "alkami.fake.package"
$packageVersion1 = "1.1.1"
$packageObject1 = Get-PackageObject -packageName $packageName1 -packageVersion $packageVersion1 -forceSameVersion
$packages.Add($packageObject1)
$metadata = New-Object psobject -property @{
WebPackagesToInstall = @()
AppPackagesToInstall = @($pkg1)
WebPackagesToUninstall = @()
AppPackagesToUninstall = @()
HasWebUninstalls = $false
HasAppUninstalls = $false
HasMicUninstalls = $false
WebServers = @()
AppServers = @("MyTestServer")
MicServers = @()
FabServers = @()
ForceReinstallPackages = ""
PackageToVersions = @{ "alkami.fake.package" = "1.1.1"}
PackageToServers = @{"alkami.fake.package" = @("MyTestServer")}
}
Mock -CommandName Write-Host -MockWith {} -ModuleName $moduleForMock
It "Writes To Console That The Package Is Being Removed" {
Remove-PackagesThatAreAlreadyInstalled -PackagesToInstall $packages -PackageMetadata $metadata
Assert-MockCalled -CommandName Write-Host -ModuleName $moduleForMock -ParameterFilter {
$Object -match "Package alkami.fake.package is already installed on all servers. Removing from list of packages to deploy"
} -Times 1 -Exactly
}
It "Removes The Package" {
$results = Remove-PackagesThatAreAlreadyInstalled -PackagesToInstall $packages -PackageMetadata $metadata
$results.Count | Should -Be 0
}
}
}