Public/Tests/Set-ConfluenceContext.Tests.ps1

BeforeAll {
    $env:TCS_CONFIG_ROOT = Join-Path -Path $TestDrive -ChildPath 'config'
    $env:TCS_SKIP_UPDATE_CHECK = '1'
    $env:TCS_TELEMETRY_OPTOUT = '1'
    $ModuleRoot = Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent
    Import-Module -Name (Join-Path -Path $ModuleRoot -ChildPath 'tcs.confluence.psd1') -Force
}

AfterAll {
    Remove-Module -Name tcs.confluence -Force -ErrorAction SilentlyContinue
}


Describe 'Set-ConfluenceContext and Get-ConfluenceContext' {
    BeforeEach {
        Import-Module -Name (Join-Path -Path $ModuleRoot -ChildPath 'tcs.confluence.psd1') -Force
    }

    It 'Returns nothing before a context is set' {
        Get-ConfluenceContext | Should -BeNullOrEmpty
    }

    It 'Normalises <Url> to <Base> and derives the <Version> endpoint' -ForEach @(
        @{ Url = 'https://contoso.atlassian.net'; Version = 'v2'; Base = 'https://contoso.atlassian.net'; Endpoint = 'https://contoso.atlassian.net/wiki/api/v2' }
        @{ Url = 'https://contoso.atlassian.net/wiki/'; Version = 'v2'; Base = 'https://contoso.atlassian.net'; Endpoint = 'https://contoso.atlassian.net/wiki/api/v2' }
        @{ Url = 'https://contoso.atlassian.net/wiki/rest/api'; Version = 'v1'; Base = 'https://contoso.atlassian.net'; Endpoint = 'https://contoso.atlassian.net/wiki/rest/api' }
        @{ Url = ' https://contoso.atlassian.net/wiki/api/v2/ '; Version = 'v1'; Base = 'https://contoso.atlassian.net'; Endpoint = 'https://contoso.atlassian.net/wiki/rest/api' }
    ) {
        Set-ConfluenceContext -ConfluenceUrl $Url.Trim() -Username 'user@contoso.com' -PersonalAccessToken 'token' -ApiVersion $Version
        $context = Get-ConfluenceContext
        $context.ConnectionBaseURL | Should -Be $Base
        $context.ConnectionURI | Should -Be $Endpoint
        $context.ApiVersion | Should -Be $Version
        $context.Username | Should -Be 'user@contoso.com'
        $context.HasCredential | Should -BeTrue
    }

    It 'Accepts a PSCredential' {
        $secure = New-Object -TypeName System.Security.SecureString
        'cred-token'.ToCharArray() | ForEach-Object { $secure.AppendChar($_) }
        $credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList 'cred@contoso.com', $secure
        Set-ConfluenceContext -ConfluenceUrl 'https://contoso.atlassian.net' -Credential $credential
        (Get-ConfluenceContext).Username | Should -Be 'cred@contoso.com'
        InModuleScope tcs.confluence { (Get-ConfluenceAuthHeader).Authorization } |
            Should -Be ('Basic ' + [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes('cred@contoso.com:cred-token')))
    }

    It 'Never exposes the token' {
        Set-ConfluenceContext -ConfluenceUrl 'https://contoso.atlassian.net' -Username 'user@contoso.com' -PersonalAccessToken 'super-secret-token' -Verbose 4>&1 |
            ForEach-Object { "$_" } | Should -Not -Match 'super-secret-token'
        (Get-ConfluenceContext | ConvertTo-Json) | Should -Not -Match 'super-secret-token'
        Get-Variable -Name ConfluenceContext -Scope Global -ErrorAction SilentlyContinue | Should -BeNullOrEmpty
        InModuleScope tcs.confluence { $script:ConfluenceCredential.Password } | Should -BeOfType [System.Security.SecureString]
    }

    It 'Rejects non-https URLs' {
        { Set-ConfluenceContext -ConfluenceUrl 'http://contoso.atlassian.net' -Username 'u' -PersonalAccessToken 't' } | Should -Throw
    }

    It 'Changes nothing with -WhatIf' {
        Set-ConfluenceContext -ConfluenceUrl 'https://contoso.atlassian.net' -Username 'u' -PersonalAccessToken 't' -WhatIf
        Get-ConfluenceContext | Should -BeNullOrEmpty
    }
}