. $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 } } }