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;
}

# ============================================================
# Get-XrmWorkflows filters (brief W01)
# ============================================================
Write-Section "Get-XrmWorkflows filters";

$filterColumns = "name", "category", "type", "primaryentity", "statecode";
$definitions = @($Global:XrmClient | Get-XrmWorkflows -Columns $filterColumns -Category 0, 5 -Type 1 -State 0, 1);
Assert-Test "-Category -Type -State: every row matches (actual: $($definitions.Count))" {
    @($definitions | Where-Object { $_.category_Value.Value -notin 0, 5 -or $_.type_Value.Value -ne 1 -or $_.statecode_Value.Value -notin 0, 1 }).Count -eq 0;
};

$sample = $definitions | Where-Object { $_.primaryentity_Value -and $_.primaryentity_Value -ne "none" } | Select-Object -First 1;
if ($sample) {
    $sampleEntity = $sample.primaryentity_Value;
    $byEntity = @($Global:XrmClient | Get-XrmWorkflows -Columns $filterColumns -Type 1 -PrimaryEntity $sampleEntity);
    Assert-Test "-PrimaryEntity '$sampleEntity': every row matches" {
        $byEntity.Count -ge 1 -and @($byEntity | Where-Object { $_.primaryentity_Value -ne $sampleEntity }).Count -eq 0;
    };

    $byName = @($Global:XrmClient | Get-XrmWorkflows -Columns $filterColumns -Type 1 -Name $sample.name);
    Assert-Test "-Name (exact): found" { @($byName | Where-Object { $_.Id -eq $sample.Id }).Count -eq 1 };

    $pattern = "$($sample.name.Substring(0, [Math]::Min(4, $sample.name.Length)))*";
    $byPattern = @($Global:XrmClient | Get-XrmWorkflows -Columns $filterColumns -Type 1 -Name $pattern);
    Assert-Test "-Name '$pattern' (wildcard): found, every row matches" {
        @($byPattern | Where-Object { $_.Id -eq $sample.Id }).Count -eq 1 -and @($byPattern | Where-Object { $_.name -notlike $pattern }).Count -eq 0;
    };
}
else {
    Write-Host " [SKIP] No workflow definition bound to a table" -ForegroundColor Yellow;
    Assert-Test "-PrimaryEntity / -Name - skipped (no sample)" { $true };
}

# ============================================================
# 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;