tests/Client/RequestOptions.Tests.ps1

<#
    Integration Test: request options and -AsRequest (brief lot 3a)
    Set-XrmRequestOptions, and the options / -AsRequest of Add-, Update-, Upsert-, Remove-XrmRecord and Set-XrmRecordState.
#>

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

$prefix = Get-TestName -Prefix "Options";
$createdIds = [System.Collections.Generic.List[Guid]]::new();

# ============================================================
# Set-XrmRequestOptions
# ============================================================
Write-Section "Set-XrmRequestOptions";

$stepId = [Guid]::NewGuid();
$request = New-XrmRequest -Name "Create";
$request = $request | Set-XrmRequestOptions -BypassBusinessLogicExecution CustomSync, CustomAsync -BypassBusinessLogicExecutionStepIds $stepId -SuppressCallbackRegistrationExpanderJob -SuppressDuplicateDetection -Tag "pdo" -BypassCustomPluginExecution;
Assert-Test "BypassBusinessLogicExecution = 'CustomSync,CustomAsync'" { $request.Parameters["BypassBusinessLogicExecution"] -eq "CustomSync,CustomAsync" };
Assert-Test "BypassBusinessLogicExecutionStepIds = step id" { $request.Parameters["BypassBusinessLogicExecutionStepIds"] -eq $stepId.ToString() };
Assert-Test "SuppressCallbackRegistrationExpanderJob, SuppressDuplicateDetection, BypassCustomPluginExecution = true" {
    $request.Parameters["SuppressCallbackRegistrationExpanderJob"] -eq $true -and $request.Parameters["SuppressDuplicateDetection"] -eq $true -and $request.Parameters["BypassCustomPluginExecution"] -eq $true;
};
Assert-Test "Tag stored under 'tag'" { $request.Parameters["tag"] -eq "pdo" };

$plain = New-XrmRequest -Name "Create" | Set-XrmRequestOptions;
Assert-Test "No option given: nothing added" { $plain.Parameters.Count -eq 0 };

# ============================================================
# -AsRequest
# ============================================================
Write-Section "-AsRequest";

$record = New-XrmEntity -LogicalName "account" -Attributes @{ name = "$prefix-asrequest" };
$createRequest = Add-XrmRecord -XrmClient $Global:XrmClient -Record $record -BypassBusinessLogicExecution CustomSync -Tag "pdo" -AsRequest;
Assert-Test "Add-XrmRecord -AsRequest: CreateRequest with target and options" {
    $createRequest -is [Microsoft.Xrm.Sdk.Messages.CreateRequest] -and $createRequest.Target["name"] -eq "$prefix-asrequest" -and $createRequest.Parameters["BypassBusinessLogicExecution"] -eq "CustomSync" -and $createRequest.Parameters["tag"] -eq "pdo";
};
$notCreated = $Global:XrmClient | Get-XrmRecord -LogicalName "account" -AttributeName "name" -Value "$prefix-asrequest";
Assert-Test "Add-XrmRecord -AsRequest: nothing sent" { $null -eq $notCreated };

$updateRequest = Update-XrmRecord -Record (New-XrmEntity -LogicalName "account" -Id ([Guid]::NewGuid()) -Attributes @{ name = "x" }) -AsRequest;
$upsertRequest = Upsert-XrmRecord -Record $record -AsRequest;
$deleteRequest = Remove-XrmRecord -LogicalName "account" -Id ([Guid]::NewGuid()) -AsRequest;
$stateRequest = Set-XrmRecordState -RecordReference (New-XrmEntityReference -LogicalName "account" -Id ([Guid]::NewGuid())) -StateCode 1 -StatusCode 2 -SuppressCallbackRegistrationExpanderJob -AsRequest;
Assert-Test "Update / Upsert / Remove -AsRequest: typed requests" {
    $updateRequest -is [Microsoft.Xrm.Sdk.Messages.UpdateRequest] -and $upsertRequest -is [Microsoft.Xrm.Sdk.Messages.UpsertRequest] -and $deleteRequest -is [Microsoft.Xrm.Sdk.Messages.DeleteRequest] -and $deleteRequest.Target.LogicalName -eq "account";
};
Assert-Test "Set-XrmRecordState -AsRequest: UpdateRequest with statecode, statuscode and options" {
    $stateRequest -is [Microsoft.Xrm.Sdk.Messages.UpdateRequest] -and $stateRequest.Target["statecode"].Value -eq 1 -and $stateRequest.Target["statuscode"].Value -eq 2 -and $stateRequest.Parameters["SuppressCallbackRegistrationExpanderJob"] -eq $true;
};

