DSCResources/MSFT_xTokenize/MSFT_xTokenize.Tests.ps1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 |
$module = (Split-Path -Leaf $PSCommandPath).Replace(".Tests.ps1", ".psm1") $code = Get-Content $module | Out-String # You have to comment out the Export-ModuleMember line or you will get an # error. $code = $code -replace "Export-ModuleMember", "# Export-ModuleMember" # Load the contents of the module into memory so we can test the code. Invoke-Expression $code Describe "Test Directory" { # Mock methods that are already tested Mock GetFiles { @{FullName="z:\web.config"} } Mock ProcessFile { } Context "finds single file but no token file" { Mock TestSingleFile { $false } It "should return false" { $tokens = @{place="World"} TestDirectory -path "z:\" -filter "*.config" -tokens $tokens -useTokenFiles $true | Should Be $false Assert-MockCalled TestSingleFile -Exactly 1 } } } Describe "Test Single File" { Mock Get-Content { "Hello __place__" } -ParameterFilter { $Path -eq "z:\web.config.token" } Mock Get-Item { @{Attributes=[System.IO.FileAttributes]::ReadOnly -bor [System.IO.FileAttributes]::Archive; FullName="z:\web.config"} } Mock Set-Content { $args.GetValue(1) | Should Be "Hello World" } Mock Test-Path { $true } -ParameterFilter { $Path -eq "z:\web.config.token" } $tokens = @{place="World"} Context "is passed path to a file not processed" { Mock Get-Content { "Hello PowerShell" } -ParameterFilter { $Path -eq "z:\web.config" } It "should return false" { TestSingleFile -path "z:\web.config.token" -tokens $tokens -useTokenFiles $true | Should Be $false } } Context "is passed path to a processed file" { Mock Get-Content { "Hello World" } -ParameterFilter { $Path -eq "z:\web.config" } It "should return true" { TestSingleFile -path "z:\web.config" -tokens $tokens -useTokenFiles $true | Should Be $true } } Context "is passed path to a processed file but token file is missing" { Mock Get-Content { "Hello World" } -ParameterFilter { $Path -eq "z:\web.config" } It "should return true" { Mock Test-Path { $false } -ParameterFilter { $Path -eq "z:\web.config.token" } TestSingleFile -path "z:\web.config" -tokens $tokens -useTokenFiles $true | Should Be $true } } Context "is passed path to a processed file not using token files" { Mock Get-Content { "Hello World" } -ParameterFilter { $Path -eq "z:\web.config" } Mock Test-Path { $true } -ParameterFilter { $Path -eq "z:\web.config" } It "should return true" { TestSingleFile -path "z:\web.config" -tokens $tokens | Should Be $true Assert-MockCalled Test-Path -Exactly 1 } } Context "is passed path to an unprocessed file not using token files" { Mock Test-Path { $true } -ParameterFilter { $Path -eq "z:\web.config" } Mock Get-Content { "Hello __place__" } -ParameterFilter { $Path -eq "z:\web.config" } It "should return false" { TestSingleFile -path "z:\web.config" -tokens $tokens | Should Be $false Assert-MockCalled Test-Path -Exactly 1 } } } Describe "Process Directory" { # Mock methods that are already tested Mock GetFiles { @{FullName="z:\web.config"} } Mock ProcessFile { } Context "is passed path, filter, tokens and useTokenFiles switch" { It "process 1 file" { $tokens = @{place="World"} ProcessDirectory -path "z:\" -filter "*.config" -tokens $tokens -useTokenFiles $true Assert-MockCalled GetFiles -Exactly 1 Assert-MockCalled ProcessFile -Exactly 1 } } } Describe "Process Single File" { Mock Get-Content { "Hello __place__" } Mock Get-Item { @{Attributes=[System.IO.FileAttributes]::ReadOnly -bor [System.IO.FileAttributes]::Archive; FullName="z:\web.config"} } Mock Set-Content { $args.GetValue(1) | Should Be "Hello World" } Context "is passed file, tokens and useTokenFiles switch" { Mock Test-Path { $true } -ParameterFilter { $Path -eq "z:\web.config.token" } It "saves file" { $tokens = @{place="World"} ProcessSingleFile -path "z:\web.config" -tokens $tokens -useTokenFiles $true Assert-MockCalled Get-Item -Exactly 2 Assert-MockCalled Get-Content -Exactly 1 Assert-MockCalled Set-Content -Exactly 1 } } Context "is passed file, tokens and useTokenFiles switch but token file does not exist" { # Token file should not be found so return false Mock Test-Path { $false } It "should write error" { $tokens = @{place="World"} ProcessSingleFile -path "z:\web.config" -tokens $tokens -useTokenFiles $true Assert-MockCalled Get-Item -Exactly 1 Assert-MockCalled Get-Content -Exactly 0 Assert-MockCalled Set-Content -Exactly 0 } } } Describe "Process File" { Mock Get-Content { "Hello __place__" } Mock Get-Item { @{Attributes=[System.IO.FileAttributes]::ReadOnly -bor [System.IO.FileAttributes]::Archive} } Mock Set-Content { $args.GetValue(1) | Should Be "Hello World" } Context "is passed file and tokens" { It "saves file" { $tokens = @{place="World"} ProcessFile -path "web.config.token" -tokens $tokens Assert-MockCalled Get-Item -Exactly 1 Assert-MockCalled Get-Content -Exactly 1 Assert-MockCalled Set-Content -Exactly 1 } } } Describe "Get Files" { # When Test-Path is called to see if there is a .token return false Mock Test-Path { $false } Context "is passed UseTokenFiles on empty folder" { It "returns nothing" { Mock Get-ChildItem { } GetFiles -useTokenFiles $true | Should Be $null Assert-MockCalled Test-Path -Exactly 0 } } Context "is passed UseTokenFiles on a folder without token file" { It "returns no file" { # Arrange # Return web.config for the initial call to Get-ChildItem Mock Get-ChildItem { } # Act # Assert GetFiles -useTokenFiles $true | Should Be $null Assert-MockCalled Test-Path -Exactly 0 } } Context "is passed UseTokenFiles on a folder with token file" { It "returns one file" { # Return web.config for the initial call to Get-ChildItem Mock Get-ChildItem { @{FullName="z:\web.config.token"} } (GetFiles -useTokenFiles $true).Count | Should Be 1 } } Context "is not passed UseTokenFiles on a folder without token file" { It "returns one file" { # Return web.config for the initial call to Get-ChildItem Mock Get-ChildItem { @{FullName="z:\web.config"} } (GetFiles).Count | Should Be 1 Assert-MockCalled Test-Path -Exactly 0 } } Context "is not passed UseTokenFiles on a folder with token file" { It "returns one file" { # Return web.config for the initial call to Get-ChildItem Mock Get-ChildItem { @{FullName="z:\web.config"} } # When Test-Path is called to see if there is a .token return true Mock Test-Path { $true } -ParameterFilter { $Path -eq "z:\web.config.token" } (GetFiles).Count | Should Be 1 Assert-MockCalled Test-Path -Exactly 0 } } } Describe "Replace Tokens" { Context "gets an empty string" { It "returns an empty string" { $contents = "" $tokens = @{} $expected = "" ReplaceTokens $contents $tokens | Should Be $expected } } Context "gets null tokens parameter" { It "returns the original string" { $contents = "Hello __place__" $tokens = $null $expected = "Hello __place__" ReplaceTokens $contents $tokens | Should Be $expected } } Context "gets an empty tokens parameter" { It "returns the original string" { $contents = "Hello __place__" $tokens = @{} $expected = "Hello __place__" ReplaceTokens $contents $tokens | Should Be $expected } } Context "has tokens to replace" { It "returns a transformed string" { $contents = "Hello __place__" $tokens = @{place = "World"} $expected = "Hello World" ReplaceTokens $contents $tokens | Should Be $expected } } } Describe "Remove Read Only Attribute" { Context "is passed ReadOnly | Archive and ReadOnly" { It "returns Archive" { $attributes = [System.IO.FileAttributes]::ReadOnly -bor [System.IO.FileAttributes]::Archive $expected = [System.IO.FileAttributes]::Archive RemoveReadyOnlyAttribute $attributes | Should Be $expected } } Context "is passed ReadOnly | Archive | System and ReadOnly" { It "returns Archive | System" { $attributes = [System.IO.FileAttributes]::ReadOnly -bor [System.IO.FileAttributes]::Archive -bor [System.IO.FileAttributes]::System $expected = [System.IO.FileAttributes]::Archive -bor [System.IO.FileAttributes]::System RemoveReadyOnlyAttribute $attributes | Should Be $expected } } } |