Tests/Integration/MSFT_AuditPolicyCsv.integration.tests.ps1


$script:DSCModuleName      = 'AuditPolicyDsc'
$script:DSCResourceName    = 'MSFT_AuditPolicyCsv'

#region HEADER
# Integration Test Template Version: 1.1.1
[String] $script:moduleRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)
if ( (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests'))) -or `
     (-not (Test-Path -Path (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1'))) )
{
    & git @('clone','https://github.com/PowerShell/DscResource.Tests.git',(Join-Path -Path $script:moduleRoot -ChildPath '\DSCResource.Tests\'))
}

Import-Module (Join-Path -Path $script:moduleRoot -ChildPath 'DSCResource.Tests\TestHelper.psm1') -Force
$TestEnvironment = Initialize-TestEnvironment `
    -DSCModuleName $script:DSCModuleName `
    -DSCResourceName $script:DSCResourceName `
    -TestType Integration
#endregion

# Using try/finally to always cleanup even if something awful happens.
try
{
    #region Integration Tests
    $ConfigFile = Join-Path -Path $PSScriptRoot -ChildPath "$($script:DSCResourceName).config.ps1"
    . $ConfigFile 

    Describe "$($script:DSCResourceName)_Integration" {
        
        Context 'Should set policy' {

            # set the system Subcategories to the incorect state to ensure a valid test.
            & 'auditpol' '/set' "/subcategory:Credential Validation" '/failure:disable' '/Success:enable'
            & 'auditpol' '/set' "/subcategory:Other Account Management Events" '/failure:enable' '/Success:disable'
            & 'auditpol' '/set' "/subcategory:Logoff" '/failure:enable' '/Success:disable'
            & 'auditpol' '/set' "/subcategory:Logon" '/failure:enable' '/Success:enable'
            & 'auditpol' '/set' "/subcategory:Special Logon" '/failure:disable' '/Success:enable'
            <#
                Since the tests read in CSV files, they are stored in a subfolder for the user and
                system context to both access.
            #>
 
            $csvPath = ([system.IO.Path]::GetTempFileName()).Replace('.tmp','.csv')

            # Create the desired auditpol backup file to test with.
            @(@("Machine Name,Policy Target,Subcategory,Subcategory GUID,Inclusion Setting,Exclusion Setting,Setting Value")
            @(",System,Credential Validation,{0cce923f-69ae-11d9-bed3-505054503030},Success and Failure,,3")
            @(",System,Other Account Management Events,{0cce923a-69ae-11d9-bed3-505054503030},Success and Failure,,3")
            @(",System,Logoff,{0cce9216-69ae-11d9-bed3-505054503030},Success,,1")
            @(",System,Logon,{0cce9215-69ae-11d9-bed3-505054503030},Success and Failure,,3")
            @(",System,Special Logon,{0cce921b-69ae-11d9-bed3-505054503030},Failure,,2")) | 
                Out-File $csvPath -Encoding utf8 -Force
            #region DEFAULT TESTS

            It 'Should compile and apply the MOF without throwing' {
                {
                    & "$($script:DSCResourceName)_Config" -CsvPath $csvPath `
                                                          -OutputPath $TestDrive
                    
                    Start-DscConfiguration -Path $TestDrive `
                        -ComputerName localhost -Wait -Verbose -Force
                } | Should not throw
            }

            It 'Should be able to call Get-DscConfiguration without throwing' {
                { $script:currentConfig = Get-DscConfiguration -Verbose -ErrorAction Stop } | 
                    Should Not throw
            }

            It 'Should have added Failure flag when configured for Success only' {
                $auditpolReturn = (& 'auditpol' '/get' '/subcategory:Credential Validation' '/r')[2] 
                ($auditpolReturn -split ",")[4] | Should Be "Success and Failure"
            }

            It 'Should have added Success flag when configured for Failure only' {
                $auditpolReturn = (& 'auditpol' '/get' '/subcategory:Other Account Management Events' '/r')[2] 
                ($auditpolReturn -split ",")[4] | Should Be "Success and Failure"
            }

            It 'Should have removed Failure flag and added Success flag' {
                $auditpolReturn = (& 'auditpol' '/get' '/subcategory:Logoff' '/r')[2] 
                ($auditpolReturn -split ",")[4] | Should Be "Success"
            }

            It 'Should have removed Success flag and added Failure flag' {
                $auditpolReturn = (& 'auditpol' '/get' '/subcategory:Special Logon' '/r')[2] 
                ($auditpolReturn -split ",")[4] | Should Be "Failure"
            }

            It 'Should have not made any changes when configured correctly' {
                $auditpolReturn = (& 'auditpol' '/get' '/subcategory:Logon' '/r')[2] 
                ($auditpolReturn -split ",")[4] | Should Be "Success and Failure"
            }
            #endregion
        }
    }
    #endregion
}
finally
{
    #region FOOTER
    Restore-TestEnvironment -TestEnvironment $TestEnvironment
    #endregion
}