Private/Tools/Test-Tooling.ps1

function Test-Tooling {
    [CmdletBinding(SupportsShouldProcess = $true)]
    param(
        [Parameter(Mandatory = $false)]
        [ValidateSet("PowerShell", "Git", "AzureCli", "AzureEnvVars", "AzureCliOrEnvVars", "AzureLogin", "AmaAlzModule", "AmaAlzModuleVersion", "YamlModule", "YamlModuleAutoInstall", "GitHubCli", "AzureDevOpsCli")]
        [string[]]$Checks = @("PowerShell", "Git", "AzureCliOrEnvVars", "AzureLogin", "AmaAlzModule", "AmaAlzModuleVersion"),
        [Parameter(Mandatory = $false)]
        [switch]$destroy
    )

    $checkResults = @()
    $hasFailure = $false
    $azCliInstalledButNotLoggedIn = $false
    $currentScope = "CurrentUser"

    # Check PowerShell version
    if ($Checks -contains "PowerShell") {
        $result = Test-PowerShellVersion
        $checkResults += $result.Results
        if ($result.HasFailure) { $hasFailure = $true }
    }

    # Check Git installation
    if ($Checks -contains "Git") {
        $result = Test-GitInstallation
        $checkResults += $result.Results
        if ($result.HasFailure) { $hasFailure = $true }
    }

    # Check Azure Environment Variables only
    if ($Checks -contains "AzureEnvVars") {
        $result = Test-AzureEnvironmentVariable
        $checkResults += $result.Results
        if ($result.HasFailure) { $hasFailure = $true }
    }

    # Check Azure CLI only (used by Remove-PlatformLandingZone)
    if ($Checks -contains "AzureCli") {
        $requireLogin = $Checks -contains "AzureLogin"
        $result = Test-AzureCli -RequireLogin $requireLogin
        $checkResults += $result.Results
        if ($result.HasFailure) { $hasFailure = $true }
        if ($result.AzCliInstalledButNotLoggedIn) { $azCliInstalledButNotLoggedIn = $true }
    }

    # Check Azure CLI or Environment Variables (used by Deploy-Accelerator)
    # If env vars are valid, skip CLI check; otherwise check CLI
    if ($Checks -contains "AzureCliOrEnvVars") {
        $envResult = Test-AzureEnvironmentVariable
        $checkResults += $envResult.Results
        if ($envResult.HasFailure) { $hasFailure = $true }

        # Only check CLI if env vars are not valid
        if (-not $envResult.EnvVarsValid) {
            $requireLogin = $Checks -contains "AzureLogin"
            $cliResult = Test-AzureCli -RequireLogin $requireLogin
            $checkResults += $cliResult.Results
            if ($cliResult.HasFailure) { $hasFailure = $true }
            if ($cliResult.AzCliInstalledButNotLoggedIn) { $azCliInstalledButNotLoggedIn = $true }
        }
    }

    # Check AMA.ALZ Module
    if ($Checks -contains "AmaAlzModule") {
        $checkVersion = $Checks -contains "AmaAlzModuleVersion"
        $result = Test-AlzModule -CheckVersion $checkVersion -AllowContinueOnFailure:$destroy.IsPresent
        $checkResults += $result.Results
        if ($result.HasFailure) { $hasFailure = $true }
        if ($result.CurrentScope) { $currentScope = $result.CurrentScope }
    }

    # Check YAML Module
    if ($Checks -contains "YamlModule") {
        $autoInstall = $Checks -contains "YamlModuleAutoInstall"
        $result = Test-YamlModule -AutoInstall $autoInstall -Scope $currentScope
        $checkResults += $result.Results
        if ($result.HasFailure) { $hasFailure = $true }
    }

    # Check GitHub CLI
    if ($Checks -contains "GitHubCli") {
        $result = Test-GitHubCli
        $checkResults += $result.Results
        if ($result.HasFailure) { $hasFailure = $true }
    }

    # Check Azure DevOps CLI
    if ($Checks -contains "AzureDevOpsCli") {
        $result = Test-AzureDevOpsCli
        $checkResults += $result.Results
        if ($result.HasFailure) { $hasFailure = $true }
    }

    # Display results
    Write-Verbose "Showing check results"
    Write-Verbose $(ConvertTo-Json $checkResults -Depth 100)
    $checkResults | ForEach-Object {[PSCustomObject]$_} | Format-Table -Property @{
        Label = "Check Result"; Expression = {
            switch ($_.result) {
                'Success' { $color = "92"; break }
                'Failure' { $color = "91"; break }
                'Warning' { $color = "93"; break }
                default { $color = "0" }
            }
            $e = [char]27
            "$e[${color}m$($_.result)${e}[0m"
        }
    }, @{ Label = "Check Details"; Expression = {$_.message} }  -AutoSize -Wrap | Out-Host

    if($hasFailure) {
        Write-ToConsoleLog "Accelerator software requirements have no been met, please review and install the missing software." -IsError
        Write-ToConsoleLog "Cannot continue with Deployment..." -IsError
        throw "Accelerator software requirements have no been met, please review and install the missing software."
    }

    return @{
        AzCliInstalledButNotLoggedIn = $azCliInstalledButNotLoggedIn
    }
}