-
-
Notifications
You must be signed in to change notification settings - Fork 26
Expand file tree
/
Copy pathHelp.tests.ps1
More file actions
executable file
·113 lines (93 loc) · 4.66 KB
/
Help.tests.ps1
File metadata and controls
executable file
·113 lines (93 loc) · 4.66 KB
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# Taken with love from @juneb_get_help (https://raw.githubusercontent.com/juneb/PesterTDD/master/Module.Help.Tests.ps1)
BeforeDiscovery {
function global:FilterOutCommonParams {
param ($Params)
$commonParameters = [System.Management.Automation.PSCmdlet]::CommonParameters + [System.Management.Automation.PSCmdlet]::OptionalCommonParameters
$params | Where-Object { $_.Name -notin $commonParameters } | Sort-Object -Property Name -Unique
}
$manifest = Import-PowerShellDataFile -Path $env:BHPSModuleManifest
$outputDir = Join-Path -Path $env:BHProjectPath -ChildPath 'Output'
$outputModDir = Join-Path -Path $outputDir -ChildPath $env:BHProjectName
$outputModVerDir = Join-Path -Path $outputModDir -ChildPath $manifest.ModuleVersion
$outputModVerManifest = Join-Path -Path $outputModVerDir -ChildPath "$($env:BHProjectName).psd1"
# Get module commands
# Remove all versions of the module from the session. Pester can't handle multiple versions.
Get-Module $env:BHProjectName | Remove-Module -Force -ErrorAction Ignore
Import-Module -Name $outputModVerManifest -Verbose:$false -ErrorAction Stop
$params = @{
Module = (Get-Module $env:BHProjectName)
CommandType = [System.Management.Automation.CommandTypes[]]'Cmdlet, Function' # Not alias
}
if ($PSVersionTable.PSVersion.Major -lt 6) {
$params.CommandType[0] += 'Workflow'
}
$script:commands = Get-Command @params
## When testing help, remember that help is cached at the beginning of each session.
## To test, restart session.
}
Describe "Test help for <_.Name>" -ForEach $commands {
BeforeDiscovery {
# Get command help, parameters, and links
$command = $_
$commandHelp = Get-Help $command.Name -ErrorAction SilentlyContinue
$commandParameters = global:FilterOutCommonParams -Params $command.ParameterSets.Parameters
$script:commandParameterNames = $commandParameters.Name
$script:helpLinks = $commandHelp.relatedLinks.navigationLink.uri
}
BeforeAll {
# These vars are needed in both discovery and test phases so we need to duplicate them here
$command = $_
$script:commandName = $_.Name
$commandHelp = Get-Help $command.Name -ErrorAction SilentlyContinue
$commandParameters = global:FilterOutCommonParams -Params $command.ParameterSets.Parameters
$script:commandParameterNames = $commandParameters.Name
$helpParameters = global:FilterOutCommonParams -Params $commandHelp.Parameters.Parameter
$script:helpParameterNames = $helpParameters.Name
}
# If help is not found, synopsis in auto-generated help is the syntax diagram
It 'Help is not auto-generated' {
$commandHelp.Synopsis | Should -Not -BeLike '*`[`<CommonParameters`>`]*'
}
# Should be a description for every function
It "Has description" {
$commandHelp.Description | Should -Not -BeNullOrEmpty
}
# Should be at least one example
It "Has example code" {
($commandHelp.Examples.Example | Select-Object -First 1).Code | Should -Not -BeNullOrEmpty
}
# Should be at least one example description
It "Has example help" {
($commandHelp.Examples.Example.Remarks | Select-Object -First 1).Text | Should -Not -BeNullOrEmpty
}
It "Help link <_> is valid" -ForEach $helpLinks {
(Invoke-WebRequest -Uri $_ -UseBasicParsing).StatusCode | Should -Be '200'
}
Context "Parameter <_.Name>" -ForEach $commandParameters {
BeforeAll {
$parameter = $_
$parameterName = $parameter.Name
$parameterHelp = $commandHelp.parameters.parameter | Where-Object Name -EQ $parameterName
$script:parameterHelpType = if ($parameterHelp.ParameterValue) { $parameterHelp.ParameterValue.Trim() }
}
# Should be a description for every parameter
It "Has description" {
$parameterHelp.Description.Text | Should -Not -BeNullOrEmpty
}
# Required value in Help should match IsMandatory property of parameter
It "Has correct [mandatory] value" {
$codeMandatory = $_.IsMandatory.toString()
$parameterHelp.Required | Should -Be $codeMandatory
}
# Parameter type in help should match code
It "Has correct parameter type" {
$parameterHelpType | Should -Be $parameter.ParameterType.Name
}
}
Context "Test <_> help parameter help for <commandName>" -ForEach $helpParameterNames {
# Shouldn't find extra parameters in help.
It "finds help parameter in code: <_>" {
$_ -in $parameterNames | Should -Be $true
}
}
}