tests/Invoke-Elevated.Tests.ps1

BeforeAll {
    Import-Module "$PSScriptRoot/../easypeasy.psd1" -Force
}

Describe 'Invoke-Elevated' {

    # sudo.exe ships only on recent Windows clients, not on the CI runner.
    $script:hasSudo = [bool] (Get-Command sudo -ErrorAction SilentlyContinue)

    It 'runs the command in an elevated pwsh via sudo' -Skip:(-not $hasSudo) {
        Mock -ModuleName easypeasy sudo { }

        Invoke-Elevated addpath -machine 'C:\Tools'

        Should -Invoke -ModuleName easypeasy sudo -Times 1 -Exactly -ParameterFilter {
            $args[0] -eq 'pwsh' -and
            $args -contains '-NoProfile' -and
            $args -contains '-Command' -and
            $args[-1] -eq 'addpath -machine C:\Tools'
        }
    }

    It 'single-quotes arguments that contain whitespace' -Skip:(-not $hasSudo) {
        Mock -ModuleName easypeasy sudo { }

        Invoke-Elevated New-Item 'C:\Program Files\X'

        Should -Invoke -ModuleName easypeasy sudo -Times 1 -Exactly -ParameterFilter {
            $args[-1] -eq "New-Item 'C:\Program Files\X'"
        }
    }

    It 'is exposed through the <alias> alias' -Skip:(-not $hasSudo) -ForEach @(
        @{ alias = 'sudops' }
        @{ alias = 'sups' }
    ) {
        Mock -ModuleName easypeasy sudo { }

        & $alias Set-Theme dark

        Should -Invoke -ModuleName easypeasy sudo -Times 1 -Exactly -ParameterFilter {
            $args[-1] -eq 'Set-Theme dark'
        }
    }

    It 'does not invoke sudo under -WhatIf' -Skip:(-not $hasSudo) {
        Mock -ModuleName easypeasy sudo { }

        Invoke-Elevated -WhatIf addpath

        Should -Invoke -ModuleName easypeasy sudo -Times 0 -Exactly
    }
}