tests/general/Help.Example.Parameters.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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
$excludeCommands = @(
    'Invoke-D365LogicAppMessage'
    , 'Invoke-D365SCDPBundleInstall'
    , 'Test-D365Command'
    , 'Test-PathExists'
)

$excludeParameters = @(
    'EnableException'
    , 'TrustedConnection'
    , 'Force'
    , 'Temporary'
    , 'OutputCommandOnly'
    , 'ShowOriginalProgress'
    , 'OutputAsHashtable'
    , 'LogPath'
)

$commandsRaw = Get-Command -Module d365fo.tools

if ($excludeCommands.Count -gt 0) {
    $commands = $commandsRaw | Select-String -Pattern $excludeCommands -SimpleMatch -NotMatch

}
else {
    $commands = $commandsRaw
}

foreach ( $commandName in $commands) {
    if ($commandName -notlike "*d365*") {
        continue
    }
    
    # command to be tested

    # get all examples from the help
    $examples = Get-Help $commandName -Examples

    $parameters = (Get-Help $commandName -Full).parameters

    # make a describe block that will contain tests for this
    Describe "Parameters without default vaules from $commandName" {
        
        foreach ($parm in $parameters.parameter) {
            if ($parm.defaultValue -ne "False") { continue }
            
            $parmName = $parm.name
            
            if ($parmName -in $excludeParameters) { continue }

            $res = $false

            foreach ($exampleObject in $examples.Examples.Example) {
                if ($res) { continue }

                $example = $exampleObject.Code -replace "`n.*" -replace "PS C:\\>"

                $res = $example -match "-$parmName( *|\:)"
            }

            It "$parmName is present in an example" {
                $res | Should -BeTrue
            }
        }
    }
}