MegaBites-AI/Windows-powershell
0308
1# Copyright (c) Microsoft Corporation.2# Licensed under the MIT License.3 4# Recursively creates a module structure given a hashtable to describe it:5# - psd1 keys have values splatted to New-ModuleManifest6# - psm1 keys have values written to files7# - Other keys with hashtable values are treated as recursive module definitions8function New-ModuleFromLayout9{10 param(11 [Parameter(Mandatory=$true)]12 [hashtable]13 $Layout,14 15 [Parameter(Mandatory=$true)]16 [string]17 $BaseDir18 )19 20 if (-not (Test-Path $BaseDir))21 {22 $null = New-Item -Path $BaseDir -ItemType Directory23 }24 25 foreach ($item in $Layout.get_Keys())26 {27 $itemPath = Join-Path $BaseDir $item28 $ext = [System.IO.Path]::GetExtension($item)29 30 switch ($ext)31 {32 '.psd1'33 {34 $moduleParameters = $Layout[$item]35 New-ModuleManifest -Path $itemPath @moduleParameters36 break37 }38 39 { '.psm1','.ps1' -contains $_ }40 {41 $null = New-Item -Path $itemPath -Value $Layout[$item]42 break43 }44 45 default46 {47 if ($Layout[$item] -is [hashtable])48 {49 New-ModuleFromLayout -BaseDir $itemPath -Layout $Layout[$item]50 }51 break52 }53 }54 }55}56 57Describe "Manifest required module autoloading from module path with simple names" -Tags "CI" {58 BeforeAll {59 $prevModulePath = $env:PSModulePath60 $env:PSModulePath = ($TestDrive -as [string]) + [System.IO.Path]::PathSeparator + $env:PSModulePath61 62 $mainModule = 'mainmod'63 $requiredModule = 'reqmod'64 65 New-ModuleFromLayout -BaseDir $TestDrive -Layout @{66 $mainModule = @{67 "$mainModule.psd1" = @{68 RequiredModules = $requiredModule69 }70 }71 $requiredModule = @{72 "$requiredModule.psd1" = @{}73 }74 }75 }76 77 AfterAll {78 $env:PSModulePath = $prevModulePath79 Get-Module $mainModule,$requiredModule | Remove-Module80 }81 82 It "Importing main module loads required modules successfully" {83 $mainMod = Import-Module $mainModule -PassThru -ErrorAction Stop84 $reqMod = Get-Module -Name $requiredModule85 86 $mainMod.Name | Should -BeExactly $mainModule87 $mainMod.RequiredModules[0].Name | Should -Be $requiredModule88 $reqMod.Name | Should -BeExactly $requiredModule89 }90}91 92Describe "Manifest required module autoloading with relative path to dir" -Tags "CI" {93 BeforeAll {94 $mainModule = 'mainmod'95 $requiredModule = 'reqmod'96 97 $mainModPath = Join-Path $TestDrive $mainModule98 99 # Test to ensure that we treat backslashes as path separators on UNIX and vice-versa100 $altSep = [System.IO.Path]::AltDirectorySeparatorChar101 102 New-ModuleFromLayout -BaseDir $TestDrive -Layout @{103 $mainModule = @{104 "$mainModule.psd1" = @{105 RequiredModules = "..${altSep}$requiredModule"106 }107 }108 $requiredModule = @{109 "$requiredModule.psd1" = @{}110 }111 }112 }113 114 AfterAll {115 Get-Module $mainModule,$requiredModule | Remove-Module116 }117 118 It "Importing main module loads required modules successfully" {119 $mainMod = Import-Module $mainModPath -PassThru -ErrorAction Stop120 $reqMod = Get-Module -Name $requiredModule121 122 $mainMod.Name | Should -BeExactly $mainModule123 $mainMod.RequiredModules[0].Name | Should -Be $requiredModule124 $reqMod.Name | Should -BeExactly $requiredModule125 }126}127 128Describe "Manifest required module autoloading with relative path to manifest" -Tags "CI" {129 BeforeAll {130 $mainModule = 'mainmod'131 $requiredModule = 'reqmod'132 133 $mainModPath = Join-Path $TestDrive $mainModule "$mainModule.psd1"134 135 # Test to ensure that we treat backslashes as path separators on UNIX and vice-versa136 $altSep = [System.IO.Path]::AltDirectorySeparatorChar137 $sep = [System.IO.Path]::DirectorySeparatorChar138 139 New-ModuleFromLayout -BaseDir $TestDrive -Layout @{140 $mainModule = @{141 "$mainModule.psd1" = @{142 RequiredModules = "..${altSep}$requiredModule${sep}$requiredModule.psd1"143 }144 }145 $requiredModule = @{146 "$requiredModule.psd1" = @{}147 }148 }149 }150 151 AfterAll {152 Get-Module $mainModule,$requiredModule | Remove-Module153 }154 155 It "Importing main module loads required modules successfully" {156 $mainMod = Import-Module $mainModPath -PassThru -ErrorAction Stop157 $reqMod = Get-Module -Name $requiredModule158 159 $mainMod.Name | Should -BeExactly $mainModule160 $mainMod.RequiredModules[0].Name | Should -Be $requiredModule161 $reqMod.Name | Should -BeExactly $requiredModule162 }163}164 165Describe "Manifest required module autoloading with absolute path to dir" -Tags "CI" {166 BeforeAll {167 $mainModule = 'mainmod'168 $requiredModule = 'reqmod'169 170 $mainModPath = Join-Path $TestDrive $mainModule "$mainModule.psd1"171 172 # Test to ensure that we treat backslashes as path separators on UNIX and vice-versa173 $altSep = [System.IO.Path]::AltDirectorySeparatorChar174 $sep = [System.IO.Path]::DirectorySeparatorChar175 176 New-ModuleFromLayout -BaseDir $TestDrive -Layout @{177 $mainModule = @{178 "$mainModule.psd1" = @{179 RequiredModules = "$TestDrive${altSep}$requiredModule${sep}"180 }181 }182 $requiredModule = @{183 "$requiredModule.psd1" = @{}184 }185 }186 }187 188 AfterAll {189 Get-Module $mainModule,$requiredModule | Remove-Module190 }191 192 It "Importing main module loads required modules successfully" {193 $mainMod = Import-Module $mainModPath -PassThru -ErrorAction Stop194 $reqMod = Get-Module -Name $requiredModule195 196 $mainMod.Name | Should -BeExactly $mainModule197 $mainMod.RequiredModules[0].Name | Should -Be $requiredModule198 $reqMod.Name | Should -BeExactly $requiredModule199 }200}201 202Describe "Manifest required module autoloading with absolute path to manifest" -Tags "CI" {203 BeforeAll {204 $mainModule = 'mainmod'205 $requiredModule = 'reqmod'206 207 $mainModPath = Join-Path $TestDrive $mainModule "$mainModule.psd1"208 209 # Test to ensure that we treat backslashes as path separators on UNIX and vice-versa210 $altSep = [System.IO.Path]::AltDirectorySeparatorChar211 $sep = [System.IO.Path]::DirectorySeparatorChar212 213 New-ModuleFromLayout -BaseDir $TestDrive -Layout @{214 $mainModule = @{215 "$mainModule.psd1" = @{216 RequiredModules = "$TestDrive${altSep}$requiredModule${sep}$requiredModule.psd1"217 }218 }219 $requiredModule = @{220 "$requiredModule.psd1" = @{}221 }222 }223 }224 225 AfterAll {226 Get-Module $mainModule,$requiredModule | Remove-Module227 }228 229 It "Importing main module loads required modules successfully" {230 $mainMod = Import-Module $mainModPath -PassThru -ErrorAction Stop231 $reqMod = Get-Module -Name $requiredModule232 233 $mainMod.Name | Should -BeExactly $mainModule234 $mainMod.RequiredModules[0].Name | Should -Be $requiredModule235 $reqMod.Name | Should -BeExactly $requiredModule236 }237}238 