Tests/Integration/MSFT_UserResource.Integration.Tests.ps1

<#
    To run these tests, the currently logged on user must have rights to create a user.
    These integration tests cover creating a brand new user, updating values
    of a user that already exists, and deleting a user that exists.
#>
 

# Suppressing this rule since we need to create a plaintext password to test this resource
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingConvertToSecureStringWithPlainText', '')]
param ()

if ($PSVersionTable.PSVersion.Major -lt 5 -or $PSVersionTable.PSVersion.Minor -lt 1)
{
    Write-Warning -Message 'Cannot run PSDscResources integration tests on PowerShell versions lower than 5.1'
    return
}

$errorActionPreference = 'Stop'
Set-StrictMode -Version 'Latest'

$script:testFolderPath = Split-Path -Path $PSScriptRoot -Parent
$script:testHelpersPath = Join-Path -Path $script:testFolderPath -ChildPath 'TestHelpers'
Import-Module -Name (Join-Path -Path $script:testHelpersPath -ChildPath 'CommonTestHelper.psm1')

$script:testEnvironment = Enter-DscResourceTestEnvironment `
    -DscResourceModuleName 'PSDscResources' `
    -DscResourceName 'MSFT_UserResource' `
    -TestType 'Integration'

try {

    $configFile = Join-Path -Path $PSScriptRoot -ChildPath 'MSFT_UserResource.config.ps1'


    Describe 'UserResource Integration Tests' {
        $ConfigData = @{
            AllNodes = @(
                @{
                    NodeName = '*'
                    PSDscAllowPlainTextPassword = $true
                }
                @{
                    NodeName = 'localhost'
                }
            )
        }
    
        Context 'Should create a new user' {
            $configurationName = 'MSFT_User_NewUser'
            $configurationPath = Join-Path -Path $TestDrive -ChildPath $configurationName

            $logPath = Join-Path -Path $TestDrive -ChildPath 'NewUser.log'
            
            $testUserName = 'TestUserName12345'
            $testUserPassword = 'StrongOne7.'
            $testDescription = 'Test Description'
            $secureTestPassword = ConvertTo-SecureString $testUserPassword -AsPlainText -Force
            $testCredential = New-Object PSCredential ($testUserName, $secureTestPassword)

            try
            {
                It 'Should compile without throwing' {
                    {
                        . $configFile -ConfigurationName $configurationName
                        & $configurationName -UserName $testUserName `
                                             -Password $testCredential `
                                             -Description $testDescription `
                                             -OutputPath $configurationPath `
                                             -ConfigurationData $ConfigData `
                                             -ErrorAction Stop
                        Start-DscConfiguration -Path $configurationPath -Wait -Force
                    } | Should Not Throw
                }

                It 'Should be able to call Get-DscConfiguration without throwing' {
                    { Get-DscConfiguration -ErrorAction Stop } | Should Not Throw
                }
                
                It 'Should return the correct configuration' {
                    $currentConfig = Get-DscConfiguration -ErrorAction Stop
                    $currentConfig.UserName | Should Be $testUserName
                    $currentConfig.Ensure | Should Be 'Present'
                    $currentConfig.Description | Should Be $TestDescription
                    $currentConfig.Disabled | Should Be $false
                    $currentConfig.PasswordChangeRequired | Should Be $null
                }
            }
            finally
            {
                if (Test-Path -Path $logPath) {
                    Remove-Item -Path $logPath -Recurse -Force
                }

                if (Test-Path -Path $configurationPath)
                {
                    Remove-Item -Path $configurationPath -Recurse -Force
                }
            }
        }
        
        Context 'Should update an existing user' {
            $configurationName = 'MSFT_User_UpdateUser'
            $configurationPath = Join-Path -Path $TestDrive -ChildPath $configurationName

            $logPath = Join-Path -Path $TestDrive -ChildPath 'UpdateUser.log'
            
            $testUserName = 'TestUserName12345'
            $testUserPassword = 'StrongOne7.'
            $testDescription = 'New Test Description'
            $secureTestPassword = ConvertTo-SecureString $testUserPassword -AsPlainText -Force
            $testCredential = New-Object PSCredential ($testUserName, $secureTestPassword)

            try
            {
                It 'Should compile without throwing' {
                    {
                        . $configFile -ConfigurationName $configurationName
                        & $configurationName -UserName $testUserName `
                                             -Password $testCredential `
                                             -Description $testDescription `
                                             -OutputPath $configurationPath `
                                             -ConfigurationData $ConfigData `
                                             -ErrorAction Stop
                        Start-DscConfiguration -Path $configurationPath -Wait -Force
                    } | Should Not Throw
                }

                It 'Should be able to call Get-DscConfiguration without throwing' {
                    { Get-DscConfiguration -ErrorAction Stop } | Should Not Throw
                }
                
                It 'Should return the correct configuration' {
                    $currentConfig = Get-DscConfiguration -ErrorAction Stop
                    $currentConfig.UserName | Should Be $testUserName
                    $currentConfig.Ensure | Should Be 'Present'
                    $currentConfig.Description | Should Be $TestDescription
                    $currentConfig.Disabled | Should Be $false
                    $currentConfig.PasswordChangeRequired | Should Be $null
                }
            }
            finally
            {
                if (Test-Path -Path $logPath) {
                    Remove-Item -Path $logPath -Recurse -Force
                }

                if (Test-Path -Path $configurationPath)
                {
                    Remove-Item -Path $configurationPath -Recurse -Force
                }
            }
        }
        
        Context 'Should delete an existing user' {
            $configurationName = 'MSFT_User_DeleteUser'
            $configurationPath = Join-Path -Path $TestDrive -ChildPath $configurationName

            $logPath = Join-Path -Path $TestDrive -ChildPath 'DeleteUser.log'
            
            $testUserName = 'TestUserName12345'
            $testUserPassword = 'StrongOne7.'
            $secureTestPassword = ConvertTo-SecureString $testUserPassword -AsPlainText -Force
            $testCredential = New-Object PSCredential ($testUserName, $secureTestPassword)

            try
            {
                It 'Should compile without throwing' {
                    {
                        . $configFile -ConfigurationName $configurationName
                        & $configurationName -UserName $testUserName `
                                             -Password $testCredential `
                                             -OutputPath $configurationPath `
                                             -ConfigurationData $ConfigData `
                                             -Ensure 'Absent' `
                                             -ErrorAction Stop
                        Start-DscConfiguration -Path $configurationPath -Wait -Force
                    } | Should Not Throw
                }

                It 'Should be able to call Get-DscConfiguration without throwing' {
                    { Get-DscConfiguration -ErrorAction Stop } | Should Not Throw
                }
                
                It 'Should return the correct configuration' {
                    $currentConfig = Get-DscConfiguration -ErrorAction Stop
                    $currentConfig.UserName | Should Be $testUserName
                    $currentConfig.Ensure | Should Be 'Absent'
                }
            }
            finally
            {
                if (Test-Path -Path $logPath) {
                    Remove-Item -Path $logPath -Recurse -Force
                }

                if (Test-Path -Path $configurationPath)
                {
                    Remove-Item -Path $configurationPath -Recurse -Force
                }
            }
        }
        
    }
}
finally
{
    Exit-DscResourceTestEnvironment -TestEnvironment $script:testEnvironment
}