ps/Modules/Alkami.PowerShell.IIS/Public/Open-AlkamiSites.Tests.ps1
2023-05-30 22:51:22 -07:00

313 lines
9.7 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 -Tag 'Unit' 'Open-AlkamiSites' {
Context "Default Mocks" {
Mock -ModuleName $moduleForMock Get-IisSiteList -MockWith {
$adminBindings = @(
[PsCustomObject]
@{
host = "admin.fooSite.com"
protocol = "http"
},
[PsCustomObject]
@{
host = "admin.barSite.com"
protocol = "https"
})
$sites = @( [PsCustomObject]@{
Bindings = $adminBindings
State = "Started"
},
[PsCustomObject]@{
Bindings = $adminBindings
State = "Stopped"
}
)
return $sites;
} -ParameterFilter { $adminSitesOnly -and $adminSitesOnly -eq $true }
Mock -ModuleName $moduleForMock Get-IisSiteList -MockWith {
$adminBindings = @(
[PsCustomObject]
@{
host = "admin.fooSite.com"
protocol = "http"
},
[PsCustomObject]
@{
host = "admin.barSite.com"
protocol = "https"
})
$bindings = @(
[PsCustomObject]
@{
host = "www.fooSite.com"
protocol = "http"
},
[PsCustomObject]
@{
host = "www.barSite.com"
protocol = "https"
})
$sites = @( [PsCustomObject]@{
Bindings = $adminBindings
State = "Started"
},
[PsCustomObject]@{
Bindings = $bindings
State = "Started"
},
[PsCustomObject]@{
Bindings = $adminBindings
State = "Stopped"
},
[PsCustomObject]@{
Bindings = $bindings
State = "Stopped"
}
)
return $sites;
}
Mock -ModuleName $moduleForMock Open-UrlInDefaultBrowser -MockWith { return $null }
it "should open sites" {
$openedSites = Open-AlkamiSites -adminSitesOnly -returnSites
Assert-MockCalled -ModuleName $moduleForMock Open-UrlInDefaultBrowser
$openedSites.Count | should -BeGreaterThan 0
}
it "should get random sites when Random == true" {
Mock -ModuleName $moduleForMock Get-Random -MockWith { return $null }
Open-AlkamiSites -Random
Assert-MockCalled -ModuleName $moduleForMock Get-Random
}
it "should only open https sites" {
$openedSites = Open-AlkamiSites -adminSitesOnly -returnSites
Assert-MockCalled -ModuleName $moduleForMock Open-UrlInDefaultBrowser
$openedSites.Count | should -BeGreaterThan 0
foreach ($site in $openedSites) {
$site.protocol | should -Be "https"
}
}
it "should only open Admin Sites when AdminOnly == true" {
$openedSites = Open-AlkamiSites -adminSitesOnly -returnSites
Assert-MockCalled -ModuleName $moduleForMock Open-UrlInDefaultBrowser
$openedSites.Count | should -BeGreaterThan 0
foreach ($site in $openedSites) {
$site.host | should -Match "admin"
}
}
it "should open all sites when AdminOnly == false" {
$openedSites = Open-AlkamiSites -returnSites
Assert-MockCalled -ModuleName $moduleForMock Open-UrlInDefaultBrowser
$countNonAdminSites = 0
foreach ($site in $openedSites) {
if ($site.host -match "www") {
$countNonAdminSites++
}
}
$countNonAdminSites | should -BeGreaterThan 0
}
it "should not return sites without the returnSites switch set" {
$openedSites = Open-AlkamiSites
Assert-MockCalled -ModuleName $moduleForMock Open-UrlInDefaultBrowser
$openedSites | should -BeNullOrEmpty
}
}
Context "Custom Mocks" {
Mock -ModuleName $moduleForMock Open-UrlInDefaultBrowser -MockWith { return $null }
it "should not open sites if none exist" {
Mock -ModuleName $moduleForMock Get-IisSiteList -MockWith { return $null }
$openedSites = Open-AlkamiSites -returnSites
$openedSites.Count | should -Be 0
}
it "should not open sites if no https sites exist" {
Mock -ModuleName $moduleForMock Get-IisSiteList -MockWith {
$adminBindings = @(
[PsCustomObject]
@{
host = "admin.fooSite.com"
protocol = "http"
})
$bindings = @(
[PsCustomObject]
@{
host = "www.fooSite.com"
protocol = "http"
})
$sites = @( [PsCustomObject]@{
Bindings = $adminBindings
State = "Started"
},
[PsCustomObject]@{
Bindings = $bindings
State = "Started"
},
[PsCustomObject]@{
Bindings = $adminBindings
State = "Stopped"
},
[PsCustomObject]@{
Bindings = $bindings
State = "Stopped"
}
)
return $sites;
}
$openedSites = Open-AlkamiSites -returnSites
$openedSites.Count | should -Be 0
}
it "should only open sites which match the filter when it's provided" {
Mock -ModuleName $moduleForMock Get-IisSiteList -MockWith {
$adminBindings = @(
[PsCustomObject]
@{
host = "admin.fooSite.com"
protocol = "https"
},
[PsCustomObject]
@{
host = "admin.barSite.com"
protocol = "https"
})
$bindings = @(
[PsCustomObject]
@{
host = "www.fooSite.com"
protocol = "https"
},
[PsCustomObject]
@{
host = "www.barSite.com"
protocol = "https"
})
$sites = @( [PsCustomObject]@{
Bindings = $adminBindings
State = "Started"
},
[PsCustomObject]@{
Bindings = $bindings
State = "Started"
},
[PsCustomObject]@{
Bindings = $adminBindings
State = "Stopped"
},
[PsCustomObject]@{
Bindings = $bindings
State = "Stopped"
}
)
return $sites;
}
$openedSites = Open-AlkamiSites -filter "foo" -returnSites
Assert-MockCalled -ModuleName $moduleForMock Open-UrlInDefaultBrowser
$openedSites.Count | should -BeGreaterThan 0
foreach ($site in $openedSites) {
Write-Host $site.host
$site.host | should -Not -Match "bar"
}
}
it "should only open Started sites" {
Mock -ModuleName $moduleForMock Get-IisSiteList -MockWith {
$startedBindings = @(
[PsCustomObject]
@{
host = "www.startedSite.com"
protocol = "https"
}
)
$stoppedBindings = @(
[PsCustomObject]
@{
host = "www.stoppedSite.com"
protocol = "https"
}
)
$sites = @( [PsCustomObject]@{
Bindings = $startedBindings
State = "Started"
},
[PsCustomObject]@{
Bindings = $stoppedBindings
State = "Stopped"
}
)
return $sites;
}
$openedSites = Open-AlkamiSites -adminSitesOnly -returnSites
Assert-MockCalled -ModuleName $moduleForMock Open-UrlInDefaultBrowser
$openedSites.Count | should -BeGreaterThan 0
foreach ($site in $openedSites) {
Write-Host $site.host
Write-Host $site.State
$site.host | should -Match "started"
}
}
}
}