tests/Query/QueryExpression.Tests.ps1

<#
    Integration Test: Query Expression
    Tests query building and execution cmdlets.
    Cmdlets: New-XrmQueryExpression, Add-XrmQueryCondition, Add-XrmQueryLink,
             Add-XrmQueryLinkCondition, Add-XrmQueryOrder, Get-XrmMultipleRecords,
             Get-XrmTotalRecordCount
#>

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

# ============================================================
# SETUP - create test data
# ============================================================
Write-Section "Setup - create test accounts";

$testPrefix = "QryTest_$(Get-Date -Format 'yyyyMMddHHmmss')";
$ids = @();

for ($i = 1; $i -le 3; $i++) {
    $record = New-XrmEntity -LogicalName "account" -Attributes @{
        "name"        = "$($testPrefix)_$i";
        "description" = "Query integration test";
        "revenue"     = New-XrmMoney -Value ($i * 10000);
    };
    $record.Id = $Global:XrmClient | Add-XrmRecord -Record $record;
    $ids += $record.Id;
}
Assert-Test "Created 3 test accounts" { $ids.Count -eq 3 };

# ============================================================
# New-XrmQueryExpression
# ============================================================
Write-Section "New-XrmQueryExpression";

$query = New-XrmQueryExpression -LogicalName "account" -Columns "name", "revenue";
Assert-Test "Query created for account" {
    $query.EntityName -eq "account";
};

# ============================================================
# Add-XrmQueryCondition - Equal
# ============================================================
Write-Section "Add-XrmQueryCondition";

$query = New-XrmQueryExpression -LogicalName "account" -Columns "name";
$query = $query | Add-XrmQueryCondition -Field "name" -Condition Equal -Values @("$($testPrefix)_1");
$results = @($Global:XrmClient | Get-XrmMultipleRecords -Query $query);
Assert-Test "Condition Equal - returns 1 record" {
    $results.Count -eq 1 -and $results[0].name -eq "$($testPrefix)_1";
};

# BeginsWith
$query = New-XrmQueryExpression -LogicalName "account" -Columns "name";
$query = $query | Add-XrmQueryCondition -Field "name" -Condition BeginsWith -Values @($testPrefix);
$results = $Global:XrmClient | Get-XrmMultipleRecords -Query $query;
Assert-Test "Condition BeginsWith - returns 3 records (actual: $($results.Count))" {
    $results.Count -eq 3;
};

# In
$query = New-XrmQueryExpression -LogicalName "account" -Columns "name";
$query = $query | Add-XrmQueryCondition -Field "accountid" -Condition In -Values $ids;
$results = $Global:XrmClient | Get-XrmMultipleRecords -Query $query;
Assert-Test "Condition In (3 Ids) - returns 3 records" {
    $results.Count -eq 3;
};

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

$query = New-XrmQueryExpression -LogicalName "account" -Columns "name";
$query = $query | Add-XrmQueryCondition -Field "name" -Condition BeginsWith -Values @($testPrefix);
$query = $query | Add-XrmQueryOrder -Field "name" -OrderType Ascending;
$results = $Global:XrmClient | Get-XrmMultipleRecords -Query $query;
Assert-Test "Order Ascending - first = _1, last = _3" {
    $results[0].name -eq "$($testPrefix)_1" -and $results[-1].name -eq "$($testPrefix)_3";
};

$query = New-XrmQueryExpression -LogicalName "account" -Columns "name";
$query = $query | Add-XrmQueryCondition -Field "name" -Condition BeginsWith -Values @($testPrefix);
$query = $query | Add-XrmQueryOrder -Field "name" -OrderType Descending;
$results = $Global:XrmClient | Get-XrmMultipleRecords -Query $query;
Assert-Test "Order Descending - first = _3, last = _1" {
    $results[0].name -eq "$($testPrefix)_3" -and $results[-1].name -eq "$($testPrefix)_1";
};

# ============================================================
# Add-XrmQueryLink + Add-XrmQueryLinkCondition
# ============================================================
Write-Section "Add-XrmQueryLink + Add-XrmQueryLinkCondition";

# Create a contact linked to account 1
$contact = New-XrmEntity -LogicalName "contact" -Attributes @{
    "firstname" = "LinkTest";
    "lastname"  = $testPrefix;
    "parentcustomerid" = New-XrmEntityReference -LogicalName "account" -Id $ids[0];
};
$contact.Id = $Global:XrmClient | Add-XrmRecord -Record $contact;
Assert-Test "Contact created for link test (Id = $($contact.Id))" {
    $contact.Id -ne [Guid]::Empty;
};

# Query contacts linked to our test account
$query = New-XrmQueryExpression -LogicalName "contact" -Columns "firstname", "lastname";
$link = $query | Add-XrmQueryLink -FromAttributeName "parentcustomerid" -ToEntityName "account" -ToAttributeName "accountid";
$link | Add-XrmQueryLinkCondition -Field "accountid" -Condition Equal -Values @($ids[0]) | Out-Null;
$results = $Global:XrmClient | Get-XrmMultipleRecords -Query $query;
$found = $results | Where-Object { $_.lastname -eq $testPrefix };
Assert-Test "Link query - found contact linked to account 1" {
    $found -ne $null;
};

# ============================================================
# TopCount
# ============================================================
Write-Section "TopCount";

$query = New-XrmQueryExpression -LogicalName "account" -Columns "name" -TopCount 2;
$query = $query | Add-XrmQueryCondition -Field "name" -Condition BeginsWith -Values @($testPrefix);
$query = $query | Add-XrmQueryOrder -Field "name" -OrderType Ascending;
$results = $Global:XrmClient | Get-XrmMultipleRecords -Query $query;
Assert-Test "TopCount 2 - returns max 2 records (actual: $($results.Count))" {
    $results.Count -eq 2;
};

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

$Global:XrmClient | Remove-XrmRecord -LogicalName "contact" -Id $contact.Id;
foreach ($id in $ids) {
    $Global:XrmClient | Remove-XrmRecord -LogicalName "account" -Id $id;
}

$query = New-XrmQueryExpression -LogicalName "account" -Columns "name";
$query = $query | Add-XrmQueryCondition -Field "accountid" -Condition In -Values $ids;
$remaining = $Global:XrmClient | Get-XrmMultipleRecords -Query $query;
$count = if ($remaining) { $remaining.Count } else { 0 };
Assert-Test "All test records deleted (remaining: $count)" { $count -eq 0 };

Write-TestSummary;