test/PSCertUtils.Tests.ps1

$ModuleManifestName = 'PSCertUtils.psd1'
$ModuleManifestPath = "$PSScriptRoot\..\$ModuleManifestName"

Describe 'Module Manifest Tests' {
    It 'Passes Test-ModuleManifest' {
        Test-ModuleManifest -Path $ModuleManifestPath
        $? | Should Be $true
    }
}

Describe 'Testing Get-X509Certificate' {

  It 'Passes download from http' {
    $X509Certificate = Get-X509Certificate -CertificateUri "http://crt.sh/?d=9314791" -ValidationThumbprint "CABD2A79A1076A31F21D253635CB039D4329A5E8"
    $X509Certificate.X509Certificate.Thumbprint | Should Be "CABD2A79A1076A31F21D253635CB039D4329A5E8"
  }
  It 'Passes download from https' {
    $X509Certificate = Get-X509Certificate -CertificateUri "https://crt.sh/?d=9314791" -ValidationThumbprint "CABD2A79A1076A31F21D253635CB039D4329A5E8"
    $X509Certificate.X509Certificate.Thumbprint | Should Be "CABD2A79A1076A31F21D253635CB039D4329A5E8"
  }
  It 'Passes import from local file' {
    $CertificateFile = [System.IO.Path]::GetTempFileName()
    (New-Object System.Net.WebClient).DownloadString('https://crt.sh/?d=9314791') | Set-Content $CertificateFile
    $X509Certificate = Get-X509Certificate -CertificateUri "$CertificateFile" -ValidationThumbprint "CABD2A79A1076A31F21D253635CB039D4329A5E8"
    Remove-Item $CertificateFile
    $X509Certificate.X509Certificate.Thumbprint | Should Be "CABD2A79A1076A31F21D253635CB039D4329A5E8"
  }

  <#

  It 'Passes pfx download from https with password' {
    $SecPass = ConvertTo-SecureString -String "Demo" -AsPlainText -Force
    $X509Certificate = Get-X509Certificate -CertificateUri "http://dominic86.de/demo/demo.pfx" -ValidationThumbprint "B6BEEE5404ACC55CD732589164DBF4EEB8031B87" -CertificatePassword $SecPass
    $X509Certificate.X509Certificate.Thumbprint | Should Be "B6BEEE5404ACC55CD732589164DBF4EEB8031B87"
    $X509Certificate.X509Certificate.HasPrivateKey | Should Be $True
  }

  #>

}

<#

Describe 'Testing Export' {
  $SecPass = ConvertTo-SecureString -String "Demo" -AsPlainText -Force
  $X509DemoCertificate = Get-X509Certificate -CertificateUri "http://dominic86.de/demo/demo.pfx" -ValidationThumbprint "B6BEEE5404ACC55CD732589164DBF4EEB8031B87" -CertificatePassword $SecPass

  It 'Passes private key still existing after export and import as pfx' {
    $NewPass = ConvertTo-SecureString -String "Demo2" -AsPlainText -Force
    $CertificateFile = Export-X509CertificatePfx -X509Certificate $X509DemoCertificate -CertificatePassword $NewPass
    $ImportedX509Certificate = Get-X509Certificate -CertificateUri $CertificateFile -ValidationThumbprint "B6BEEE5404ACC55CD732589164DBF4EEB8031B87" -CertificatePassword $NewPass
    $ImportedX509Certificate.X509Certificate.Thumbprint | Should Be "B6BEEE5404ACC55CD732589164DBF4EEB8031B87"
    $ImportedX509Certificate.X509Certificate.HasPrivateKey | Should Be $True
  }

  It 'Passes private key still existing after export and import as pfx without password' {
    $CertificateFile = Export-X509CertificatePfx -X509Certificate $X509DemoCertificate
    $ImportedX509Certificate = Get-X509Certificate -CertificateUri $CertificateFile -ValidationThumbprint "B6BEEE5404ACC55CD732589164DBF4EEB8031B87"
    $ImportedX509Certificate.X509Certificate.Thumbprint | Should Be "B6BEEE5404ACC55CD732589164DBF4EEB8031B87"
    $ImportedX509Certificate.X509Certificate.HasPrivateKey | Should Be $True
  }

  It 'Passes export as base64 certificate' {
    $CertificateFile = Export-X509Certificate -X509Certificate $X509DemoCertificate
    Get-FileHash -Path $CertificateFile -Algorithm SHA256 | Select-Object -ExpandProperty Hash | Should Be '2A081A0E6B25FCC0DA97E78BA4D71F9CCD7D0751447A6351276FE7E1CD11C204'
  }
}

#>



Describe "Get-X509CommonNameFromSubject" {
    Context "subjects without common name" {
    It "Without a common name in '<Subject>', it returns an empty string" -TestCases @(
      @{ Subject = 'CN=, C=Demo Company, O=Demo Company' }
      @{ Subject = 'CN='}
      @{ Subject = 'C=Demo Company, O=Demo Company' }
      @{ Subject = '' }
    ) {
      param ($Subject)

      $CommonName = Get-X509CommonNameFromSubject -X509Subject $Subject
      $CommonName | Should -Be ""

    }
  }

  Context "subjects with common name" {
    It "Given valid subject '<Subject>', it returns '<Expected>'" -TestCases @(
      @{ Subject = 'CN=Demo, C=Demo Company, O=Demo Company'; Expected = 'Demo' }
      @{ Subject = 'C=Demo Company, O=Demo Company, CN=Demo'  ; Expected = 'Demo' }
      @{ Subject = 'C=Demo Company, CN=Demo, O=Demo Company'  ; Expected = 'Demo' }
      @{ Subject = 'CN=Demo'; Expected = 'Demo' }
      @{ Subject = 'CN=Demo One'; Expected = 'Demo One' }
      @{ Subject = 'C=Demo Company, CN=Demo One, O=Demo Company'  ; Expected = 'Demo One' }
    ) {
      param ($Subject, $Expected)

      $CommonName = Get-X509CommonNameFromSubject -X509Subject $Subject
      $CommonName | Should -Be $Expected

    }
  }
}