tests/general/PSScriptAnalyzer.Tests.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[CmdletBinding()]
Param (
    [switch]
    $SkipTest,
    
    [string[]]
    $CommandPath = @("$global:testroot\..\functions", "$global:testroot\..\internal\functions")
)

if ($SkipTest) { return }

$global:__pester_data.ScriptAnalyzer = New-Object System.Collections.ArrayList

Describe 'Invoking PSScriptAnalyzer against commandbase' {
    $commandFiles = Get-ChildItem -Path $CommandPath -Recurse | Where-Object Name -like "*.ps1"
    $scriptAnalyzerRules = Get-ScriptAnalyzerRule
    
    foreach ($file in $commandFiles)
    {
        Context "Analyzing $($file.BaseName)" {
            $analysis = Invoke-ScriptAnalyzer -Path $file.FullName -ExcludeRule PSAvoidTrailingWhitespace, PSShouldProcess
            
            forEach ($rule in $scriptAnalyzerRules)
            {
                It "Should pass $rule" -TestCases @{ analysis = $analysis; rule = $rule } {
                    If ($analysis.RuleName -contains $rule)
                    {
                        $analysis | Where-Object RuleName -EQ $rule -outvariable failures | ForEach-Object { $null = $global:__pester_data.ScriptAnalyzer.Add($_) }
                        
                        1 | Should -Be 0
                    }
                    else
                    {
                        0 | Should -Be 0
                    }
                }
            }
        }
    }
}