MegaBites-AI/Windows-powershell
0372
1# Copyright (c) Microsoft Corporation.2# Licensed under the MIT License.3Describe "Get-Command Tests" -Tags "CI" {4 BeforeAll {5 function TestGetCommand-DynamicParametersDCR6 {7 [CmdletBinding()]8 param (9 [Parameter(Mandatory = $true, Position = 0)]10 [ValidateSet("ReturnNull", "ReturnThis", "Return1", "Return2","Return3", "ReturnDuplicateParameter", "ReturnAlias", "ReturnDuplicateAlias","ReturnObjectNoParameters", "ReturnGenericParameter", "ThrowException")]11 [string] $TestToRun,12 13 [Parameter()]14 [Type]$ParameterType15 )16 17 DynamicParam {18 if ( ! $TestToRun ) {19 $TestToRun = "returnnull"20 }21 $dynamicParamDictionary = [System.Management.Automation.RuntimeDefinedParameterDictionary]::new()22 switch ( $TestToRun )23 {24 "returnnull" {25 $dynamicParamDictionary = $null26 break27 }28 "return1" {29 $attr = [System.Management.Automation.ParameterAttribute]::new()30 $attr.Mandatory = $true31 $dynamicParameter = [System.Management.Automation.RuntimeDefinedParameter]::new("OneString",[string],$attr)32 $dynamicParamDictionary.Add("OneString",$dynamicParameter)33 break34 }35 "return2" {36 $attr1 = [System.Management.Automation.ParameterAttribute]::new()37 $attr1.Mandatory = $true38 $attr1.ParameterSetName = "__AllParameterSets"39 $ac1 = [Collections.ObjectModel.Collection[Attribute]]::new()40 $ac1.Add($attr1)41 $p1 = [System.Management.Automation.RuntimeDefinedParameter]::new("OneString",[string],$ac1)42 $dynamicParamDictionary.Add("OneString",$p1)43 44 $attr2 = [System.Management.Automation.ParameterAttribute]::new()45 $attr2.Mandatory = $false46 $attr2.ParameterSetName = "__AllParameterSets"47 $VRattr = [System.Management.Automation.ValidateRangeAttribute]::new(5,9)48 49 $ac2 = [Collections.ObjectModel.Collection[Attribute]]::new()50 $ac2.Add($attr2)51 $ac2.Add($VRattr)52 $p2 = [System.Management.Automation.RuntimeDefinedParameter]::New("TwoInt",[int],$ac2)53 $dynamicParamDictionary.Add("TwoInt",$p2)54 break55 }56 "return3" {57 $attr1 = [System.Management.Automation.ParameterAttribute]::new()58 $attr1.Mandatory = $true59 $attr1.ParameterSetName = "__AllParameterSets"60 $ac1 = [Collections.ObjectModel.Collection[Attribute]]::new()61 $ac1.Add($attr1)62 $p1 = [System.Management.Automation.RuntimeDefinedParameter]::new("OneString",[string],$ac1)63 $dynamicParamDictionary.Add("OneString",$p1)64 65 $attr2 = [System.Management.Automation.ParameterAttribute]::new()66 $attr2.Mandatory = $false67 $attr2.ParameterSetName = "__AllParameterSets"68 $VRattr = [System.Management.Automation.ValidateRangeAttribute]::new(5,9)69 70 $ac2 = [Collections.ObjectModel.Collection[Attribute]]::new()71 $ac2.Add($attr2)72 $ac2.Add($VRattr)73 $p2 = [System.Management.Automation.RuntimeDefinedParameter]::New("TwoInt",[int],$ac2)74 $dynamicParamDictionary.Add("TwoInt",$p2)75 76 $attr3 = [System.Management.Automation.ParameterAttribute]::new()77 $attr3.Mandatory = $false78 $attr3.ParameterSetName = "__AllParameterSets"79 $ac3 = [Collections.ObjectModel.Collection[Attribute]]::new()80 $ac3.Add($attr3)81 $p3 = [System.Management.Automation.RuntimeDefinedParameter]::new("ThreeBool",[bool],$ac3)82 $dynamicParamDictionary.Add("ThreeBool",$p3)83 break84 }85 "returnduplicateparameter" {86 $attr1 = [System.Management.Automation.ParameterAttribute]::new()87 $attr1.Mandatory = $false88 $attr1.ParameterSetName = "__AllParameterSets"89 $ac1 = [Collections.ObjectModel.Collection[Attribute]]::new()90 $ac1.Add($attr1)91 $p1 = [System.Management.Automation.RuntimeDefinedParameter]::new("TestToRun",[int],$ac1)92 $dynamicParamDictionary.Add("TestToRun",$p1)93 break94 }95 "returngenericparameter" {96 $attr1 = [System.Management.Automation.ParameterAttribute]::new()97 $attr1.ParameterSetName = "__AllParameterSets"98 $ac1 = [Collections.ObjectModel.Collection[Attribute]]::new()99 $ac1.Add($attr1)100 $p1 = [System.Management.Automation.RuntimeDefinedParameter]::new("TypedValue",$ParameterType,$ac1)101 $dynamicParamDictionary.Add("TypedValue",$p1)102 break103 }104 default {105 throw ([invalidoperationexception]::new("unable to determine which dynamic parameters to return!"))106 break107 }108 }109 return $dynamicParamDictionary110 }111 112 BEGIN {113 $ReturnNull = "ReturnNull"114 $ReturnThis = "ReturnThis"115 $ReturnAlias = "ReturnAlias"116 $ReturnDuplicateAlias = "ReturnDuplicateAlias"117 $Return1 = "Return1"118 $Return2 = "Return2"119 $Return3 = "Return3"120 $ReturnDuplicateParameter = "ReturnDuplicateParameter"121 $ReturnObjectNoParameters = "ReturnObjectNoParameters"122 $ReturnGenericParameter = "ReturnGenericParameter"123 $ThrowException = "ThrowException"124 return $dynamicParamDictionary125 }126 }127 128 function GetDynamicParameter($cmdlet, $parameterName)129 {130 foreach ($paramSet in $cmdlet.ParameterSets)131 {132 foreach ($pinfo in $paramSet.Parameters)133 {134 if ($pinfo.Name -eq $parameterName)135 {136 $foundParam = $pinfo137 break138 }139 }140 if($null -ne $foundParam)141 {142 break143 }144 }145 return $foundParam146 }147 148 function VerifyDynamicParametersExist($cmdlet, $parameterNames)149 {150 foreach($paramName in $parameterNames)151 {152 $foundParam = GetDynamicParameter -cmdlet $cmdlet -parameterName $paramName153 $foundParam.Name | Should -BeExactly $paramName154 }155 }156 157 function VerifyParameterType($cmdlet, $parameterName, $ParameterType)158 {159 $foundParam = GetDynamicParameter -cmdlet $cmdlet -parameterName $parameterName160 $foundParam.ParameterType | Should -Be $ParameterType161 }162 }163 164 It "Verify that Get-Command Get-Content includes the dynamic parameters when the cmdlet is checked against the file system provider implementation" {165 $fullPath = Join-Path $TestDrive -ChildPath "blah"166 New-Item -Path $fullPath -ItemType directory -Force167 $results = Get-Command Get-Content -Path $fullPath168 $dynamicParameter = "Wait", "Encoding", "Delimiter"169 VerifyDynamicParametersExist -cmdlet $results[0] -parameterNames $dynamicParameter170 }171 172 It "Verify that Get-Command Get-Content doesn't have any dynamic parameters for Function provider" {173 $results =Get-Command Get-Content -Path function:174 $dynamicParameter = "Wait", "Encoding", "Delimiter"175 foreach ($dynamicPara in $dynamicParameter)176 {177 $results[0].ParameterSets.Parameters.Name -contains $dynamicPara | Should -BeFalse178 }179 }180 181 It "Verify that the specified dynamic parameter exists in the CmdletInfo result returned" {182 $results = Get-Command TestGetCommand-DynamicParametersDCR -TestToRun return1183 $dynamicParameter = "OneString"184 VerifyDynamicParametersExist -cmdlet $results[0] -parameterNames $dynamicParameter185 VerifyParameterType -cmdlet $results[0] -parameterName $dynamicParameter -ParameterType string186 }187 188 It "Verify three dynamic parameters are created properly" {189 $results = Get-Command TestGetCommand-DynamicParametersDCR -TestToRun return3190 $dynamicParameter = "OneString", "TwoInt", "ThreeBool"191 192 VerifyDynamicParametersExist -cmdlet $results[0] -parameterNames $dynamicParameter193 VerifyParameterType -cmdlet $results[0] -parameterName "OneString" -parameterType string194 VerifyParameterType -cmdlet $results[0] -parameterName "TwoInt" -parameterType Int195 VerifyParameterType -cmdlet $results[0] -parameterName "ThreeBool" -parameterType bool196 }197 198 It "Verify dynamic parameter type is process" {199 $results = Get-Command TestGetCommand-DynamicParametersDCR -Args '-TestToRun','returngenericparameter','-parametertype','System.Diagnostics.Process'200 VerifyParameterType -cmdlet $results[0] -parameterName "TypedValue" -parameterType System.Diagnostics.Process201 }202 203 It "Verify a single cmdlet returned using verb and noun parameter set syntax works properly" {204 $paramName = "OneString"205 $results = Get-Command -Verb TestGetCommand -Noun DynamicParametersDCR -TestToRun Return1206 VerifyDynamicParametersExist -cmdlet $results[0] -parameterNames $paramName207 VerifyParameterType -cmdlet $results[0] -parameterName $paramName -parameterType string208 }209 210 It "Verify Single Cmdlet Using Verb&Noun ParameterSet" {211 $paramName = "Encoding"212 $results = Get-Command -Verb get -Noun content -Encoding Unicode213 VerifyDynamicParametersExist -cmdlet $results[0] -parameterNames $paramName214 VerifyParameterType -cmdlet $results[0] -parameterName $paramName -parameterType System.Text.Encoding215 }216 217 It "Verify Single Cmdlet Using Verb&Noun ParameterSet With Usage" {218 $results = Get-Command -Verb get -Noun content -Encoding Unicode -Syntax219 $results.ToString() | Should -Match "-Encoding"220 $results.ToString() | Should -Match "-Wait"221 $results.ToString() | Should -Match "-Delimiter"222 }223 224 It "Test Script Lookup Positive Script Info" {225 $tempFile = "mytempfile.ps1"226 $fullPath = Join-Path $TestDrive -ChildPath $tempFile227 "$a = dir" > $fullPath228 $results = Get-Command $fullPath229 230 $results.Name | Should -BeExactly $tempFile231 $results.Definition | Should -BeExactly $fullPath232 }233 234 It "Two dynamic parameters are created properly" {235 $results = Get-Command TestGetCommand-DynamicParametersDCR -TestToRun return2236 $dynamicParameter = "OneString", "TwoInt"237 VerifyDynamicParametersExist -cmdlet $results[0] -parameterNames $dynamicParameter238 VerifyParameterType -cmdlet $results[0] -parameterName "OneString" -ParameterType string239 VerifyParameterType -cmdlet $results[0] -parameterName "TwoInt" -ParameterType int240 }241 242 It "Throw an Exception when set TestToRun to 'returnduplicateparameter'" {243 { Get-Command TestGetCommand-DynamicParametersDCR -TestToRun returnduplicateparameter -ErrorAction Stop } |244 Should -Throw -ErrorId "GetCommandMetadataError,Microsoft.PowerShell.Commands.GetCommandCommand"245 }246 247 It "verify if get the proper dynamic parameter type skipped by issue #1430" -Pending {248 $results = Get-Command TestGetCommand-DynamicParametersDCR -TestToRun returngenericparameter -ParameterType System.Diagnostics.Process249 VerifyParameterType -cmdlet $results[0] -parameterName "TypedValue" -parameterType System.Diagnostics.Process250 }251 252 It "It works with Single Cmdlet Using Verb&Noun ParameterSet" {253 $paramName = "Encoding"254 $results = Get-Command -Verb get -Noun content -encoding UTF8255 VerifyDynamicParametersExist -cmdlet $results[0] -parameterNames $paramName256 VerifyParameterType -cmdlet $results[0] -parameterName $paramName -ParameterType System.Text.Encoding257 }258 259 #unsupported parameter: -synop260 It "[Unsupported]It works with Single Cmdlet Using Verb&Noun ParameterSet With Synopsis" -Pending {261 $paramName = "Encoding"262 $results = Get-Command -Verb get -Noun content -encoding UTF8 -Synop263 VerifyDynamicParametersExist -cmdlet $results[0] -parameterNames $paramName264 VerifyParameterType -cmdlet $results[0] -parameterName $paramName -ParameterType System.Text.Encoding265 }266 267 It "Piping more than one CommandInfo works" {268 $result = Get-Command -Name Add-Content, Get-Content | Get-Command269 $result.Count | Should -Be 2270 $result.Name | Should -Be "Add-Content","Get-Content"271 }272 273 It "Excluding modules works" {274 $result = Get-Command -Name Get-Command -ExcludeModule Microsoft.PowerShell.Core275 $result | Should -Be $null276 }277}278 