diff --git a/functions/Get-JobStatus.ps1 b/functions/Get-JobStatus.ps1 index 4f0c630..3bfd288 100644 --- a/functions/Get-JobStatus.ps1 +++ b/functions/Get-JobStatus.ps1 @@ -18,6 +18,8 @@ function Get-JobStatus { $Context = $null ) + Assert-IsAgent -Context $Context + $key = 'job_statuses' if ($PSBoundParameters.ContainsKey('Id')) { diff --git a/tests/Routes-JobStatuses.tests.ps1 b/tests/Routes-JobStatuses.tests.ps1 new file mode 100644 index 0000000..64942ab --- /dev/null +++ b/tests/Routes-JobStatuses.tests.ps1 @@ -0,0 +1,117 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingConvertToSecureStringWithPlainText', '')] +Param() + +Import-Module "$PSScriptRoot/../PwshZendesk.psm1" -Force + +Describe 'Job Status Routes' { + + InModuleScope PwshZendesk { + + $IsInteractive = [Environment]::GetCommandLineArgs() -join ' ' -notmatch '-NonI' + + $context = @{ + Organization = 'company' + BaseUrl = 'https://company.testdesk.com' + Credential = [System.Management.Automation.PSCredential]::New('email', ('api-key' | ConvertTo-SecureString -AsPlainText -Force)) + User = [PSCustomObject]@{ role = '' } + } + $context | Add-Member -TypeName 'ZendeskContext' + + Mock -ModuleName PwshZendesk Invoke-RestMethod { [PSCustomObject]@{ job_status = $null; job_statuses = $null } } + + Context 'List Job Statuses' { + It 'Matches the endpoint' { + if ($IsInteractive) { + throw 'Please run test in non-interactive mode' + } + + $context.User.role = 'admin' + + { Get-JobStatus -Context $context } | Should -Not -Throw + Assert-MockCalled Invoke-RestMethod -Exactly 1 -ParameterFilter { $Method -eq 'Get' -and $Uri -match '/api/v2/job_statuses.json' } -Scope It + } + + It 'Does not allow end users to call' { + $context.User.role = 'end-user' + + { Get-JobStatus -Context $context } | Should -Throw 'Authenticated user must have role' + } + + It 'Allows agents to call' { + $context.User.role = 'agent' + + { Get-JobStatus -Context $context } | Should -Not -Throw + } + + It 'Allows admins to call' { + $context.User.role = 'admin' + + { Get-JobStatus -Context $context } | Should -Not -Throw + } + } + + Context 'Show Job Status' { + It 'Matches the endpoint' { + if ($IsInteractive) { + throw 'Please run test in non-interactive mode' + } + + $context.User.role = 'admin' + + { Get-JobStatus -Context $context -Id 1 } | Should -Not -Throw + Assert-MockCalled Invoke-RestMethod -Exactly 1 -ParameterFilter { $Method -eq 'Get' -and $Uri -match '/api/v2/job_statuses/\d+\.json' } -Scope It + } + + It 'Does not allow end users to call' { + $context.User.role = 'end-user' + + { Get-JobStatus -Context $context -Id 1 } | Should -Throw 'Authenticated user must have role' + } + + It 'Allows agents to call' { + $context.User.role = 'agent' + + { Get-JobStatus -Context $context -Id 1 } | Should -Not -Throw + } + + It 'Allows admins to call' { + $context.User.role = 'admin' + + { Get-JobStatus -Context $context -Id 1 } | Should -Not -Throw + } + } + + Context 'Show Many Job Statuses' { + It 'Matches the endpoint' { + if ($IsInteractive) { + throw 'Please run test in non-interactive mode' + } + + $context.User.role = 'admin' + + { Get-JobStatus -Context $context -Id @(1..5) } | Should -Not -Throw + Assert-MockCalled Invoke-RestMethod -Exactly 1 -ParameterFilter { $Method -eq 'Get' -and $Uri -match '/api/v2/job_statuses/show_many\.json\?ids=' } -Scope It + } + + It 'Does not allow end users to call' { + $context.User.role = 'end-user' + + { Get-JobStatus -Context $context -Id @(1..5) } | Should -Throw 'Authenticated user must have role' + } + + It 'Allows agents to call' { + $context.User.role = 'agent' + + { Get-JobStatus -Context $context -Id @(1..5) } | Should -Not -Throw + } + + It 'Allows admins to call' { + $context.User.role = 'admin' + + { Get-JobStatus -Context $context -Id @(1..5) } | Should -Not -Throw + } + } + + } + +}