Providers/AD/Private/Test-ADTestPrerequisite.ps1

function Test-ADTestPrerequisite {
    [CmdletBinding()]
    [OutputType([bool])]
    <#
    .SYNOPSIS
        Tests prerequisites for AD test data operations

    .DESCRIPTION
        Verifies that required modules are available, domain connectivity exists,
        and data files are present

    .PARAMETER CheckDataFiles
        Also verify that required CSV data files exist

    .OUTPUTS
        Boolean indicating if all prerequisites are met

    .EXAMPLE
        if (-not (Test-ADTestPrerequisite)) {
            throw "Prerequisites not met"
        }

    .NOTES
        Author: Jeffrey Stuhr
        Version: 1.0.0
        Last Updated: 2025-08-03
    #>


    [CmdletBinding()]
    param(
        [switch]$CheckDataFiles
    )

    $issues = @()

    # Check AD module
    try {
        Import-Module ActiveDirectory -ErrorAction Stop -Verbose:$false
        Write-Verbose "Active Directory module loaded successfully"
    } catch {
        $issues += "Active Directory PowerShell module not available: $($_.Exception.Message)"
    }

    # Check domain connectivity
    try {
        $domain = Get-ADTestDomain
        Write-Verbose "Domain connectivity verified: $($domain.DNSName)"
    } catch {
        $issues += "Domain connectivity failed: $($_.Exception.Message)"
    }

    # Check data files if requested
    if ($CheckDataFiles) {
        try {
            $dataPath = Get-ADTestDataPath
            $requiredFiles = @("ADUsers.csv", "ADDevices.csv", "ADSecurityGroups.csv")

            foreach ($file in $requiredFiles) {
                $filePath = Join-Path $dataPath $file
                if (-not (Test-Path $filePath)) {
                    $issues += "Required data file missing: $filePath"
                }
            }
        } catch {
            $issues += "Data path validation failed: $($_.Exception.Message)"
        }
    }

    if ($issues.Count -gt 0) {
        foreach ($issue in $issues) {
            Write-Error $issue
        }
        return $false
    }

    return $true
}