Tests/Unit/Private/Test-SCASession.Tests.ps1

Import-Module (Join-Path $PSScriptRoot '../../../psSCA.psd1') -Force

Describe 'Test-SCASession' {
    InModuleScope psSCA {
        BeforeEach {
            $script:SCASessions = [ordered]@{}
            $script:SCACurrentSessionName = $null
        }

        It 'throws when there is no active session and none is specified' {
            { Test-SCASession -Session $null } | Should -Throw '*No active psSCA session*'
        }

        It 'throws when -Session is a type it does not recognize' {
            { Test-SCASession -Session 42 } | Should -Throw '*must be a psSCA.Session object, a session name, or omitted*'
        }

        It 'throws when a named session does not exist' {
            { Test-SCASession -Session 'DoesNotExist' } | Should -Throw "*No psSCA session named 'DoesNotExist'*"
        }

        It 'resolves the current default session when -Session is omitted' {
            $session = [pscustomobject]@{
                PSTypeName = 'psSCA.Session'
                Name       = 'Default'
                ExpiresAt  = [DateTime]::UtcNow.AddMinutes(10)
            }
            $script:SCASessions['Default'] = $session
            $script:SCACurrentSessionName = 'Default'

            $resolved = Test-SCASession -Session $null
            $resolved.Name | Should -Be 'Default'
        }

        It 'resolves a session passed by name' {
            $session = [pscustomobject]@{
                PSTypeName = 'psSCA.Session'
                Name       = 'Secondary'
                ExpiresAt  = [DateTime]::UtcNow.AddMinutes(10)
            }
            $script:SCASessions['Secondary'] = $session

            $resolved = Test-SCASession -Session 'Secondary'
            $resolved.Name | Should -Be 'Secondary'
        }

        It 'passes through a session object unchanged' {
            $session = [pscustomobject]@{
                PSTypeName = 'psSCA.Session'
                Name       = 'PipedIn'
                ExpiresAt  = [DateTime]::UtcNow.AddMinutes(10)
            }

            $resolved = Test-SCASession -Session $session
            $resolved.Name | Should -Be 'PipedIn'
        }

        It 'throws when the resolved session has expired' {
            $session = [pscustomobject]@{
                PSTypeName = 'psSCA.Session'
                Name       = 'Expired'
                ExpiresAt  = [DateTime]::UtcNow.AddMinutes(-1)
            }

            { Test-SCASession -Session $session } | Should -Throw '*expired*'
        }
    }
}