tests/Metadata/MultilingualLabels.Tests.ps1

<#
    Integration Test: Multilingual labels
    Validates multilingual label hashtable parameters on Add-/Set- table and column cmdlets.
    Cmdlets: New-XrmLabel, Add-XrmTable, Set-XrmTable, Add-XrmColumn, Set-XrmColumn,
             Get-XrmEntityMetadata, Get-XrmColumn, Remove-XrmTable
#>

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

$prefix = "new";
$suffix = Get-Random -Minimum 10000 -Maximum 99999;
$tableName = "${prefix}_mllabels${suffix}";
$columnName = "${prefix}_mlcol${suffix}";
$tableCreated = $false;

function Get-LabelText {
    param($Label, [int]$LanguageCode)
    if ($null -eq $Label) { return $null; }
    $match = $Label.LocalizedLabels | Where-Object { $_.LanguageCode -eq $LanguageCode };
    if ($null -eq $match) { return $null; }
    return $match.Label;
}

# ============================================================
# New-XrmLabel -Labels (multilingual primitive)
# ============================================================
Write-Section "New-XrmLabel multilingual";

$label = New-XrmLabel -Labels @{ 1033 = "Account"; 1036 = "Compte" };
Assert-Test "New-XrmLabel -Labels builds 2 localized labels" {
    $label.LocalizedLabels.Count -eq 2;
};
Assert-Test "New-XrmLabel -Labels keeps 1033 text" {
    (Get-LabelText -Label $label -LanguageCode 1033) -eq "Account";
};
Assert-Test "New-XrmLabel -Labels keeps 1036 text" {
    (Get-LabelText -Label $label -LanguageCode 1036) -eq "Compte";
};

# ============================================================
# Add-XrmTable with multilingual labels
# ============================================================
Write-Section "Add-XrmTable multilingual labels";

$createTableResponse = $Global:XrmClient | Add-XrmTable `
    -LogicalName $tableName `
    -DisplayNameLabels @{ 1033 = "ML Project"; 1036 = "Projet ML" } `
    -PluralNameLabels @{ 1033 = "ML Projects"; 1036 = "Projets ML" } `
    -DescriptionLabels @{ 1033 = "Multilingual test table"; 1036 = "Table de test multilingue" } `
    -OwnershipType ([Microsoft.Xrm.Sdk.Metadata.OwnershipTypes]::UserOwned) `
    -PrimaryAttributeSchemaName "${prefix}_name" `
    -PrimaryAttributeDisplayNameLabels @{ 1033 = "Name"; 1036 = "Nom" } `
    -PrimaryAttributeMaxLength 200;

Assert-Test "Add-XrmTable - created '$tableName'" {
    $createTableResponse -ne $null;
};
$tableCreated = $true;

$tableMetadata = $Global:XrmClient | Get-XrmEntityMetadata -LogicalName $tableName -Filter ([Microsoft.Xrm.Sdk.Metadata.EntityFilters]::Entity) -IfExists;
Assert-Test "Table DisplayName has 1033 label" {
    (Get-LabelText -Label $tableMetadata.DisplayName -LanguageCode 1033) -eq "ML Project";
};
Assert-Test "Table DisplayName has 1036 label" {
    (Get-LabelText -Label $tableMetadata.DisplayName -LanguageCode 1036) -eq "Projet ML";
};
Assert-Test "Table DisplayCollectionName has 1036 label" {
    (Get-LabelText -Label $tableMetadata.DisplayCollectionName -LanguageCode 1036) -eq "Projets ML";
};

# ============================================================
# Set-XrmTable redefine labels
# ============================================================
Write-Section "Set-XrmTable redefine labels";

$Global:XrmClient | Set-XrmTable `
    -MetadataId $tableMetadata.MetadataId `
    -DisplayNameLabels @{ 1036 = "Projet ML modifie" } | Out-Null;

$tableMetadata2 = $Global:XrmClient | Get-XrmEntityMetadata -LogicalName $tableName -Filter ([Microsoft.Xrm.Sdk.Metadata.EntityFilters]::Entity) -IfExists;
Assert-Test "Set-XrmTable redefined 1036 DisplayName" {
    (Get-LabelText -Label $tableMetadata2.DisplayName -LanguageCode 1036) -eq "Projet ML modifie";
};
Assert-Test "Set-XrmTable kept 1033 DisplayName (MergeLabels)" {
    (Get-LabelText -Label $tableMetadata2.DisplayName -LanguageCode 1033) -eq "ML Project";
};

