Tests/Private/Dismount-SmbDrive.Tests.ps1

BeforeAll {
    . "$PSScriptRoot/../../Private/Get-Timestamp.ps1"
    . "$PSScriptRoot/../../Private/Invoke-NetUse.ps1"
    . "$PSScriptRoot/../../Private/Dismount-SmbDrive.ps1"
}

Describe 'Dismount-SmbDrive' {
    BeforeEach {
        Mock Write-Host {}
    }

    Context 'When drive is mounted' {
        BeforeEach {
            Mock Test-Path { $true } -ParameterFilter { $Path -like '*:\' }
            Mock Invoke-NetUse { 'OK' }
        }

        It 'Calls Invoke-NetUse with delete arguments' {
            Dismount-SmbDrive -DriveLetter 'X'
            Should -Invoke Invoke-NetUse -Times 1 -ParameterFilter { $Arguments -contains '/delete' }
        }

        It 'Writes dismount confirmation' {
            Dismount-SmbDrive -DriveLetter 'X'
            Should -Invoke Write-Host -ParameterFilter { $Object -like "*Dismounted*" }
        }
    }

    Context 'When drive is not mounted' {
        BeforeEach {
            Mock Test-Path { $false } -ParameterFilter { $Path -like '*:\' }
            Mock Invoke-NetUse { 'OK' }
        }

        It 'Does not attempt to dismount' {
            Dismount-SmbDrive -DriveLetter 'X'
            Should -Not -Invoke Invoke-NetUse
        }
    }

    Context 'Parameter validation' {
        It 'Rejects multi-character drive letters' {
            { Dismount-SmbDrive -DriveLetter 'XY' } | Should -Throw
        }

        It 'Rejects numeric drive letters' {
            { Dismount-SmbDrive -DriveLetter '9' } | Should -Throw
        }
    }
}