tests/TMD.Credentials.Tests.ps1

BeforeAll {
# Define some variable to be used in all of the tests
[String]$CredentialPath = $ENV:HOMEDRIVE + $env:HOMEPATH + '\TMD_Files\Credentials'
[String]$CredentialName = 'TestCredential'
[SecureString]$SecurePassword = ConvertTo-SecureString 'TestPassword' -AsPlainText -Force
[PsCredential]$Credential = [System.Management.Automation.PSCredential]::new('TestUserName', $SecurePassword)

    # Import the module file
    if (Get-Module 'TMD.Common') {
        Remove-Module 'TMD.Common' -Force
    }
    Import-Module "TMD.Common" -Force
}

Describe 'Add-StoredCredential' {
    BeforeAll {
        # Run the function before all of the tests
        Add-StoredCredential -Name $CredentialName -Credential $Credential
    }

    It 'Credential is created and named properly' {
        Join-Path $CredentialPath ($CredentialName + '.credential') | Should -Exist
    }

    It 'File contains proper data' {
        $CredPath = Join-Path $CredentialPath ($CredentialName + '.credential')
        $ImportedCred = Import-Clixml -Path $CredPath
        $ImportedCred.UserName | Should -Be $Credential.UserName
        $ImportedCred | Should -BeOfType System.Management.Automation.PSCredential
    }

    It 'Error is thrown when no credentials are supplied' {
        $Global:TmdRunningAction = $true
        { Add-StoredCredential -Name $CredentialName -ErrorAction Stop} | Should -Throw
        $Global:TmdRunningAction = $false
    }

    # TODO: Add pipeline tests
    
    AfterAll {
        $CredFile = Join-Path $CredentialPath ($CredentialName + '.credential')
        if (Test-Path -Path $CredFile) {
            Remove-Item $CredFile -Force
        }
    }
}

Describe 'Remove-StoredCredential' {
    BeforeEach {
        # Create a credential before each of the tests
        Add-StoredCredential -Name $CredentialName -Credential $Credential
    }
    
    It 'File is actually removed' {
        Remove-StoredCredential -Name $CredentialName
        Join-Path $CredentialPath ($CredentialName + '.credential') | Should -Not -Exist
    }
    
    It 'Error is thrown when Name is incorrect' {
        {Remove-StoredCredential -Name 'IncorrectCredentialName' -ErrorAction Stop} | Should -Throw
    }
    
    # TODO: Add pipeline tests
    AfterAll {
        Remove-Item (Join-Path $CredentialPath ($CredentialName + '.credential')) -Force
    }
}

Describe 'Get-StoredCredential' {
    BeforeAll {
        1..5 | ForEach-Object {
            Add-StoredCredential -Name $_ -Credential $Credential
        }
    }
    
    It 'Only one parameter set can be used' {
        {Get-StoredCredential -Name $CredentialName -List} | Should -Throw
    }

    Context "Without Params" {
        It 'List of objects is returned' {
            $Creds = Get-StoredCredential
            $Creds.GetType().BaseType.ToString() | Should -Be 'System.Array'
            $Creds | Should -BeOfType PSCustomObject
        }
    }
    
    Context 'Using -List' {
        It 'List of strings is returned' {
            $CredList = Get-StoredCredential -List
            $CredList.GetType().BaseType.ToString() | Should -Be 'System.Array'
            $CredList | Should -BeOfType String
        }
        
        It '1-5 are in the list' {
            $CredList = Get-StoredCredential -List
            1..5 | ForEach-Object {
                $CredList | Should -Contain $_
            }
        }
    }
    # TODO: Add pipeline tests
    
    Context 'Specifying Name' {
        BeforeAll {
            # Run the function before all of the tests
            Add-StoredCredential -Name $CredentialName -Credential $Credential
        }
    
        It 'PSCredential should be returned' {
            $Cred = Get-StoredCredential -Name $CredentialName
            $Cred | Should -BeOfType PSCredential
        }

        It 'No error if Name is incorrect' {
            $Cred = Get-StoredCredential -Name 'IncorrectCredentialName'
            $Cred | Should -BeNullOrEmpty
        }


    }
    
    AfterAll {
        1..5 | ForEach-Object {
            Remove-Item (Join-Path $CredentialPath "$_.credential") -Force
        }
    }
}