tests/Resolve-DFToolExecutable.Tests.ps1

BeforeAll {
    . "$PSScriptRoot/TestSupport.ps1"
    foreach ($f in Get-DFTestModuleFile) { . $f }
}

Describe 'Resolve-DFToolExecutable' {
    BeforeEach {
        $script:Hits = @()
        Mock Get-Command { $script:Hits | ForEach-Object { [pscustomobject]@{ Source = $_ } } }
    }

    It 'returns the first resolved path that no exclude pattern matches' {
        $script:Hits = @('C:\Program Files\Git\usr\bin\less.exe', 'C:\Users\x\scoop\shims\less.exe')
        $tool = [pscustomobject]@{ executable = 'less.exe'; executableExclude = @('*\Git\usr\bin\*') }
        Resolve-DFToolExecutable -Tool $tool | Should -Be 'C:\Users\x\scoop\shims\less.exe'
    }

    It 'matches exclude patterns case-insensitively' {
        $script:Hits = @('C:\program files\git\USR\BIN\less.exe')
        $tool = [pscustomobject]@{ executable = 'less.exe'; executableExclude = @('*\Git\usr\bin\*') }
        Resolve-DFToolExecutable -Tool $tool | Should -BeNullOrEmpty
    }

    It 'returns the first hit when the tool excludes nothing' {
        $script:Hits = @('C:\a\less.exe', 'C:\b\less.exe')
        Resolve-DFToolExecutable -Tool ([pscustomobject]@{ executable = 'less.exe'; executableExclude = @() }) | Should -Be 'C:\a\less.exe'
    }
}

Describe 'ConvertTo-DFToolExePathToken' {
    It 'uses forward slashes' {
        Mock Resolve-DFToolExecutable { 'C:\Users\x\scoop\shims\less.exe' }
        ConvertTo-DFToolExePathToken -Tool ([pscustomobject]@{ executable = 'less.exe' }) | Should -Be 'C:/Users/x/scoop/shims/less.exe'
    }

    It 'quotes a path that contains a space' {
        Mock Resolve-DFToolExecutable { 'C:\Program Files\less\less.exe' }
        ConvertTo-DFToolExePathToken -Tool ([pscustomobject]@{ executable = 'less.exe' }) | Should -Be '"C:/Program Files/less/less.exe"'
    }

    It 'falls back to the bare name when nothing qualifies' {
        Mock Resolve-DFToolExecutable { $null }
        ConvertTo-DFToolExePathToken -Tool ([pscustomobject]@{ executable = 'less.exe' }) | Should -Be 'less'
    }
}