Tests/Unit/Public/Policies.Tests.ps1

BeforeAll {
    $moduleRoot = (Resolve-Path (Join-Path $PSScriptRoot '../../..')).Path
    Import-Module (Join-Path $moduleRoot 'psSIA.psd1') -Force
}

Describe 'Get-SIAPolicy' {
    It 'routes to the Uap service' {
        InModuleScope psSIA {
            Mock Invoke-SIARequest {
                param($Path, $Service)
                $Path | Should -Be '/policies'
                $Service | Should -Be 'Uap'
                @()
            }

            Get-SIAPolicy | Out-Null
        }
    }

    It 'requests a single policy by ID' {
        InModuleScope psSIA {
            Mock Invoke-SIARequest {
                param($Path)
                $Path | Should -Be '/policies/policy-1'
                [pscustomobject]@{ id = 'policy-1' }
            }

            (Get-SIAPolicy -Id 'policy-1').id | Should -Be 'policy-1'
        }
    }
}

Describe 'Remove-SIAPolicy' {
    It 'calls DELETE against the Uap service' {
        InModuleScope psSIA {
            Mock Invoke-SIARequest {
                param($Method, $Path, $Service)
                $Method | Should -Be 'DELETE'
                $Path | Should -Be '/policies/policy-1'
                $Service | Should -Be 'Uap'
            }

            Remove-SIAPolicy -Id 'policy-1' -Confirm:$false
        }
    }
}

Describe 'Get-SIAAccessPolicy (legacy)' {
    It 'calls the legacy Dpa-hosted endpoint, not Uap' {
        InModuleScope psSIA {
            Mock Invoke-SIARequest {
                param($Path)
                $Path | Should -Be '/api/access-policies'
                @()
            }

            Get-SIAAccessPolicy | Out-Null
        }
    }
}

Describe 'Test-SIAPolicy' {
    It 'calls the validate endpoint with the supplied body' {
        InModuleScope psSIA {
            Mock Invoke-SIARequest {
                param($Path, $Body)
                $Path | Should -Be '/policies/policy-1/validate'
                $Body.name | Should -Be 'test-policy'
            }

            Test-SIAPolicy -Id 'policy-1' -Body @{ name = 'test-policy' }
        }
    }
}

Describe 'New-SIAPolicy and Set-SIAPolicy' {
    It 'New-SIAPolicy posts to /policies on the Uap service' {
        InModuleScope psSIA {
            Mock Invoke-SIARequest {
                param($Method, $Path, $Service)
                $Method | Should -Be 'POST'
                $Path | Should -Be '/policies'
                $Service | Should -Be 'Uap'
            }

            New-SIAPolicy -Body @{ name = 'test-policy' } -Confirm:$false
        }
    }

    It 'Set-SIAPolicy puts to /policies/{id} on the Uap service' {
        InModuleScope psSIA {
            Mock Invoke-SIARequest {
                param($Method, $Path, $Service)
                $Method | Should -Be 'PUT'
                $Path | Should -Be '/policies/policy-1'
                $Service | Should -Be 'Uap'
            }

            Set-SIAPolicy -Id 'policy-1' -Body @{ name = 'test-policy' } -Confirm:$false
        }
    }
}

Describe 'Legacy access policy write cmdlets' {
    It 'New-SIAAccessPolicy posts policyName, the VM policyType constant, and status' {
        InModuleScope psSIA {
            Mock Invoke-SIARequest {
                param($Method, $Path, $Body)
                $Method | Should -Be 'POST'
                $Path | Should -Be '/api/access-policies'
                $Body.policyName | Should -Be 'legacy-policy'
                $Body.policyType | Should -Be 'VM'
                $Body.status | Should -Be 'Draft'
            }

            New-SIAAccessPolicy -PolicyName 'legacy-policy' -Confirm:$false
        }
    }

    It 'New-SIAAccessPolicy accepts an explicit Status' {
        InModuleScope psSIA {
            Mock Invoke-SIARequest { param($Body) $Body.status | Should -Be 'Enabled' }
            New-SIAAccessPolicy -PolicyName 'legacy-policy' -Status Enabled -Confirm:$false
        }
    }

    It 'Set-SIAAccessPolicy only includes supplied fields' {
        InModuleScope psSIA {
            Mock Invoke-SIARequest {
                param($Method, $Path, $Body)
                $Method | Should -Be 'PUT'
                $Path | Should -Be '/api/access-policies/policy-1'
                $Body.status | Should -Be 'Disabled'
                $Body.Keys | Should -Not -Contain 'policyName'
            }

            Set-SIAAccessPolicy -Id 'policy-1' -Status Disabled -Confirm:$false
        }
    }

    It 'Remove-SIAAccessPolicy deletes /api/access-policies/{id}' {
        InModuleScope psSIA {
            Mock Invoke-SIARequest {
                param($Method, $Path)
                $Method | Should -Be 'DELETE'
                $Path | Should -Be '/api/access-policies/policy-1'
            }

            Remove-SIAAccessPolicy -Id 'policy-1' -Confirm:$false
        }
    }

    It 'does not call the API under -WhatIf' {
        InModuleScope psSIA {
            Mock Invoke-SIARequest {}
            Remove-SIAAccessPolicy -Id 'policy-1' -WhatIf
            Should -Invoke Invoke-SIARequest -Times 0 -Exactly
        }
    }
}