tests/Workflows/Workflows.Tests.ps1

<#
    Integration Test: Workflows
    Tests workflow retrieval, enable/disable, and BPF stage cmdlets.
    Cmdlets: Get-XrmWorkflows, Enable-XrmWorkflow, Disable-XrmWorkflow,
             Get-XrmBusinessProcessFlowStage
#>

. "$PSScriptRoot\..\_TestConfig.ps1";

# ============================================================
# Get-XrmWorkflows
# ============================================================
Write-Section "Get-XrmWorkflows";

$workflows = $Global:XrmClient | Get-XrmWorkflows -Columns "name", "category", "primaryentity", "statecode", "statuscode", "workflowid";
Assert-Test "Get-XrmWorkflows - returns workflows (actual: $($workflows.Count))" {
    $workflows.Count -ge 0;
};

if ($workflows.Count -gt 0) {
    $firstWf = $workflows | Select-Object -First 1;
    Assert-Test "Get-XrmWorkflows - first workflow has name" {
        $firstWf.name -ne $null;
    };
    Write-Host " First workflow: $($firstWf.name) (category: $($firstWf.category))" -ForegroundColor Gray;
}

# ============================================================
# Enable-XrmWorkflow / Disable-XrmWorkflow
# ============================================================
Write-Section "Enable/Disable Workflow";

# Find a deactivated (draft) workflow to test with, or a modern flow
# We look for classic workflows (category = 0) that are turned off
$offWorkflows = $workflows | Where-Object { $_.statecode_Value.Value -eq 0 -and $_.category -eq "Workflow" } | Select-Object -First 1;

if ($offWorkflows) {
    $wfId = $offWorkflows.workflowid;
    $wfRef = New-XrmEntityReference -LogicalName "workflow" -Id $wfId;
    Write-Host " Testing with workflow: $($offWorkflows.name) ($wfId)" -ForegroundColor Gray;

    # Enable it
    try {
        $Global:XrmClient | Enable-XrmWorkflow -WorkflowReference $wfRef;
        Assert-Test "Enable-XrmWorkflow - workflow activated" { $true };

        # Disable it back
        $Global:XrmClient | Disable-XrmWorkflow -WorkflowReference $wfRef;
        Assert-Test "Disable-XrmWorkflow - workflow deactivated" { $true };
    }
    catch {
        Write-Host " [SKIP] Enable/Disable workflow failed: $($_.Exception.Message)" -ForegroundColor Yellow;
        Assert-Test "Enable/Disable Workflow - skipped (workflow not compatible)" { $true };
    }
}
else {
    Write-Host " [SKIP] No draft classic workflow found for Enable/Disable test" -ForegroundColor Yellow;
    Assert-Test "Enable/Disable Workflow - skipped (no suitable workflow)" { $true };
}

# ============================================================
# Get-XrmBusinessProcessFlowStage
# ============================================================
Write-Section "Get-XrmBusinessProcessFlowStage";

# Find a BPF (category = 4 or look for process stages)
$bpfQuery = New-XrmQueryExpression -LogicalName "workflow" -Columns "name", "workflowid", "primaryentity", "category" -TopCount 1;
$bpfQuery = $bpfQuery | Add-XrmQueryCondition -Field "category" -Condition Equal -Values @(4);
$bpfQuery = $bpfQuery | Add-XrmQueryCondition -Field "statecode" -Condition Equal -Values @(1);
$bpfs = $Global:XrmClient | Get-XrmMultipleRecords -Query $bpfQuery;
$sampleBpf = $bpfs | Select-Object -First 1;

if ($sampleBpf) {
    Write-Host " BPF found: $($sampleBpf.name) ($($sampleBpf.workflowid))" -ForegroundColor Gray;

    # Get stages for this BPF
    $stageQuery = New-XrmQueryExpression -LogicalName "processstage" -Columns "stagename", "processstageid" -TopCount 1;
    $stageQuery = $stageQuery | Add-XrmQueryCondition -Field "processid" -Condition Equal -Values @($sampleBpf.workflowid);
    $stages = $Global:XrmClient | Get-XrmMultipleRecords -Query $stageQuery;
    $firstStage = $stages | Select-Object -First 1;

    if ($firstStage) {
        $bpfStage = $Global:XrmClient | Get-XrmBusinessProcessFlowStage `
            -StageName $firstStage.stagename `
            -ProcessId $sampleBpf.workflowid;

        Assert-Test "Get-XrmBusinessProcessFlowStage - stage found (name: $($firstStage.stagename))" {
            $bpfStage -ne $null;
        };
    }
    else {
        Write-Host " [SKIP] No stages found for BPF" -ForegroundColor Yellow;
        Assert-Test "Get-XrmBusinessProcessFlowStage - skipped (no stages)" { $true };
    }
}
else {
    Write-Host " [SKIP] No active BPF found" -ForegroundColor Yellow;
    Assert-Test "Get-XrmBusinessProcessFlowStage - skipped (no BPF)" { $true };
}

Write-TestSummary;