Public/TestHelpers/Test.ErrorLogs.Tests.ps1

#Requires -Version 5.0
#Requires -Modules @{ ModuleName="Pester"; ModuleVersion="4.10.1" }
$ErrorActionPreference = "Stop";
Set-StrictMode -Version 'Latest'

$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.Tests\.ps1', '.psm1'
$module = Import-Module "$PSScriptRoot\$sut" -Force -PassThru


Describe 'CheckEventViewerForErrors' -Tags 'Unit' {
    $moduleName = $module.Name
    $fakeSource = 'NonExistentSource'
    $logName = 'Application'
    $logSource = 'Pester'
    $commandToMock = 'Get-EventLog'
    
    It 'returns $false when there are no entries found for the source' {
        # Arrange
        $expected = $true
        Mock `
            -ModuleName $moduleName `
            -CommandName $commandToMock `
            -MockWith { New-Object System.Exception }
        # Act
        [bool] $actual = CheckEventViewerForErrors `
            -logName $logName `
            -logSource $fakeSource `
            -dateGreaterThanFilter $(Get-Date)
        # Assert
        Assert-MockCalled -ModuleName $moduleName -CommandName $commandToMock
        $actual | Should Be $expected            
    }    
    It 'returns $false when there are entries for the source but no errors' {
        # Arrange
        $expected = $false             
        Mock `
            -ModuleName $moduleName `
            -CommandName $commandToMock `
            -MockWith { return @{ TimeGenerated = Get-Date; EntryType = 'Information' } }             
        # Act
        [bool] $actual = CheckEventViewerForErrors `
            -logName $logName `
            -logSource $logSource `
            -dateGreaterThanFilter (Get-Date).AddDays(-1)
        # Assert
        Assert-MockCalled -ModuleName $moduleName -CommandName $commandToMock 
        $actual | Should Be $expected
    } 
    It 'returns $true when there are error entries for the source' {
        # Arrange
        $expected = $true                
        Mock `
            -ModuleName $moduleName `
            -CommandName $commandToMock `
            -MockWith { return @{ TimeGenerated = Get-Date; EntryType = 'Error' } }             
        # Act
        [bool] $actual = CheckEventViewerForErrors `
            -logName $logName `
            -logSource $logSource `
            -dateGreaterThanFilter (Get-Date).AddDays(-1)
        # Assert
        Assert-MockCalled -ModuleName $moduleName -CommandName $commandToMock 
        $actual | Should Be $expected
    }
}    


Describe 'CheckEventViewerForErrors' -Tags 'Integration' {
    BeforeEach {
        $logSource = "Pester"
        if ($null -eq (Get-EventLog -LogName Application -Source $logSource -ErrorAction SilentlyContinue)) {
            New-EventLog -Source $logSource -LogName Application 
        }
    }
    It 'returns $false when there are no entries found' {
        # Arrange
        [bool] $expected = $false    
        # Act
        [bool] $actual = CheckEventViewerForErrors -logSource 'NonExistentSource' -dateGreaterThanFilter (Get-Date)
        # Assert
        $actual | Should Be $expected
    }
    It 'returns $true when there are entries for the source but no errors' {
        # Arrange
        [bool] $expected = $true    
        Write-EventLog -LogName Application -Source $logSource -Message 'Log for test' -EntryType Information -EventId 0 
        # Act
        [bool] $actual = CheckEventViewerForErrors -logSource $logSource -dateGreaterThanFilter (Get-Date)
        # Assert
        $actual | Should Be $expected
    }
    It 'returns $false when there are error entries for the source' {
        # Arrange
        [bool] $expected = $true    
        Write-EventLog -LogName Application -Source $logSource -Message 'Log for test' -EntryType Error -EventId 0 
        # Act
        [bool] $actual = CheckEventViewerForErrors -logSource $logSource -dateGreaterThanFilter (Get-Date)
        # Assert
        $actual | Should Be $expected
    }
}