377 lines
14 KiB
PowerShell
377 lines
14 KiB
PowerShell
|
. $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
|
||
|
}
|
||
|
}
|
||
|
}
|