@@ -6,37 +6,176 @@ BeforeAll {
6
6
}
7
7
8
8
Describe " AvoidDefaultValueForMandatoryParameter" {
9
- Context " When there are violations" {
10
- It " has 1 provide default value for mandatory parameter violation with CmdletBinding" {
11
- $violations = Invoke-ScriptAnalyzer - ScriptDefinition ' Function foo{ [CmdletBinding()]Param([Parameter(Mandatory)]$Param1='' defaultValue'' ) }' |
12
- Where-Object { $_.RuleName -eq $ruleName }
9
+
10
+ Context " Basic mandatory parameter violations" {
11
+ It " should flag mandatory parameter with default value (implicit)" {
12
+ $script = ' Function Test { Param([Parameter(Mandatory)]$Param = "default") }'
13
+ $violations = Invoke-ScriptAnalyzer - ScriptDefinition $script | Where-Object { $_.RuleName -eq $ruleName }
14
+ $violations.Count | Should - Be 1
15
+ }
16
+
17
+ It " should flag mandatory parameter with default value (explicit true)" {
18
+ $script = ' Function Test { Param([Parameter(Mandatory=$true)]$Param = "default") }'
19
+ $violations = Invoke-ScriptAnalyzer - ScriptDefinition $script | Where-Object { $_.RuleName -eq $ruleName }
20
+ $violations.Count | Should - Be 1
21
+ }
22
+
23
+ It " should flag mandatory parameter with default value (numeric true)" {
24
+ $script = ' Function Test { Param([Parameter(Mandatory=1)]$Param = "default") }'
25
+ $violations = Invoke-ScriptAnalyzer - ScriptDefinition $script | Where-Object { $_.RuleName -eq $ruleName }
26
+ $violations.Count | Should - Be 1
27
+ }
28
+ }
29
+
30
+ Context " Parameter sets (multiple Parameter attributes)" {
31
+ It " should NOT flag parameter mandatory in some but not all parameter sets" {
32
+ $script = @'
33
+ Function Test {
34
+ Param(
35
+ [Parameter(Mandatory, ParameterSetName='Set1')]
36
+ [Parameter(ParameterSetName='Set2')]
37
+ $Param = 'default'
38
+ )
39
+ }
40
+ '@
41
+ $violations = Invoke-ScriptAnalyzer - ScriptDefinition $script | Where-Object { $_.RuleName -eq $ruleName }
42
+ $violations.Count | Should - Be 0
43
+ }
44
+
45
+ It " should flag parameter mandatory in ALL parameter sets" {
46
+ $script = @'
47
+ Function Test {
48
+ Param(
49
+ [Parameter(Mandatory, ParameterSetName='Set1')]
50
+ [Parameter(Mandatory, ParameterSetName='Set2')]
51
+ $Param = 'default'
52
+ )
53
+ }
54
+ '@
55
+ $violations = Invoke-ScriptAnalyzer - ScriptDefinition $script | Where-Object { $_.RuleName -eq $ruleName }
13
56
$violations.Count | Should - Be 1
14
57
}
15
58
16
- It " has 1 provide default value for mandatory=$true parameter violation without CmdletBinding" {
17
- $violations = Invoke-ScriptAnalyzer - ScriptDefinition ' Function foo{ Param([Parameter(Mandatory=$true)]$Param1='' defaultValue'' ) }' |
18
- Where-Object { $_.RuleName -eq $ruleName }
59
+ It " should handle mixed mandatory/non-mandatory in multiple parameter sets" {
60
+ $script = @'
61
+ Function Test {
62
+ Param(
63
+ [Parameter(Mandatory=$true, ParameterSetName='Set1')]
64
+ [Parameter(Mandatory=$false, ParameterSetName='Set2')]
65
+ [Parameter(ParameterSetName='Set3')]
66
+ $Param = 'default'
67
+ )
68
+ }
69
+ '@
70
+ $violations = Invoke-ScriptAnalyzer - ScriptDefinition $script | Where-Object { $_.RuleName -eq $ruleName }
71
+ $violations.Count | Should - Be 0
72
+ }
73
+ }
74
+
75
+ Context " Script-level param blocks" {
76
+ It " should flag mandatory parameters with defaults in script-level param blocks" {
77
+ $script = @'
78
+ Param(
79
+ [Parameter(Mandatory)]
80
+ $ScriptParam = 'default'
81
+ )
82
+ '@
83
+ $violations = Invoke-ScriptAnalyzer - ScriptDefinition $script | Where-Object { $_.RuleName -eq $ruleName }
19
84
$violations.Count | Should - Be 1
20
85
}
21
86
22
- It " returns violations when the parameter is specified as mandatory=1 and has a default value" {
23
- $violations = Invoke-ScriptAnalyzer - ScriptDefinition ' Function foo{ Param([Parameter(Mandatory=1)]$Param1='' defaultValue'' ) }' |
24
- Where-Object { $_.RuleName -eq $ruleName }
87
+ It " should NOT flag non-mandatory parameters in script-level param blocks" {
88
+ $script = @'
89
+ Param(
90
+ [Parameter()]
91
+ $ScriptParam = 'default'
92
+ )
93
+ '@
94
+ $violations = Invoke-ScriptAnalyzer - ScriptDefinition $script | Where-Object { $_.RuleName -eq $ruleName }
95
+ $violations.Count | Should - Be 0
96
+ }
97
+ }
98
+
99
+ Context " Non-Parameter attributes" {
100
+ It " should NOT flag non-Parameter attributes with Mandatory property" {
101
+ $script = ' Function Test { Param([MyCustomAttribute(Mandatory)]$Param = "default") }'
102
+ $violations = Invoke-ScriptAnalyzer - ScriptDefinition $script | Where-Object { $_.RuleName -eq $ruleName }
103
+ $violations.Count | Should - Be 0
104
+ }
105
+
106
+ It " should NOT flag parameters with only validation attributes" {
107
+ $script = ' Function Test { Param([ValidateNotNull()]$Param = "default") }'
108
+ $violations = Invoke-ScriptAnalyzer - ScriptDefinition $script | Where-Object { $_.RuleName -eq $ruleName }
109
+ $violations.Count | Should - Be 0
110
+ }
111
+ }
112
+
113
+ Context " Valid scenarios (no violations)" {
114
+ It " should NOT flag mandatory parameters without default values" {
115
+ $script = ' Function Test { Param([Parameter(Mandatory)]$Param) }'
116
+ $violations = Invoke-ScriptAnalyzer - ScriptDefinition $script | Where-Object { $_.RuleName -eq $ruleName }
117
+ $violations.Count | Should - Be 0
118
+ }
119
+
120
+ It " should NOT flag non-mandatory parameters with default values" {
121
+ $script = ' Function Test { Param([Parameter(Mandatory=$false)]$Param = "default") }'
122
+ $violations = Invoke-ScriptAnalyzer - ScriptDefinition $script | Where-Object { $_.RuleName -eq $ruleName }
123
+ $violations.Count | Should - Be 0
124
+ }
125
+
126
+ It " should NOT flag parameters without Parameter attributes" {
127
+ $script = ' Function Test { Param($Param = "default") }'
128
+ $violations = Invoke-ScriptAnalyzer - ScriptDefinition $script | Where-Object { $_.RuleName -eq $ruleName }
129
+ $violations.Count | Should - Be 0
130
+ }
131
+
132
+ It " should NOT flag mandatory=0 parameters" {
133
+ $script = ' Function Test { Param([Parameter(Mandatory=0)]$Param = "default") }'
134
+ $violations = Invoke-ScriptAnalyzer - ScriptDefinition $script | Where-Object { $_.RuleName -eq $ruleName }
135
+ $violations.Count | Should - Be 0
136
+ }
137
+ }
138
+
139
+ Context " Complex scenarios" {
140
+ It " should handle multiple parameters with mixed violations" {
141
+ $script = @'
142
+ Function Test {
143
+ Param(
144
+ [Parameter(Mandatory)]$BadParam = "default",
145
+ [Parameter()]$GoodParam = "default",
146
+ [Parameter(Mandatory)]$AnotherBadParam = "default"
147
+ )
148
+ }
149
+ '@
150
+ $violations = Invoke-ScriptAnalyzer - ScriptDefinition $script | Where-Object { $_.RuleName -eq $ruleName }
151
+ $violations.Count | Should - Be 2
152
+ }
153
+
154
+ It " should work with CmdletBinding" {
155
+ $script = ' Function Test { [CmdletBinding()]Param([Parameter(Mandatory)]$Param = "default") }'
156
+ $violations = Invoke-ScriptAnalyzer - ScriptDefinition $script | Where-Object { $_.RuleName -eq $ruleName }
25
157
$violations.Count | Should - Be 1
26
158
}
27
159
}
28
160
29
- Context " When there are no violations " {
30
- It " has 1 provide default value for mandatory parameter violation " {
31
- $violations = Invoke-ScriptAnalyzer - ScriptDefinition ' Function foo { Param([Parameter(Mandatory=$false)]$Param1= '' val1 '' , [Parameter(Mandatory)]$Param2= '' val2 '' , $Param3= '' val3 '' ) } ' |
32
- Where-Object { $_.RuleName -eq $ruleName }
161
+ Context " Edge cases " {
162
+ It " should handle empty param blocks gracefully " {
163
+ $script = ' Function Test { Param() } '
164
+ $violations = Invoke-ScriptAnalyzer - ScriptDefinition $script | Where-Object { $_.RuleName -eq $ruleName }
33
165
$violations.Count | Should - Be 0
34
166
}
35
167
36
- It " returns no violations when the parameter is specified as mandatory=0 and has a default value" {
37
- $violations = Invoke-ScriptAnalyzer - ScriptDefinition ' Function foo{ Param([Parameter(Mandatory=0)]$Param1='' val1'' ) }' |
38
- Where-Object { $_.RuleName -eq $ruleName }
168
+ It " should handle null/empty default values" {
169
+ $script = ' Function Test { Param([Parameter(Mandatory)]$Param = $null) }'
170
+ $violations = Invoke-ScriptAnalyzer - ScriptDefinition $script | Where-Object { $_.RuleName -eq $ruleName }
171
+ $violations.Count | Should - Be 1
172
+ }
173
+
174
+ It " should handle parameters with multiple non-Parameter attributes" {
175
+ $script = ' Function Test { Param([ValidateNotNull()][Alias("P")]$Param = "default") }'
176
+ $violations = Invoke-ScriptAnalyzer - ScriptDefinition $script | Where-Object { $_.RuleName -eq $ruleName }
39
177
$violations.Count | Should - Be 0
40
178
}
41
179
}
180
+
42
181
}
0 commit comments