Public/Tests/JSMServiceDesk.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.jira.psd1') -Force
    Set-JiraContext -JiraUrl 'https://contoso.atlassian.net' -Username 'user@contoso.com' -PersonalAccessToken 'tok-SECRET-123'
    $Base = 'https://contoso.atlassian.net'
}

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

Describe 'Get-JSMRequestTransition' {
    It 'Returns the transitions of every page' {
        Mock -ModuleName tcs.jira Invoke-RestMethod {
            if ($Uri -match 'start=1') {
                [pscustomobject]@{ isLastPage = $true; values = @([pscustomobject]@{ id = '2'; name = 'Done' }) }
            }
            else {
                [pscustomobject]@{ isLastPage = $false; values = @([pscustomobject]@{ id = '1'; name = 'Cancel' }); _links = [pscustomobject]@{ next = 'https://contoso.atlassian.net/rest/servicedeskapi/request/SD-1/transition?start=1' } }
            }
        }
        $transitions = @(Get-JSMRequestTransition -IssueKey 'SD-1')
        ($transitions | ForEach-Object name) -join ',' | Should -Be 'Cancel,Done'
        Should -Invoke Invoke-RestMethod -ModuleName tcs.jira -Times 1 -Exactly -ParameterFilter { $Uri -eq "$Base/rest/servicedeskapi/request/SD-1/transition" }
    }
}

Describe 'Get-JSMServiceDesk' {
    BeforeEach {
        Mock -ModuleName tcs.jira Invoke-RestMethod {
            if ($Uri -like '*/servicedesk/4') {
                [pscustomobject]@{ id = '4'; projectKey = 'SD' }
            }
            else {
                [pscustomobject]@{ isLastPage = $true; values = @([pscustomobject]@{ id = '4'; projectKey = 'SD' }, [pscustomobject]@{ id = '5'; projectKey = 'HR' }) }
            }
        }
    }

    It 'Lists service desks' {
        $desks = @(Get-JSMServiceDesk)
        ($desks | ForEach-Object projectKey) -join ',' | Should -Be 'SD,HR'
        Should -Invoke Invoke-RestMethod -ModuleName tcs.jira -Times 1 -Exactly -ParameterFilter { $Uri -eq "$Base/rest/servicedeskapi/servicedesk" }
    }

    It 'Gets one service desk and validates the id' {
        (Get-JSMServiceDesk -ServiceDeskId '4').projectKey | Should -Be 'SD'
        { Get-JSMServiceDesk -ServiceDeskId '4/../x' } | Should -Throw
    }
}

Describe 'Get-JSMRequestType' {
    BeforeEach {
        Mock -ModuleName tcs.jira Invoke-RestMethod { [pscustomobject]@{ isLastPage = $true; values = @([pscustomobject]@{ id = '10'; name = 'Get IT help' }) } }
    }

    It 'Lists the request types of a service desk' {
        (@(Get-JSMRequestType -ServiceDeskId '4'))[0].name | Should -Be 'Get IT help'
        Should -Invoke Invoke-RestMethod -ModuleName tcs.jira -Times 1 -Exactly -ParameterFilter { $Uri -eq "$Base/rest/servicedeskapi/servicedesk/4/requesttype" }
    }

    It 'Gets one request type' {
        Mock -ModuleName tcs.jira Invoke-RestMethod { [pscustomobject]@{ id = '10'; name = 'Get IT help' } }
        (Get-JSMRequestType -ServiceDeskId '4' -RequestTypeId '10').id | Should -Be '10'
        Should -Invoke Invoke-RestMethod -ModuleName tcs.jira -Times 1 -Exactly -ParameterFilter { $Uri -eq "$Base/rest/servicedeskapi/servicedesk/4/requesttype/10" }
    }

    It 'Takes the service desk id from Get-JSMServiceDesk output' {
        $null = [pscustomobject]@{ id = '5'; projectKey = 'HR' } | Get-JSMRequestType
        Should -Invoke Invoke-RestMethod -ModuleName tcs.jira -Times 1 -Exactly -ParameterFilter { $Uri -eq "$Base/rest/servicedeskapi/servicedesk/5/requesttype" }
    }

    It 'Rejects ids that could change the request path' {
        { Get-JSMRequestType -ServiceDeskId '4?x' } | Should -Throw
        { Get-JSMRequestType -ServiceDeskId '4' -RequestTypeId '../1' } | Should -Throw
    }
}