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