mirror of
https://github.com/PowerShell/PSDscResources
synced 2026-06-21 13:45:29 +00:00
755 lines
39 KiB
PowerShell
755 lines
39 KiB
PowerShell
$errorActionPreference = 'Stop'
|
|
Set-StrictMode -Version 'Latest'
|
|
|
|
if ($PSVersionTable.PSVersion -lt [Version] '5.1')
|
|
{
|
|
Write-Warning -Message 'Cannot run PSDscResources integration tests on PowerShell versions lower than 5.1'
|
|
return
|
|
}
|
|
|
|
Describe 'Archive Integration Tests' {
|
|
BeforeAll {
|
|
# Import CommonTestHelper for Enter-DscResourceTestEnvironment, Exit-DscResourceTestEnvironment
|
|
$testsFolderFilePath = Split-Path $PSScriptRoot -Parent
|
|
$testHelperFolderFilePath = Join-Path -Path $testsFolderFilePath -ChildPath 'TestHelpers'
|
|
$commonTestHelperFilePath = Join-Path -Path $testHelperFolderFilePath -ChildPath 'CommonTestHelper.psm1'
|
|
Import-Module -Name $commonTestHelperFilePath
|
|
|
|
$script:testEnvironment = Enter-DscResourceTestEnvironment `
|
|
-DscResourceModuleName 'PSDscResources' `
|
|
-DscResourceName 'MSFT_Archive' `
|
|
-TestType 'Unit'
|
|
|
|
# Import archive test helper for New-ZipFileFromHashtable, Test-FileStructuresMatch
|
|
$archiveTestHelperFilePath = Join-Path -Path $testHelperFolderFilePath -ChildPath 'MSFT_Archive.TestHelper.psm1'
|
|
Import-Module -Name $archiveTestHelperFilePath
|
|
}
|
|
|
|
AfterAll {
|
|
$null = Exit-DscResourceTestEnvironment -TestEnvironment $script:testEnvironment
|
|
}
|
|
|
|
Context 'When expanding a basic archive' {
|
|
$zipFileName = 'BasicArchive1'
|
|
$subfolderName = 'Folder1'
|
|
|
|
$zipFileStructure = @{
|
|
$subfolderName = @{
|
|
File1 = 'Fake file contents'
|
|
}
|
|
}
|
|
|
|
$zipFilePath = New-ZipFileFromHashtable -Name $zipFileName -ParentPath $TestDrive -ZipFileStructure $zipFileStructure
|
|
$zipFileSourcePath = $zipFilePath.Replace('.zip', '')
|
|
|
|
$destinationDirectoryName = 'ExpandBasicArchive'
|
|
$destinationDirectoryPath = Join-Path -Path $TestDrive -ChildPath $destinationDirectoryName
|
|
|
|
It 'File structure and contents of the destination should not match the file structure and contents of the archive before Set-TargetResource' {
|
|
Test-FileStructuresMatch -SourcePath $zipFileSourcePath -DestinationPath $destinationDirectoryPath -CheckContents | Should -BeFalse
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return false before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeFalse
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return true before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeTrue
|
|
}
|
|
|
|
It 'Set-TargetResource should not throw' {
|
|
{ Set-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath } | Should -Not -Throw
|
|
}
|
|
|
|
It 'File structure and contents of the destination should match the file structure and contents of the archive after Set-TargetResource' {
|
|
Test-FileStructuresMatch -SourcePath $zipFileSourcePath -DestinationPath $destinationDirectoryPath -CheckContents | Should -BeTrue
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return true after Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeTrue
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return false after Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeFalse
|
|
}
|
|
}
|
|
|
|
Context 'When removing a basic archive' {
|
|
$zipFileName = 'BasicArchive2'
|
|
$subfolderName = 'Folder1'
|
|
|
|
$zipFileStructure = @{
|
|
$subfolderName = @{
|
|
File1 = 'Fake file contents'
|
|
}
|
|
}
|
|
|
|
$zipFilePath = New-ZipFileFromHashtable -Name $zipFileName -ParentPath $TestDrive -ZipFileStructure $zipFileStructure
|
|
$zipFileSourcePath = $zipFilePath.Replace('.zip', '')
|
|
|
|
$destinationDirectoryName = 'RemoveBasicArchive'
|
|
$destinationDirectoryPath = Join-Path -Path $TestDrive -ChildPath $destinationDirectoryName
|
|
|
|
$null = Expand-Archive -Path $zipFilePath -DestinationPath $destinationDirectoryPath -Force
|
|
|
|
It 'File structure and contents of the destination should match the file structure and contents of the archive before Set-TargetResource' {
|
|
Test-FileStructuresMatch -SourcePath $zipFileSourcePath -DestinationPath $destinationDirectoryPath -CheckContents | Should -BeTrue
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return true before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeTrue
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return false before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeFalse
|
|
}
|
|
|
|
It 'Set-TargetResource should not throw' {
|
|
{ Set-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath } | Should -Not -Throw
|
|
}
|
|
|
|
It 'File structure and contents of the destination should not match the file structure and contents of the archive after Set-TargetResource' {
|
|
Test-FileStructuresMatch -SourcePath $zipFileSourcePath -DestinationPath $destinationDirectoryPath -CheckContents | Should -BeFalse
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return false after Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeFalse
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return true after Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeTrue
|
|
}
|
|
}
|
|
|
|
Context 'When expanding an archive with nested directories' {
|
|
$zipFileName = 'NestedArchive1'
|
|
|
|
$zipFileStructure = @{
|
|
Folder1 = @{}
|
|
Folder2 = @{
|
|
Folder21 = @{
|
|
Folder22 = @{
|
|
Folder23 = @{}
|
|
}
|
|
}
|
|
}
|
|
Folder3 = @{
|
|
Folder31 = @{
|
|
Folder31 = @{
|
|
Folder33 = @{
|
|
Folder34 = @{
|
|
File31 = 'Fake file contents'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Folder4 = @{
|
|
Folder41 = @{
|
|
Folder42 = @{
|
|
Folder43 = @{
|
|
Folder44 = @{}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
File1 = 'Fake file contents'
|
|
File2 = 'Fake file contents'
|
|
}
|
|
|
|
$zipFilePath = New-ZipFileFromHashtable -Name $zipFileName -ParentPath $TestDrive -ZipFileStructure $zipFileStructure
|
|
$zipFileSourcePath = $zipFilePath.Replace('.zip', '')
|
|
|
|
$destinationDirectoryName = 'ExpandNestedArchive'
|
|
$destinationDirectoryPath = Join-Path -Path $TestDrive -ChildPath $destinationDirectoryName
|
|
|
|
It 'File structure and contents of the destination should not match the file structure and contents of the archive before Set-TargetResource' {
|
|
Test-FileStructuresMatch -SourcePath $zipFileSourcePath -DestinationPath $destinationDirectoryPath -CheckContents | Should -BeFalse
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return false before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeFalse
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return true before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeTrue
|
|
}
|
|
|
|
It 'Set-TargetResource should not throw' {
|
|
{ Set-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath } | Should -Not -Throw
|
|
}
|
|
|
|
It 'File structure and contents of the destination should match the file structure and contents of the archive after Set-TargetResource' {
|
|
Test-FileStructuresMatch -SourcePath $zipFileSourcePath -DestinationPath $destinationDirectoryPath -CheckContents | Should -BeTrue
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return true after Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeTrue
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return false after Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeFalse
|
|
}
|
|
}
|
|
|
|
Context 'When removing an archive with nested directories' {
|
|
$zipFileName = 'NestedArchive2'
|
|
|
|
$zipFileStructure = @{
|
|
Folder1 = @{}
|
|
Folder2 = @{
|
|
Folder21 = @{
|
|
Folder22 = @{
|
|
Folder23 = @{}
|
|
}
|
|
}
|
|
}
|
|
Folder3 = @{
|
|
Folder31 = @{
|
|
Folder31 = @{
|
|
Folder33 = @{
|
|
Folder34 = @{
|
|
File31 = 'Fake file contents'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Folder4 = @{
|
|
Folder41 = @{
|
|
Folder42 = @{
|
|
Folder43 = @{
|
|
Folder44 = @{}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
File1 = 'Fake file contents'
|
|
File2 = 'Fake file contents'
|
|
}
|
|
|
|
$zipFilePath = New-ZipFileFromHashtable -Name $zipFileName -ParentPath $TestDrive -ZipFileStructure $zipFileStructure
|
|
$zipFileSourcePath = $zipFilePath.Replace('.zip', '')
|
|
|
|
$destinationDirectoryName = 'RemoveNestedArchive'
|
|
$destinationDirectoryPath = Join-Path -Path $TestDrive -ChildPath $destinationDirectoryName
|
|
|
|
$null = Expand-Archive -Path $zipFilePath -DestinationPath $destinationDirectoryPath -Force
|
|
|
|
It 'File structure and contents of the destination should match the file structure and contents of the archive before Set-TargetResource' {
|
|
Test-FileStructuresMatch -SourcePath $zipFileSourcePath -DestinationPath $destinationDirectoryPath -CheckContents | Should -BeTrue
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return true before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeTrue
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return false before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeFalse
|
|
}
|
|
|
|
It 'Set-TargetResource should not throw' {
|
|
{ Set-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath } | Should -Not -Throw
|
|
}
|
|
|
|
It 'File structure and contents of the destination should not match the file structure and contents of the archive after Set-TargetResource' {
|
|
Test-FileStructuresMatch -SourcePath $zipFileSourcePath -DestinationPath $destinationDirectoryPath -CheckContents | Should -BeFalse
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return false after Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeFalse
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return true after Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeTrue
|
|
}
|
|
}
|
|
|
|
Context 'When expanding an archive when another archive with the same timestamp exists in the same folder' {
|
|
$zipFileName1 = 'SameTimestamp1'
|
|
|
|
$zipFileStructure1 = @{
|
|
Folder1 = @{
|
|
File1 = 'Fake file contents'
|
|
}
|
|
}
|
|
|
|
$zipFilePath1 = New-ZipFileFromHashtable -Name $zipFileName1 -ParentPath $TestDrive -ZipFileStructure $zipFileStructure1
|
|
$zipFileSourcePath1 = $zipFilePath1.Replace('.zip', '')
|
|
|
|
$zipFileName2 = 'SameTimestamp2'
|
|
|
|
$zipFileStructure2 = @{
|
|
Folder2 = @{
|
|
File2 = 'Fake file contents'
|
|
}
|
|
}
|
|
|
|
$zipFilePath2 = New-ZipFileFromHashtable -Name $zipFileName2 -ParentPath $TestDrive -ZipFileStructure $zipFileStructure2
|
|
|
|
$currentTimestamp = Get-Date
|
|
$null = Set-ItemProperty -Path $zipFilePath1 -Name 'LastWriteTime' -Value $currentTimestamp
|
|
$null = Set-ItemProperty -Path $zipFilePath2 -Name 'LastWriteTime' -Value $currentTimestamp
|
|
|
|
$destinationDirectoryName = 'ArchiveWithMatchingTimeStampDestination'
|
|
$destinationDirectoryPath = Join-Path -Path $TestDrive -ChildPath $destinationDirectoryName
|
|
|
|
It 'File structure and contents of the destination should not match the file structure and contents of the archive before Set-TargetResource' {
|
|
Test-FileStructuresMatch -SourcePath $zipFileSourcePath1 -DestinationPath $destinationDirectoryPath -CheckContents | Should -BeFalse
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return false for specified archive before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath1 -Destination $destinationDirectoryPath | Should -BeFalse
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return true for specified archive before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath1 -Destination $destinationDirectoryPath | Should -BeTrue
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return false for other archive with same timestamp with before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath2 -Destination $destinationDirectoryPath | Should -BeFalse
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return true for other archive with same timestamp before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath2 -Destination $destinationDirectoryPath | Should -BeTrue
|
|
}
|
|
|
|
It 'Set-TargetResource should not throw' {
|
|
{ Set-TargetResource -Ensure 'Present' -Path $zipFilePath1 -Destination $destinationDirectoryPath } | Should -Not -Throw
|
|
}
|
|
|
|
It 'File structure and contents of the destination should match the file structure and contents of the archive after Set-TargetResource' {
|
|
Test-FileStructuresMatch -SourcePath $zipFileSourcePath1 -DestinationPath $destinationDirectoryPath -CheckContents | Should -BeTrue
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return true for specified archive after Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath1 -Destination $destinationDirectoryPath | Should -BeTrue
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return false for specified archive after Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath1 -Destination $destinationDirectoryPath | Should -BeFalse
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return false for other archive with same timestamp with before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath2 -Destination $destinationDirectoryPath | Should -BeFalse
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return true for other archive with same timestamp before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath2 -Destination $destinationDirectoryPath | Should -BeTrue
|
|
}
|
|
}
|
|
|
|
Context 'When removing an archive with an extra file in a nested directory' {
|
|
$zipFileName = 'NestedArchiveWithAdd'
|
|
|
|
$zipFileStructure = @{
|
|
Folder1 = @{
|
|
Folder11 = @{
|
|
Folder12 = @{
|
|
Folder13 = @{
|
|
Folder14 = @{
|
|
File11 = 'Fake file contents'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
File1 = 'Fake file contents'
|
|
File2 = 'Fake file contents'
|
|
}
|
|
|
|
$zipFilePath = New-ZipFileFromHashtable -Name $zipFileName -ParentPath $TestDrive -ZipFileStructure $zipFileStructure
|
|
$zipFileSourcePath = $zipFilePath.Replace('.zip', '')
|
|
|
|
$destinationDirectoryName = 'RemoveArchiveWithExtra'
|
|
$destinationDirectoryPath = Join-Path -Path $TestDrive -ChildPath $destinationDirectoryName
|
|
|
|
$null = Expand-Archive -Path $zipFilePath -DestinationPath $destinationDirectoryPath -Force
|
|
|
|
$newFilePath = "$destinationDirectoryPath\Folder1\Folder11\Folder12\AddedFile"
|
|
$null = New-Item -Path $newFilePath -ItemType 'File'
|
|
$null = Set-Content -Path $newFilePath -Value 'Fake text'
|
|
|
|
It 'File structure and contents of the destination should match the file structure and contents of the archive before Set-TargetResource' {
|
|
Test-FileStructuresMatch -SourcePath $zipFileSourcePath -DestinationPath $destinationDirectoryPath -CheckContents | Should -BeTrue
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return true before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeTrue
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return false before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeFalse
|
|
}
|
|
|
|
It 'Extra file should be present before Set-TargetResource' {
|
|
Test-Path -Path $newFilePath | Should -BeTrue
|
|
}
|
|
|
|
It 'Set-TargetResource should not throw' {
|
|
{ Set-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath } | Should -Not -Throw
|
|
}
|
|
|
|
It 'File structure and contents of the destination should not match the file structure and contents of the archive after Set-TargetResource' {
|
|
Test-FileStructuresMatch -SourcePath $zipFileSourcePath -DestinationPath $destinationDirectoryPath -CheckContents | Should -BeFalse
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return false after Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeFalse
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return true after Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath | Should -BeTrue
|
|
}
|
|
|
|
It 'Extra file should be present after Set-TargetResource' {
|
|
Test-Path -Path $newFilePath | Should -BeTrue
|
|
}
|
|
}
|
|
|
|
$possibleChecksumValues = @( 'SHA-1', 'SHA-256', 'SHA-512', 'CreatedDate', 'ModifiedDate' )
|
|
|
|
$zipFileName = 'ChecksumWithModifiedFile'
|
|
$fileToEditName = 'File1'
|
|
$fileNotToEditName = 'File2'
|
|
|
|
$zipFileStructure = @{
|
|
$fileToEditName = 'Fake file contents'
|
|
$fileNotToEditName = 'Fake file contents'
|
|
}
|
|
|
|
$zipFilePath = New-ZipFileFromHashtable -Name $zipFileName -ParentPath $TestDrive -ZipFileStructure $zipFileStructure
|
|
$zipFileSourcePath = $zipFilePath.Replace('.zip', '')
|
|
|
|
foreach ($possibleChecksumValue in $possibleChecksumValues)
|
|
{
|
|
Context "When expanding an archive with an edited file, Validate and Force specified, and Checksum specified as $possibleChecksumValue" {
|
|
$destinationDirectoryName = 'ExpandModifiedArchiveWithCheck'
|
|
$destinationDirectoryPath = Join-Path -Path $TestDrive -ChildPath $destinationDirectoryName
|
|
|
|
$null = Expand-Archive -Path $zipFilePath -DestinationPath $destinationDirectoryPath -Force
|
|
|
|
# This foreach loop with the Open-Archive call is needed to set the timestamps of the files at the destination correctly
|
|
$destinationChildItems = Get-ChildItem -Path $destinationDirectoryPath -Recurse -File
|
|
|
|
foreach ($destinationChildItem in $destinationChildItems)
|
|
{
|
|
$correspondingZipItemPath = $destinationChildItem.FullName.Replace($destinationDirectoryPath + '\', '')
|
|
$archive = Open-Archive -Path $zipFilePath
|
|
|
|
try
|
|
{
|
|
$matchingArchiveEntry = $archive.Entries | Where-Object -FilterScript {
|
|
$_.FullName -eq $correspondingZipItemPath
|
|
}
|
|
$archiveEntryLastWriteTime = $matchingArchiveEntry.LastWriteTime.DateTime
|
|
}
|
|
finally
|
|
{
|
|
$null = $archive.Dispose()
|
|
}
|
|
|
|
$null = Set-ItemProperty -Path $destinationChildItem.FullName -Name 'CreationTime' -Value $archiveEntryLastWriteTime
|
|
$null = Set-ItemProperty -Path $destinationChildItem.FullName -Name 'LastWriteTime' -Value $archiveEntryLastWriteTime
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return true before file edit' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath -Validate $true -Checksum $possibleChecksumValue | Should -BeTrue
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return false before file edit' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath -Validate $true -Checksum $possibleChecksumValue | Should -BeFalse
|
|
}
|
|
|
|
$fileToEditPath = Join-Path -Path $destinationDirectoryPath -ChildPath $fileToEditName
|
|
|
|
It 'File to edit should exist at the destination before Set-TargetResource' {
|
|
Test-Path -Path $fileToEditPath | Should -BeTrue
|
|
}
|
|
|
|
$fileBeforeEdit = Get-Item -Path $fileToEditPath
|
|
$lastWriteTimeBeforeEdit = $fileBeforeEdit.LastWriteTime
|
|
|
|
$null = Set-Content -Path $fileToEditPath -Value 'Different false text' -Force
|
|
Set-ItemProperty -Path $fileToEditPath -Name 'LastWriteTime' -Value ([System.DateTime]::MaxValue)
|
|
Set-ItemProperty -Path $fileToEditPath -Name 'CreationTime' -Value ([System.DateTime]::MaxValue)
|
|
|
|
$fileAfterEdit = Get-Item -Path $fileToEditPath
|
|
|
|
It 'Edited file at the destination should have different content than the same file in the archive before Set-TargetResource' {
|
|
Get-Content -Path $fileToEditPath -Raw | Should -Not -Be ($zipFileStructure[$fileToEditName] + "`r`n")
|
|
}
|
|
|
|
It 'Edited file at the destination should have different last write time than the same file in the archive before Set-TargetResource' {
|
|
$fileAfterEdit.LastWriteTime | Should -Not -Be $lastWriteTimeBeforeEdit
|
|
}
|
|
|
|
It 'Edited file at the destination should have different creation time than the last write time of the the same file in the archive before Set-TargetResource' {
|
|
$fileAfterEdit.CreationTime | Should -Not -Be $lastWriteTimeBeforeEdit
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return false before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath -Validate $true -Checksum $possibleChecksumValue | Should -BeFalse
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return true before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath -Validate $true -Checksum $possibleChecksumValue | Should -BeTrue
|
|
}
|
|
|
|
It 'File structure and contents of the destination should not match the file structure and contents of the archive before Set-TargetResource' {
|
|
Test-FileStructuresMatch -SourcePath $zipFileSourcePath -DestinationPath $destinationDirectoryPath -CheckContents | Should -BeFalse
|
|
}
|
|
|
|
It 'Set-TargetResource should not throw' {
|
|
{ Set-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath -Validate $true -Checksum $possibleChecksumValue -Force $true } | Should -Not -Throw
|
|
}
|
|
|
|
$fileAfterSetTargetResource = Get-Item -Path $fileToEditPath
|
|
|
|
It 'Edited file should exist at the destination after Set-TargetResource' {
|
|
Test-Path -Path $fileToEditPath | Should -BeTrue
|
|
}
|
|
|
|
It 'Edited file at the destination should have the same content as the same file in the archive after Set-TargetResource' {
|
|
Get-Content -Path $fileToEditPath -Raw | Should -Be ($zipFileStructure[$fileToEditName] + "`r`n")
|
|
}
|
|
|
|
It 'Edited file at the destination should have the same last write time as the same file in the archive after Set-TargetResource' {
|
|
$fileAfterSetTargetResource.LastWriteTime | Should -Be $lastWriteTimeBeforeEdit
|
|
}
|
|
|
|
It 'Edited file at the destination should have the same creation time as last write time of the the same file in the archive after Set-TargetResource' {
|
|
$fileAfterSetTargetResource.CreationTime | Should -Be $lastWriteTimeBeforeEdit
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return true after Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath -Validate $true -Checksum $possibleChecksumValue | Should -BeTrue
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return false after Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath -Validate $true -Checksum $possibleChecksumValue | Should -BeFalse
|
|
}
|
|
|
|
It 'File structure and contents of the destination should match the file structure and contents of the archive after Set-TargetResource' {
|
|
Test-FileStructuresMatch -SourcePath $zipFileSourcePath -DestinationPath $destinationDirectoryPath -CheckContents | Should -BeTrue
|
|
}
|
|
}
|
|
|
|
Context "When expanding an archive with an edited file, Validate specfied, Force not specified, and Checksum specified as $possibleChecksumValue" {
|
|
$destinationDirectoryName = 'ExpandModifiedArchiveWithCheckFail'
|
|
$destinationDirectoryPath = Join-Path -Path $TestDrive -ChildPath $destinationDirectoryName
|
|
|
|
$null = Expand-Archive -Path $zipFilePath -DestinationPath $destinationDirectoryPath -Force
|
|
|
|
# This foreach loop with the Open-Archive call is needed to set the timestamps of the files at the destination correctly
|
|
$destinationChildItems = Get-ChildItem -Path $destinationDirectoryPath -Recurse -File
|
|
|
|
foreach ($destinationChildItem in $destinationChildItems)
|
|
{
|
|
$correspondingZipItemPath = $destinationChildItem.FullName.Replace($destinationDirectoryPath + '\', '')
|
|
$archive = Open-Archive -Path $zipFilePath
|
|
|
|
try
|
|
{
|
|
$matchingArchiveEntry = $archive.Entries | Where-Object -FilterScript {
|
|
$_.FullName -eq $correspondingZipItemPath
|
|
}
|
|
$archiveEntryLastWriteTime = $matchingArchiveEntry.LastWriteTime.DateTime
|
|
}
|
|
finally
|
|
{
|
|
$null = $archive.Dispose()
|
|
}
|
|
|
|
$null = Set-ItemProperty -Path $destinationChildItem.FullName -Name 'CreationTime' -Value $archiveEntryLastWriteTime
|
|
$null = Set-ItemProperty -Path $destinationChildItem.FullName -Name 'LastWriteTime' -Value $archiveEntryLastWriteTime
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return true before file edit' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath -Validate $true -Checksum $possibleChecksumValue | Should -BeTrue
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return false before file edit' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath -Validate $true -Checksum $possibleChecksumValue | Should -BeFalse
|
|
}
|
|
|
|
$fileToEditPath = Join-Path -Path $destinationDirectoryPath -ChildPath $fileToEditName
|
|
|
|
It 'File to edit should exist at the destination before Set-TargetResource' {
|
|
Test-Path -Path $fileToEditPath | Should -BeTrue
|
|
}
|
|
|
|
$fileBeforeEdit = Get-Item -Path $fileToEditPath
|
|
$lastWriteTimeBeforeEdit = $fileBeforeEdit.LastWriteTime
|
|
|
|
$null = Set-Content -Path $fileToEditPath -Value 'Different false text' -Force
|
|
Set-ItemProperty -Path $fileToEditPath -Name 'LastWriteTime' -Value ([System.DateTime]::MaxValue)
|
|
Set-ItemProperty -Path $fileToEditPath -Name 'CreationTime' -Value ([System.DateTime]::MaxValue)
|
|
|
|
$fileAfterEdit = Get-Item -Path $fileToEditPath
|
|
|
|
It 'Edited file at the destination should have different content than the same file in the archive before Set-TargetResource' {
|
|
Get-Content -Path $fileToEditPath -Raw | Should -Not -Be ($zipFileStructure[$fileToEditName] + "`r`n")
|
|
}
|
|
|
|
It 'Edited file at the destination should have different last write time than the same file in the archive before Set-TargetResource' {
|
|
$fileAfterEdit.LastWriteTime | Should -Not -Be $lastWriteTimeBeforeEdit
|
|
}
|
|
|
|
It 'Edited file at the destination should have different creation time than the last write time of the the same file in the archive before Set-TargetResource' {
|
|
$fileAfterEdit.CreationTime | Should -Not -Be $lastWriteTimeBeforeEdit
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return false before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath -Validate $true -Checksum $possibleChecksumValue | Should -BeFalse
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return true before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath -Validate $true -Checksum $possibleChecksumValue | Should -BeTrue
|
|
}
|
|
|
|
It 'File structure and contents of the destination should not match the file structure and contents of the archive before Set-TargetResource' {
|
|
Test-FileStructuresMatch -SourcePath $zipFileSourcePath -DestinationPath $destinationDirectoryPath -CheckContents | Should -BeFalse
|
|
}
|
|
|
|
{ Set-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath -Validate $true -Checksum $possibleChecksumValue } | Should -Throw
|
|
}
|
|
|
|
Context "When removing an archive with an edited file, Validate specified, and Checksum specified as $possibleChecksumValue" {
|
|
$destinationDirectoryName = 'RemoveModifiedArchiveWithCheck'
|
|
$destinationDirectoryPath = Join-Path -Path $TestDrive -ChildPath $destinationDirectoryName
|
|
|
|
$null = Expand-Archive -Path $zipFilePath -DestinationPath $destinationDirectoryPath -Force
|
|
|
|
# This foreach loop with the Open-Archive call is needed to set the timestamps of the files at the destination correctly
|
|
$destinationChildItems = Get-ChildItem -Path $destinationDirectoryPath -Recurse -File
|
|
|
|
foreach ($destinationChildItem in $destinationChildItems)
|
|
{
|
|
$correspondingZipItemPath = $destinationChildItem.FullName.Replace($destinationDirectoryPath + '\', '')
|
|
$archive = Open-Archive -Path $zipFilePath
|
|
|
|
try
|
|
{
|
|
$matchingArchiveEntry = $archive.Entries | Where-Object -FilterScript {
|
|
$_.FullName -eq $correspondingZipItemPath
|
|
}
|
|
$archiveEntryLastWriteTime = $matchingArchiveEntry.LastWriteTime.DateTime
|
|
}
|
|
finally
|
|
{
|
|
$null = $archive.Dispose()
|
|
}
|
|
|
|
$null = Set-ItemProperty -Path $destinationChildItem.FullName -Name 'CreationTime' -Value $archiveEntryLastWriteTime
|
|
$null = Set-ItemProperty -Path $destinationChildItem.FullName -Name 'LastWriteTime' -Value $archiveEntryLastWriteTime
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return true before file edit' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath -Validate $true -Checksum $possibleChecksumValue | Should -BeTrue
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return false before file edit' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath -Validate $true -Checksum $possibleChecksumValue | Should -BeFalse
|
|
}
|
|
|
|
$fileToEditPath = Join-Path -Path $destinationDirectoryPath -ChildPath $fileToEditName
|
|
|
|
It 'File to edit should exist at the destination before Set-TargetResource' {
|
|
Test-Path -Path $fileToEditPath | Should -BeTrue
|
|
}
|
|
|
|
$fileBeforeEdit = Get-Item -Path $fileToEditPath
|
|
$lastWriteTimeBeforeEdit = $fileBeforeEdit.LastWriteTime
|
|
|
|
$null = Set-Content -Path $fileToEditPath -Value 'Different false text' -Force
|
|
Set-ItemProperty -Path $fileToEditPath -Name 'LastWriteTime' -Value ([System.DateTime]::MaxValue)
|
|
Set-ItemProperty -Path $fileToEditPath -Name 'CreationTime' -Value ([System.DateTime]::MaxValue)
|
|
|
|
$fileAfterEdit = Get-Item -Path $fileToEditPath
|
|
|
|
It 'Edited file at the destination should have the edited content' {
|
|
Get-Content -Path $fileToEditPath -Raw | Should -Be ('Different false text' + "`r`n")
|
|
}
|
|
|
|
It 'Edited file at the destination should have different last write time than the same file in the archive after file edit and before Set-TargetResource' {
|
|
$fileAfterEdit.LastWriteTime | Should -Not -Be $lastWriteTimeBeforeEdit
|
|
}
|
|
|
|
It 'Edited file at the destination should have different creation time than the last write time of the the same file in the archive after file edit before Set-TargetResource' {
|
|
$fileAfterEdit.CreationTime | Should -Not -Be $lastWriteTimeBeforeEdit
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return false before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath -Validate $true -Checksum $possibleChecksumValue | Should -BeFalse
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return true before Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath -Validate $true -Checksum $possibleChecksumValue | Should -BeTrue
|
|
}
|
|
|
|
It 'File structure and contents of the destination should not match the file structure and contents of the archive before Set-TargetResource' {
|
|
Test-FileStructuresMatch -SourcePath $zipFileSourcePath -DestinationPath $destinationDirectoryPath -CheckContents | Should -BeFalse
|
|
}
|
|
|
|
It 'Set-TargetResource should not throw' {
|
|
{ Set-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath -Validate $true -Checksum $possibleChecksumValue } | Should -Not -Throw
|
|
}
|
|
|
|
It 'Edited file should exist at the destination after Set-TargetResource' {
|
|
Test-Path -Path $fileToEditPath | Should -BeTrue
|
|
}
|
|
|
|
It 'Edited file at the destination should have the edited content' {
|
|
Get-Content -Path $fileToEditPath -Raw | Should -Be ('Different false text' + "`r`n")
|
|
}
|
|
|
|
It 'Edited file at the destination should have different last write time than the same file in the archive after Set-TargetResource' {
|
|
$fileAfterEdit.LastWriteTime | Should -Not -Be $lastWriteTimeBeforeEdit
|
|
}
|
|
|
|
It 'Edited file at the destination should have different creation time than the last write time of the the same file in the archive after Set-TargetResource' {
|
|
$fileAfterEdit.CreationTime | Should -Not -Be $lastWriteTimeBeforeEdit
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Present should return false after Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destinationDirectoryPath -Validate $true -Checksum $possibleChecksumValue | Should -BeFalse
|
|
}
|
|
|
|
It 'Test-TargetResource with Ensure as Absent should return true after Set-TargetResource' {
|
|
Test-TargetResource -Ensure 'Absent' -Path $zipFilePath -Destination $destinationDirectoryPath -Validate $true -Checksum $possibleChecksumValue | Should -BeTrue
|
|
}
|
|
|
|
It 'File structure and contents of the destination should not match the file structure and contents of the archive after Set-TargetResource' {
|
|
Test-FileStructuresMatch -SourcePath $zipFileSourcePath -DestinationPath $destinationDirectoryPath -CheckContents | Should -BeFalse
|
|
}
|
|
}
|
|
}
|
|
|
|
Context 'When expanding an archive when the archive name contains a bracket' {
|
|
$zipFileName = 'ReturnCorrectValue['
|
|
|
|
$zipFileStructure = @{
|
|
Folder1 = @{
|
|
File1 = 'Fake file contents'
|
|
}
|
|
}
|
|
|
|
$zipFilePath = New-ZipFileFromHashtable -Name $zipFileName -ParentPath $TestDrive -ZipFileStructure $zipFileStructure
|
|
|
|
$destination = Join-Path -Path $TestDrive -ChildPath 'ArchiveNameWithBracket'
|
|
|
|
It 'Set-TargetResource should not throw' {
|
|
{ Set-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destination } | Should -Not -Throw
|
|
}
|
|
|
|
It 'Get-TargetResource should not throw' {
|
|
{ $null = Get-TargetResource -Path $zipFilePath -Destination $destination } | Should -Not -Throw
|
|
}
|
|
|
|
It 'Test-TargetResource should not throw' {
|
|
{ $null = Test-TargetResource -Ensure 'Present' -Path $zipFilePath -Destination $destination } | Should -Not -Throw
|
|
}
|
|
}
|
|
}
|