# ============================================================
# Add-XrmColumn with multilingual labels
# ============================================================
Write-Section "Add-XrmColumn multilingual labels";

$attr = New-XrmStringColumn -LogicalName $columnName -SchemaName $columnName -DisplayName "Code" -MaxLength 100;
$Global:XrmClient | Add-XrmColumn `
    -EntityLogicalName $tableName `
    -Attribute $attr `
    -DisplayNameLabels @{ 1033 = "Code"; 1036 = "Code FR" } `
    -DescriptionLabels @{ 1033 = "Code description"; 1036 = "Description du code" } | Out-Null;

$column = $Global:XrmClient | Get-XrmColumn -EntityLogicalName $tableName -LogicalName $columnName -MetadataType ([Microsoft.Xrm.Sdk.Metadata.StringAttributeMetadata]) -IfExists;
Assert-Test "Column DisplayName has 1033 label" {
    (Get-LabelText -Label $column.DisplayName -LanguageCode 1033) -eq "Code";
};
Assert-Test "Column DisplayName has 1036 label" {
    (Get-LabelText -Label $column.DisplayName -LanguageCode 1036) -eq "Code FR";
};

# ============================================================
# Set-XrmColumn redefine labels
# ============================================================
Write-Section "Set-XrmColumn redefine labels";

$Global:XrmClient | Set-XrmColumn `
    -EntityLogicalName $tableName `
    -Attribute $column `
    -DisplayNameLabels @{ 1036 = "Code FR modifie" } | Out-Null;

$column2 = $Global:XrmClient | Get-XrmColumn -EntityLogicalName $tableName -LogicalName $columnName -MetadataType ([Microsoft.Xrm.Sdk.Metadata.StringAttributeMetadata]) -IfExists;
Assert-Test "Set-XrmColumn redefined 1036 DisplayName" {
    (Get-LabelText -Label $column2.DisplayName -LanguageCode 1036) -eq "Code FR modifie";
};
Assert-Test "Set-XrmColumn kept 1033 DisplayName (MergeLabels)" {
    (Get-LabelText -Label $column2.DisplayName -LanguageCode 1033) -eq "Code";
};

# ============================================================
# Component labels (-Labels -> name) via Add-/Set-XrmView
# ============================================================
Write-Section "Component labels - Add-XrmView -Labels";

$viewFetch = "<fetch><entity name='$tableName'><attribute name='${prefix}_name' /></entity></fetch>";
$viewLayout = "<grid name='resultset' object='1' jump='${prefix}_name' select='1' icon='1' preview='1'><row name='result' id='${tableName}id'><cell name='${prefix}_name' width='300' /></row></grid>";

$viewRef = $Global:XrmClient | Add-XrmView -EntityLogicalName $tableName -Labels @{ 1033 = "ML View EN"; 1036 = "Vue ML FR" } -LanguageCode 1036 -FetchXml $viewFetch -LayoutXml $viewLayout;
Assert-Test "Add-XrmView -Labels created a view" {
    $viewRef -ne $null -and $viewRef.Id -ne [Guid]::Empty;
};

$viewRecord = $Global:XrmClient | Get-XrmRecord -LogicalName "savedquery" -Id $viewRef.Id -Columns "name";
Assert-Test "View name resolved from -Labels using -LanguageCode 1036" {
    $viewRecord.name -eq "Vue ML FR";
};

Write-Section "Component labels - Set-XrmView -Labels (redefine)";

$Global:XrmClient | Set-XrmView -ViewReference $viewRef -Labels @{ 1033 = "ML View EN2"; 1036 = "Vue ML FR2" } | Out-Null;
$viewRecord2 = $Global:XrmClient | Get-XrmRecord -LogicalName "savedquery" -Id $viewRef.Id -Columns "name";
Assert-Test "Set-XrmView -Labels redefined name (default 1033)" {
    $viewRecord2.name -eq "ML View EN2";
};

# ============================================================
# CLEANUP: Remove-XrmTable (also removes the view above)
# ============================================================
Write-Section "Cleanup - Remove-XrmTable";

if ($tableCreated) {
    $removeTableResponse = $Global:XrmClient | Remove-XrmTable -LogicalName $tableName;
    Assert-Test "Remove-XrmTable - removed '$tableName'" {
        $removeTableResponse -ne $null;
    };
}

Write-TestSummary;