tests/Client/SdkValues.Tests.ps1

<#
    Integration Test: SDK value normalization
    Values wrapped in a PowerShell PSObject (New-Object, pipeline output) or passed as Object[] are normalized
    before they reach the SDK, so requests serialize.
    Cmdlets: Set-XrmAttributeValue (through New-XrmEntity), Add-XrmRequestParameter, Add-XrmQueryCondition,
             Add-XrmQueryLinkCondition, Add-XrmBulkDelete
#>

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

# ============================================================
# Attributes
# ============================================================
Write-Section "Attributes: PSObject-wrapped values";

$name = Get-TestName -Prefix "SdkValue";
$pipedName = $name | ForEach-Object { $_ };
$creditLimit = New-Object Microsoft.Xrm.Sdk.Money 1500;
$record = New-XrmEntity -LogicalName "account" -Attributes @{
    "name"        = $pipedName;
    "creditlimit" = $creditLimit;
};
$record.Id = $Global:XrmClient | Add-XrmRecord -Record $record;
Assert-Test "Account created from a piped string and a New-Object Money (Id = $($record.Id))" {
    $null -ne $record.Id -and $record.Id -ne [Guid]::Empty;
};

$check = $Global:XrmClient | Get-XrmRecord -LogicalName "account" -Id $record.Id -Columns "name", "creditlimit";
Assert-Test "Values persisted" {
    $check.name -eq $name -and $check.creditlimit_Value.Value -eq 1500;
};

# ============================================================
# Query conditions
# ============================================================
Write-Section "Add-XrmQueryCondition / Add-XrmQueryLinkCondition";

$pipedId = $record.Id | ForEach-Object { $_ };
$query = New-XrmQueryExpression -LogicalName "account" -Columns "name";
$query = $query | Add-XrmQueryCondition -Field "accountid" -Condition In -Values @($pipedId);
$rows = @($Global:XrmClient | Get-XrmMultipleRecords -Query $query);
Assert-Test "In with a piped Guid returns the record" {
    $rows.Count -eq 1 -and $rows[0].Id -eq $record.Id;
};

$query = New-XrmQueryExpression -LogicalName "account" -Columns "name" -TopCount 5;
$query = $query | Add-XrmQueryCondition -Field "accountid" -Condition In -Values @();
$rows = @($Global:XrmClient | Get-XrmMultipleRecords -Query $query);
Assert-Test "Empty In returns no row" {
    $rows.Count -eq 0;
};

$query = New-XrmQueryExpression -LogicalName "account" -Columns "name";
$query.Criteria.FilterOperator = [Microsoft.Xrm.Sdk.Query.LogicalOperator]::Or;
$query = $query | Add-XrmQueryCondition -Field "accountid" -Condition In -Values @();
$query = $query | Add-XrmQueryCondition -Field "accountid" -Condition Equal -Values $record.Id;
$rows = @($Global:XrmClient | Get-XrmMultipleRecords -Query $query);
Assert-Test "Empty In under an Or filter does not widen the result" {
    $rows.Count -eq 1 -and $rows[0].Id -eq $record.Id;
};

$query = New-XrmQueryExpression -LogicalName "account" -Columns "name";
$query = $query | Add-XrmQueryCondition -Field "accountid" -Condition Equal -Values $record.Id;
$query = $query | Add-XrmQueryCondition -Field "accountid" -Condition NotIn -Values @();
$rows = @($Global:XrmClient | Get-XrmMultipleRecords -Query $query);
Assert-Test "Empty NotIn adds no restriction" {
    $rows.Count -eq 1;
};

$query = New-XrmQueryExpression -LogicalName "account" -Columns "name";
$query = $query | Add-XrmQueryCondition -Field "accountid" -Condition Equal -Values $record.Id;
$link = $query | Add-XrmQueryLink -ToEntityName "systemuser" -FromAttributeName "owninguser" -ToAttributeName "systemuserid";
$link | Add-XrmQueryLinkCondition -Field "isdisabled" -Condition Equal -Values @($false) | Out-Null;
Assert-Test "Link condition keeps a falsy value (@(`$false))" {
    $link.LinkCriteria.Conditions[0].Values.Count -eq 1 -and $link.LinkCriteria.Conditions[0].Values[0] -eq $false;
};
$rows = @($Global:XrmClient | Get-XrmMultipleRecords -Query $query);
Assert-Test "Query with the link condition returns the record" {
    $rows.Count -eq 1;
};

# ============================================================
# Request parameters
# ============================================================
Write-Section "Add-XrmRequestParameter";

$request = New-XrmRequest -Name "Retrieve";
$target = New-Object Microsoft.Xrm.Sdk.EntityReference -ArgumentList "account", $record.Id;
$columnSet = New-Object Microsoft.Xrm.Sdk.Query.ColumnSet -ArgumentList (, [string[]]@("name"));
$request | Add-XrmRequestParameter -Name "Target" -Value $target | Out-Null;
$request | Add-XrmRequestParameter -Name "ColumnSet" -Value $columnSet | Out-Null;
$response = $Global:XrmClient | Invoke-XrmRequest -Request $request;
Assert-Test "Retrieve built from New-Object values succeeds" {
    $null -ne $response -and $response.Results["Entity"]["name"] -eq $name;
};

$typedRequest = New-XrmRequest -Name "Test";
$typedRequest | Add-XrmRequestParameter -Name "Ids" -Value @($record.Id, [Guid]::NewGuid()) | Out-Null;
Assert-Test "Homogeneous Object[] is typed (Guid[])" {
    $typedRequest.Parameters["Ids"] -is [Guid[]];
};

$errorMessage = $null;
try {
    $typedRequest | Add-XrmRequestParameter -Name "Bad" -Value ([PSCustomObject]@{ Id = 1 }) | Out-Null;
}
catch {
    $errorMessage = $_.Exception.Message;
}
Assert-Test "PSCustomObject value raises an error that names the parameter" {
    $errorMessage -like "*'Bad'*";
};

# ============================================================
# Add-XrmBulkDelete
# ============================================================
Write-Section "Add-XrmBulkDelete";

$bulkQuery = New-XrmQueryExpression -LogicalName "account" -Columns "accountid";
$bulkQuery = $bulkQuery | Add-XrmQueryCondition -Field "name" -Condition Equal -Values "$name-none";
$bulkResponse = $Global:XrmClient | Add-XrmBulkDelete -Query $bulkQuery -JobName "PowerDataOps test $name";
Assert-Test "BulkDelete accepted: QuerySet sent as QueryExpression[] (JobId returned)" {
    $null -ne $bulkResponse -and $bulkResponse.Results["JobId"] -ne [Guid]::Empty;
};

# ============================================================
# CLEANUP
# ============================================================
Write-Section "Cleanup";

$Global:XrmClient | Remove-XrmRecord -LogicalName "account" -Id $record.Id;
Assert-Test "Cleanup complete" { $true };

Write-TestSummary;