. $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 = "" $currentErrorActionPreference = $ErrorActionPreference $ErrorActionPreference = "stop" # Init functions. Used to reset package objets in each Context. function Init-PackageData { $webPackage1 = New-DummyPackageInstallationData -PackageName "web.package1" -PackageVersion "1.1.0" -IsWebOnly $webPackage2 = New-DummyPackageInstallationData -PackageName "web.package2" -PackageVersion "1.1.0" -IsWebOnly $appPackage1 = New-DummyPackageInstallationData -PackageName "app.package1" -PackageVersion "1.1.0" -IsAppOnly $appPackage2 = New-DummyPackageInstallationData -PackageName "app.package2" -PackageVersion "1.1.0" -IsAppOnly $micPackage1 = New-DummyPackageInstallationData -PackageName "mic.package1" -PackageVersion "1.1.0" -IsMicOnly $micPackage2 = New-DummyPackageInstallationData -PackageName "mic.package2" -PackageVersion "1.1.0" -IsMicOnly $appPackageArray = @($appPackage1, $appPackage2) $webPackageArray = @($webPackage1, $webPackage2) $micPackageArray = @($micPackage1, $micPackage2) $packageData = New-PackageMetadataObject $packageData.AppPackagesToInstall = $appPackageArray $packageData.AppPackagesToInstall += $micPackageArray $packageData.WebPackagesToInstall = $webPackageArray $packageData.ServersToQuery = @("fake.appserver.1", "fake.fabserver.1", "fake.micserver.1", "fake.webserver.1") $packageData.AppServers = @("fake.appserver.1") $packageData.FabServers = @("fake.fabserver.1") $packageData.MicServers = @("fake.micserver.1") $packageData.WebServers = @("fake.webserver.1") $packageData.HasAppServers = $true $packageData.HasFabServers = $true $packageData.HasMicServers = $true $packageData.HasWebServers = $true return $packageData } function Init-DebugMetadata { $webPackage1 = New-DummyPackageInstallationData -PackageName "web.package1" -PackageVersion "1.1.0" -IsWebOnly $webPackage2 = New-DummyPackageInstallationData -PackageName "web.package2" -PackageVersion "1.1.0" -IsWebOnly $appPackage1 = New-DummyPackageInstallationData -PackageName "app.package1" -PackageVersion "1.1.0" -IsAppOnly $appPackage2 = New-DummyPackageInstallationData -PackageName "app.package2" -PackageVersion "1.1.0" -IsAppOnly $micPackage1 = New-DummyPackageInstallationData -PackageName "mic.package1" -PackageVersion "1.1.0" -IsMicOnly $micPackage2 = New-DummyPackageInstallationData -PackageName "mic.package2" -PackageVersion "1.1.0" -IsMicOnly $debugMetadata = New-Object psobject -property @{ WebServerPackages = @() AppServerPackages = @() MicServerPackages = @() FabServerPackages = @() WebPackagesToInstallMap = @{} AppPackagesToInstallMap = @{} ClassifiedPackagesMap = @{} ExistingInstalledHotfixes = @() } $appServerPackageArray = @($appPackage1, $appPackage2, $webPackage1) $webServerPackageArray = @($webPackage1, $webPackage2, $appPackage1) $micServerPackageArray = @($micPackage1, $micPackage2, $webPackage1) $fabServerPackageArray = @($micPackage1, $micPackage2, $webPackage1) $debugMetadata.WebServerPackages = $webServerPackageArray $debugMetadata.AppServerPackages = $appServerPackageArray $debugMetadata.MicServerPackages = $micServerPackageArray $debugMetadata.FabServerPackages = $fabServerPackageArray $debugMetadata.ClassifiedPackagesMap["app.package1"] = $appPackage1 $debugMetadata.ClassifiedPackagesMap["app.package2"] = $appPackage2 $debugMetadata.ClassifiedPackagesMap["mic.package1"] = $micPackage1 $debugMetadata.ClassifiedPackagesMap["mic.package2"] = $micPackage2 $debugMetadata.ClassifiedPackagesMap["web.package1"] = $webPackage1 $debugMetadata.ClassifiedPackagesMap["web.package2"] = $webPackage2 return $debugMetadata } $password = ConvertTo-SecureString 'fake' -AsPlainText -Force $fakeCred = New-Object System.Management.Automation.PSCredential('bogus', $password) Describe "Get-ServerPackageInformation" { #region Mocks Mock -CommandName Write-Host -MockWith {} Mock -CommandName Write-Warning -MockWith {} Mock -CommandName Write-Error -MockWith {} #TODO : Check the return value; possibly needs to be massaged. If so, might need a duplicate in a specific Context. Mock -CommandName Get-EnvironmentData -MockWith { return $packageData } #TODO : Check the return value; possibly needs to be massaged. If so, might need a duplicate in a specific Context. Mock -CommandName Get-PackageServerMapping -MockWith { return $packageData, $debugMetadata } #TODO : Check the return value; possibly needs to be massaged. If so, might need a duplicate in a specific Context. Mock -CommandName Get-BadPackages -MockWith { return $packageData } Mock -CommandName Select-InstallPackages -MockWith { return $packageData } Mock -CommandName Get-AwsSettings -MockWith { return @{ "Region" = "courts-of-chaos-1" "Profile" = "unittest" } } # Cheating for the mock; assume you always get a unique list and just return it. # Only works if you ensure the input is faked correctly. Mock -CommandName Select-UniqueServerPackages -MockWith { return $packagesArray } Mock -CommandName Get-InstalledPackages -MockWith { $installedPackages = @( @{ Version = "1.0.0" Name = "web.package1" IsValid = $false }, @{ Version = "1.0.0" Name = "web.package2" IsValid = $false } ) return [pscustomobject]$installedPackages } -ParameterFilter { $ComputerName -like "*web*" } Mock -CommandName Get-InstalledPackages -MockWith { $installedPackages = @( @{ Version = "1.0.0" Name = "mic.package1" IsValid = $false }, @{ Version = "1.0.0" Name = "mic.package2" IsValid = $false } ) return [pscustomobject]$installedPackages } -ParameterFilter { $ComputerName -like "*mic*" -or $ComputerName -like "*fab*" } Mock -CommandName Get-InstalledPackages -MockWith { $installedPackages = @( @{ Version = "1.0.0" Name = "app.package1" IsValid = $false }, @{ Version = "1.0.0" Name = "app.package2" IsValid = $false } ) return [pscustomobject]$installedPackages } -ParameterFilter { $ComputerName -like "*app*" } # TODO : Check the return value; Possibly needs to be massaged. # Cheating for the mock; assume you always get a unique list and just return it. # Only works if you ensure the input is faked correctly. Mock -CommandName Remove-PackagesThatAreAlreadyInstalled -MockWith { return $packagesToInstall } Mock -CommandName Select-AlkamiAppServers -MockWith {return $true} Mock -CommandName Select-AlkamiMicServers -MockWith {return $true} Mock -CommandName Select-AlkamiWebServers -MockWith {return $true} #endregion Mocks Context "Checking that Dependencies are used" { $packageData = Init-PackageData $debugMetadata = Init-DebugMetadata It "Gets EnvironmentData" { Get-ServerPackageInformation -PackageMetadata $packageData -DebugMetadata $debugMetadata ` -BuildCheckoutDirectory "SomePath" -NugetCredential $fakeCred -AwsProfileName "JunkProfile" -DependencyReleaseValue "junkRelease" Assert-MockCalled -CommandName Get-EnvironmentData } It "Builds PackageServerMapping" { Get-ServerPackageInformation -PackageMetadata $packageData -DebugMetadata $debugMetadata ` -BuildCheckoutDirectory "SomePath" -NugetCredential $fakeCred -AwsProfileName "JunkProfile" -DependencyReleaseValue "junkRelease" Assert-MockCalled -CommandName Get-PackageServerMapping } It "Gets EnvironmentData" { Get-ServerPackageInformation -PackageMetadata $packageData -DebugMetadata $debugMetadata ` -BuildCheckoutDirectory "SomePath" -NugetCredential $fakeCred -AwsProfileName "JunkProfile" -DependencyReleaseValue "junkRelease" Assert-MockCalled -CommandName Get-BadPackages } It "Gets EnvironmentData" { Get-ServerPackageInformation -PackageMetadata $packageData -DebugMetadata $debugMetadata ` -BuildCheckoutDirectory "SomePath" -NugetCredential $fakeCred -AwsProfileName "JunkProfile" -DependencyReleaseValue "junkRelease" Assert-MockCalled -CommandName Get-AwsSettings } } # We force reinstall Widgets & Providers if it's an orb deploy. We don't if it's a package install. Context "When Force Re-installing Packages" { $packageData = Init-PackageData $debugMetadata = Init-DebugMetadata # Create Pre-installed packages $appReInstallPackage = New-DummyPackageInstallationData -packagename "app.reinstall.package" -packageversion "1.0.0" -isapponly $webReInstallPackage = New-DummyPackageInstallationData -packagename "web.reinstall.package" -packageversion "1.0.0" -iswebonly # Create Packages to be uninstalled $appUninstallPackage = New-DummyPackageInstallationData -packagename "app.uninstall.package" -packageversion "1.0.0" -isapponly $webuninstallPackage = New-DummyPackageInstallationData -packagename "web.uninstall.package" -packageversion "1.0.0" -iswebonly # Create pre installed Packages to be uninstalled and reinstalled. $appReUninstallPackage = New-DummyPackageInstallationData -packagename "app.re.uninstall.package" -packageversion "1.0.0" -isapponly $webReUninstallPackage = New-DummyPackageInstallationData -packagename "web.re.uninstall.package" -packageversion "1.0.0" -iswebonly # Add packages to install/uninstall lists $packagedata.AppPackagesToUninstall += @($appReUninstallPackage) $packagedata.WebPackagesToUninstall += @($webReUninstallPackage) $packagedata.AppPackagesToUninstall += @($appUninstallPackage) $packagedata.WebPackagesToUninstall += @($webUninstallPackage) $packageData.AppPackagesToInstall += @($appReUninstallPackage) $packageData.WebPackagesToInstall += @($webReUninstallPackage) # Make this an orb run $packageData.ForceReinstallPackages = $true # Add packages to preinstalled lists $debugMetadata.AppServerPackages += $appReInstallPackage $debugMetadata.WebServerPackages += $webReInstallPackage $debugMetadata.AppServerPackages += $appUninstallPackage $debugMetadata.WebServerPackages += $webUninstallPackage $debugMetadata.AppServerPackages += $appReUninstallPackage $debugMetadata.WebServerPackages += $webReUninstallPackage # Pretend packages to be reinstalled are everywhere Mock -CommandName Select-InstallPackages -MockWith { $appReInstallPackage.ForceSameVersion = $true $webReInstallPackage.ForceSameVersion = $true $newPackages = @() $newPackages += $appReInstallPackage $newPackages += $webReInstallPackage # TODO: Change this to be uninstall/reinstall packages. $newPackages += $appReUninstallPackage $newPackages += $webReUninstallPackage $newPackages += $packages return $newPackages } Mock -CommandName Get-PackageServerMapping -MockWith{ $PackageMetadata.AppPackagesToInstall = $AllAppTierPackages $PackageMetadata.WebPackagesToInstall = $AllWebTierPackages return $PackageMetadata, $DebugMetadata } Mock -CommandName Add-OldHotfixPackagesToUninstallList -MockWith { return $PackageMetadata, $DebugMetadata } $packages, $debugpackagses = Get-ServerPackageInformation -packagemetadata $packageData -debugmetadata $debugmetadata ` -buildcheckoutdirectory "somepath" -nugetcredential $fakecred -DependencyReleaseValue "123" -AwsProfileName "JunkProfile" It "Calls Add-OldHotfixPackagesToUninstallList" { Assert-MockCalled Add-OldHotfixPackagesToUninstallList } # Test App Packages It "Keeps Providers To Be Reinstalled"{ $packages.AppPackagesToInstall | Should -Contain $appReInstallPackage } # Test Web Packages It "Keeps Widgets To Be Reinstalled" { $packages.WebPackagesToInstall | Should -Contain $WebReInstallPackage } It "Does Not Reinstall Packages Which Are Being Uninstalled" { $packages.AppPackagesToInstall | Should -Not -Contain $appUninstallPackage $packages.WebPackagesToInstall | Should -Not -Contain $webUninstallPackage } It "Does Reinstall Packages Which Are Being Uninstalled And Reinstalled" { $packages.AppPackagesToInstall | Should -Contain $appReUninstallPackage $packages.WebPackagesToInstall | Should -Contain $webReUninstallPackage } } Context "When Told To Install Chocolatey" { $packageData = Init-PackageData $debugMetadata = Init-DebugMetadata $packageData.AppPackagesToInstall += New-DummyPackageInstallationData -PackageName "chocolatey" -PackageVersion "1.0.0" -IsAppOnly $packageData.WebPackagesToInstall += New-DummyPackageInstallationData -PackageName "chocolatey" -PackageVersion "1.0.0" -IsWebOnly # This is the function that strips out chocolatey based on allWebTierPackages and allAppTierPackages. Do that here. Mock -CommandName Get-PackageServerMapping -MockWith { $packageData.AppPackagesToInstall = $AllAppTierPackages $packageData.WebPackagesToInstall = $AllWebTierPackages return $packageData, $debugMetadata } $packages, $debugPackagses = Get-ServerPackageInformation -PackageMetadata $packageData -DebugMetadata $debugMetadata ` -BuildCheckoutDirectory "SomePath" -NugetCredential $fakeCred -AwsProfileName "JunkProfile" -DependencyReleaseValue "junkRelease" It "Writes a Warning on Apps" { Assert-MockCalled -CommandName Write-Warning -Scope Context -Exactly 1 ` -ParameterFilter {$Message -eq "The Chocolatey Package Manager Program package (chocolatey) was passed in to be installed on the App Tier. At this time we explicitly dissallow that. It has been skipped."} } It "Writes a Warning on Webs" { Assert-MockCalled -CommandName Write-Warning -Scope Context -Exactly 1 ` -ParameterFilter {$Message -eq "The Chocolatey Package Manager Program package (chocolatey) was passed in to be installed on the Web Tier. At this time we explicitly dissallow that. It has been skipped."} } It "Removes Chocolatey From the Install List on Apps" { $packages.AppPackagesToInstall | ForEach-Object {$_.Name | Should -Not -BeExactly "chocolatey"} } It "Removes Chocolatey from The Install List on Webs" { $packages.WebPackagesToInstall | ForEach-Object {$_.Name | Should -Not -BeExactly "chocolatey"} } } # TODO: Need changes from SRE-16772 before we write tests Context "When Different Servers Have Different Package Versions" { $packageData = Init-PackageData $debugMetadata = Init-DebugMetadata $packageData.ServersToQuery = @("fake.appserver.1", "fake.appserver.2", "fake.fabserver.1", "fake.fabserver.2", "fake.micserver.1", "fake.micserver.2", "fake.webserver.1", "fake.webserver.2") # Need one mock per server based on computer name. So, 8 mocks. Mock -CommandName Get-InstalledPackages -MockWith { $installedPackages = @( @{ Version = "1.0.1" Name = "web.package1" IsValid = $false }, @{ Version = "1.0.1" Name = "web.package2" IsValid = $false } ) return [pscustomobject]$installedPackages } -ParameterFilter { $ComputerName -like "*fake.webserver.1*" } Mock -CommandName Get-InstalledPackages -MockWith { $installedPackages = @( @{ Version = "1.0.1" Name = "web.package1" IsValid = $false }, @{ Version = "1.0.2" Name = "web.package2" IsValid = $false } ) return [pscustomobject]$installedPackages } -ParameterFilter { $ComputerName -like "*fake.webserver.2*" } Mock -CommandName Get-InstalledPackages -MockWith { $installedPackages = @( @{ Version = "1.0.1" Name = "mic.package1" IsValid = $false }, @{ Version = "1.0.1" Name = "mic.package2" IsValid = $false } ) return [pscustomobject]$installedPackages } -ParameterFilter { $ComputerName -like "*fake.micserver.1*" } Mock -CommandName Get-InstalledPackages -MockWith { $installedPackages = @( @{ Version = "1.0.1" Name = "mic.package1" IsValid = $false }, @{ Version = "1.0.2" Name = "mic.package2" IsValid = $false } ) return [pscustomobject]$installedPackages } -ParameterFilter { $ComputerName -like "*fake.micserver.2*" } Mock -CommandName Get-InstalledPackages -MockWith { $installedPackages = @( @{ Version = "1.0.1" Name = "mic.package1" IsValid = $false }, @{ Version = "1.0.1" Name = "mic.package2" IsValid = $false } ) return [pscustomobject]$installedPackages } -ParameterFilter { $ComputerName -like "*fake.fabserver.1*" } Mock -CommandName Get-InstalledPackages -MockWith { $installedPackages = @( @{ Version = "1.0.1" Name = "mic.package1" IsValid = $false }, @{ Version = "1.0.2" Name = "mic.package2" IsValid = $false } ) return [pscustomobject]$installedPackages } -ParameterFilter { $ComputerName -like "*fake.fabserver.2*" } Mock -CommandName Get-InstalledPackages -MockWith { $installedPackages = @( @{ Version = "1.0.1" Name = "app.package1" IsValid = $false }, @{ Version = "1.0.1" Name = "app.package2" IsValid = $false } ) return [pscustomobject]$installedPackages } -ParameterFilter { $ComputerName -like "*fake.appserver.1*" } Mock -CommandName Get-InstalledPackages -MockWith { $installedPackages = @( @{ Version = "1.0.1" Name = "app.package1" IsValid = $false }, @{ Version = "1.0.2" Name = "app.package2" IsValid = $false } ) return [pscustomobject]$installedPackages } -ParameterFilter { $ComputerName -like "*fake.appserver.2*" } $packages, $debugPackagses = Get-ServerPackageInformation -PackageMetadata $packageData -DebugMetadata $debugMetadata ` -BuildCheckoutDirectory "SomePath" -NugetCredential $fakeCred -AwsProfileName "JunkProfile" -DependencyReleaseValue "junkRelease" it "Reduces Them to Unique Values" { $packages.PackageToVersions | should -not -BeNullOrEmpty foreach ($h in $packages.packagetoversions.getenumerator()) { $versions = $h.value foreach ($version in $versions) { ($versions | Where-Object { $_ -eq $version }).Count | Should Be 1 } } } } Context "When Already Installed Packages Are To Be Re-installed" { $packageData = Init-PackageData $debugMetadata = Init-DebugMetadata # Create pre-installed package $appInstalledPackage = New-DummyPackageInstallationData -packagename "app.package1" -packageversion "1.0.0" -isapponly # Create package to install $appPackageV2 = New-DummyPackageInstallationData -PackageName "app.package1" -PackageVersion "2.1.0" -IsAppOnly # Add package to preinstalled list $debugMetadata.AppServerPackages += $appInstalledPackage # Add package to list to be installed $packageData.AppPackagesToInstall += @($appPackageV2) $packages, $debugPackagses = Get-ServerPackageInformation -PackageMetadata $packageData -DebugMetadata $debugMetadata ` -BuildCheckoutDirectory "SomePath" -NugetCredential $fakeCred -AwsProfileName "JunkProfile" -DependencyReleaseValue "junkRelease" It "Calls Remove-PackagesThatAreAlreadyInstalled" { Assert-MockCalled -CommandName Remove-PackagesThatAreAlreadyInstalled -Scope Context } It "Installs The Version From The Install List" { $packages.AppPackagesToInstall | Should -Contain $appPackageV2 } It "Does Not Install The Existing Version" { $packages.AppPackagesToInstall | Should -Not -Contain $appInstalledPackage } } Context "When Uninstalling Packages" { $packageData = Init-PackageData $debugMetadata = Init-DebugMetadata $appUninstallPackage = New-DummyPackageInstallationData -PackageName "app.uninstall.package" -PackageVersion "1.0.0" -IsAppOnly $micUninstallPackage = New-DummyPackageInstallationData -PackageName "mic.uninstall.package" -PackageVersion "1.0.0" -IsMicOnly $webUninstallPackage = New-DummyPackageInstallationData -PackageName "web.uninstall.package" -PackageVersion "1.0.0" -IsWebOnly # Starts off in the same array, split inside the function we're testing. $packageData.AppPackagesToUninstall += @($appUninstallPackage) $packageData.AppPackagesToUninstall += @($micUninstallPackage) $packageData.WebPackagesToUninstall += @($webUninstallPackage) $debugMetadata.AppServerPackages += $appUninstallPackage $debugMetadata.MicServerPackages += $micUninstallPackage $debugMetadata.WebServerPackages += $webUninstallPackage $packages, $debugPackagses = Get-ServerPackageInformation -PackageMetadata $packageData -DebugMetadata $debugMetadata ` -BuildCheckoutDirectory "SomePath" -NugetCredential $fakeCred -AwsProfileName "JunkProfile" -DependencyReleaseValue "junkRelease" It "Removes Packages from App Servers" { $packages.AppPackagesToUninstall | Should -Not -BeNullOrEmpty $packages.AppPackagesToUninstall | Should -Match $packageData.AppPackagesToUninstall } It "Removes Packages from Mic Servers" { $packages.MicPackagesToUninstall | Should -Not -BeNullOrEmpty $packages.MicPackagesToUninstall | Should -Match $packageData.MicPackagesToUninstall } It "Removes Packages from Web Servers" { $packages.WebPackagesToUninstall | Should -Not -BeNullOrEmpty $packages.WebPackagesToUninstall | Should -Match $packageData.WebPackagesToUninstall } It "Correctly Labels Has App Uninstalls" { $packages.HasAppUninstalls | Should -BeTrue } It "Correctly Labels Has Mic Uninstalls" { $packages.HasMicUninstalls | Should -BeTrue } It "Correctly Labels Has Web Uninstalls" { $packages.HasWebUninstalls | Should -BeTrue } } Context "When Packages Are Found On The Wrong Server Type" { $packageData = Init-PackageData $debugMetadata = Init-DebugMetadata $appUninstallPackage = New-DummyPackageInstallationData -PackageName "app.uninstall.package" -PackageVersion "1.0.0" -IsAppOnly $micUninstallPackage = New-DummyPackageInstallationData -PackageName "mic.uninstall.package" -PackageVersion "1.0.0" -IsMicOnly $webUninstallPackage = New-DummyPackageInstallationData -PackageName "web.uninstall.package" -PackageVersion "1.0.0" -IsWebOnly Mock -CommandName Get-BadPackages -MockWith { $packageData.BadMicPackagesToUninstall += @($micUninstallPackage) $packageData.BadAppPackagesToUninstall += @($webUninstallPackage) $packageData.BadWebPackagesToUninstall += @($appUninstallPackage) return $packageData } $packages, $debugPackagses = Get-ServerPackageInformation -PackageMetadata $packageData -DebugMetadata $debugMetadata ` -BuildCheckoutDirectory "SomePath" -NugetCredential $fakeCred -AwsProfileName "JunkProfile" -DependencyReleaseValue "junkRelease" It "Removes Bad Packages from App Servers" { $packages.AppPackagesToUninstall | Should -Not -BeNullOrEmpty $packages.AppPackagesToUninstall | Should -Match $packageData.AppPackagesToUninstall } It "Removes Bad Packages from Mic Servers" { $packages.MicPackagesToUninstall | Should -Not -BeNullOrEmpty $packages.MicPackagesToUninstall | Should -Match $packageData.MicPackagesToUninstall } It "Removes Bad Packages from Web Servers" { $packages.WebPackagesToUninstall | Should -Not -BeNullOrEmpty $packages.WebPackagesToUninstall | Should -Match $packageData.WebPackagesToUninstall } } Context "When Getting Install Information" { $packageData = Init-PackageData $debugMetadata = Init-DebugMetadata $packages, $debugPackagses = Get-ServerPackageInformation -PackageMetadata $packageData -DebugMetadata $debugMetadata ` -BuildCheckoutDirectory "SomePath" -NugetCredential $fakeCred -AwsProfileName "JunkProfile" -DependencyReleaseValue "junkRelease" It "Correctly Labels Has App Installs" { $packages.HasAppInstalls | Should -BeTrue } It "Correctly Labels Has Mic Installs" { $packages.HasMicInstalls | Should -BeTrue } It "Correctly Labels Has Web Installs" { $packages.HasWebInstalls | Should -BeTrue } It "Returns Package Metadata" { $packages | Should -Not -BeNullOrEmpty } It "Returns DebugMetadata" { $debugPackagses | Should -Not -BeNullOrEmpty } } }