MegaBites-AI/Windows-powershell
0372
1# Copyright (c) Microsoft Corporation.2# Licensed under the MIT License.3Describe "Remote import-module tests" -Tags 'Feature','RequireAdminOnWindows' {4 5 BeforeAll {6 $originalDefaultParameterValues = $PSDefaultParameterValues.Clone()7 $modulePath = "$testdrive\Modules\TestImport"8 9 $pendingTest = (Test-IsWinWow64)10 $skipTest = !$IsWindows11 12 if ($skipTest) {13 $PSDefaultParameterValues["it:skip"] = $true14 } elseif ($pendingTest) {15 $PSDefaultParameterValues["it:pending"] = $true16 } else {17 $pssession = New-RemoteSession18 Invoke-Command -Session $pssession -Scriptblock { $env:PSModulePath += ";${using:testdrive}" }19 # pending https://github.com/PowerShell/PowerShell/issues/481920 # $cimsession = New-RemoteSession -CimSession21 $null = New-Item -ItemType Directory -Path $modulePath22 Set-Content -Path $modulePath\testimport.psm1 -Value "function test-hello { 'world' }"23 New-ModuleManifest -Path $modulePath\testimport.psd1 -ModuleVersion 1.2.3 -RootModule testimport.psm1 -FunctionsToExport "test-hello" `24 -HelpInfoUri "https://help" -Guid (New-Guid)25 }26 }27 28 AfterAll {29 $global:PSDefaultParameterValues = $originalDefaultParameterValues30 if ($IsWindows -and !$pendingTest -and !$skipTest) {31 $pssession | Remove-PSSession -ErrorAction SilentlyContinue32 }33 34 Remove-Module TestImport -Force -ErrorAction SilentlyContinue35 }36 37 BeforeEach {38 Remove-Module TestImport -Force -ErrorAction SilentlyContinue39 }40 41 It "Import-Module can be called as an API with '<parameter>' = '<value>'" -TestCases @(42 @{parameter = "Global" ; value = $true},43 @{parameter = "Global" ; value = $false},44 @{parameter = "Prefix" ; value = "Hello"},45 @{parameter = "Name" ; value = "foo","bar"},46 @{parameter = "FullyQualifiedName" ; value = @{ModuleName='foo';RequiredVersion='0.0'},@{ModuleName='bar';RequiredVersion='1.1'}},47 @{parameter = "Assembly" ; script = { [System.AppDomain]::CurrentDomain.GetAssemblies() | Select-Object -First 2 }}48 @{parameter = "Function" ; value = "foo","bar"},49 @{parameter = "Cmdlet" ; value = "foo","bar"},50 @{parameter = "Variable" ; value = "foo","bar"},51 @{parameter = "Alias" ; value = "foo","bar"},52 @{parameter = "Force" ; value = $true},53 @{parameter = "Force" ; value = $false},54 @{parameter = "PassThru" ; value = $true},55 @{parameter = "PassThru" ; value = $false},56 @{parameter = "AsCustomObject" ; value = $true},57 @{parameter = "AsCustomObject" ; value = $false},58 @{parameter = "MinimumVersion" ; value = "1.2.3"},59 @{parameter = "MaximumVersion" ; value = "3.2.1"},60 @{parameter = "RequiredVersion" ; value = "1.1.1"},61 @{parameter = "ArgumentList" ; value = "hello","world"},62 @{parameter = "DisableNameChecking"; value = $true},63 @{parameter = "DisableNameChecking"; value = $false},64 @{parameter = "NoClobber" ; value = $true},65 @{parameter = "NoClobber" ; value = $false},66 @{parameter = "Scope" ; value = "Local"},67 @{parameter = "Scope" ; value = "Global"},68 @{parameter = "PSSession" ; value = $pssession},69 # @{parameter = "CimSession" ; value = $cimsession},70 @{parameter = "CimResourceUri" ; value = "http://foo/"},71 @{parameter = "CimNamespace" ; value = "foo"}72 ) {73 param($parameter, $value, $script)74 75 $importModuleCommand = [Microsoft.PowerShell.Commands.ImportModuleCommand]::new()76 if ($script -ne $null) {77 $value = & $script78 }79 $importModuleCommand.$parameter = $value80 if ($parameter -eq "FullyQualifiedName") {81 $importModuleCommand.FullyQualifiedName.Count | Should -BeExactly 282 $importModuleCommand.FullyQualifiedName | Should -BeOfType Microsoft.PowerShell.Commands.ModuleSpecification83 $importModuleCommand.FullyQualifiedName[0].Name | Should -BeExactly "foo"84 $importModuleCommand.FullyQualifiedName[0].RequiredVersion | Should -Be "0.0"85 $importModuleCommand.FullyQualifiedName[1].Name | Should -BeExactly "bar"86 $importModuleCommand.FullyQualifiedName[1].RequiredVersion | Should -Be "1.1"87 } else {88 $importModuleCommand.$parameter | Should -BeExactly $value89 }90 }91 92 It "Import-Module can import over remote session: <test>" -TestCases @(93 @{ test = "pssession" ; parameters = @{Name="TestImport";PSSession=$pssession}},94# @{ test = "cimsession" ; parameters = @{Name="TestImport";CimSession=$cimsession}},95 @{ test = "minimumversion" ; parameters = @{Name="TestImport";PSSession=$pssession;MinimumVersion="1.0";Force=$true}},96 @{ test = "requiredversion" ; parameters = @{Name="TestImport";PSSession=$pssession;RequiredVersion="1.2.3"}},97 @{ test = "maxiumversion" ; parameters = @{Name="TestImport";PSSession=$pssession;MaximumVersion="2.0"}},98 @{ test = "invalid miniumversion" ; parameters = @{Name="TestImport";PSSession=$pssession;MinimumVersion="2.0"};99 errorid = "Modules_ModuleWithVersionNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand,Microsoft.PowerShell.Commands.ImportModuleCommand"},100 @{ test = "invalid maximumversion" ; parameters = @{Name="TestImport";PSSession=$pssession;MaximumVersion="1.0"};101 errorid = "Modules_ModuleWithVersionNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand,Microsoft.PowerShell.Commands.ImportModuleCommand"},102 @{ test = "fullyqualifiedname" ; parameters = @{FullyQualifiedName=@{Modulename="TestImport"; RequiredVersion="1.2.3"};PSSession=$pssession}}103 ) {104 param ($test, $parameters, $errorid)105 106 Invoke-Command -Session $pssession -ScriptBlock { $env:PSModulePath += ";$(Split-Path $using:modulePath)"}107 Get-Module TestImport | Should -BeNullOrEmpty108 if ($errorid) {109 { Import-Module @parameters -ErrorAction Stop } | Should -Throw -ErrorId $errorid110 } else {111 Import-Module @parameters112 $module = Get-Module TestImport113 $module.Name | Should -BeExactly "TestImport"114 115 # generated proxy module always uses 1.0116 $module.Version | Should -BeExactly "1.0"117 118 test-hello | Should -BeExactly "world"119 }120 }121}122 