System.Tests.ps1

$Global:InitialLocation = $Null

Function Get-TestEnvironFolder {
    If ($Null -ne $TestDrive) {
        return Join-Path $TestDrive 'TestEnvironmentFolder'
    }
    Else {
        throw 'TestDrive is NULL, are you sure you''re calling this function in a Describe or Context block?'
    }
}

Function TestSetup {
    Import-Module $PSScriptRoot\ArchivematicaChecksum.psm1
    $Global:InitialLocation = Get-Location
}

Function PreTest {
    $TestFolder = Get-TestEnvironFolder
    If (Test-Path $TestFolder -ErrorAction SilentlyContinue) {
        Remove-Item $TestFolder -Recurse -Force
    }
    New-Item -Path $TestFolder -ItemType Directory
    Set-Location $TestDrive
}

Function TestTeardown {
    Set-Location $Global:InitialLocation
}

Describe 'Full System Tests' -Tag 'System' {
    TestSetup

    # Run system tests here
    Context 'Creating checksum files. No recursion' {
        It 'Should create checksums for files in a folder' {
            PreTest

            $TestFolder = Get-TestEnvironFolder
            $File1 = Join-Path $TestFolder 'file1.txt'
            $File2 = Join-Path $TestFolder 'file2.txt'
            New-Item -Path $File1 -ItemType File -Value 'test test test' -Force
            New-Item -Path $File2 -ItemType File -Value 'testing testing testing' -Force
            $File1MD5Checksum = (Get-FileHash $File1 -Algorithm MD5).Hash.ToLower()
            $File2MD5Checksum = (Get-FileHash $File2 -Algorithm MD5).Hash.ToLower()

            Get-ArchivematicaChecksumFile -Folder $TestFolder -Algorithm 'MD5'

            $GeneratedChecksumFile = Join-Path $TestFolder '\metadata\checksum.md5'
            $GeneratedChecksumFile | Should -Exist
            $ChecksumsContents = (Get-Content $GeneratedChecksumFile -Raw)
            $ChecksumsContents | Should -Match $File1MD5Checksum
            $ChecksumsContents | Should -Match $File2MD5Checksum
        }

        It 'Should not create checksums for files in subfolders' {
            PreTest

            $TestFolder = Get-TestEnvironFolder
            $File1 = Join-Path $TestFolder 'file1.txt'
            $File2 = Join-Path $TestFolder 'folder_a\file2.txt'
            New-Item -Path $File1 -ItemType File -Value 'test test test' -Force
            New-Item -Path $File2 -ItemType File -Value 'testing testing testing' -Force
            $File1MD5Checksum = (Get-FileHash $File1 -Algorithm MD5).Hash.ToLower()
            $File2MD5Checksum = (Get-FileHash $File2 -Algorithm MD5).Hash.ToLower()

            Get-ArchivematicaChecksumFile -Folder $TestFolder -Algorithm 'MD5'

            $GeneratedChecksumFile = Join-Path $TestFolder '\metadata\checksum.md5'
            $GeneratedChecksumFile | Should -Exist
            $ChecksumsContents = (Get-Content $GeneratedChecksumFile -Raw)
            $ChecksumsContents | Should -Match $File1MD5Checksum
            $ChecksumsContents | Should -Not -Match $File2MD5Checksum
        }

        It 'Should not create checksum file if there are no files in the target folder' {
            PreTest

            $TestFolder = Get-TestEnvironFolder
            $File1 = Join-Path $TestFolder 'folder_a\file1.txt'
            $File2 = Join-Path $TestFolder 'folder_b\file2.txt'
            New-Item -Path $File1 -ItemType File -Value 'test test test' -Force
            New-Item -Path $File2 -ItemType File -Value 'testing testing testing' -Force

            Get-ArchivematicaChecksumFile -Folder $TestFolder -Algorithm 'MD5'

            $GeneratedChecksumFile = Join-Path $TestFolder '\metadata\checksum.md5'
            $GeneratedChecksumFile | Should -Not -Exist
        }
    }

    Context 'Creating checksum files. With recursion' {
        It 'Should create checksums for files in target folder and subfolders' {
            PreTest

            $TestFolder = Get-TestEnvironFolder
            $File1 = Join-Path $TestFolder 'file1.txt'
            $File2 = Join-Path $TestFolder 'folder_a\file2.txt'
            $File3 = Join-Path $TestFolder 'folder_a\folder_b\file3.txt'
            New-Item -Path $File1 -ItemType File -Value 'test test test' -Force
            New-Item -Path $File2 -ItemType File -Value 'testing testing testing' -Force
            New-Item -Path $File3 -ItemType File -Value 't t t' -Force
            $File1SHA1Checksum = (Get-FileHash $File1 -Algorithm SHA1).Hash.ToLower()
            $File2SHA1Checksum = (Get-FileHash $File2 -Algorithm SHA1).Hash.ToLower()
            $File3SHA1Checksum = (Get-FileHash $File2 -Algorithm SHA1).Hash.ToLower()

            Get-ArchivematicaChecksumFile -Folder $TestFolder -Algorithm SHA1 -Recurse

            $GeneratedChecksumFile = Join-Path $TestFolder '\metadata\checksum.sha1'
            $GeneratedChecksumFile | Should -Exist
            $ChecksumsContents = (Get-Content $GeneratedChecksumFile -Raw)
            $ChecksumsContents | Should -Match $File1SHA1Checksum
            $ChecksumsContents | Should -Match $File2SHA1Checksum
            $ChecksumsContents | Should -Match $File3SHA1Checksum
        }

        It 'Should create checksums for files if there are none in target folder but some in subfolders' {
            PreTest

            $TestFolder = Get-TestEnvironFolder
            $File1 = Join-Path $TestFolder 'folder_a\file2.txt'
            $File2 = Join-Path $TestFolder 'folder_a\folder_b\file3.txt'
            $File3 = Join-Path $TestFolder 'folder_a\folder_b\folder_c\file3.txt'
            New-Item -Path $File1 -ItemType File -Value 'test test test' -Force
            New-Item -Path $File2 -ItemType File -Value 'testing testing testing' -Force
            New-Item -Path $File3 -ItemType File -Value 't t t' -Force
            $File1SHA1Checksum = (Get-FileHash $File1 -Algorithm SHA1).Hash.ToLower()
            $File2SHA1Checksum = (Get-FileHash $File2 -Algorithm SHA1).Hash.ToLower()
            $File3SHA1Checksum = (Get-FileHash $File2 -Algorithm SHA1).Hash.ToLower()

            Get-ArchivematicaChecksumFile -Folder $TestFolder -Algorithm SHA1 -Recurse

            $GeneratedChecksumFile = Join-Path $TestFolder '\metadata\checksum.sha1'
            $GeneratedChecksumFile | Should -Exist
            $ChecksumsContents = (Get-Content $GeneratedChecksumFile -Raw)
            $ChecksumsContents | Should -Match $File1SHA1Checksum
            $ChecksumsContents | Should -Match $File2SHA1Checksum
            $ChecksumsContents | Should -Match $File3SHA1Checksum
        }

        It 'Should not create checksum file if there are no files in target folder or subdirectories' {
            PreTest

            $TestFolder = Get-TestEnvironFolder
            New-Item -Path (Join-Path $TestFolder 'folder_a') -ItemType Directory -Force
            New-Item -Path (Join-Path $TestFolder 'folder_a\folder_b') -ItemType Directory -Force

            Get-ArchivematicaChecksumFile -Folder $TestFolder -Algorithm SHA1 -Recurse

            $GeneratedChecksumFile = Join-Path $TestFolder '\metadata\checksum.sha1'
            $GeneratedChecksumFile | Should -Not -Exist
        }
    }

    Context 'Testing format of checksum file' {
        It 'Should write file with \n line endings, not \r\n line endings' {

        }

        It 'Should not write file with a Byte-Order-Marker' {

        }
    }

    TestTeardown
}