Public/Unpublish-Space.Tests.ps1

Set-StrictMode -Version Latest

BeforeAll {
    . "$PSScriptRoot\Unpublish-Space.ps1"
    . "$PSScriptRoot\Get-Space.ps1"
    . "$PSScriptRoot\Remove-AllServiceBindings.ps1"
    . "$PSScriptRoot\Remove-Service.ps1"
    . "$PSScriptRoot\Get-ServiceInstance.ps1"
    . "$PSScriptRoot\Wait-ServiceOperations.ps1"
    . "$PSScriptRoot\Wait-RemoveSpace.ps1"
}
Describe "UnPublish-Space" {
    BeforeAll {
        [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignment', '', Justification='pester supported')]
        $TargetOrg = [PSCustomObject]@{name="myorg"}
        [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignment', '', Justification='pester supported')]
        $TargetSpace = [PSCustomObject]@{}
        $TargetUserServices = @()
        $TargetService = [PSCustomObject]@{name="service1"}
        $TargetServices = @($TargetService)
        $TargetDeveloperRoles = @([PSCustomObject]@{})
        $TargetManagerRoles = @([PSCustomObject]@{})
        $TargetAuditorRoles = @([PSCustomObject]@{})
        [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignment', '', Justification='pester supported')]
        $TargetServiceInstance = [PSCustomObject]@{guid="1"}
        [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignment', '', Justification='pester supported')]
        $TargetDefinition = [PSCustomObject]@{
            name="myspace"
            services=$TargetServices
            userservices=$TargetUserServices
            roles=@{
                developers=$TargetDeveloperRoles
                managers=$TargetManagerRoles
                auditors=$TargetAuditorRoles
            }
        }
        Mock Remove-AllServiceBindings
        Mock Remove-Service
        Mock Wait-ServiceOperations
        Mock Wait-RemoveSpace
        Mock Get-ServiceInstance
    }
    Context "calls dependenct cmdlets" {
        It "skips when space does not exist" {
            Mock Get-Space
            UnPublish-Space -Org $TargetOrg -Definition $TargetDefinition
            Should -Invoke Get-Space -ParameterFilter { $Name -eq $TargetDefinition.name }
        }
        It "removes all service bindings" {
            Mock Get-Space { $TargetSpace }
            Mock Remove-AllServiceBindings
            Mock Get-ServiceInstance { $TargetServiceInstance }
            Mock Remove-Service
            UnPublish-Space -Org $TargetOrg -Definition $TargetDefinition
            Should -Invoke Get-Space -ParameterFilter { $Name -eq $TargetDefinition.name }
            Should -Invoke Remove-AllServiceBindings -ParameterFilter { $Space -eq $TargetSpace }
            Should -Invoke Get-ServiceInstance -ParameterFilter {$Space -eq $TargetSpace }
            Should -Invoke Remove-Service -ParameterFilter { $Guid -eq $TargetServiceInstance.guid }
        }
        It "waits on all service operations" {
            Mock Get-Space { $TargetSpace }
            Mock Remove-AllServiceBindings
            Mock Get-ServiceInstance { $TargetServiceInstance }
            Mock Remove-Service
            Mock Wait-ServiceOperations
            UnPublish-Space -Org $TargetOrg -Definition $TargetDefinition
            Should -Invoke Get-Space -ParameterFilter { $Name -eq $TargetDefinition.name }
            Should -Invoke Remove-AllServiceBindings -ParameterFilter { $Space -eq $TargetSpace }
            Should -Invoke Get-ServiceInstance -ParameterFilter {$Space -eq $TargetSpace }
            Should -Invoke Remove-Service -ParameterFilter { $Guid -eq $TargetServiceInstance.guid }
            Should -Invoke Wait-ServiceOperations -ParameterFilter { $Space -eq $TargetSpace -and $Timeout -eq 60 }
        }
        It "waits on space removal" {
            Mock Get-Space { $TargetSpace }
            Mock Remove-AllServiceBindings
            Mock Get-ServiceInstance { $TargetServiceInstance }
            Mock Remove-Service
            Mock Wait-RemoveSpace
            UnPublish-Space -Org $TargetOrg -Definition $TargetDefinition
            Should -Invoke Get-Space -ParameterFilter { $Name -eq $TargetDefinition.name }
            Should -Invoke Remove-AllServiceBindings -ParameterFilter { $Space -eq $TargetSpace }
            Should -Invoke Get-ServiceInstance -ParameterFilter {$Space -eq $TargetSpace }
            Should -Invoke Remove-Service -ParameterFilter { $Guid -eq $TargetServiceInstance.guid }
            Should -Invoke Wait-RemoveSpace -ParameterFilter { $Space -eq $TargetSpace -and $Timeout -eq 60 }
        }
    }
    Context "parameters" {
        It "ensures 'Org' is not null" {
            { Unpublish-Space -Org $null -Definition $TargetDefinition } | Should -Throw "*Cannot validate argument on parameter 'Org'. The argument is null or empty*"
        }
        It "ensures 'Definition' is not null" {
            { Unpublish-Space -Org $TargetOrg  -Definition $null } | Should -Throw "*Cannot validate argument on parameter 'Definition'. The argument is null or empty*"
        }
        It "supports positional" {
            { Unpublish-Space $TargetOrg $TargetDefinition 30 }
        }
        It "supports 'Org' from pipeline" {
            { $TargetOrg | Unpublish-Space -Definition $TargetDefinition }
        }
    }
}