# ============================================================
# Options sent to the platform
# ============================================================
Write-Section "Options accepted by the platform";

$accountId = $Global:XrmClient | Add-XrmRecord -Record (New-XrmEntity -LogicalName "account" -Attributes @{ name = "$prefix-sent" }) -BypassBusinessLogicExecution CustomSync, CustomAsync -SuppressCallbackRegistrationExpanderJob -SuppressDuplicateDetection -Tag "pdo";
Assert-Test "Add-XrmRecord with every option: created" { $accountId -is [Guid] -and $accountId -ne [Guid]::Empty };
$createdIds.Add($accountId);

$Global:XrmClient | Update-XrmRecord -Record (New-XrmEntity -LogicalName "account" -Id $accountId -Attributes @{ description = "updated" }) -BypassBusinessLogicExecution CustomSync -SuppressCallbackRegistrationExpanderJob;
$Global:XrmClient | Upsert-XrmRecord -Record (New-XrmEntity -LogicalName "account" -Id $accountId -Attributes @{ telephone1 = "0102030405" }) -BypassBusinessLogicExecution CustomAsync -Tag "pdo" | Out-Null;
$stateReference = $Global:XrmClient | Set-XrmRecordState -RecordReference (New-XrmEntityReference -LogicalName "account" -Id $accountId) -StateCode 1 -StatusCode 2 -BypassBusinessLogicExecution CustomSync;
$check = $Global:XrmClient | Get-XrmRecord -LogicalName "account" -Id $accountId -Columns "description", "telephone1", "statecode";
Assert-Test "Update, Upsert and Set-XrmRecordState with options: applied" {
    $check.description -eq "updated" -and $check.telephone1 -eq "0102030405" -and ($check | Get-XrmRowValue -Name "statecode" -Raw) -eq 1;
};
Assert-Test "Set-XrmRecordState still returns the reference" { $stateReference.Id -eq $accountId };

Write-Section "Requests built with -AsRequest, sent in bulk";

$bulkRequests = 1..3 | ForEach-Object { Add-XrmRecord -Record (New-XrmEntity -LogicalName "account" -Attributes @{ name = "$prefix-bulk-$_" }) -BypassBusinessLogicExecution CustomSync -AsRequest };
$bulkResponses = @($Global:XrmClient | Invoke-XrmBulkRequests -Requests $bulkRequests -ReturnResponses $true -Quiet);
$bulkResponses | ForEach-Object { $createdIds.Add($_.Results["id"]); };
Assert-Test "3 accounts created from -AsRequest requests" { $bulkResponses.Count -eq 3 };

Write-Section "Remove-XrmRecord with options";
$Global:XrmClient | Remove-XrmRecord -LogicalName "account" -Id $accountId -BypassBusinessLogicExecution CustomSync -SuppressCallbackRegistrationExpanderJob;
$createdIds.Remove($accountId) | Out-Null;
Assert-Test "Deleted" { $null -eq ($Global:XrmClient | Get-XrmRecord -LogicalName "account" -Id $accountId -IfExists) };

Write-Section "Cleanup";
foreach ($id in $createdIds) { try { $Global:XrmClient | Remove-XrmRecord -LogicalName "account" -Id $id; } catch { } }
Assert-Test "Cleanup complete" { $true };

Write-TestSummary;