. $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 Get-PackageVersionsFromAlkamiProget { $samplePackageFileDirectory = "C:\test\test.txt" $samplePackageNames = "Alkami.Test.Microservice" Mock Get-Content -ModuleName $moduleForMock { return @() } Context "Parameter validation" { Mock Write-Warning -ModuleName $moduleForMock { } It "Throw when Both PackageNames Sources Passed" { { Get-PackageVersionsFromAlkamiProget -PackageNamesFile $samplePackageFileDirectory -PackageNames $samplePackageNames } | Should -Throw } It "Throw when PackageNames is provided but empty" { { Get-PackageVersionsFromAlkamiProget -PackageNames "" } | Should -Throw } It "Throw when the file from PackageNamesFile is empty" { Mock Test-IsCollectionNullOrEmpty -ModuleName $moduleForMock { return $true } Mock Write-Host -ModuleName $moduleForMock { } { Get-PackageVersionsFromAlkamiProget -PackageNamesFile $samplePackageFileDirectory } | Should -Throw } It "Throw when the file from PackageNamesFile doesn't exist" { { Get-PackageVersionsFromAlkamiProget -PackageNamesFile $samplePackageFileDirectory } | Should -Throw } It "Throw when the string for PackageNamesFile is empty" { { Get-PackageVersionsFromAlkamiProget -PackageNamesFile "" } | Should -Throw } It "Throw when neither PackageNames nor PackageNamesFile parameters are provided" { { Get-PackageVersionsFromAlkamiProget -SearchDevFeed } | Should -Throw } It "Correct amount of write-hosts called when PackageNames and all switch parameters are passed" { Mock Write-Host -ModuleName $moduleForMock { } Get-PackageVersionsFromAlkamiProget -PackageNames $samplePackageNames -ExactMatch -ShowPreVersions -SearchDevFeed -SearchQaFeed Assert-MockCalled -CommandName Write-Host -ModuleName $moduleForMock -Scope It -Exactly 12 } It "Correct amount of write-hosts called when only PackageNamesFile parameter is passed" { Mock Get-Content -ModuleName $moduleForMock { return @() } Mock Test-IsCollectionNullOrEmpty -ModuleName $moduleForMock { return $false } Mock Test-Path -ModuleName $moduleForMock { return $true } Get-PackageVersionsFromAlkamiProget -packageNamesFile $samplePackageFileDirectory Assert-MockCalled -CommandName Write-Host -ModuleName $moduleForMock -Scope It -Exactly 3 } It "Correct amount of write-hosts called when SearchQaFeed parameter is passed and SearchDevFeed is not" { Mock Write-Host -ModuleName $moduleForMock { } Get-PackageVersionsFromAlkamiProget -packageNames $samplePackageNames -SearchQaFeed Assert-MockCalled -CommandName Write-Host -ModuleName $moduleForMock -Scope It -Exactly 4 } It "Correct amount of write-hosts called when neither SearchDevFeed nor SearchQaFeed is passed" { Mock Write-Host -ModuleName $moduleForMock { } Get-PackageVersionsFromAlkamiProget -packageNames $samplePackageNames Assert-MockCalled -CommandName Write-Host -ModuleName $moduleForMock -Scope It -Exactly 2 } } Context "Output validation" { Mock Get-ChocoState -ModuleName $moduleForMock { $results = @(@{ Feed = $NULL; IsService = $NULL; Version = "1.0.1"; Tags = $NULL; Name = "Alkami.Test.Test1" }, @{ Feed = $NULL; IsService = $NULL; Version = "1.1.0"; Tags = $NULL; Name = "Alkami.Test.Test2" }, @{ Feed = $NULL; IsService = $NULL; Version = "1.2.0-pre099"; Tags = $NULL; Name = "Alkami.TestPre.Test" }) return $results } Mock Write-Host -ModuleName $moduleForMock { } It "DevRelease versions of packages are displayed by default when no feed switches are provided" { $results = Get-PackageVersionsFromAlkamiProget -packageNames $samplePackageNames $results | Should -BeLike "*DevRelease*" } It "DevRelease versions of packages are displayed when SearchDevFeed is provided" { $results = Get-PackageVersionsFromAlkamiProget -packageNames $samplePackageNames -SearchDevFeed $results | Should -BeLike "*DevRelease*" } It "DevPre versions of packages are displayed when ShowPreVersions is provided" { $results = Get-PackageVersionsFromAlkamiProget -packageNames $samplePackageNames -ShowPreVersions $results | Should -BeLike "*DevPre*" } It "QaRelease versions of packages are displayed when SearchQaFeed is provided" { $results = Get-PackageVersionsFromAlkamiProget -packageNames $samplePackageNames -SearchQaFeed $results | Should -BeLike "*QaRelease*" } It "DevRelease, DevPre, and QaRelease versions are displayed when SearchDevFeed, ShowPreVersions, and SearchQaFeed are provided" { $results = Get-PackageVersionsFromAlkamiProget -packageNames $samplePackageNames -SearchQaFeed -ShowPreVersions -SearchDevFeed $results | Should -BeLike "*QaRelease*" $results | Should -BeLike "*DevPre*" $results | Should -BeLike "*DevRelease*" } It "DevRelease versions are not displayed when SearchDevFeed is not passed, and SearchQaFeed or ShowPreVersions is passed" { $results = Get-PackageVersionsFromAlkamiProget -packageNames $samplePackageNames -SearchQaFeed -ShowPreVersions $results | Should -Not -BeLike "*DevRelease*" } It "QaRelease versions are not displayed when the SearchQaFeed parameter is not provided" { $results = Get-PackageVersionsFromAlkamiProget -packageNames $samplePackageNames -SearchDevFeed -ShowPreVersions $results | Should -Not -BeLike "*QaRelease*" } It "DevPre versions are not displayed when the SearchDevFeed parameter is not provided" { $results = Get-PackageVersionsFromAlkamiProget -packageNames $samplePackageNames -SearchDevFeed -SearchQaFeed $results | Should -Not -BeLike "*DevPre*" } It "Returns an empty JSON string and warns the user if no results are found" { Mock Get-ChocoState -ModuleName $moduleForMock { $results = $NULL return $results } Mock Write-Warning -ModuleName $moduleForMock { } $results = Get-PackageVersionsFromAlkamiProget -packageNames "doesntexist" $emptyHashToJson = @{} | ConvertTo-Json $results | Should -BeExactly $emptyHashToJson Assert-MockCalled -CommandName Write-Warning -ModuleName $moduleForMock -Scope It -Exactly 1 } It "Hash duplicate checks make function return only one instance of a package when the package is found by get-chocostate multiple times" { Mock Get-ChocoState -ModuleName $moduleForMock { $results = @(@{ Feed = $NULL; IsService = $NULL; Version = "1.0.1-pre000"; Tags = $NULL; Name = "Alkami.Test" }) return $results } Mock Write-Verbose -ModuleName $moduleForMock { } $results = Get-PackageVersionsFromAlkamiProget -packageNames "testIterationOne,testIterationTwo" -SearchDevFeed -SearchQaFeed -ShowPreVersions -Verbose Assert-MockCalled -CommandName Write-Verbose -ModuleName $moduleForMock -Scope It -ParameterFilter {$Message -like "*Results already contain a DevRelease entry*"} Assert-MockCalled -CommandName Write-Verbose -ModuleName $moduleForMock -Scope It -ParameterFilter {$Message -like "*Results already contain a DevPre entry*"} Assert-MockCalled -CommandName Write-Verbose -ModuleName $moduleForMock -Scope It -ParameterFilter {$Message -like "*Results already contain a QaRelease entry*"} $convertedResults = $results | ConvertFrom-Json $convertedResults.'Alkami.Test'.DevRelease | Should -Be "1.0.1-pre000" $convertedResultsCount = ($convertedResults | Get-Member -Type NoteProperty).count $convertedResultsCount | Should -Be 1 } } }