Describe "SecureString conversion tests" -Tags "CI" {
    BeforeAll {
        $string = "ABCD"
        $secureString = [System.Security.SecureString]::New()
        $string.ToCharArray() | foreach-object { $securestring.AppendChar($_) }
        $defaultParamValues = $PSdefaultParameterValues.Clone()
        $PSdefaultParameterValues = @{}
        if ( ! $IsWindows ) { $PSdefaultParameterValues["it:pending"] = $true }
    }
    AfterAll {
        $PSdefaultParameterValues = $defaultParamValues
    }

    It "using null arguments to ConvertFrom-SecureString produces an exception" {
        try {
            ConvertFrom-SecureString -secureString $null -key $null
            throw "No Exception!"
        }
        catch {
            $_.FullyQualifiedErrorId | should be "ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.ConvertFromSecureStringCommand"
        }

    }

    It "using a bad key produces an exception" {
        try {
            $badkey = [byte[]]@(1,2)
            ConvertFrom-SecureString -securestring $secureString -key $badkey
            throw "Command did not throw exception"
        }
        catch {
            $_.FullyQualifiedErrorId | should be "Argument,Microsoft.PowerShell.Commands.ConvertFromSecureStringCommand"
        }
    }

    It "Can convert to a secure string" {
        $ss = ConvertTo-SecureString -AsPlainText -Force abcd
        $ss | Should BeOfType SecureString
    }
    It "can convert back from a secure string" {
        $secret = "abcd"
        $ss1 = ConvertTo-SecureString -AsPlainText -Force $secret
        $ss2 = convertfrom-securestring $ss1 | convertto-securestring
        [pscredential]::New("user",$ss2).GetNetworkCredential().Password | should be $secret
    }
}
