Templates/Sampler/tests/Unit/Modules/Folder.Common.Tests.ps1

#region HEADER
$ProjectPath = "$PSScriptRoot\..\..\.." | Convert-Path
$ProjectName = (Get-ChildItem $ProjectPath\*\*.psd1 | Where-Object {
        ($_.Directory.Name -match 'source|src' -or $_.Directory.Name -eq $_.BaseName) -and
        $(try { Test-ModuleManifest $_.FullName -ErrorAction Stop }catch{$false}) }
    ).BaseName

$script:ParentModule = Get-Module $ProjectName -ListAvailable | Select-Object -First 1
$script:SubModulesFolder = Join-Path -Path $script:ParentModule.ModuleBase -ChildPath 'Modules'
Remove-Module $script:ParentModule -Force -ErrorAction SilentlyContinue

$script:SubModuleName = (Split-Path $PSCommandPath -Leaf) -replace '\.Tests.ps1'
$script:SubmoduleFile = Join-Path $script:SubModulesFolder "$($script:SubModuleName)/$($script:SubModuleName).psm1"

#endregion HEADER

Import-Module $script:SubmoduleFile -Force -ErrorAction Stop

InModuleScope $Script:SubModuleName {

    Describe 'FolderCommon\Test-FileAttribute' -Tag 'Helper' {
        BeforeAll {
            $mockAttribute = 'ReadOnly'
            $script:mockFolderObjectPath = Join-Path -Path $TestDrive -ChildPath 'FolderTest'
            $script:mockFolderObject = New-Item -Path $script:mockFolderObjectPath -ItemType 'Directory' -Force
            $script:mockFolderObject.Attributes = [System.IO.FileAttributes]::$mockAttribute
        }

        Context 'When a folder has a specific attribute' {
            It 'Should return $true' {
                $testFileAttributeResult = Test-FileAttribute -Folder $script:mockFolderObject -Attribute $mockAttribute
                $testFileAttributeResult | Should -Be $true
            }
        }

        Context 'When a folder does not have a specific attribute' {
            It 'Should return $false' {
                $testFileAttributeResult = Test-FileAttribute -Folder $script:mockFolderObject -Attribute 'Hidden'
                $testFileAttributeResult | Should -Be $false
            }
        }
    }

    Describe 'FolderCommon\Set-FileAttribute' -Tag 'Helper' {
        BeforeAll {
            $mockAttribute = 'ReadOnly'
            $script:mockFolderObjectPath = Join-Path -Path $TestDrive -ChildPath 'FolderTest'
            $script:mockFolderObject = New-Item -Path $script:mockFolderObjectPath -ItemType 'Directory' -Force

            $defaultAttributeParameter = @{
                Folder = $script:mockFolderObject
                Attribute = $mockAttribute
            }
    }

        Context 'When a folder should have a specific attribute' {
            It 'Should set the folder to the specific attribute' {
                $setFileAttributeParameter = $defaultAttributeParameter.Clone()
                $setFileAttributeParameter['Enabled'] = $true

                { Set-FileAttribute @setFileAttributeParameter } | Should -Not -Throw

                # Using the helper function that was test above to test the result
                $testFileAttributeResult = Test-FileAttribute @defaultAttributeParameter
                $testFileAttributeResult | Should -Be $true
            }
        }

        Context 'When a folder should not have a specific attribute' {
            It 'Should set the folder to the specific attribute' {
                $setFileAttributeParameter = $defaultAttributeParameter.Clone()
                $setFileAttributeParameter['Enabled'] = $false

                { Set-FileAttribute @setFileAttributeParameter } | Should -Not -Throw

                # Using the helper function that was test above to test the result
                $testFileAttributeResult = Test-FileAttribute @defaultAttributeParameter
                $testFileAttributeResult | Should -Be $false
            }
        }
    }
}