Tests/GenXdev.FileSystem/Rename-InProject.Tests.ps1
############################################################################### Pester\BeforeAll { $Script:testRoot = GenXdev.FileSystem\Expand-Path "$env:TEMP\GenXdev.FileSystem.Tests\" -CreateDirectory } Pester\AfterAll { $Script:testRoot = GenXdev.FileSystem\Expand-Path "$env:TEMP\GenXdev.FileSystem.Tests\" -CreateDirectory # cleanup test folder GenXdev.FileSystem\Remove-AllItems $Script:testRoot -DeleteFolder } ############################################################################### Pester\Describe 'Rename-InProject' { Pester\It 'Should pass PSScriptAnalyzer rules' { # get the script path for analysis $scriptPath = GenXdev.FileSystem\Expand-Path "$PSScriptRoot\..\..\Functions\GenXdev.FileSystem\Rename-InProject.ps1" # run analyzer with explicit settings $analyzerResults = GenXdev.Coding\Invoke-GenXdevScriptAnalyzer ` -Path $scriptPath [string] $message = '' $analyzerResults | Microsoft.PowerShell.Core\ForEach-Object { $message = $message + @" -------------------------------------------------- Rule: $($_.RuleName)` Description: $($_.Description) Message: $($_.Message) `r`n "@ } $analyzerResults.Count | Pester\Should -Be 0 -Because @" The following PSScriptAnalyzer rules are being violated: $message "@; } Pester\BeforeAll { Microsoft.PowerShell.Management\Push-Location $Script:testRoot } Pester\AfterAll { Microsoft.PowerShell.Management\Pop-Location GenXdev.FileSystem\Remove-AllItems $Script:testRoot -DeleteFolder } Pester\BeforeEach { # Setup test directory structure $Script:testDir = Microsoft.PowerShell.Management\Join-Path $Script:testRoot 'rename-test' Microsoft.PowerShell.Management\New-Item -Path $Script:testDir -ItemType Directory -Force # Create test files with content using Unix-style line endings $Script:files = @{ 'oldfile.txt' = 'This is oldtext in a file' 'subdir/nested.txt' = 'More oldtext content' 'OldName/test.txt' = 'oldtext in subdirectory' } foreach ($file in $Script:files.Keys) { $path = Microsoft.PowerShell.Management\Join-Path $Script:testDir $file Microsoft.PowerShell.Management\New-Item -Path (Microsoft.PowerShell.Management\Split-Path $path) -ItemType Directory -Force # Use Set-Content with -NoNewline to avoid adding line endings Microsoft.PowerShell.Management\Set-Content -Path $path -Value $Script:files[$file] -NoNewline } Microsoft.PowerShell.Management\Push-Location $Script:testDir } Pester\AfterEach { Microsoft.PowerShell.Management\Pop-Location Microsoft.PowerShell.Management\Remove-Item -Path (Microsoft.PowerShell.Management\Join-Path $Script:testRoot 'rename-test') -Recurse -Force -ErrorAction SilentlyContinue } Pester\It 'Replaces text content in files' { GenXdev.FileSystem\Rename-InProject -Source .\ -FindText 'oldtext' -ReplacementText 'newtext' # Trim any line endings when comparing content $content = (Microsoft.PowerShell.Management\Get-Content 'oldfile.txt' -Raw).TrimEnd() $content | Pester\Should -Be 'This is newtext in a file' $nestedContent = (Microsoft.PowerShell.Management\Get-Content 'subdir/nested.txt' -Raw).TrimEnd() $nestedContent | Pester\Should -Be 'More newtext content' } Pester\It 'Renames files containing search text' { GenXdev.FileSystem\Rename-InProject -Source .\ -FindText 'old' -ReplacementText 'new' Microsoft.PowerShell.Management\Test-Path 'newfile.txt' | Pester\Should -BeTrue Microsoft.PowerShell.Management\Test-Path 'oldfile.txt' | Pester\Should -BeFalse } Pester\It 'Renames directories containing search text' { GenXdev.FileSystem\Rename-InProject -Source . -FindText 'OldName' -ReplacementText 'NewName' Microsoft.PowerShell.Management\Test-Path 'NewName' | Pester\Should -BeTrue Microsoft.PowerShell.Management\Test-Path 'OldName' | Pester\Should -BeFalse Microsoft.PowerShell.Management\Test-Path 'NewName/test.txt' | Pester\Should -BeTrue } Pester\It 'Performs no changes in WhatIf mode' { GenXdev.FileSystem\Rename-InProject -Source . -FindText 'oldtext' -ReplacementText 'newtext' -WhatIf $content = (Microsoft.PowerShell.Management\Get-Content 'oldfile.txt' -Raw).TrimEnd() $content | Pester\Should -Be 'This is oldtext in a file' Microsoft.PowerShell.Management\Test-Path 'oldfile.txt' | Pester\Should -BeTrue } Pester\It 'Skips binary files' { # Create a fake binary file $binPath = 'test.exe' [byte[]]$bytes = 1..10 [System.IO.File]::WriteAllBytes((Microsoft.PowerShell.Management\Join-Path $Script:testDir $binPath), $bytes) GenXdev.FileSystem\Rename-InProject -Source . -FindText 'old' -ReplacementText 'new' # Binary file Should remain unchanged Microsoft.PowerShell.Management\Test-Path $binPath | Pester\Should -BeTrue $newBytes = [System.IO.File]::ReadAllBytes((Microsoft.PowerShell.Management\Join-Path $Script:testDir $binPath)) $newBytes | Pester\Should -Be $bytes } } |