1
+ if (! (Get-Module PSScriptAnalyzer) -and ! $testingLibraryUsage )
2
+ {
3
+ Import-Module PSScriptAnalyzer
4
+ }
5
+
6
+ if ($testingLibraryUsage )
7
+ {
8
+ return
9
+ }
10
+
11
+ $directory = Split-Path - Parent $MyInvocation.MyCommand.Path
12
+ $violationFileName = ' MissingDSCResource.ps1'
13
+ $violationFilePath = Join-Path $directory $violationFileName
14
+
15
+ Describe " Resolve DSC Resource Dependency" {
16
+
17
+ Function Test-EnvironmentVariables ($oldEnv )
18
+ {
19
+ $newEnv = Get-Item Env:\* | Sort-Object - Property Key
20
+ $newEnv.Count | Should Be $oldEnv.Count
21
+ foreach ($index in 1 .. $newEnv.Count )
22
+ {
23
+ $newEnv [$index ].Key | Should Be $oldEnv [$index ].Key
24
+ $newEnv [$index ].Value | Should Be $oldEnv [$index ].Value
25
+ }
26
+ }
27
+
28
+ Context " Module handler class" {
29
+ $oldEnvVars = Get-Item Env:\* | Sort-Object - Property Key
30
+ $oldPSModulePath = $env: PSModulePath
31
+ It " Sets defaults correctly" {
32
+ $depHandler = [Microsoft.Windows.PowerShell.ScriptAnalyzer.Generic.ModuleDependencyHandler ]::new()
33
+
34
+ $expectedPath = [System.Environment ]::GetEnvironmentVariable(" TEMP" );
35
+ $depHandler.TempPath | Should Be $expectedPath
36
+
37
+ $expectedLocalAppDataPath = [System.Environment ]::GetEnvironmentVariable(" LOCALAPPDATA" );
38
+ $depHandler.LocalAppDataPath | Should Be $expectedLocalAppDataPath
39
+
40
+ $expectedModuleRepository = " PSGallery"
41
+ $depHandler.ModuleRepository | Should Be $expectedModuleRepository
42
+
43
+ $expectedPssaAppDataPath = Join-Path $depHandler.LocalAppDataPath " PSScriptAnalyzer"
44
+ $depHandler.PSSAAppDataPath | Should Be $expectedPssaAppDataPath
45
+
46
+ $expectedPSModulePath = $oldPSModulePath + [System.IO.Path ]::PathSeparator + $depHandler.TempModulePath
47
+ $env: PSModulePath | Should Be $expectedPSModulePath
48
+
49
+ $depHandler.Dispose ()
50
+ }
51
+
52
+ It " Keeps the environment variables unchanged" {
53
+ Test-EnvironmentVariables ($oldEnvVars )
54
+ }
55
+ }
56
+
57
+ Context " Invoke-ScriptAnalyzer without switch" {
58
+ It " Has parse errors" {
59
+ $dr = Invoke-ScriptAnalyzer - Path $violationFilePath - ErrorVariable parseErrors - ErrorAction SilentlyContinue
60
+ $parseErrors.Count | Should Be 1
61
+ }
62
+ }
63
+
64
+ Context " Invoke-ScriptAnalyzer with switch" {
65
+ $oldEnvVars = Get-Item Env:\* | Sort-Object - Property Key
66
+ $moduleName = " MyDscResource"
67
+ $modulePath = Join-Path (Join-Path (Join-Path (Split-Path $directory ) " Rules" ) " DSCResources" ) $moduleName
68
+ # Save the current environment variables
69
+ $oldLocalAppDataPath = $env: LOCALAPPDATA
70
+ $oldTempPath = $env: TEMP
71
+ $oldPSModulePath = $env: PSModulePath
72
+
73
+ # set the environment variables
74
+ $tempPath = Join-Path $oldTempPath ([guid ]::NewGUID()).ToString()
75
+ $newLocalAppDataPath = Join-Path $tempPath " LocalAppData"
76
+ $newTempPath = Join-Path $tempPath " Temp"
77
+ $env: LOCALAPPDATA = $newLocalAppDataPath
78
+ $env: TEMP = $newTempPath
79
+
80
+ # create the temporary directories
81
+ New-Item - Type Directory - Path $newLocalAppDataPath
82
+ New-Item - Type Directory - Path $newTempPath
83
+
84
+ # create and dispose module dependency handler object
85
+ # to setup the temporary module location
86
+ $depHandler = [Microsoft.Windows.PowerShell.ScriptAnalyzer.Generic.ModuleDependencyHandler ]::new()
87
+ $pssaAppDataPath = $depHandler.PSSAAppDataPath
88
+ $tempModulePath = $depHandler.TempModulePath
89
+ $depHandler.Dispose ()
90
+
91
+ # copy myresource module to the temporary location
92
+ # we could let the module dependency handler download it from psgallery
93
+ Copy-Item - Recurse - Path $modulePath - Destination $tempModulePath
94
+
95
+ It " Doesn't have parse errors" {
96
+ # invoke script analyzer
97
+ $dr = Invoke-ScriptAnalyzer - Path $violationFilePath - ErrorVariable parseErrors - ErrorAction SilentlyContinue
98
+ $dr.Count | Should Be 0
99
+ }
100
+
101
+ It " Keeps PSModulePath unchanged before and after invocation" {
102
+ $dr = Invoke-ScriptAnalyzer - Path $violationFilePath - ErrorVariable parseErrors - ErrorAction SilentlyContinue
103
+ $env: PSModulePath | Should Be $oldPSModulePath
104
+ }
105
+ # restore environment variables and clean up temporary location
106
+ $env: LOCALAPPDATA = $oldLocalAppDataPath
107
+ $env: TEMP = $oldTempPath
108
+ Remove-Item - Recurse - Path $tempModulePath
109
+ Remove-Item - Recurse - Path $tempPath
110
+
111
+ It " Keeps the environment variables unchanged" {
112
+ Test-EnvironmentVariables ($oldEnvVars )
113
+ }
114
+ }
115
+ }
0 commit comments