diff --git a/build/scripts/NewBcContainer.ps1 b/build/scripts/NewBcContainer.ps1 index d6e98d84794..1426435eb65 100644 --- a/build/scripts/NewBcContainer.ps1 +++ b/build/scripts/NewBcContainer.ps1 @@ -24,6 +24,64 @@ if ($platformVersion) { New-BcContainer @parameters +if ($parameters.auth -in @('UserPassword', 'NavUserPassword')) { + if (-not $parameters.credential) { + throw "The BCApps UserPassword test container requires a credential." + } + + $apiTestPasswordFile = 'C:\Run\my\ApiTestPassword' + $apiTestPassword = $parameters.credential.GetNetworkCredential().Password + $hostPasswordFile = Join-Path ([System.IO.Path]::GetTempPath()) "BCAppsApiTestPassword-$([Guid]::NewGuid().ToString('N'))" + try { + [System.IO.File]::WriteAllText($hostPasswordFile, $apiTestPassword) + + try { + Copy-FileToBcContainer -containerName $parameters.ContainerName -localPath $hostPasswordFile -containerPath $apiTestPasswordFile + Invoke-ScriptInBcContainer -containerName $parameters.ContainerName -argumentList $apiTestPasswordFile -scriptblock { + param( + [string]$FilePath + ) + + $fileSecurity = [System.Security.AccessControl.FileSecurity]::new() + $fileSecurity.SetAccessRuleProtection($true, $false) + foreach ($accessEntry in @( + @{ Sid = 'S-1-5-18'; Rights = [System.Security.AccessControl.FileSystemRights]::FullControl }, + @{ Sid = 'S-1-5-20'; Rights = [System.Security.AccessControl.FileSystemRights]::Read }, + @{ Sid = 'S-1-5-32-544'; Rights = [System.Security.AccessControl.FileSystemRights]::FullControl } + )) { + $identity = [System.Security.Principal.SecurityIdentifier]::new($accessEntry.Sid) + $accessRule = [System.Security.AccessControl.FileSystemAccessRule]::new( + $identity, + $accessEntry.Rights, + [System.Security.AccessControl.AccessControlType]::Allow) + $fileSecurity.AddAccessRule($accessRule) + } + Set-Acl -LiteralPath $FilePath -AclObject $fileSecurity + } + } + catch { + $originalError = $_ + try { + Invoke-ScriptInBcContainer -containerName $parameters.ContainerName -argumentList $apiTestPasswordFile -scriptblock { + param( + [string]$FilePath + ) + + Remove-Item -LiteralPath $FilePath -Force -ErrorAction SilentlyContinue + } + } + catch { + Write-Warning "Could not remove the API test credential file after setup failed." + } + throw $originalError + } + } + finally { + Remove-Item -LiteralPath $hostPasswordFile -Force -ErrorAction SilentlyContinue + Clear-Variable apiTestPassword -ErrorAction SilentlyContinue + } +} + Set-BcContainerServerConfiguration -containerName $parameters.ContainerName -keyName "EnforceUserPathForAlFileOperations" -keyValue "false" Set-BcContainerServerConfiguration -containerName $parameters.ContainerName -keyName "UsePermissionSetsFromExtensions" -keyValue "true" Restart-BcContainer -containerName $parameters.ContainerName diff --git a/build/scripts/ParallelTestExecution.psm1 b/build/scripts/ParallelTestExecution.psm1 index 2d6e2b669e7..3c95789e0fe 100644 --- a/build/scripts/ParallelTestExecution.psm1 +++ b/build/scripts/ParallelTestExecution.psm1 @@ -14,6 +14,148 @@ if (-not (Get-Command Write-Log -ErrorAction SilentlyContinue)) { } Import-Module (Join-Path $PSScriptRoot "ALAppBuild.psm1" -Resolve) +<# +.SYNOPSIS + Determines whether a disabled-test entry applies to the current country. +#> +function Test-DisabledTestAppliesToCountry { + param( + $DisabledTest, + [string]$Country + ) + + if (-not $DisabledTest.PSObject.Properties['countries']) { + return $true + } + + return $Country -in @($DisabledTest.countries) +} + +<# +.SYNOPSIS + Gets disabled test entries for an app and filters country-scoped entries. +.PARAMETER AppName + Application name used to locate its DisabledTests folder. +#> +function Get-DisabledTestsForApp { + param( + [Parameter(Mandatory=$true)] + [string]$AppName + ) + + $appFolderName = $AppName -replace ' ', '_' + $disabledTests = @() + $country = Get-ALGoSetting -Key "country" + + $disabledTestsFolders = Get-ChildItem -Path (Get-BaseFolder) -Filter "DisabledTests" -Recurse -Directory + foreach ($disabledTestsFolder in $disabledTestsFolders) { + $appFolder = Join-Path $disabledTestsFolder.FullName $appFolderName + if (-not (Test-Path $appFolder)) { + continue + } + + foreach ($jsonFile in (Get-ChildItem -Path $appFolder -Filter "*.json")) { + $disabledTests += @( + Get-Content -Raw -Path $jsonFile.FullName | + ConvertFrom-Json | + Where-Object { Test-DisabledTestAppliesToCountry -DisabledTest $_ -Country $country } + ) + } + } + + return @($disabledTests) +} + +function Get-ParametersForCommand { + param( + [Parameter(Mandatory=$true)] + [Hashtable]$Parameters, + [Parameter(Mandatory=$true)] + [string]$CommandName + ) + + $command = Get-Command $CommandName -ErrorAction Stop + $filtered = @{} + foreach ($key in $Parameters.Keys) { + if ($command.Parameters.ContainsKey($key)) { + $filtered[$key] = $Parameters[$key] + } + } + return $filtered +} + +function ConvertTo-RequiredDisabledWorkItems { + param( + [array]$DiscoveredTests, + [string]$AppName, + [string]$AppId + ) + + $codeunits = @() + foreach ($entry in @($DiscoveredTests)) { + if ($entry.PSObject.Properties.Name -contains "Codeunits") { + $codeunits += @($entry.Codeunits) + } else { + $codeunits += $entry + } + } + + return @( + $codeunits | + Where-Object { $_ -and $_.Id -and @($_.Tests).Count -gt 0 } | + ForEach-Object { + [PSCustomObject]@{ + Key = "${AppName}::$($_.Id)" + AppName = $AppName + AppId = $AppId + CodeunitId = [string]$_.Id + CodeunitName = [string]$_.Name + TestCount = @($_.Tests).Count + } + } + ) +} + +function Get-RequiredDisabledWorkItems { + param( + [Parameter(Mandatory=$true)] + [Hashtable]$Parameters, + [Parameter(Mandatory=$true)] + [string]$TestType, + [string[]]$AppNamesToTest, + [Parameter(Mandatory=$true)] + [Hashtable]$AppIdByName + ) + + $workItems = @() + foreach ($appName in $AppNamesToTest) { + $appId = $AppIdByName[$appName] + if (-not $appId) { + continue + } + + $discoveryParameters = Get-ParametersForCommand -Parameters $Parameters -CommandName "Get-TestsFromBcContainer" + $discoveryParameters["extensionId"] = $appId + $discoveryParameters["requiredTestIsolation"] = "Disabled" + $discoveryParameters["disabledTests"] = @(Get-DisabledTestsForApp -AppName $appName) + if ($TestType -eq "Legacy") { + $discoveryParameters.Remove("testType") | Out-Null + } else { + $discoveryParameters["testType"] = $TestType + } + + Write-Host "Discovering RequiredTestIsolation=Disabled codeunits in '$appName'..." + $discoveredTests = @(Get-TestsFromBcContainer @discoveryParameters) + $appWorkItems = @(ConvertTo-RequiredDisabledWorkItems -DiscoveredTests $discoveredTests -AppName $appName -AppId $appId) + if ($appWorkItems.Count -gt 0) { + Write-Host " Found $($appWorkItems.Count) codeunit(s), $((($appWorkItems | Measure-Object TestCount -Sum).Sum)) test method(s)." + $workItems += $appWorkItems + } + } + + return @($workItems) +} + <# .SYNOPSIS Returns the rerun budget for the current build. @@ -196,6 +338,16 @@ function Get-AppNamesForBucket { return @($InstalledTestAppNames | Where-Object { $_ -notin $allLegacyTestApps }) } +function Get-CleanTenantTestAppNames { + $testConfigPath = Join-Path (Get-BaseFolder) "build\scripts\TestConfiguration.json" + if (-not (Test-Path $testConfigPath)) { + return @() + } + + $testConfig = Get-Content $testConfigPath -Raw | ConvertFrom-Json + return @($testConfig.CleanTenantRequiredDisabled) +} + <# .SYNOPSIS Gets the list of operational tenants in a BC container. @@ -204,18 +356,211 @@ function Get-AppNamesForBucket { .OUTPUTS [string[]] Array of tenant IDs that are in Operational state. #> -function Get-AvailableBcTenants { +function Get-AvailableBcTenantInfo { param( [Parameter(Mandatory=$true)] [string]$containerName ) $tenants = Invoke-ScriptInBcContainer -containerName $containerName -scriptblock { - Get-NavTenant $ServerInstance | Where-Object { $_.State -eq "Operational" } | ForEach-Object { $_.Id } + Get-NavTenant $ServerInstance | + Where-Object { $_.State -eq "Operational" } | + ForEach-Object { + [PSCustomObject]@{ + Id = $_.Id + DatabaseName = $_.DatabaseName + } + } } return @($tenants) } +<# +.SYNOPSIS + Gets the IDs of operational tenants in a BC container. +.PARAMETER containerName + Name of the BC container. +#> +function Get-AvailableBcTenants { + param( + [Parameter(Mandatory=$true)] + [string]$containerName + ) + + return @( + Get-AvailableBcTenantInfo -containerName $containerName | + ForEach-Object { $_.Id } + ) +} + +function New-BcTestTenantTemplate { + param( + [Parameter(Mandatory=$true)] + [string]$ContainerName, + [Parameter(Mandatory=$true)] + [string]$SourceDatabaseName + ) + + $result = @(Invoke-ScriptInBcContainer -containerName $ContainerName -useSession $false -scriptblock { Param($sourceDatabaseName) + $templateDatabaseName = "$sourceDatabaseName-test-template" + $maxAttempts = 3 + $retryDelaySeconds = 5 + for ($attempt = 1; $attempt -le $maxAttempts; $attempt++) { + try { + if (Test-NAVDatabase -DatabaseName $templateDatabaseName) { + Remove-NAVDatabase -DatabaseName $templateDatabaseName | Out-Null + } + + Write-Host "Creating immutable test tenant template '$templateDatabaseName' from '$sourceDatabaseName' (attempt $attempt/$maxAttempts)..." + Copy-NAVDatabase -SourceDatabaseName $sourceDatabaseName -DestinationDatabaseName $templateDatabaseName -DatabaseServer "." | Out-Null + break + } catch { + Write-Host "WARNING: Template database copy failed on attempt $attempt/${maxAttempts}: $($_.Exception.Message)" + if ($attempt -eq $maxAttempts) { + throw "Failed to create a test tenant template from '$sourceDatabaseName' after $maxAttempts attempts. Last error: $($_.Exception.Message)" + } + Start-Sleep -Seconds $retryDelaySeconds + } + } + $templateDatabaseName + } -argumentList $SourceDatabaseName) + + if ($result.Count -eq 0) { + throw "Creating the clean test tenant template returned no database name." + } + return [string]$result[-1] +} + +<# +.SYNOPSIS + Replaces a tenant database with a copy of the immutable test template. +.PARAMETER ContainerName + Name of the BC container. +.PARAMETER Tenant + Tenant ID to refresh. +.PARAMETER TenantDatabaseName + Database currently mounted for the tenant. +.PARAMETER TemplateDatabaseName + Immutable source database copied before the next test codeunit. +#> +function Reset-BcTestTenant { + param( + [Parameter(Mandatory=$true)] + [string]$ContainerName, + [Parameter(Mandatory=$true)] + [string]$Tenant, + [Parameter(Mandatory=$true)] + [string]$TenantDatabaseName, + [Parameter(Mandatory=$true)] + [string]$TemplateDatabaseName + ) + + Invoke-ScriptInBcContainer -containerName $ContainerName -useSession $false -scriptblock { + Param($tenant, $tenantDatabaseName, $templateDatabaseName) + + $stopwatch = [System.Diagnostics.Stopwatch]::StartNew() + $mountedTenant = Get-NAVTenant -ServerInstance $ServerInstance -Tenant $tenant -ErrorAction SilentlyContinue + if ($mountedTenant) { + Dismount-NAVTenant -ServerInstance $ServerInstance -Tenant $tenant -Force | Out-Null + } + + $maxAttempts = 3 + $retryDelaySeconds = 5 + for ($attempt = 1; $attempt -le $maxAttempts; $attempt++) { + try { + if (Test-NAVDatabase -DatabaseName $tenantDatabaseName) { + Remove-NAVDatabase -DatabaseName $tenantDatabaseName | Out-Null + } + + Copy-NAVDatabase -SourceDatabaseName $templateDatabaseName -DestinationDatabaseName $tenantDatabaseName -DatabaseServer "." | Out-Null + break + } catch { + Write-Host "WARNING: Tenant database refresh failed on attempt $attempt/${maxAttempts}: $($_.Exception.Message)" + if ($attempt -eq $maxAttempts) { + throw "Failed to refresh tenant database '$tenantDatabaseName' after $maxAttempts attempts. Last error: $($_.Exception.Message)" + } + Start-Sleep -Seconds $retryDelaySeconds + } + } + Mount-NAVTenant -ServerInstance $ServerInstance -Id $tenant -DatabaseServer "." -DatabaseName $tenantDatabaseName -OverwriteTenantIdInDatabase -Force | Out-Null + + $maxWaitSeconds = 300 + while ((Get-NAVTenant -ServerInstance $ServerInstance -Tenant $tenant).State -eq "Mounting") { + if ($stopwatch.Elapsed.TotalSeconds -ge $maxWaitSeconds) { + throw "Tenant '$tenant' did not finish mounting within $maxWaitSeconds seconds." + } + Start-Sleep -Milliseconds 250 + } + + $state = (Get-NAVTenant -ServerInstance $ServerInstance -Tenant $tenant).State + if ($state -notin @("Operational", "OperationalWithWarnings")) { + throw "Tenant '$tenant' is '$state' after refresh; expected an operational state." + } + + $stopwatch.Stop() + Write-Host "Refreshed tenant '$tenant' from '$templateDatabaseName' in $([math]::Round($stopwatch.Elapsed.TotalSeconds, 2)) seconds." + } -argumentList $Tenant, $TenantDatabaseName, $TemplateDatabaseName +} + +function Remove-BcTestTenantTemplate { + param( + [Parameter(Mandatory=$true)] + [string]$ContainerName, + [Parameter(Mandatory=$true)] + [string]$TemplateDatabaseName + ) + + Invoke-ScriptInBcContainer -containerName $ContainerName -scriptblock { Param($templateDatabaseName) + if (Test-NAVDatabase -DatabaseName $templateDatabaseName) { + Remove-NAVDatabase -DatabaseName $templateDatabaseName | Out-Null + } + } -argumentList $TemplateDatabaseName +} + +function Set-BcTestTaskScheduler { + param( + [Parameter(Mandatory=$true)] + [string]$ContainerName, + [Parameter(Mandatory=$true)] + [bool]$Enabled + ) + + Invoke-ScriptInBcContainer -containerName $ContainerName -scriptblock { Param($enabled) + $state = if ($enabled) { "Enabling" } else { "Disabling" } + $value = if ($enabled) { "true" } else { "false" } + Write-Host "$state Task Scheduler for clean RequiredTestIsolation=Disabled execution..." + Set-NAVServerConfiguration -ServerInstance $ServerInstance -KeyName "EnableTaskScheduler" -KeyValue $value -WarningAction SilentlyContinue + Set-NAVServerInstance -ServerInstance $ServerInstance -Restart + + $maxWaitSeconds = 300 + $stopwatch = [System.Diagnostics.Stopwatch]::StartNew() + while (Get-NAVTenant $ServerInstance | Where-Object { $_.State -eq "Mounting" }) { + if ($stopwatch.Elapsed.TotalSeconds -ge $maxWaitSeconds) { + throw "Tenants did not finish mounting within $maxWaitSeconds seconds after changing Task Scheduler state." + } + Start-Sleep -Milliseconds 250 + } + } -argumentList $Enabled +} + +function Enable-BcTestTaskScheduler { + param( + [Parameter(Mandatory=$true)] + [string]$ContainerName + ) + + Set-BcTestTaskScheduler -ContainerName $ContainerName -Enabled $true +} + +function Disable-BcTestTaskScheduler { + param( + [Parameter(Mandatory=$true)] + [string]$ContainerName + ) + + Set-BcTestTaskScheduler -ContainerName $ContainerName -Enabled $false +} + <# .SYNOPSIS Merges multiple test result XML files into a single file. @@ -297,7 +642,9 @@ function Merge-TestResultFiles { Any of these fingerprints is sufficient evidence: "Cannot open page 130455", "InvokeInteractions failed with status code 500", or a stack frame referencing "InteractionManager.cs:line N" (line number not pinned, so platform refactors do not - silently invalidate the match). + silently invalidate the match). The platform can also fail while page 130455 resolves an + extension's codeunit metadata; the known variants surface from ExtensionId_a45_OnValidate + as an invalid metadata BLOB range or a missing nullable metadata value. .PARAMETER Output The combined output (stdout + stderr + verbose) captured from a finished background job. Null or empty returns $false. @@ -308,7 +655,13 @@ function Test-TransientTestFailure { ) if ([string]::IsNullOrEmpty($Output)) { return $false } - return [bool]($Output -match 'Cannot open page 130455|InvokeInteractions failed with status code 500|InteractionManager\.cs:line \d+') + return [bool]( + ($Output -match 'TRANSIENT TEST PLATFORM RACE') -or + ($Output -match 'ClientSession State is InError') -or + ($Output -match 'Cannot open page 130455|InvokeInteractions failed with status code 500|InteractionManager\.cs:line \d+') -or + ($Output -match '(?s)ObjName:Command Line Test Tool.*MethodName:ExtensionId_a45_OnValidate.*(?:Offset and length were out of bounds|Nullable object must have a value)') -or + ($Output -match '(?s)GET request failed\..*Response code is 500.*Object reference not set to an instance of an object') + ) } <# @@ -403,6 +756,7 @@ function Start-TestAppDispatch { [string]$ScriptPath, [string]$TestType, $State, + [switch]$SkipAutomaticDisabledPass, [string]$Verb = 'Dispatching', [string]$FileSuffix ) @@ -414,12 +768,149 @@ function Start-TestAppDispatch { $appParams['extensionId'] = $AppId $appParams.Remove('ReRun') | Out-Null - $job = Start-TestJob -parameters $appParams -tenant $Tenant -scriptPath $ScriptPath -testType $TestType -fileSuffix $FileSuffix + $job = Start-TestJob -parameters $appParams -tenant $Tenant -scriptPath $ScriptPath -testType $TestType ` + -skipAutomaticDisabledPass:$SkipAutomaticDisabledPass -fileSuffix $FileSuffix $State.jobs = @($State.jobs) + @([PSCustomObject]@{ jobId = $job.Id; tenant = $Tenant; appName = $AppName }) Start-Sleep -Seconds 5 } +function Start-RequiredDisabledDispatch { + param( + [Hashtable]$Parameters, + $WorkItem, + $TenantInfo, + [string]$ScriptPath, + [string]$TestType, + $State, + [string]$Verb = "Dispatching" + ) + + Write-Host "$Verb RequiredTestIsolation=Disabled codeunit $($WorkItem.CodeunitId) '$($WorkItem.CodeunitName)' from '$($WorkItem.AppName)' on tenant '$($TenantInfo.Id)'" + + $codeunitParameters = $Parameters.Clone() + $codeunitParameters["appName"] = $WorkItem.AppName + $codeunitParameters["extensionId"] = $WorkItem.AppId + $codeunitParameters["testCodeunit"] = $WorkItem.CodeunitId + $codeunitParameters["requiredTestIsolation"] = "Disabled" + $codeunitParameters["testRunnerCodeunitId"] = "130451" + $codeunitParameters["disabledTests"] = @(Get-DisabledTestsForApp -AppName $WorkItem.AppName) + $codeunitParameters.Remove("ReRun") | Out-Null + if ($Verb -eq "Re-dispatching") { + $codeunitParameters["ReRun"] = $true + } + + $appendKeys = @{ + XUnitResultFileName = "AppendToXUnitResultFile" + JUnitResultFileName = "AppendToJUnitResultFile" + } + foreach ($resultKey in $appendKeys.Keys) { + if ($codeunitParameters.ContainsKey($resultKey) -and $codeunitParameters[$resultKey]) { + $codeunitParameters[$appendKeys[$resultKey]] = $true + } + } + + $job = Start-TestJob -parameters $codeunitParameters -tenant $TenantInfo.Id -scriptPath $ScriptPath ` + -testType $TestType -skipAutomaticDisabledPass + $State.jobs = @($State.jobs) + @( + [PSCustomObject]@{ + jobId = $job.Id + tenant = $TenantInfo.Id + appName = $WorkItem.Key + } + ) + Start-Sleep -Seconds 1 +} + +function Invoke-RequiredDisabledTestExecution { + param( + [Parameter(Mandatory=$true)] + [Hashtable]$Parameters, + [Parameter(Mandatory=$true)] + [array]$WorkItems, + [Parameter(Mandatory=$true)] + [array]$TenantInfo, + [Parameter(Mandatory=$true)] + [string]$TemplateDatabaseName, + [Parameter(Mandatory=$true)] + [string]$ScriptPath, + [Parameter(Mandatory=$true)] + [string]$TestType + ) + + if ($WorkItems.Count -eq 0) { + return $true + } + + $workItemByKey = @{} + foreach ($workItem in $WorkItems) { + $workItemByKey[$workItem.Key] = $workItem + } + + $state = [PSCustomObject]@{ + jobs = @() + hasFailures = $false + transient = @() + retried = @{} + retryTenant = @{} + } + $pending = @($WorkItems) + + while ($pending.Count -gt 0 -or $state.transient.Count -gt 0) { + if ($state.transient.Count -gt 0) { + $retryItems = @() + foreach ($transient in @($state.transient)) { + $key = $transient.Key + $state.retried[$key] = $true + $state.retryTenant[$key] = $transient.Tenant + $retryItems += $workItemByKey[$key] + } + $state.transient = @() + $pending = @($retryItems) + @($pending) + } + + $availableTenantInfo = @($TenantInfo) + $batch = @() + while ($pending.Count -gt 0 -and $availableTenantInfo.Count -gt 0) { + $workItem = $pending[0] + $pending = @($pending | Select-Object -Skip 1) + $selectedTenantInfo = if ($state.retryTenant.ContainsKey($workItem.Key)) { + $availableTenantInfo | + Where-Object { $_.Id -eq $state.retryTenant[$workItem.Key] } | + Select-Object -First 1 + } else { + $availableTenantInfo | Select-Object -First 1 + } + if (-not $selectedTenantInfo) { + throw "Could not reserve tenant for clean codeunit '$($workItem.Key)'." + } + $availableTenantInfo = @($availableTenantInfo | Where-Object { $_.Id -ne $selectedTenantInfo.Id }) + $verb = if ($state.retried.ContainsKey($workItem.Key)) { "Re-dispatching" } else { "Dispatching" } + + $batch += [PSCustomObject]@{ + WorkItem = $workItem + TenantInfo = $selectedTenantInfo + Verb = $verb + } + } + + # Finish every restore in the batch before any test starts. This keeps SQL backup/restore + # activity from overlapping page 130455 metadata enumeration and API cold starts. + foreach ($dispatch in $batch) { + Reset-BcTestTenant -ContainerName $Parameters.containerName -Tenant $dispatch.TenantInfo.Id ` + -TenantDatabaseName $dispatch.TenantInfo.DatabaseName -TemplateDatabaseName $TemplateDatabaseName + } + foreach ($dispatch in $batch) { + Start-RequiredDisabledDispatch -Parameters $Parameters -WorkItem $dispatch.WorkItem ` + -TenantInfo $dispatch.TenantInfo ` + -ScriptPath $ScriptPath -TestType $TestType -State $state -Verb $dispatch.Verb + } + $null = Wait-ForAllTestJobs -state $state + } + + return (-not $state.hasFailures) +} + <# .SYNOPSIS Records a finished job's outcome on the state object, queueing a rerun when one is warranted. @@ -442,10 +933,17 @@ function Register-TestJobOutcome { switch ($Result.Outcome) { 'Transient' { Write-Host "Transient platform race for '$($Result.AppName)' on '$($Result.Tenant)'. Queued for one retry." - $State.transient = @($State.transient) + @($Result.AppName) + $State.transient = @($State.transient) + @( + [PSCustomObject]@{ + Key = $Result.AppName + Tenant = $Result.Tenant + } + ) } 'Failed' { - $canRerun = ($State.rerunBudget -gt 0) -and + $supportsAppReruns = $null -ne $State.PSObject.Properties['rerunBudget'] + $canRerun = $supportsAppReruns -and + ($State.rerunBudget -gt 0) -and ($State.tenantCount -gt 1) -and (-not $State.rerunDone.ContainsKey($Result.AppName)) @@ -542,6 +1040,28 @@ function Wait-ForFreeTenant { throw "Wait-ForFreeTenant: timed out after $timeoutSeconds seconds waiting for a free tenant. Running jobs: $($state.jobs | ForEach-Object { "$($_.appName) on $($_.tenant)" } | Out-String)" } +function Wait-ForSpecificTenant { + param( + $state, + $tenants, + [string]$tenant, + [int]$timeoutSeconds = 7200, + [int]$pollIntervalSeconds = 10 + ) + + $waited = 0 + while ($waited -lt $timeoutSeconds) { + $available = @(Get-FreeTenants -state $state -tenants $tenants) + if ($tenant -in $available) { + return $tenant + } + Start-Sleep -Seconds $pollIntervalSeconds + $waited += $pollIntervalSeconds + } + + throw "Wait-ForSpecificTenant: timed out after $timeoutSeconds seconds waiting for tenant '$tenant'." +} + <# .SYNOPSIS Starts a background job to run tests for a single app on a specific tenant. @@ -564,6 +1084,7 @@ function Start-TestJob { [string]$tenant, [string]$scriptPath, [string]$testType, + [switch]$skipAutomaticDisabledPass, [string]$fileSuffix ) @@ -587,15 +1108,19 @@ function Start-TestJob { $bchModule = Get-Module BcContainerHelper | Select-Object -First 1 $bchModulePath = if ($bchModule) { $bchModule.Path } else { "BcContainerHelper" } - return Start-Job -ScriptBlock { - param($params, $scriptPath, $testType, $bchPath) + $jobScript = { + param($params, $scriptPath, $testType, $bchPath, $skipDisabledPass) Import-Module $bchPath # Background jobs run a single app sequentially. Pass an empty $AppNamesToTest so the # shared script skips the parallel dispatch branch and falls through to running this # one app's tests directly. - $passed = . $scriptPath -parameters $params -TestType $testType -AppNamesToTest @() + $passed = . $scriptPath -parameters $params -TestType $testType -AppNamesToTest @() ` + -SkipAutomaticDisabledPass:$skipDisabledPass if (-not $passed) { throw "Test execution failed" } - } -ArgumentList $jobParams, $scriptPath, $testType, $bchModulePath + } + + return Start-Job -ScriptBlock $jobScript -ArgumentList $jobParams, $scriptPath, $testType, $bchModulePath, ` + $skipAutomaticDisabledPass.IsPresent } <# @@ -627,6 +1152,59 @@ function Wait-ForAllTestJobs { $state.jobs = @() } +function Add-MissingJUnitTestProperties { + param( + [Parameter(Mandatory=$true)] + [string]$ResultFile, + [array]$WorkItems = @() + ) + + if (-not (Test-Path $ResultFile) -or $WorkItems.Count -eq 0) { + return + } + + $workItemByCodeunitId = @{} + foreach ($workItem in $WorkItems) { + $workItemByCodeunitId[[string]$workItem.CodeunitId] = $workItem + } + + $xml = [xml](Get-Content $ResultFile -Raw) + $changed = $false + foreach ($suite in @($xml.testsuites.testsuite)) { + if ($suite.properties) { + continue + } + + $codeunitId = ([string]$suite.name -split ' ', 2)[0] + $workItem = $workItemByCodeunitId[$codeunitId] + if (-not $workItem) { + continue + } + + $properties = $xml.CreateElement("properties") + foreach ($propertyValue in @{ + extensionid = $workItem.AppId + appName = $workItem.AppName + }.GetEnumerator()) { + $property = $xml.CreateElement("property") + $property.SetAttribute("name", $propertyValue.Key) + $property.SetAttribute("value", [string]$propertyValue.Value) + $properties.AppendChild($property) | Out-Null + } + + if ($suite.FirstChild) { + $suite.InsertBefore($properties, $suite.FirstChild) | Out-Null + } else { + $suite.AppendChild($properties) | Out-Null + } + $changed = $true + } + + if ($changed) { + $xml.Save($ResultFile) + } +} + <# .SYNOPSIS Merges per-job test result files into the single file expected by Run-AlPipeline. @@ -642,6 +1220,7 @@ function Merge-TenantTestResults { param( [Hashtable]$parameters, [string[]]$tenants, + [array]$workItems = @(), [string[]]$rerunSuffixes = @() ) @@ -655,6 +1234,11 @@ function Merge-TenantTestResults { $ext = [System.IO.Path]::GetExtension($origFile) $tenantFiles = @($suffixes | ForEach-Object { Join-Path $dir "$name-$_$ext" }) + if ($resultKey -eq "JUnitResultFileName") { + foreach ($tenantFile in $tenantFiles) { + Add-MissingJUnitTestProperties -ResultFile $tenantFile -WorkItems $workItems + } + } Merge-TestResultFiles -targetFile $origFile -sourceFiles $tenantFiles # Clean up per-job files @@ -680,6 +1264,8 @@ function Merge-TenantTestResults { All available tenant ids. Warmup dispatches onto the first one. .PARAMETER State The parallel execution state object; mutated (jobs/hasFailures/transient) as the warmup runs. +.PARAMETER CleanTenantAppNames + Apps whose automatic Disabled-isolation pass must be deferred to clean-codeunit execution. .OUTPUTS [string[]] The remaining app names to dispatch (first app removed if it was warmed up). #> @@ -691,7 +1277,8 @@ function Invoke-WarmupDispatch { [Parameter(Mandatory=$true)][AllowEmptyCollection()][string[]]$Tenants, [Parameter(Mandatory=$true)][string]$ScriptPath, [string]$TestType, - [Parameter(Mandatory=$true)]$State + [Parameter(Mandatory=$true)]$State, + [string[]]$CleanTenantAppNames = @() ) # Only serialize when there is a fan-out to protect: >1 app AND >1 tenant. @@ -708,7 +1295,8 @@ function Invoke-WarmupDispatch { Write-Host "Warming up: dispatching first app '$warmupApp' on '$($Tenants[0])' alone and awaiting completion before parallel fan-out." Start-TestAppDispatch -Parameters $Parameters -AppName $warmupApp -AppId $warmupAppId -Tenant $Tenants[0] ` - -ScriptPath $ScriptPath -TestType $TestType -State $State -Verb 'Dispatching' + -ScriptPath $ScriptPath -TestType $TestType -State $State -Verb 'Dispatching' ` + -SkipAutomaticDisabledPass:($warmupApp -in $CleanTenantAppNames) # Await the single job so the process is warm before anything runs in parallel. A transient # failure here lands in $State.transient and the caller's loop re-queues it; a hard failure is @@ -808,7 +1396,8 @@ function Invoke-ParallelTestExecution { } } - $tenants = @(Get-AvailableBcTenants -containerName $parameters.containerName) + $tenantInfo = @(Get-AvailableBcTenantInfo -containerName $parameters.containerName) + $tenants = @($tenantInfo | ForEach-Object { $_.Id }) Write-Host "Available tenants: $($tenants -join ', ')" # Build a name -> appId map so we can set extensionId per dispatch. Run-TestsInBcContainer @@ -820,15 +1409,64 @@ function Invoke-ParallelTestExecution { Where-Object { $_.IsInstalled } | ForEach-Object { $appIdByName[$_.Name] = $_.AppId } + $cleanTenantAppNames = @( + Get-CleanTenantTestAppNames | + Where-Object { $_ -in $appNamesToTest } + ) + $requiredDisabledWorkItems = @( + Get-RequiredDisabledWorkItems -Parameters $parameters -TestType $testType ` + -AppNamesToTest $cleanTenantAppNames -AppIdByName $appIdByName + ) + $cleanTenantInfo = @( + $tenantInfo | + Where-Object { $_.Id -ne $parameters.tenant } + ) + $templateDatabaseName = "" + try { + if ($requiredDisabledWorkItems.Count -gt 0) { + if ($cleanTenantInfo.Count -eq 0) { + throw "Clean RequiredTestIsolation=Disabled execution requires at least one secondary tenant." + } + Write-Host "Preparing clean-tenant execution for $($requiredDisabledWorkItems.Count) RequiredTestIsolation=Disabled codeunit(s)." + $sourceTenantInfo = @($tenantInfo | Where-Object { $_.Id -eq $parameters.tenant }) | Select-Object -First 1 + if (-not $sourceTenantInfo -or [string]::IsNullOrEmpty($sourceTenantInfo.DatabaseName)) { + throw "Could not determine the database name for source tenant '$($parameters.tenant)'." + } + $templateDatabaseName = New-BcTestTenantTemplate -ContainerName $parameters.containerName -SourceDatabaseName $sourceTenantInfo.DatabaseName + } + # dispatched=true marks "we started the foreach" - lets concurrent reads notice an in-flight # run. completed=false stays false until wait+merge finish; only then is finalResult valid. $state = [PSCustomObject]@{ jobs = @(); dispatched = $true; completed = $false; finalResult = $false; hasFailures = $false - transient = @(); retried = @{} + transient = @(); retried = @{}; retryTenant = @{} rerun = @(); rerunDone = @{}; rerunBudget = (Get-AppRerunBudget); tenantCount = $tenants.Count } $state | ConvertTo-Json -Depth 5 | Set-Content $stateFile -Force + if ($requiredDisabledWorkItems.Count -gt 0) { + Enable-BcTestTaskScheduler -ContainerName $parameters.containerName + try { + $requiredDisabledPassed = Invoke-RequiredDisabledTestExecution -Parameters $parameters ` + -WorkItems $requiredDisabledWorkItems -TenantInfo $cleanTenantInfo ` + -TemplateDatabaseName $templateDatabaseName -ScriptPath $scriptPath -TestType $testType + if (-not $requiredDisabledPassed) { + $state.hasFailures = $true + } + } + finally { + try { + Disable-BcTestTaskScheduler -ContainerName $parameters.containerName + } + finally { + foreach ($cleanTenant in $cleanTenantInfo) { + Reset-BcTestTenant -ContainerName $parameters.containerName -Tenant $cleanTenant.Id ` + -TenantDatabaseName $cleanTenant.DatabaseName -TemplateDatabaseName $templateDatabaseName + } + } + } + } + # Single dispatch loop, FIFO. TestConfiguration.json lists the smallest app first (a cheap # serial warmup) and the rest longest-first (LPT, keeps the tail short). The retry cap lives in # Receive-TestJobResult: an app already in $state.retried is classified as Failed on a re-fail. @@ -837,7 +1475,8 @@ function Invoke-ParallelTestExecution { # Run the first app alone and await it to warm the container before parallelizing the rest. # No-op for single-app/single-tenant. $pending = @(Invoke-WarmupDispatch -Parameters $parameters -Pending $pending -AppIdByName $appIdByName ` - -Tenants $tenants -ScriptPath $scriptPath -TestType $testType -State $state) + -Tenants $tenants -ScriptPath $scriptPath -TestType $testType -State $state ` + -CleanTenantAppNames $cleanTenantAppNames) $rerunSuffixes = @() @@ -850,9 +1489,12 @@ function Invoke-ParallelTestExecution { if ($state.transient.Count -gt 0) { $toRetry = @($state.transient) $state.transient = @() - Write-Host "Re-queueing $($toRetry.Count) app(s) after transient platform race: $($toRetry -join ', ')" - foreach ($appName in $toRetry) { + $retryAppNames = @($toRetry | ForEach-Object { $_.Key }) + Write-Host "Re-queueing $($toRetry.Count) app(s) after transient platform race: $($retryAppNames -join ', ')" + foreach ($transient in $toRetry) { + $appName = $transient.Key $state.retried[$appName] = $true + $state.retryTenant[$appName] = $transient.Tenant # A transient retry goes out through the normal queue and so writes to a TENANT # result file. Tenant files are merged before rerun files, so any rerun file this # app already produced would overwrite the newer result - drop it. @@ -860,7 +1502,7 @@ function Invoke-ParallelTestExecution { Remove-RerunResultFile -parameters $parameters -suffix $state.rerunDone[$appName] } } - $pending = @($toRetry) + @($pending) + $pending = @($retryAppNames) + @($pending) } # Reruns take priority over the normal queue, for the same tail-latency reason as above: @@ -875,7 +1517,8 @@ function Invoke-ParallelTestExecution { $tenant = Wait-ForFreeTenant -state $state -tenants $tenants -excludeTenant $rerunItem.excludeTenant Start-TestAppDispatch -Parameters $parameters -AppName $rerunItem.appName -AppId $appIdByName[$rerunItem.appName] ` -Tenant $tenant -ScriptPath $scriptPath -TestType $testType -State $state ` - -Verb 'Re-running' -FileSuffix $rerunItem.suffix + -Verb 'Re-running' -FileSuffix $rerunItem.suffix ` + -SkipAutomaticDisabledPass:($rerunItem.appName -in $cleanTenantAppNames) continue } @@ -890,9 +1533,14 @@ function Invoke-ParallelTestExecution { } $verb = if ($state.retried.ContainsKey($appName)) { 'Re-dispatching' } else { 'Dispatching' } - $tenant = Wait-ForFreeTenant -state $state -tenants $tenants + $tenant = if ($state.retryTenant.ContainsKey($appName)) { + Wait-ForSpecificTenant -state $state -tenants $tenants -tenant $state.retryTenant[$appName] + } else { + Wait-ForFreeTenant -state $state -tenants $tenants + } Start-TestAppDispatch -Parameters $parameters -AppName $appName -AppId $appId -Tenant $tenant ` - -ScriptPath $scriptPath -TestType $testType -State $state -Verb $verb + -ScriptPath $scriptPath -TestType $testType -State $state ` + -SkipAutomaticDisabledPass:($appName -in $cleanTenantAppNames) -Verb $verb } else { # Nothing left to dispatch; drain any still-running jobs. New transient failures and # reruns discovered here are picked up at the top of the next loop iteration. @@ -902,17 +1550,25 @@ function Invoke-ParallelTestExecution { } } - $allPassed = -not $state.hasFailures + $allPassed = -not $state.hasFailures - Merge-TenantTestResults -parameters $parameters -tenants $tenants -rerunSuffixes $rerunSuffixes + Merge-TenantTestResults -parameters $parameters -tenants $tenants ` + -workItems $requiredDisabledWorkItems -rerunSuffixes $rerunSuffixes - # Persist final result and mark complete so subsequent override invocations short-circuit - # to this value (and not the placeholder we wrote before dispatch). - $state.finalResult = $allPassed - $state.completed = $true - $state | ConvertTo-Json -Depth 5 | Set-Content $stateFile -Force + # Persist final result and mark complete so subsequent override invocations short-circuit + # to this value (and not the placeholder we wrote before dispatch). + $state.finalResult = $allPassed + $state.completed = $true + $state | ConvertTo-Json -Depth 5 | Set-Content $stateFile -Force - return $allPassed + return $allPassed + } + finally { + if ($templateDatabaseName) { + Remove-BcTestTenantTemplate -ContainerName $parameters.containerName ` + -TemplateDatabaseName $templateDatabaseName + } + } } <# @@ -957,4 +1613,4 @@ function Invoke-PerProjectTestRun { return (. $script -parameters $parameters -TestType $testType -AppNamesToTest $appNamesToTest) } -Export-ModuleMember -Function Invoke-ParallelTestExecution, Get-AvailableBcTenants, Get-CachedTestRunResult, Get-InstalledTestAppNames, Get-AppNamesForBucket, Invoke-PerProjectTestRun, Get-AppNameFromMetadata, Invoke-WarmupDispatch, Merge-TestResultFiles, Get-AppRerunBudget +Export-ModuleMember -Function Invoke-ParallelTestExecution, Get-AvailableBcTenants, Get-CachedTestRunResult, Get-InstalledTestAppNames, Get-AppNamesForBucket, Invoke-PerProjectTestRun, Get-AppNameFromMetadata, Get-DisabledTestsForApp, Reset-BcTestTenant, Invoke-WarmupDispatch, Merge-TestResultFiles, Get-AppRerunBudget, Test-TransientTestFailure diff --git a/build/scripts/RunTestsInBcContainer.ps1 b/build/scripts/RunTestsInBcContainer.ps1 index 5ffd8c957bc..51067229314 100644 --- a/build/scripts/RunTestsInBcContainer.ps1 +++ b/build/scripts/RunTestsInBcContainer.ps1 @@ -5,40 +5,14 @@ Param( # Names of test apps to dispatch in parallel across tenants. Only set by the per-project # override on the parent invocation. Empty when called from inside a background job, which # forces the sequential single-app path further down. - [string[]] $AppNamesToTest = @() + [string[]] $AppNamesToTest = @(), + [switch] $SkipAutomaticDisabledPass ) Import-Module $PSScriptRoot\EnlistmentHelperFunctions.psm1 +Import-Module $PSScriptRoot\ParallelTestExecution.psm1 Import-Module $PSScriptRoot\TestTolerance\TestTolerance.psm1 -Force -function Get-DisabledTests -{ - param( - [string] $AppName - ) - - $baseFolder = Get-BaseFolder - - # Convert app name to folder name format (replace spaces with underscores) - $appFolderName = $AppName -replace ' ', '_' - - $disabledTests = @() - - # Look for DisabledTests folders and find the app-specific subfolder - $disabledTestsFolders = Get-ChildItem -Path $baseFolder -Filter "DisabledTests" -Recurse -Directory - foreach ($disabledTestsFolder in $disabledTestsFolders) { - $appFolder = Join-Path $disabledTestsFolder.FullName $appFolderName - if (Test-Path $appFolder) { - $jsonFiles = Get-ChildItem -Path $appFolder -Filter "*.json" - foreach ($jsonFile in $jsonFiles) { - $disabledTests += (Get-Content -Raw -Path $jsonFile.FullName | ConvertFrom-Json) - } - } - } - - return @($disabledTests) -} - <# .SYNOPSIS Runs Run-TestsInBcContainer and detects silent test truncation caused by BCH ERROR DIALOG events. @@ -84,15 +58,21 @@ function Invoke-RunTestsWithCancellationDetection { } $bchCancelled = $false + $transientPlatformRace = $false if ($transcriptStarted -and (Test-Path $transcriptFile)) { - if (Select-String -Path $transcriptFile -Pattern 'database command was cancelled|ERROR DIALOG' -Quiet) { + $transcriptContent = Get-Content -Path $transcriptFile -Raw + if ($transcriptContent -match 'database command was cancelled|ERROR DIALOG') { Write-Host "::warning::BCH client cancellation detected for app '$($parameters['appName'])' on tenant '$($parameters['tenant'])'. Tests were silently truncated - subsequent codeunits did not run." $bchCancelled = $true } + if (Test-TransientTestFailure -Output $transcriptContent) { + Write-Host "::warning::TRANSIENT TEST PLATFORM RACE detected for app '$($parameters['appName'])' on tenant '$($parameters['tenant'])'." + $transientPlatformRace = $true + } } Remove-Item $transcriptFile -Force -ErrorAction SilentlyContinue - return ($bchPassed -and -not $bchCancelled) + return ($bchPassed -and -not $bchCancelled -and -not $transientPlatformRace) } function Invoke-TestsWithReruns { @@ -126,7 +106,7 @@ if (($null -ne $TestType) -and ($TestType -ne "Legacy")) { $parameters["testType"] = $TestType } -$parameters["disabledTests"] = @(Get-DisabledTests -AppName $parameters["appName"]) # Add disabled tests to parameters +$parameters["disabledTests"] = @(Get-DisabledTestsForApp -AppName $parameters["appName"]) $parameters["renewClientContextBetweenTests"] = $true # When invoked from the per-project override on the parent process, $AppNamesToTest contains @@ -135,17 +115,18 @@ $parameters["renewClientContextBetweenTests"] = $true # circuit. When invoked from inside a background job (Start-TestJob), $AppNamesToTest is empty # and we fall through to the sequential single-app path below. if ($AppNamesToTest.Count -gt 0) { - Import-Module $PSScriptRoot\ParallelTestExecution.psm1 return Invoke-ParallelTestExecution -parameters $parameters -scriptPath $PSCommandPath -testType $TestType -appNamesToTest $AppNamesToTest } +$isRequiredDisabledRun = $parameters.ContainsKey("requiredTestIsolation") -and $parameters["requiredTestIsolation"] -eq "Disabled" # A failing app is retried once by the parallel dispatcher, on a different tenant (see # ParallelTestExecution.psm1). Retrying in place here would reuse the tenant the app just dirtied, # so the same residue could re-trigger the failure - hence a single attempt per dispatch. $result = Invoke-TestsWithReruns -parameters $parameters -maxAttempts 1 -# For UnitTests, also run with DisableTestIsolation on the same tenant -if ($TestType -eq "UnitTest") { +# Preserve the old sequential fallback. Parallel project execution defers this pass to the +# clean-tenant codeunit scheduler in ParallelTestExecution.psm1. +if ($TestType -eq "UnitTest" -and -not $SkipAutomaticDisabledPass -and -not $isRequiredDisabledRun) { Write-Host "Running DisableTestIsolation pass for UnitTest" $parameters["requiredTestIsolation"] = "Disabled" $parameters["testRunnerCodeunitId"] = "130451" diff --git a/build/scripts/TestConfiguration.json b/build/scripts/TestConfiguration.json index 574045bb454..aa98cc32e4e 100644 --- a/build/scripts/TestConfiguration.json +++ b/build/scripts/TestConfiguration.json @@ -1,4 +1,21 @@ { + "CleanTenantRequiredDisabled": [ + "_Exclude_APIV1_ Tests", + "_Exclude_APIV2_ Tests", + "_Exclude_Connectivity Apps Tests", + "_Exclude_Master_Data_Management_Tests", + "AMC Banking 365 Fundamentals Test Automations", + "Dynamics BC Excel Reports Tests", + "E-Document Connector - Continia Tests", + "E-Document Connector - Logiq Tests", + "Email - SMTP Connector Tests", + "Expense Agent Tests", + "GetAddress.io UK Postcodes Tests", + "Retention Policy Test", + "Shopify Connector Test", + "Sustainability Tests", + "VAT Group Management Tests" + ], "LegacyTests-Bucket1": [ "Tests-Resource", "Tests-Workflow", diff --git a/build/scripts/tests/ParallelTestExecution.Test.ps1 b/build/scripts/tests/ParallelTestExecution.Test.ps1 index 84c7d0e83ba..69263395fde 100644 --- a/build/scripts/tests/ParallelTestExecution.Test.ps1 +++ b/build/scripts/tests/ParallelTestExecution.Test.ps1 @@ -1,5 +1,33 @@ $errorActionPreference = "Stop"; $ProgressPreference = "SilentlyContinue"; Set-StrictMode -Version 2.0 +if (-not (Get-Command Get-TestsFromBcContainer -ErrorAction SilentlyContinue)) { + function global:Get-TestsFromBcContainer { + param( + [string]$containerName, + [string]$tenant, + [string]$extensionId, + [string]$requiredTestIsolation, + [string]$testType, + [array]$disabledTests + ) + $null = $containerName, $tenant, $extensionId, $requiredTestIsolation, $testType, $disabledTests + throw "Get-TestsFromBcContainer stub should never be called; a Pester mock must intercept it." + } +} + +if (-not (Get-Command Invoke-ScriptInBcContainer -ErrorAction SilentlyContinue)) { + function global:Invoke-ScriptInBcContainer { + param( + [string]$containerName, + [scriptblock]$scriptblock, + [object[]]$argumentList, + [bool]$useSession + ) + $null = $containerName, $scriptblock, $argumentList, $useSession + throw "Invoke-ScriptInBcContainer stub should never be called; a Pester mock must intercept it." + } +} + Import-Module (Join-Path $PSScriptRoot '../ParallelTestExecution.psm1') -Force Describe "ParallelTestExecution app-name resolution" { @@ -97,6 +125,76 @@ Describe "ParallelTestExecution app-name resolution" { $result | Should -Not -Contain 'Projects-Json-Key' } } + + It "uses docker exec for the long-running template database copy" { + InModuleScope ParallelTestExecution { + Mock Invoke-ScriptInBcContainer { 'default-test-template' } + + New-BcTestTenantTemplate -ContainerName 'bc' -SourceDatabaseName 'default' | Should -Be 'default-test-template' + + Should -Invoke Invoke-ScriptInBcContainer -Times 1 -ParameterFilter { + $containerName -eq 'bc' -and $useSession -eq $false + } + } + } + + It "uses docker exec for long-running tenant database refreshes" { + InModuleScope ParallelTestExecution { + Mock Invoke-ScriptInBcContainer { } + + Reset-BcTestTenant -ContainerName 'bc' -Tenant 'tenant2' ` + -TenantDatabaseName 'tenant2' -TemplateDatabaseName 'default-test-template' + + Should -Invoke Invoke-ScriptInBcContainer -Times 1 -ParameterFilter { + $containerName -eq 'bc' -and $useSession -eq $false + } + } + } + + It "removes the clean template when normal app dispatch aborts" { + InModuleScope ParallelTestExecution { + Mock Get-AvailableBcTenantInfo { + @( + [PSCustomObject]@{ Id = 'default'; DatabaseName = 'default' } + [PSCustomObject]@{ Id = 'tenant2'; DatabaseName = 'tenant2' } + ) + } + Mock Get-BcContainerAppInfo { + @([PSCustomObject]@{ IsInstalled = $true; Name = 'Tests'; AppId = 'tests-id' }) + } + Mock Get-CleanTenantTestAppNames { @('Tests') } + Mock Get-RequiredDisabledWorkItems { + @([PSCustomObject]@{ + Key = 'Tests::500' + AppName = 'Tests' + AppId = 'tests-id' + CodeunitId = '500' + CodeunitName = 'API E2E' + TestCount = 2 + }) + } + Mock Enable-BcTestTaskScheduler { } + Mock Disable-BcTestTaskScheduler { } + Mock New-BcTestTenantTemplate { 'default-test-template' } + Mock Invoke-RequiredDisabledTestExecution { $true } + Mock Reset-BcTestTenant { } + Mock Invoke-WarmupDispatch { @($Pending) } + Mock Wait-ForFreeTenant { 'default' } + Mock Start-TestAppDispatch { throw 'dispatch failed' } + Mock Remove-BcTestTenantTemplate { } + + { + Invoke-ParallelTestExecution -parameters @{ + containerName = "ut-$([guid]::NewGuid().ToString('N'))" + tenant = 'default' + } -scriptPath 'unused.ps1' -testType 'IntegrationTest' -appNamesToTest @('Tests') + } | Should -Throw '*dispatch failed*' + + Should -Invoke Remove-BcTestTenantTemplate -Times 1 -ParameterFilter { + $TemplateDatabaseName -eq 'default-test-template' + } + } + } } Describe "ParallelTestExecution transient retry scheduling" { @@ -104,6 +202,20 @@ Describe "ParallelTestExecution transient retry scheduling" { Import-Module (Join-Path $PSScriptRoot '../ParallelTestExecution.psm1') -Force } + It "classifies page 130455 metadata-resolution runtime failures as transient" { + InModuleScope ParallelTestExecution { + @( + "ObjName:Command Line Test Tool, ObjID:130455, Type:Form, MethodName:ExtensionId_a45_OnValidate`nOffset and length were out of bounds for the array" + "ObjName:Command Line Test Tool, ObjID:130455, Type:Form, MethodName:ExtensionId_a45_OnValidate`nNullable object must have a value." + "TRANSIENT TEST PLATFORM RACE detected for app 'Tests' on tenant 'tenant2'." + "Exception occurred while running tests: ClientSession State is InError (Wait time 25 seconds)" + "GET request failed. Response code is 500 (InternalServerError), expected code is 200. Error message: Object reference not set to an instance of an object." + ) | ForEach-Object { + Test-TransientTestFailure -Output $_ | Should -BeTrue + } + } + } + It "re-dispatches a transient platform-race victim ahead of the apps still queued" { # The dispatch order is what decides the critical path: a platform race normally kills a # job within a minute of dispatch, so the victim is one of the first (longest) apps. If the @@ -113,13 +225,21 @@ Describe "ParallelTestExecution transient retry scheduling" { $script:dispatched = [System.Collections.Generic.List[string]]::new() $script:raced = $false - Mock Get-AvailableBcTenants { @('default') } + Mock Get-AvailableBcTenantInfo { + @( + [PSCustomObject]@{ Id = 'default'; DatabaseName = 'default' } + [PSCustomObject]@{ Id = 'tenant2'; DatabaseName = 'tenant2' } + ) + } Mock Get-BcContainerAppInfo { @('Big', 'Medium', 'Small') | ForEach-Object { [PSCustomObject]@{ IsInstalled = $true; Name = $_; AppId = "id-$_" } } } + Mock Get-CleanTenantTestAppNames { @() } + Mock Get-RequiredDisabledWorkItems { @() } Mock Wait-ForFreeTenant { 'default' } + Mock Wait-ForSpecificTenant { 'default' } Mock Wait-ForAllTestJobs { $true } Mock Merge-TenantTestResults { } Mock Start-TestAppDispatch { @@ -127,7 +247,9 @@ Describe "ParallelTestExecution transient retry scheduling" { # 'Big' loses the platform race on its very first dispatch, exactly once. if ($AppName -eq 'Big' -and -not $script:raced) { $script:raced = $true - $State.transient = @($State.transient) + @($AppName) + $State.transient = @($State.transient) + @( + [PSCustomObject]@{ Key = $AppName; Tenant = $Tenant } + ) } } @@ -140,18 +262,472 @@ Describe "ParallelTestExecution transient retry scheduling" { } } +Describe "ParallelTestExecution RequiredTestIsolation discovery" { + BeforeAll { + Import-Module (Join-Path $PSScriptRoot '../ParallelTestExecution.psm1') -Force + } + + It "flattens discovered codeunits and excludes codeunits without enabled methods" { + InModuleScope ParallelTestExecution { + $discovered = @( + [PSCustomObject]@{ Id = '100'; Name = 'Direct'; Tests = @('A', 'B') } + [PSCustomObject]@{ + Group = 'G' + Codeunits = @( + [PSCustomObject]@{ Id = '200'; Name = 'Grouped'; Tests = @('C') } + [PSCustomObject]@{ Id = '300'; Name = 'Disabled'; Tests = @() } + ) + } + ) + + $result = @(ConvertTo-RequiredDisabledWorkItems -DiscoveredTests $discovered -AppName 'API Tests' -AppId 'app-id') + + $result.Count | Should -Be 2 + $result[0].Key | Should -Be 'API Tests::100' + $result[0].TestCount | Should -Be 2 + $result[1].CodeunitId | Should -Be '200' + } + } + + It "discovers enabled Disabled-isolation codeunits per app" { + InModuleScope ParallelTestExecution { + Mock Get-ParametersForCommand { @{ containerName = 'c'; tenant = 'default' } } + Mock Get-DisabledTestsForApp { + @([PSCustomObject]@{ codeunitId = 999; method = 'DisabledMethod' }) + } + Mock Get-TestsFromBcContainer { + @([PSCustomObject]@{ Id = '500'; Name = 'API E2E'; Tests = @('Create', 'Modify') }) + } + + $result = @( + Get-RequiredDisabledWorkItems -Parameters @{ containerName = 'c'; tenant = 'default' } ` + -TestType 'IntegrationTest' -AppNamesToTest @('API Tests') ` + -AppIdByName @{ 'API Tests' = 'app-id' } + ) + + $result.Count | Should -Be 1 + $result[0].CodeunitId | Should -Be '500' + Should -Invoke Get-TestsFromBcContainer -Times 1 -ParameterFilter { + $extensionId -eq 'app-id' -and + $requiredTestIsolation -eq 'Disabled' -and + $testType -eq 'IntegrationTest' -and + $disabledTests.Count -eq 1 + } + } + } + + It "does not apply a test type filter to Legacy buckets" { + InModuleScope ParallelTestExecution { + Mock Get-ParametersForCommand { @{ containerName = 'c'; tenant = 'default'; testType = 'stale' } } + Mock Get-DisabledTestsForApp { @() } + Mock Get-TestsFromBcContainer { @() } + + $null = Get-RequiredDisabledWorkItems -Parameters @{ containerName = 'c' } ` + -TestType 'Legacy' -AppNamesToTest @('Legacy Tests') ` + -AppIdByName @{ 'Legacy Tests' = 'legacy-id' } + + Should -Invoke Get-TestsFromBcContainer -Times 1 -ParameterFilter { + -not $PSBoundParameters.ContainsKey('testType') + } + } + } +} + +Describe "ParallelTestExecution clean tenant scheduling" { + BeforeAll { + Import-Module (Join-Path $PSScriptRoot '../ParallelTestExecution.psm1') -Force + } + + It "does not create a database template when no Disabled-isolation codeunits are enabled" { + InModuleScope ParallelTestExecution { + Mock Get-AvailableBcTenantInfo { + @([PSCustomObject]@{ Id = 'default'; DatabaseName = 'default' }) + } + Mock Get-BcContainerAppInfo { + @([PSCustomObject]@{ IsInstalled = $true; Name = 'Tests'; AppId = 'tests-id' }) + } + Mock Get-CleanTenantTestAppNames { @() } + Mock Get-RequiredDisabledWorkItems { @() } + Mock New-BcTestTenantTemplate { throw 'Template must not be created' } + Mock Wait-ForFreeTenant { 'default' } + Mock Start-TestAppDispatch { } + Mock Wait-ForAllTestJobs { $true } + Mock Merge-TenantTestResults { } + + $result = Invoke-ParallelTestExecution -parameters @{ + containerName = "ut-$([guid]::NewGuid().ToString('N'))" + tenant = 'default' + } -scriptPath 'unused.ps1' -testType 'IntegrationTest' -appNamesToTest @('Tests') + + $result | Should -BeTrue + Should -Invoke New-BcTestTenantTemplate -Times 0 + } + } + + Describe "ParallelTestExecution result metadata" { + BeforeAll { + Import-Module (Join-Path $PSScriptRoot '../ParallelTestExecution.psm1') -Force + } + + It "adds app properties to clean-codeunit JUnit suites" { + InModuleScope ParallelTestExecution { + $resultFile = Join-Path ([System.IO.Path]::GetTempPath()) "junit-$([guid]::NewGuid().ToString('N')).xml" + try { + @( + '' + '' + ' ' + ' ' + ' ' + '' + ) | Set-Content -Path $resultFile -Encoding utf8 + + Add-MissingJUnitTestProperties -ResultFile $resultFile -WorkItems @( + [PSCustomObject]@{ + CodeunitId = '139800' + AppId = 'app-id' + AppName = '_Exclude_APIV2_ Tests' + } + ) + + [xml]$xml = Get-Content $resultFile -Raw + $properties = @($xml.testsuites.testsuite.properties.property) + ($properties | Where-Object name -eq 'extensionid').value | Should -Be 'app-id' + ($properties | Where-Object name -eq 'appName').value | Should -Be '_Exclude_APIV2_ Tests' + } finally { + Remove-Item $resultFile -Force -ErrorAction SilentlyContinue + } + } + } + } + + Describe "API test isolation metadata" { + It "matches every NAV API execution path and its isolation mode" { + $repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..\..\..')).Path + $typedIntegrationCodeunits = @(139917, 139918, 139919, 139920, 139921) + foreach ($apiVersion in @('APIV1', 'APIV2')) { + $testSource = Join-Path $repoRoot "src\Apps\W1\$apiVersion\test\src" + $disabledManifest = Join-Path $repoRoot "src\DisabledTests\_Exclude_${apiVersion}__Tests\_Exclude_${apiVersion}__Tests.DisabledTest.json" + $disabledCodeunitIds = if (Test-Path $disabledManifest) { + @( + Get-Content $disabledManifest -Raw | + ConvertFrom-Json | + Where-Object method -eq '*' | + ForEach-Object { [int]$_.codeunitId } + ) + } else { + @() + } + $enabledCodeunitCount = 0 + foreach ($file in (Get-ChildItem $testSource -Filter '*.al' -File)) { + $content = Get-Content $file.FullName -Raw + if ($content -match 'Subtype\s*=\s*Test\s*;') { + $codeunitId = [int]([regex]::Match($content, 'codeunit\s+(\d+)').Groups[1].Value) + if ($codeunitId -in $disabledCodeunitIds) { + continue + } + + $enabledCodeunitCount++ + if ($codeunitId -in $typedIntegrationCodeunits) { + $content | Should -Match 'TestType\s*=\s*IntegrationTest\s*;' ` + -Because "$($file.Name) runs through NAV's typed Integration task" + $content | Should -Not -Match 'RequiredTestIsolation\s*=\s*Disabled\s*;' ` + -Because "$($file.Name) runs with normal Codeunit isolation in NAV" + $content | Should -Match 'LibraryGraphMgt\.EnsureAuthenticationAvailable\(\);' + } else { + $content | Should -Match 'RequiredTestIsolation\s*=\s*Disabled\s*;' ` + -Because "$($file.Name) runs in a NAV Disabled-isolation path" + $content | Should -Match 'LibraryGraphMgt\.EnsureAuthenticationAvailable\(\);' ` + -Because "$($file.Name) must preflight authentication" + $content | Should -Match 'LibraryGraphMgt\.SetLicenseSafeWorkDate\(\);' ` + -Because "$($file.Name) must explicitly use a license-safe work date" + $content | Should -Not -Match 'LibraryERM\.SetWorkDate\(\);' ` + -Because "$($file.Name) must not overwrite the API test license-safe work date" + } + } + } + + $expectedEnabledCodeunits = if ($apiVersion -eq 'APIV1') { 44 } else { 75 } + $enabledCodeunitCount | Should -Be $expectedEnabledCodeunits ` + -Because "$apiVersion must match the union of NAV's web-service and typed test tasks" + } + } + } + + It "defers the automatic Unit disabled pass only for clean-tenant apps" { + InModuleScope ParallelTestExecution { + $script:skipValues = [System.Collections.Generic.List[bool]]::new() + Mock Start-Sleep { } + Mock Start-TestJob { + $script:skipValues.Add($skipAutomaticDisabledPass.IsPresent) + [PSCustomObject]@{ Id = $script:skipValues.Count } + } + + $state = [PSCustomObject]@{ jobs = @() } + Start-TestAppDispatch -Parameters @{} -AppName 'Normal Tests' -AppId 'normal-id' ` + -Tenant 'default' -ScriptPath 'runner.ps1' -TestType 'UnitTest' -State $state + Start-TestAppDispatch -Parameters @{} -AppName 'API Tests' -AppId 'api-id' ` + -Tenant 'tenant2' -ScriptPath 'runner.ps1' -TestType 'UnitTest' -State $state ` + -SkipAutomaticDisabledPass + + $script:skipValues | Should -Be @($false, $true) + } + } + + It "applies country-scoped disabled tests only in matching countries" { + InModuleScope ParallelTestExecution { + Test-DisabledTestAppliesToCountry -DisabledTest ([PSCustomObject]@{ method = 'Global' }) -Country 'W1' | + Should -BeTrue + Test-DisabledTestAppliesToCountry -DisabledTest ([PSCustomObject]@{ + method = 'IndiaOnly' + countries = @('IN') + }) -Country 'IN' | Should -BeTrue + Test-DisabledTestAppliesToCountry -DisabledTest ([PSCustomObject]@{ + method = 'IndiaOnly' + countries = @('IN') + }) -Country 'W1' | Should -BeFalse + } + } + + It "dispatches one codeunit with Disabled isolation" { + InModuleScope ParallelTestExecution { + $script:capturedParameters = $null + + Mock Get-DisabledTestsForApp { @() } + Mock Start-Sleep { } + Mock Start-TestJob { + $script:capturedParameters = $parameters + [PSCustomObject]@{ Id = 42 } + } + + $state = [PSCustomObject]@{ jobs = @() } + $workItem = [PSCustomObject]@{ + Key = 'Tests::500' + AppName = 'Tests' + AppId = 'tests-id' + CodeunitId = '500' + CodeunitName = 'API E2E' + } + + Start-RequiredDisabledDispatch -Parameters @{ + containerName = 'c' + JUnitResultFileName = 'results.xml' + } -WorkItem $workItem -TenantInfo ([PSCustomObject]@{ + Id = 'tenant2' + DatabaseName = 'tenant2' + }) -ScriptPath 'runner.ps1' ` + -TestType 'IntegrationTest' -State $state + + $script:capturedParameters.testCodeunit | Should -Be '500' + $script:capturedParameters.requiredTestIsolation | Should -Be 'Disabled' + $script:capturedParameters.testRunnerCodeunitId | Should -Be '130451' + $script:capturedParameters.AppendToJUnitResultFile | Should -BeTrue + $state.jobs.Count | Should -Be 1 + } + } + + It "marks scheduler retries as reruns so existing XML entries are replaced" { + InModuleScope ParallelTestExecution { + $script:capturedParameters = $null + + Mock Get-DisabledTestsForApp { @() } + Mock Reset-BcTestTenant { } + Mock Start-Sleep { } + Mock Start-TestJob { + $script:capturedParameters = $parameters + [PSCustomObject]@{ Id = 42 } + } + + Start-RequiredDisabledDispatch -Parameters @{ containerName = 'c' } -WorkItem ([PSCustomObject]@{ + Key = 'Tests::500' + AppName = 'Tests' + AppId = 'tests-id' + CodeunitId = '500' + CodeunitName = 'API E2E' + }) -TenantInfo ([PSCustomObject]@{ + Id = 'tenant2' + DatabaseName = 'tenant2' + }) -ScriptPath 'runner.ps1' ` + -TestType 'IntegrationTest' -State ([PSCustomObject]@{ jobs = @() }) ` + -Verb 'Re-dispatching' + + $script:capturedParameters.ReRun | Should -BeTrue + } + } + + It "retries a clean codeunit on its original tenant" { + InModuleScope ParallelTestExecution { + $script:dispatchTenants = [System.Collections.Generic.List[string]]::new() + $script:firstDispatch = $true + + Mock Reset-BcTestTenant { } + Mock Wait-ForAllTestJobs { $true } + Mock Start-RequiredDisabledDispatch { + $script:dispatchTenants.Add($TenantInfo.Id) + if ($script:firstDispatch) { + $script:firstDispatch = $false + $State.transient = @( + [PSCustomObject]@{ Key = $WorkItem.Key; Tenant = $TenantInfo.Id } + ) + } + } + + $workItem = [PSCustomObject]@{ + Key = 'Tests::500' + AppName = 'Tests' + AppId = 'tests-id' + CodeunitId = '500' + CodeunitName = 'API E2E' + } + $tenantInfo = @( + [PSCustomObject]@{ Id = 'tenant2'; DatabaseName = 'tenant2' } + [PSCustomObject]@{ Id = 'tenant3'; DatabaseName = 'tenant3' } + ) + + $result = Invoke-RequiredDisabledTestExecution -Parameters @{ containerName = 'c' } ` + -WorkItems @($workItem) -TenantInfo $tenantInfo -TemplateDatabaseName 'template' ` + -ScriptPath 'runner.ps1' -TestType 'UnitTest' + + $result | Should -BeTrue + $script:dispatchTenants | Should -Be @('tenant2', 'tenant2') + } + } + + It "finishes all tenant resets before dispatching a clean-codeunit batch" { + InModuleScope ParallelTestExecution { + $script:events = [System.Collections.Generic.List[string]]::new() + Mock Reset-BcTestTenant { + $script:events.Add("reset:$Tenant") + } + Mock Start-RequiredDisabledDispatch { + $script:events.Add("dispatch:$($TenantInfo.Id)") + } + Mock Wait-ForAllTestJobs { } + + $workItems = @( + [PSCustomObject]@{ Key = 'Tests::500'; AppName = 'Tests'; AppId = 'id'; CodeunitId = '500'; CodeunitName = 'A' } + [PSCustomObject]@{ Key = 'Tests::501'; AppName = 'Tests'; AppId = 'id'; CodeunitId = '501'; CodeunitName = 'B' } + ) + $tenantInfo = @( + [PSCustomObject]@{ Id = 'tenant2'; DatabaseName = 'tenant2' } + [PSCustomObject]@{ Id = 'tenant3'; DatabaseName = 'tenant3' } + ) + + Invoke-RequiredDisabledTestExecution -Parameters @{ containerName = 'c' } ` + -WorkItems $workItems -TenantInfo $tenantInfo -TemplateDatabaseName 'template' ` + -ScriptPath 'runner.ps1' -TestType 'UnitTest' | Should -BeTrue + + $script:events | Should -Be @('reset:tenant2', 'reset:tenant3', 'dispatch:tenant2', 'dispatch:tenant3') + } + } + + It "creates one template and invokes clean-tenant execution when codeunits require Disabled isolation" { + InModuleScope ParallelTestExecution { + Mock Get-AvailableBcTenantInfo { + @( + [PSCustomObject]@{ Id = 'default'; DatabaseName = 'default' } + [PSCustomObject]@{ Id = 'tenant2'; DatabaseName = 'tenant2' } + ) + } + Mock Get-BcContainerAppInfo { + @([PSCustomObject]@{ IsInstalled = $true; Name = 'Tests'; AppId = 'tests-id' }) + } + Mock Get-CleanTenantTestAppNames { @('Tests') } + Mock Get-RequiredDisabledWorkItems { + @([PSCustomObject]@{ + Key = 'Tests::500' + AppName = 'Tests' + AppId = 'tests-id' + CodeunitId = '500' + CodeunitName = 'API E2E' + TestCount = 2 + }) + } + $script:taskSchedulerEnabled = $false + Mock New-BcTestTenantTemplate { 'default-test-template' } + Mock Wait-ForFreeTenant { 'default' } + Mock Start-TestAppDispatch { + $script:taskSchedulerEnabled | Should -BeFalse + } + Mock Wait-ForAllTestJobs { $true } + Mock Invoke-RequiredDisabledTestExecution { + $script:taskSchedulerEnabled | Should -BeTrue + $true + } + Mock Reset-BcTestTenant { + $script:taskSchedulerEnabled | Should -BeFalse + } + Mock Remove-BcTestTenantTemplate { } + Mock Enable-BcTestTaskScheduler { $script:taskSchedulerEnabled = $true } + Mock Disable-BcTestTaskScheduler { $script:taskSchedulerEnabled = $false } + Mock Merge-TenantTestResults { } + + $result = Invoke-ParallelTestExecution -parameters @{ + containerName = "ut-$([guid]::NewGuid().ToString('N'))" + tenant = 'default' + } -scriptPath 'unused.ps1' -testType 'IntegrationTest' -appNamesToTest @('Tests') + + $result | Should -BeTrue + Should -Invoke New-BcTestTenantTemplate -Times 1 -ParameterFilter { + $SourceDatabaseName -eq 'default' + } + Should -Invoke Enable-BcTestTaskScheduler -Times 1 + Should -Invoke Disable-BcTestTaskScheduler -Times 1 + Should -Invoke Reset-BcTestTenant -Times 1 -ParameterFilter { + $Tenant -eq 'tenant2' -and + $TenantDatabaseName -eq 'tenant2' -and + $TemplateDatabaseName -eq 'default-test-template' + } + Should -Invoke Invoke-RequiredDisabledTestExecution -Times 1 -ParameterFilter { + $TemplateDatabaseName -eq 'default-test-template' -and + $WorkItems.Count -eq 1 -and + $TenantInfo.Count -eq 1 -and + $TenantInfo[0].Id -eq 'tenant2' + } + Should -Invoke Remove-BcTestTenantTemplate -Times 1 -ParameterFilter { + $TemplateDatabaseName -eq 'default-test-template' + } + } + } +} + Describe "ParallelTestExecution warmup dispatch" { BeforeAll { Import-Module (Join-Path $PSScriptRoot '../ParallelTestExecution.psm1') -Force } + It "defers the Disabled pass when the warmup app uses clean-codeunit execution" { + InModuleScope ParallelTestExecution { + $script:skipDisabledPass = $false + Mock Start-TestAppDispatch { + $script:skipDisabledPass = $SkipAutomaticDisabledPass.IsPresent + } + Mock Wait-ForAllTestJobs { } + + $state = [PSCustomObject]@{ jobs = @(); hasFailures = $false; transient = @(); retried = @{} } + $result = Invoke-WarmupDispatch -Parameters @{ containerName = 'c' } ` + -Pending @('API Tests', 'Other Tests') ` + -AppIdByName @{ 'API Tests' = 'api-id'; 'Other Tests' = 'other-id' } ` + -Tenants @('default', 'tenant2') -ScriptPath 'unused.ps1' -TestType 'UnitTest' ` + -State $state -CleanTenantAppNames @('API Tests') + + $result | Should -Be @('Other Tests') + $script:skipDisabledPass | Should -BeTrue + } + } + It "dispatches the first app alone and awaits it before fanning out the rest" { # The first app must run alone and be awaited before any parallel dispatch. This asserts # exactly that ordering: dispatch(first) -> wait -> rest. InModuleScope ParallelTestExecution { $script:events = [System.Collections.Generic.List[string]]::new() - Mock Get-AvailableBcTenants { @('default', 'tenant2') } + Mock Get-AvailableBcTenantInfo { + @( + [PSCustomObject]@{ Id = 'default'; DatabaseName = 'default' } + [PSCustomObject]@{ Id = 'tenant2'; DatabaseName = 'tenant2' } + ) + } Mock Get-BcContainerAppInfo { @('Big', 'Medium', 'Small') | ForEach-Object { [PSCustomObject]@{ IsInstalled = $true; Name = $_; AppId = "id-$_" } @@ -179,7 +755,9 @@ Describe "ParallelTestExecution warmup dispatch" { InModuleScope ParallelTestExecution { $script:events = [System.Collections.Generic.List[string]]::new() - Mock Get-AvailableBcTenants { @('default') } + Mock Get-AvailableBcTenantInfo { + @([PSCustomObject]@{ Id = 'default'; DatabaseName = 'default' }) + } Mock Get-BcContainerAppInfo { @('Big', 'Medium') | ForEach-Object { [PSCustomObject]@{ IsInstalled = $true; Name = $_; AppId = "id-$_" } @@ -242,13 +820,15 @@ Describe "ParallelTestExecution warmup dispatch" { InModuleScope ParallelTestExecution { Mock Start-TestAppDispatch { } # Simulate Wait-ForAllTestJobs classifying the warmup app as a transient race. - Mock Wait-ForAllTestJobs { $State.transient = @('A'); $true } + Mock Wait-ForAllTestJobs { + $State.transient = @([PSCustomObject]@{ Key = 'A'; Tenant = 'default' }) + } $state = [PSCustomObject]@{ jobs = @(); hasFailures = $false; transient = @(); retried = @{} } $result = Invoke-WarmupDispatch -Parameters @{ containerName = 'c' } ` -Pending @('A', 'B', 'C') -AppIdByName @{ A = 'id-A'; B = 'id-B'; C = 'id-C' } ` -Tenants @('default', 'tenant2') -ScriptPath 'unused.ps1' -TestType 'Legacy' -State $state $result | Should -Be @('B', 'C') - $state.transient | Should -Contain 'A' + $state.transient.Key | Should -Contain 'A' $state.hasFailures | Should -BeFalse } } @@ -267,12 +847,19 @@ Describe "ParallelTestExecution failed-app rerun scheduling" { $script:dispatched = [System.Collections.Generic.List[object]]::new() $script:failed = $false - Mock Get-AvailableBcTenants { @('default', 'tenant2') } + Mock Get-AvailableBcTenantInfo { + @( + [PSCustomObject]@{ Id = 'default'; DatabaseName = 'default' } + [PSCustomObject]@{ Id = 'tenant2'; DatabaseName = 'tenant2' } + ) + } Mock Get-BcContainerAppInfo { @('Big', 'Small') | ForEach-Object { [PSCustomObject]@{ IsInstalled = $true; Name = $_; AppId = "id-$_" } } } + Mock Get-CleanTenantTestAppNames { @('Big') } + Mock Get-RequiredDisabledWorkItems { @() } Mock Invoke-WarmupDispatch { @($Pending) } Mock Get-AppRerunBudget { 1 } Mock Wait-ForAllTestJobs { $true } @@ -282,7 +869,12 @@ Describe "ParallelTestExecution failed-app rerun scheduling" { @('default', 'tenant2') | Where-Object { $_ -ne $excludeTenant } | Select-Object -First 1 } Mock Start-TestAppDispatch { - $script:dispatched.Add([PSCustomObject]@{ App = $AppName; Tenant = $Tenant; Suffix = $FileSuffix }) + $script:dispatched.Add([PSCustomObject]@{ + App = $AppName + Tenant = $Tenant + Suffix = $FileSuffix + SkipDisabled = $SkipAutomaticDisabledPass.IsPresent + }) # 'Big' fails on its first dispatch, exactly once. if ($AppName -eq 'Big' -and -not $script:failed) { $script:failed = $true @@ -300,6 +892,7 @@ Describe "ParallelTestExecution failed-app rerun scheduling" { $rerun.App | Should -Be 'Big' $rerun.Tenant | Should -Be 'tenant2' $rerun.Suffix | Should -Be 'rerun1' + $rerun.SkipDisabled | Should -BeTrue # The rerun passed, so the run as a whole passed. $result | Should -BeTrue } @@ -454,7 +1047,12 @@ Describe "ParallelTestExecution rerun budget is limited to pull request builds" Set-Content -Path $staleFile -Value '' $script:raced = $false - Mock Get-AvailableBcTenants { @('default', 'tenant2') } + Mock Get-AvailableBcTenantInfo { + @( + [PSCustomObject]@{ Id = 'default'; DatabaseName = 'default' } + [PSCustomObject]@{ Id = 'tenant2'; DatabaseName = 'tenant2' } + ) + } Mock Get-BcContainerAppInfo { @([PSCustomObject]@{ IsInstalled = $true; Name = 'A'; AppId = 'id-A' }) } Mock Invoke-WarmupDispatch { @($Pending) } Mock Wait-ForAllTestJobs { } @@ -464,7 +1062,9 @@ Describe "ParallelTestExecution rerun budget is limited to pull request builds" if ($FileSuffix -and -not $script:raced) { # The rerun job hits the platform race. $script:raced = $true - $State.transient = @($State.transient) + @($AppName) + $State.transient = @($State.transient) + @( + [PSCustomObject]@{ Key = $AppName; Tenant = $Tenant } + ) } } # Pre-seed the state as though 'A' already had its rerun dispatched. @@ -475,10 +1075,11 @@ Describe "ParallelTestExecution rerun budget is limited to pull request builds" rerun = @(); rerunDone = @{}; rerunBudget = 1; tenantCount = 2 } $state.rerunDone['A'] = 'rerun1' - $state.transient = @('A') + $state.transient = @([PSCustomObject]@{ Key = 'A'; Tenant = 'tenant2' }) # Exercise just the promotion path the loop performs. - foreach ($appName in @($state.transient)) { + foreach ($transient in @($state.transient)) { + $appName = $transient.Key if ($state.rerunDone.ContainsKey($appName)) { Remove-RerunResultFile -parameters $params -suffix $state.rerunDone[$appName] } @@ -518,7 +1119,12 @@ Describe "ParallelTestExecution rerun budget is limited to pull request builds" $script:dispatched = [System.Collections.Generic.List[object]]::new() $script:failed = $false - Mock Get-AvailableBcTenants { @('default', 'tenant2') } + Mock Get-AvailableBcTenantInfo { + @( + [PSCustomObject]@{ Id = 'default'; DatabaseName = 'default' } + [PSCustomObject]@{ Id = 'tenant2'; DatabaseName = 'tenant2' } + ) + } Mock Get-BcContainerAppInfo { @('Big', 'Small') | ForEach-Object { [PSCustomObject]@{ IsInstalled = $true; Name = $_; AppId = "id-$_" } diff --git a/src/Apps/US/IRSForms/test/src/IRS1099APITests.Codeunit.al b/src/Apps/US/IRSForms/test/src/IRS1099APITests.Codeunit.al index 7495ec2d793..c250819e2a9 100644 --- a/src/Apps/US/IRSForms/test/src/IRS1099APITests.Codeunit.al +++ b/src/Apps/US/IRSForms/test/src/IRS1099APITests.Codeunit.al @@ -10,6 +10,12 @@ codeunit 148018 "IRS 1099 API Tests" TestType = Uncategorized; TestPermissions = Disabled; + trigger OnRun() + begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); + end; + var LibraryTestInitialize: Codeunit "Library - Test Initialize"; LibraryGraphMgt: Codeunit "Library - Graph Mgt"; diff --git a/src/Apps/W1/APIV1/test/src/APIV1AccountsE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1AccountsE2E.Codeunit.al index 9e3ef6f5e64..4e0073d5450 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1AccountsE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1AccountsE2E.Codeunit.al @@ -3,10 +3,13 @@ codeunit 139701 "APIV1 - Accounts E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Account] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1AgedAPE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1AgedAPE2E.Codeunit.al index 9c057dab240..eb0f52a67a3 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1AgedAPE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1AgedAPE2E.Codeunit.al @@ -3,10 +3,13 @@ codeunit 139719 "APIV1 - Aged AP E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Purchase] [Aged Report] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1AgedARE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1AgedARE2E.Codeunit.al index afdb729791c..b57d9ca1443 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1AgedARE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1AgedARE2E.Codeunit.al @@ -3,10 +3,13 @@ codeunit 139720 "APIV1 - Aged AR E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Aged Report] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1AttachmentsE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1AttachmentsE2E.Codeunit.al index 5e03d6caccc..a45de0d489d 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1AttachmentsE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1AttachmentsE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139733 "APIV1 - Attachments E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Attachment] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1AutomationRSPackage.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1AutomationRSPackage.Codeunit.al index fba368ca1dc..d90419df236 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1AutomationRSPackage.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1AutomationRSPackage.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139731 "APIV1 - Automation RS Package" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Config. Package] end; @@ -16,7 +19,6 @@ codeunit 139731 "APIV1 - Automation RS Package" LibraryGraphMgt: Codeunit "Library - Graph Mgt"; LibraryUtility: Codeunit "Library - Utility"; Assert: Codeunit "Assert"; - IsInitialized: Boolean; SamplePackageFile: Text; PackageCodeTxt: Label 'code', Locked = true; ActionImportTxt: Label 'Microsoft.NAV.import'; @@ -31,11 +33,7 @@ codeunit 139731 "APIV1 - Automation RS Package" begin TenantConfigPackageFile.DELETEALL(TRUE); - IF IsInitialized THEN - EXIT; - SamplePackageFile := GenerateSamplePackageFile(); - IsInitialized := TRUE; end; [Test] @@ -142,11 +140,12 @@ codeunit 139731 "APIV1 - Automation RS Package" StartTime := CURRENTDATETIME(); REPEAT + SelectLatestVersion(); ConfigPackage.FIND(); UNTIL (NOT IsImportPending(ConfigPackage)) OR (CURRENTDATETIME() - StartTime > 180000); - Assert.AreEqual(ConfigPackage."Import Status", ConfigPackage."Import Status"::Completed, 'Import Status should be completed.'); + Assert.AreEqual(ConfigPackage."Import Status"::Completed, ConfigPackage."Import Status", 'Import Status should be completed.'); // clean up after the test LibraryRapidStart.CleanUp(ConfigPackage.Code); @@ -190,11 +189,12 @@ codeunit 139731 "APIV1 - Automation RS Package" StartTime := CURRENTDATETIME(); REPEAT + SelectLatestVersion(); ConfigPackage.FIND(); UNTIL (NOT IsImportPending(ConfigPackage)) OR (CURRENTDATETIME() - StartTime > 180000); - Assert.AreEqual(ConfigPackage."Import Status", ConfigPackage."Import Status"::Error, 'Import Status should be error.'); + Assert.AreEqual(ConfigPackage."Import Status"::Error, ConfigPackage."Import Status", 'Import Status should be error.'); // clean up after the test LibraryRapidStart.CleanUp(ConfigPackage.Code); @@ -240,11 +240,12 @@ codeunit 139731 "APIV1 - Automation RS Package" StartTime := CURRENTDATETIME(); REPEAT + SelectLatestVersion(); ConfigPackage.FIND(); UNTIL (NOT IsApplyPending(ConfigPackage)) OR (CURRENTDATETIME() - StartTime > 180000); - Assert.AreEqual(ConfigPackage."Apply Status", ConfigPackage."Apply Status"::Completed, 'Apply Status should be completed.'); + Assert.AreEqual(ConfigPackage."Apply Status"::Completed, ConfigPackage."Apply Status", 'Apply Status should be completed.'); Assert.AreEqual(0, ConfigPackage."No. of Errors", 'There should be no errors.'); // clean up after the test @@ -328,7 +329,7 @@ codeunit 139731 "APIV1 - Automation RS Package" local procedure IsApplyPending(var ConfigPackage: Record "Config. Package"): Boolean begin - EXIT(ConfigPackage."Apply Status" IN [ConfigPackage."Import Status"::Scheduled, ConfigPackage."Apply Status"::InProgress]); + EXIT(ConfigPackage."Apply Status" IN [ConfigPackage."Apply Status"::Scheduled, ConfigPackage."Apply Status"::InProgress]); end; local procedure CreateTestPackage(var ConfigPackage: Record "Config. Package") diff --git a/src/Apps/W1/APIV1/test/src/APIV1BalanceSheetE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1BalanceSheetE2E.Codeunit.al index 9f700458c0e..02111358ba2 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1BalanceSheetE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1BalanceSheetE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139715 "APIV1 - Balance Sheet E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Balance Sheet] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1CashFlowStatementE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1CashFlowStatementE2E.Codeunit.al index 2478bfb256f..a61af306926 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1CashFlowStatementE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1CashFlowStatementE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139717 "APIV1 - CashFlow Statement E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Cash Flow Statement] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1CompanyInfoE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1CompanyInfoE2E.Codeunit.al index 6b3b4e66322..cea76056864 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1CompanyInfoE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1CompanyInfoE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139706 "APIV1 - Company Info. E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = IntegrationTest; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Company Information] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1CurrenciesE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1CurrenciesE2E.Codeunit.al index 5105b4c44bb..617bd5aedff 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1CurrenciesE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1CurrenciesE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139713 "APIV1 - Currencies E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Currency] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1CustomerPaymentsE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1CustomerPaymentsE2E.Codeunit.al index 13e55ac2bb6..f70fe831524 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1CustomerPaymentsE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1CustomerPaymentsE2E.Codeunit.al @@ -1,11 +1,14 @@ codeunit 139743 "APIV1 - Customer Payments E2E" { Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Customer Payments] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1CustomersE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1CustomersE2E.Codeunit.al index be1fe579b35..e49d5aa9cf6 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1CustomersE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1CustomersE2E.Codeunit.al @@ -9,6 +9,8 @@ codeunit 139702 "APIV1 - Customers E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Customer] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1DefaultDimensionsE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1DefaultDimensionsE2E.Codeunit.al index 96621497106..74c01924f58 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1DefaultDimensionsE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1DefaultDimensionsE2E.Codeunit.al @@ -9,6 +9,8 @@ codeunit 139732 "APIV1 - Default Dimensions E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Default Dimension] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1DimensionLinesE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1DimensionLinesE2E.Codeunit.al index a0f0993cf2a..727da4c45e1 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1DimensionLinesE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1DimensionLinesE2E.Codeunit.al @@ -9,6 +9,8 @@ codeunit 139725 "APIV1 - Dimension Lines E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Dimension Line] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1DimensionsE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1DimensionsE2E.Codeunit.al index f1aafb40161..51fcfd7ae64 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1DimensionsE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1DimensionsE2E.Codeunit.al @@ -3,10 +3,13 @@ codeunit 139724 "APIV1 - Dimensions E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Dimension] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1EmployeesE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1EmployeesE2E.Codeunit.al index c2d3a8700fb..d1e2ceb5b74 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1EmployeesE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1EmployeesE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139722 "APIV1 - Employees E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Employee] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1GLEntriesE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1GLEntriesE2E.Codeunit.al index f405f7a3ad5..b9edc7f1e81 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1GLEntriesE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1GLEntriesE2E.Codeunit.al @@ -3,20 +3,23 @@ codeunit 139730 "APIV1 - GLEntries E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [G/L Entry] end; var Assert: Codeunit "Assert"; LibraryERM: Codeunit "Library - ERM"; - LibraryVariableStorage: Codeunit "Library - Variable Storage"; LibraryGraphMgt: Codeunit "Library - Graph Mgt"; IsInitialized: Boolean; + JournalTemplateName: Code[10]; ServiceNameTxt: Label 'generalLedgerEntries'; local procedure Initialize() @@ -89,7 +92,7 @@ codeunit 139730 "APIV1 - GLEntries E2E" CreateGeneralJournalBatch(GenJournalBatch); // Create General Journal Line. - LibraryVariableStorage.Enqueue(GenJournalBatch."Journal Template Name"); + JournalTemplateName := GenJournalBatch."Journal Template Name"; GeneralJournal.TRAP(); GeneralJournal.OPENEDIT(); GeneralJournal."Account Type".SETVALUE(GenJournalLine."Account Type"::"G/L Account"); @@ -119,7 +122,6 @@ codeunit 139730 "APIV1 - GLEntries E2E" local procedure UpdateAmountOnGenJournalLine(GenJournalBatch: Record "Gen. Journal Batch"; var GeneralJournal: TestPage "General Journal") begin - LibraryVariableStorage.Enqueue(GenJournalBatch."Journal Template Name"); LibraryERM.UpdateAmountOnGenJournalLine(GenJournalBatch, GeneralJournal); end; @@ -145,7 +147,7 @@ codeunit 139730 "APIV1 - GLEntries E2E" [ModalPageHandler] procedure GeneralJournalTemplateHandler(var GeneralJournalTemplateList: TestPage 250) begin - GeneralJournalTemplateList.FILTER.SETFILTER(Name, LibraryVariableStorage.DequeueText()); + GeneralJournalTemplateList.FILTER.SETFILTER(Name, JournalTemplateName); GeneralJournalTemplateList.OK().INVOKE(); end; } @@ -163,4 +165,3 @@ codeunit 139730 "APIV1 - GLEntries E2E" - diff --git a/src/Apps/W1/APIV1/test/src/APIV1IncomeStatementE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1IncomeStatementE2E.Codeunit.al index a49c2db7b8b..c2b08a1fa3f 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1IncomeStatementE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1IncomeStatementE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139716 "APIV1 - Income Statement E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Income Statement] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1ItemCategoriesE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1ItemCategoriesE2E.Codeunit.al index 9035d86b098..5c4db3d3571 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1ItemCategoriesE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1ItemCategoriesE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139707 "APIV1 - Item Categories E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Item Category] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1ItemVariantsE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1ItemVariantsE2E.Codeunit.al index 7d404f44ee1..884be687186 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1ItemVariantsE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1ItemVariantsE2E.Codeunit.al @@ -9,6 +9,8 @@ codeunit 139739 "APIV1 - Item Variants E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Item] [Variant] end; @@ -343,6 +345,7 @@ codeunit 139739 "APIV1 - Item Variants E2E" var LibraryGraphMgt: Codeunit "Library - Graph Mgt"; + LibraryGraphDocumentTools: Codeunit "Library - Graph Document Tools"; LibraryUtility: Codeunit "Library - Utility"; LibraryRandom: Codeunit "Library - Random"; LibraryInventory: Codeunit "Library - Inventory"; @@ -426,6 +429,8 @@ codeunit 139739 "APIV1 - Item Variants E2E" LibrarySales: Codeunit "Library - Sales"; begin LibrarySales.CreateSalesOrder(SalesHeader); + LibraryGraphDocumentTools.EnsureVATPostingSetupExists( + SalesHeader."VAT Bus. Posting Group", Item."VAT Prod. Posting Group"); LibrarySales.CreateSalesLine(SalesLine, SalesHeader, SalesLine.Type::Item, Item."No.", 2); SalesLine."Variant Code" := ItemVariant.Code; SalesLine.Modify(); diff --git a/src/Apps/W1/APIV1/test/src/APIV1ItemsE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1ItemsE2E.Codeunit.al index 4cddfa7b2ec..98f11ff1978 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1ItemsE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1ItemsE2E.Codeunit.al @@ -9,6 +9,8 @@ codeunit 139700 "APIV1 - Items E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Item] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1JournalLinesE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1JournalLinesE2E.Codeunit.al index c528b4c662a..f7279bfb24d 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1JournalLinesE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1JournalLinesE2E.Codeunit.al @@ -1,11 +1,14 @@ codeunit 139745 "APIV1 - Journal Lines E2E" { Subtype = Test; + RequiredTestIsolation = Disabled; TestType = IntegrationTest; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [JournalLines] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1JournalsE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1JournalsE2E.Codeunit.al index 6aab2759557..896de508ee6 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1JournalsE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1JournalsE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139727 "APIV1 - Journals E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Journal] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1PDFDocumentE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1PDFDocumentE2E.Codeunit.al index 3f795d60e48..cd1f74d37db 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1PDFDocumentE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1PDFDocumentE2E.Codeunit.al @@ -1,11 +1,14 @@ codeunit 139744 "APIV1 - PDF Document E2E" { Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [PDF] end; @@ -24,7 +27,7 @@ codeunit 139744 "APIV1 - PDF Document E2E" var CompanyInformation: Record "Company Information"; begin - WorkDate := Today; + LibraryGraphMgt.SetLicenseSafeWorkDate(); CompanyInformation.Get(); if CompanyInformation."Giro No." = '' then @@ -279,4 +282,3 @@ codeunit 139744 "APIV1 - PDF Document E2E" Commit(); end; } - diff --git a/src/Apps/W1/APIV1/test/src/APIV1PaymentTermsE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1PaymentTermsE2E.Codeunit.al index 5c39f3bd02a..6ea918f0406 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1PaymentTermsE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1PaymentTermsE2E.Codeunit.al @@ -3,10 +3,13 @@ codeunit 139704 "APIV1 - Payment Terms E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Payment Terms] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1PicturesE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1PicturesE2E.Codeunit.al index 3913b1537e6..deefee7aade 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1PicturesE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1PicturesE2E.Codeunit.al @@ -7,6 +7,8 @@ codeunit 139742 "APIV1 - Pictures E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Image] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1PurchaseInvLinesE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1PurchaseInvLinesE2E.Codeunit.al index d3b95c6f61c..c949fb9e7ad 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1PurchaseInvLinesE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1PurchaseInvLinesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139738 "APIV1 - Purchase Inv Lines E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Purchase] [Invoice] end; @@ -711,6 +714,7 @@ codeunit 139738 "APIV1 - Purchase Inv Lines E2E" TargetURL: Text; ResponseText: Text; InvoiceLineJSON: Text; + LineDescription: Text; begin // [SCENARIO] Posting a line with description only will get a type item // [GIVEN] A post request with description only @@ -719,7 +723,8 @@ codeunit 139738 "APIV1 - Purchase Inv Lines E2E" COMMIT(); - InvoiceLineJSON := '{"description":"test"}'; + LineDescription := Format(CreateGuid()); + InvoiceLineJSON := LibraryGraphMgt.AddPropertytoJSON('', 'description', LineDescription); // [WHEN] we just POST a blank line TargetURL := LibraryGraphMgt @@ -731,8 +736,10 @@ codeunit 139738 "APIV1 - Purchase Inv Lines E2E" LibraryGraphMgt.PostToWebService(TargetURL, InvoiceLineJSON, ResponseText); // [THEN] Line of type Item is created - FindFirstPurchaseLine(PurchaseHeader, PurchaseLine); - PurchaseLine.FINDLAST(); + PurchaseLine.SETRANGE("Document Type", PurchaseHeader."Document Type"); + PurchaseLine.SETRANGE("Document No.", PurchaseHeader."No."); + PurchaseLine.SETRANGE(Description, LineDescription); + Assert.IsTrue(PurchaseLine.FINDFIRST(), 'Could not find the created purchase invoice line'); Assert.AreEqual('', PurchaseLine."No.", 'No should be blank'); Assert.AreEqual(PurchaseLine.Type, PurchaseLine.Type::Item, 'Wrong type is set'); @@ -1149,12 +1156,6 @@ codeunit 139738 "APIV1 - Purchase Inv Lines E2E" - - - - - - diff --git a/src/Apps/W1/APIV1/test/src/APIV1PurchaseInvoicesE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1PurchaseInvoicesE2E.Codeunit.al index 8060fbf4d23..ada74c1e642 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1PurchaseInvoicesE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1PurchaseInvoicesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139729 "APIV1 - Purchase Invoices E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Purchase] [Invoice] end; @@ -423,8 +426,9 @@ codeunit 139729 "APIV1 - Purchase Invoices E2E" Vendor.Validate("Payment Terms Code", PaymentTerms.Code); Vendor.Modify(true); - // [GIVEN] Create Invoice Json with Vendor No and Invoice Date - InvoiceJSON := CreateInvoiceJSON('vendorNumber', VendorNo, 'invoiceDate', WorkDate()); + // [GIVEN] Create Invoice Json with dates before the vendor defaults are applied + InvoiceJSON := CreateInvoiceJSON('invoiceDate', WorkDate(), 'postingDate', WorkDate()); + InvoiceJSON := LibraryGraphMgt.AddPropertytoJSON(InvoiceJSON, 'vendorNumber', VendorNo); COMMIT(); // [WHEN] We POST the JSON to the Web Service @@ -441,7 +445,30 @@ codeunit 139729 "APIV1 - Purchase Invoices E2E" PurchaseHeader.SETRANGE("No.", InvoiceNumber); PurchaseHeader.SETRANGE("Buy-from Vendor No.", VendorNo); Assert.IsTrue(PurchaseHeader.FINDFIRST(), UnpostedInvoiceExistErr); - Assert.IsTrue(PurchaseHeader."Payment Discount %" <> 0, PaymentDiscountErr); + if PurchaseHeader."Payment Discount %" = 0 then + Assert.IsTrue(HasLocalizedPaymentDiscount(PurchaseHeader."No."), PaymentDiscountErr); + end; + + local procedure HasLocalizedPaymentDiscount(DocumentNo: Code[20]): Boolean + var + RecordField: Record Field; + PaymentLineRecordRef: RecordRef; + PaymentLineFieldRef: FieldRef; + begin + RecordField.SetRange(TableNo, 12170); + if RecordField.IsEmpty() then + exit(false); + + PaymentLineRecordRef.Open(12170); + PaymentLineFieldRef := PaymentLineRecordRef.Field(10); + PaymentLineFieldRef.SetRange(2); + PaymentLineFieldRef := PaymentLineRecordRef.Field(1); + PaymentLineFieldRef.SetRange(2); + PaymentLineFieldRef := PaymentLineRecordRef.Field(2); + PaymentLineFieldRef.SetRange(DocumentNo); + PaymentLineFieldRef := PaymentLineRecordRef.Field(7); + PaymentLineFieldRef.SetFilter('>%1', 0); + exit(not PaymentLineRecordRef.IsEmpty()); end; local procedure CreatePurchaseInvoices(var InvoiceID1: Text; var InvoiceID2: Text) @@ -542,15 +569,7 @@ codeunit 139729 "APIV1 - Purchase Invoices E2E" end; local procedure CreatePaymentTermsWithDiscount(var PaymentTerms: Record "Payment Terms") - var - DateCalculation: DateFormula; begin - LibraryERM.CreatePaymentTerms(PaymentTerms); - Evaluate(DateCalculation, '1M'); - PaymentTerms.Validate("Due Date Calculation", DateCalculation); - Evaluate(DateCalculation, '8D'); - PaymentTerms.Validate("Discount Date Calculation", DateCalculation); - PaymentTerms.Validate("Discount %", 2); - PaymentTerms.Modify(true); + LibraryERM.CreatePaymentTermsDiscount(PaymentTerms, true); end; } diff --git a/src/Apps/W1/APIV1/test/src/APIV1RetEarningsE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1RetEarningsE2E.Codeunit.al index 2bc76f8cb32..986cd5ea619 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1RetEarningsE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1RetEarningsE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139721 "APIV1 - Ret. Earnings E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Retained Earnings] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1SalesCrMemoLinesE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1SalesCrMemoLinesE2E.Codeunit.al index 1d5fc4dabe1..e570ade8aec 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1SalesCrMemoLinesE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1SalesCrMemoLinesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139737 "APIV1 - Sales CrMemo Lines E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Credit Memo] end; @@ -698,6 +701,7 @@ codeunit 139737 "APIV1 - Sales CrMemo Lines E2E" TargetURL: Text; ResponseText: Text; CreditMemoLineJSON: Text; + LineDescription: Text; begin // [SCENARIO] Posting a line with description only will get a type item // [GIVEN] A post request with description only @@ -706,7 +710,8 @@ codeunit 139737 "APIV1 - Sales CrMemo Lines E2E" COMMIT(); - CreditMemoLineJSON := '{"description":"test"}'; + LineDescription := Format(CreateGuid()); + CreditMemoLineJSON := LibraryGraphMgt.AddPropertytoJSON('', 'description', LineDescription); // [WHEN] we just POST a blank line TargetURL := LibraryGraphMgt @@ -718,8 +723,10 @@ codeunit 139737 "APIV1 - Sales CrMemo Lines E2E" LibraryGraphMgt.PostToWebService(TargetURL, CreditMemoLineJSON, ResponseText); // [THEN] Line of type Item is created - FindFirstSalesLine(SalesHeader, SalesLine); - SalesLine.FINDLAST(); + SalesLine.SETRANGE("Document Type", SalesHeader."Document Type"); + SalesLine.SETRANGE("Document No.", SalesHeader."No."); + SalesLine.SETRANGE(Description, LineDescription); + Assert.IsTrue(SalesLine.FINDFIRST(), 'Could not find the created credit memo line'); Assert.AreEqual('', SalesLine."No.", 'No should be blank'); Assert.AreEqual(SalesLine.Type, SalesLine.Type::Item, 'Wrong type is set'); @@ -1392,12 +1399,6 @@ codeunit 139737 "APIV1 - Sales CrMemo Lines E2E" - - - - - - diff --git a/src/Apps/W1/APIV1/test/src/APIV1SalesCreditMemosE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1SalesCreditMemosE2E.Codeunit.al index 8ab2dff2dbb..7c59f7cfad4 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1SalesCreditMemosE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1SalesCreditMemosE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139728 "APIV1 - Sales Credit Memos E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Credit Memo] end; @@ -769,12 +772,17 @@ codeunit 139728 "APIV1 - Sales Credit Memos E2E" local procedure CreateCorrectiveSalesCreditMemo(var SalesCrMemoHeader: Record "Sales Cr.Memo Header") var + ReasonCode: Record "Reason Code"; SalesInvoiceHeader: Record "Sales Invoice Header"; SalesHeader: Record "Sales Header"; InvoiceCode: Code[20]; begin LibrarySales.CreateSalesInvoice(SalesHeader); ModifySalesHeaderPostingDate(SalesHeader, WORKDATE()); + EnsureReasonCode(); + ReasonCode.FindFirst(); + SalesHeader.Validate("Reason Code", ReasonCode.Code); + SalesHeader.Modify(true); InvoiceCode := LibrarySales.PostSalesDocument(SalesHeader, false, true); SalesInvoiceHeader.Get(InvoiceCode); Commit(); @@ -783,6 +791,16 @@ codeunit 139728 "APIV1 - Sales Credit Memos E2E" SalesCrMemoHeader.FindFirst(); end; + local procedure EnsureReasonCode() + var + ReasonCode: Record "Reason Code"; + begin + if not ReasonCode.IsEmpty() then + exit; + + LibraryERM.CreateReasonCode(ReasonCode); + end; + local procedure CreateDraftSalesCreditMemo(var SalesHeader: Record "Sales Header") begin LibrarySales.CreateSalesCreditMemo(SalesHeader); @@ -952,6 +970,8 @@ codeunit 139728 "APIV1 - Sales Credit Memos E2E" SalesHeader1RecordRef.GETTABLE(SalesHeader1); SalesHeader2RecordRef.GETTABLE(SalesHeader2); + LibraryGraphMgt.AddFieldToIgnoreIfExists( + TempIgnoredFieldsForComparison, DATABASE::"Sales Header", 'Operation Occurred Date'); Assert.RecordsAreEqualExceptCertainFields( SalesHeader1RecordRef, SalesHeader2RecordRef, TempIgnoredFieldsForComparison, 'Credit Memos do not match'); @@ -1071,4 +1091,3 @@ codeunit 139728 "APIV1 - Sales Credit Memos E2E" JobQueueEntry.Cancel(); end; } - diff --git a/src/Apps/W1/APIV1/test/src/APIV1SalesInvLinesE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1SalesInvLinesE2E.Codeunit.al index 86e95b3f302..044c5aa6417 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1SalesInvLinesE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1SalesInvLinesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139734 "APIV1 - Sales Inv. Lines E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Invoice] end; @@ -935,6 +938,7 @@ codeunit 139734 "APIV1 - Sales Inv. Lines E2E" TargetURL: Text; ResponseText: Text; InvoiceLineJSON: Text; + LineDescription: Text; begin // [SCENARIO] Posting a line with description only will get a type item // [GIVEN] A post request with description only @@ -943,7 +947,8 @@ codeunit 139734 "APIV1 - Sales Inv. Lines E2E" COMMIT(); - InvoiceLineJSON := '{"description":"test"}'; + LineDescription := Format(CreateGuid()); + InvoiceLineJSON := LibraryGraphMgt.AddPropertytoJSON('', 'description', LineDescription); // [WHEN] we just POST a blank line TargetURL := LibraryGraphMgt @@ -955,8 +960,10 @@ codeunit 139734 "APIV1 - Sales Inv. Lines E2E" LibraryGraphMgt.PostToWebService(TargetURL, InvoiceLineJSON, ResponseText); // [THEN] Line of type Item is created - FindFirstSalesLine(SalesHeader, SalesLine); - SalesLine.FINDLAST(); + SalesLine.SETRANGE("Document Type", SalesHeader."Document Type"); + SalesLine.SETRANGE("Document No.", SalesHeader."No."); + SalesLine.SETRANGE(Description, LineDescription); + Assert.IsTrue(SalesLine.FINDFIRST(), 'Could not find the created invoice line'); Assert.AreEqual('', SalesLine."No.", 'No should be blank'); Assert.AreEqual(SalesLine.Type, SalesLine.Type::Item, 'Wrong type is set'); VerifyIdsAreBlank(ResponseText); @@ -1070,6 +1077,8 @@ codeunit 139734 "APIV1 - Sales Inv. Lines E2E" Assert.AreNotEqual('', InvoiceLineID, 'ID should not be empty'); LineNo := SalesLine."Line No."; LibraryInventory.CreateItem(Item); + LibraryGraphDocumentTools.EnsureVATPostingSetupExists( + SalesLine."VAT Bus. Posting Group", Item."VAT Prod. Posting Group"); InvoiceLineJSON := STRSUBSTNO('{"itemId":"%1"}', LibraryGraphMgt.StripBrackets(Format(Item.SystemId))); COMMIT(); diff --git a/src/Apps/W1/APIV1/test/src/APIV1SalesOrderLinesE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1SalesOrderLinesE2E.Codeunit.al index 2afa4cf7193..29f07470e21 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1SalesOrderLinesE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1SalesOrderLinesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139735 "APIV1 - Sales Order Lines E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Order] end; @@ -712,6 +715,7 @@ codeunit 139735 "APIV1 - Sales Order Lines E2E" TargetURL: Text; ResponseText: Text; OrderLineJSON: Text; + LineDescription: Text; begin // [SCENARIO] Posting a line with description only will get a type item // [GIVEN] A post request with description only @@ -720,7 +724,8 @@ codeunit 139735 "APIV1 - Sales Order Lines E2E" COMMIT(); - OrderLineJSON := '{"description":"test"}'; + LineDescription := Format(CreateGuid()); + OrderLineJSON := LibraryGraphMgt.AddPropertytoJSON('', 'description', LineDescription); // [WHEN] we just POST a blank line TargetURL := LibraryGraphMgt @@ -732,8 +737,10 @@ codeunit 139735 "APIV1 - Sales Order Lines E2E" LibraryGraphMgt.PostToWebService(TargetURL, OrderLineJSON, ResponseText); // [THEN] Line of type Item is created - FindFirstSalesLine(SalesHeader, SalesLine); - SalesLine.FINDLAST(); + SalesLine.SETRANGE("Document Type", SalesHeader."Document Type"); + SalesLine.SETRANGE("Document No.", SalesHeader."No."); + SalesLine.SETRANGE(Description, LineDescription); + Assert.IsTrue(SalesLine.FINDFIRST(), 'Could not find the created order line'); Assert.AreEqual('', SalesLine."No.", 'No should be blank'); Assert.AreEqual(SalesLine.Type, SalesLine.Type::Item, 'Wrong type is set'); @@ -844,6 +851,8 @@ codeunit 139735 "APIV1 - Sales Order Lines E2E" Assert.AreNotEqual('', OrderId, 'ID should not be empty'); LibraryInventory.CreateItem(Item); + LibraryGraphDocumentTools.EnsureVATPostingSetupExists( + SalesLine."VAT Bus. Posting Group", Item."VAT Prod. Posting Group"); OrderLineJSON := STRSUBSTNO('{"itemId":"%1"}', LibraryGraphMgt.StripBrackets(Format(Item.SystemId))); COMMIT(); @@ -1279,14 +1288,6 @@ codeunit 139735 "APIV1 - Sales Order Lines E2E" - - - - - - - - diff --git a/src/Apps/W1/APIV1/test/src/APIV1SalesOrdersE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1SalesOrdersE2E.Codeunit.al index ec9fb22f169..287b0b2233d 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1SalesOrdersE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1SalesOrdersE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139711 "APIV1 - Sales Orders E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Order] end; @@ -381,6 +384,8 @@ codeunit 139711 "APIV1 - Sales Orders E2E" PageSalesHeader.Get(PageSalesHeader."Document Type"::Order, SalesOrder."No.".VALUE()); ApiRecordRef.GetTable(ApiSalesHeader); PageRecordRef.GetTable(PageSalesHeader); + LibraryGraphMgt.AddFieldToIgnoreIfExists( + TempIgnoredFieldsForComparison, DATABASE::"Sales Header", 'Operation Occurred Date'); Assert.RecordsAreEqualExceptCertainFields(ApiRecordRef, PageRecordRef, TempIgnoredFieldsForComparison, 'Page and API order do not match'); diff --git a/src/Apps/W1/APIV1/test/src/APIV1SalesQuoteLinesE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1SalesQuoteLinesE2E.Codeunit.al index b4e577f634b..d1c0388110f 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1SalesQuoteLinesE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1SalesQuoteLinesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139736 "APIV1 - Sales Quote Lines E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Quote] end; @@ -614,6 +617,7 @@ codeunit 139736 "APIV1 - Sales Quote Lines E2E" TargetURL: Text; ResponseText: Text; QuoteLineJSON: Text; + LineDescription: Text; begin // [SCENARIO] Posting a line with description only will get a type item // [GIVEN] A post request with description only @@ -622,7 +626,8 @@ codeunit 139736 "APIV1 - Sales Quote Lines E2E" COMMIT(); - QuoteLineJSON := '{"description":"test"}'; + LineDescription := Format(CreateGuid()); + QuoteLineJSON := LibraryGraphMgt.AddPropertytoJSON('', 'description', LineDescription); // [WHEN] we just POST a blank line TargetURL := LibraryGraphMgt @@ -634,8 +639,10 @@ codeunit 139736 "APIV1 - Sales Quote Lines E2E" LibraryGraphMgt.PostToWebService(TargetURL, QuoteLineJSON, ResponseText); // [THEN] Line of type Item is created - FindFirstSalesLine(SalesHeader, SalesLine); - SalesLine.FINDLAST(); + SalesLine.SETRANGE("Document Type", SalesHeader."Document Type"); + SalesLine.SETRANGE("Document No.", SalesHeader."No."); + SalesLine.SETRANGE(Description, LineDescription); + Assert.IsTrue(SalesLine.FINDFIRST(), 'Could not find the created quote line'); Assert.AreEqual('', SalesLine."No.", 'No should be blank'); Assert.AreEqual(SalesLine.Type, SalesLine.Type::Item, 'Wrong type is set'); @@ -1005,12 +1012,6 @@ codeunit 139736 "APIV1 - Sales Quote Lines E2E" - - - - - - diff --git a/src/Apps/W1/APIV1/test/src/APIV1SalesQuotesE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1SalesQuotesE2E.Codeunit.al index b395b79b8e8..14abfeef836 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1SalesQuotesE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1SalesQuotesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139723 "APIV1 - Sales Quotes E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Quote] end; @@ -367,6 +370,11 @@ codeunit 139723 "APIV1 - Sales Quotes E2E" PageSalesHeader.Get(PageSalesHeader."Document Type"::Quote, SalesQuote."No.".VALUE()); ApiRecordRef.GETTABLE(ApiSalesHeader); PageRecordRef.GETTABLE(PageSalesHeader); + LibraryGraphMgt.AddFieldToIgnoreIfExists( + TempIgnoredFieldsForComparison, DATABASE::"Sales Header", 'Operation Occurred Date'); + LibraryGraphMgt.AddFieldToIgnoreIfExists( + TempIgnoredFieldsForComparison, DATABASE::"Sales Header", 'VAT Reporting Date'); + Assert.RecordsAreEqualExceptCertainFields(ApiRecordRef, PageRecordRef, TempIgnoredFieldsForComparison, 'Page and API quote do not match'); end; @@ -770,6 +778,9 @@ codeunit 139723 "APIV1 - Sales Quotes E2E" LibrarySmallBusiness.CreateCustomer(Customer); LibrarySmallBusiness.CreateItem(Item); LibrarySmallBusiness.CreateSalesQuoteHeaderWithLines(SalesHeader, Customer, Item, 1, 1); + SalesHeader.Validate("Posting Date", WorkDate()); + SalesHeader.Validate("Document Date", WorkDate()); + SalesHeader.Modify(true); end; local procedure FindSalesHeader(var SalesHeader: Record "Sales Header"; CustomerNo: Text; QuoteNumber: Text): Boolean diff --git a/src/Apps/W1/APIV1/test/src/APIV1ShipmentMethodsE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1ShipmentMethodsE2E.Codeunit.al index 09cf7ce2b3e..4bb01dc0057 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1ShipmentMethodsE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1ShipmentMethodsE2E.Codeunit.al @@ -3,10 +3,13 @@ codeunit 139705 "APIV1 - Shipment Methods E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Shipment Method] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1TaxAreasE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1TaxAreasE2E.Codeunit.al index bffc2b39d55..3004d9e9788 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1TaxAreasE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1TaxAreasE2E.Codeunit.al @@ -9,6 +9,8 @@ codeunit 139726 "APIV1 - Tax Areas E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Tax Area] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1TrialBalanceE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1TrialBalanceE2E.Codeunit.al index c495bc2ddfc..bfabf36cddd 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1TrialBalanceE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1TrialBalanceE2E.Codeunit.al @@ -3,10 +3,13 @@ codeunit 139718 "APIV1 - Trial Balance E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Trial Balance] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1UofME2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1UofME2E.Codeunit.al index b283bc61d9d..b567c670ad6 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1UofME2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1UofME2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139712 "APIV1 - UofM E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Unit of Measure] end; diff --git a/src/Apps/W1/APIV1/test/src/APIV1VendorsE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/APIV1VendorsE2E.Codeunit.al index 44570b29311..324a7d02e3c 100644 --- a/src/Apps/W1/APIV1/test/src/APIV1VendorsE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/APIV1VendorsE2E.Codeunit.al @@ -9,6 +9,8 @@ codeunit 139703 "APIV1 - Vendors E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Vendor] end; diff --git a/src/Apps/W1/APIV1/test/src/CountriesRegionsE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/CountriesRegionsE2E.Codeunit.al index 1e4843ec39c..7dd5d7645c9 100644 --- a/src/Apps/W1/APIV1/test/src/CountriesRegionsE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/CountriesRegionsE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139710 "Countries/Regions E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Country/Region] end; diff --git a/src/Apps/W1/APIV1/test/src/PaymentMethodsE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/PaymentMethodsE2E.Codeunit.al index 005c5f0add8..dde83f5c15c 100644 --- a/src/Apps/W1/APIV1/test/src/PaymentMethodsE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/PaymentMethodsE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139714 "Payment Methods E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Payment Method] end; diff --git a/src/Apps/W1/APIV1/test/src/SalesInvoicesE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/SalesInvoicesE2E.Codeunit.al index dbf39f9a725..b22f615cfbb 100644 --- a/src/Apps/W1/APIV1/test/src/SalesInvoicesE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/SalesInvoicesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139709 "Sales Invoices E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Invoice] end; @@ -577,6 +580,9 @@ codeunit 139709 "Sales Invoices E2E" PageSalesHeader.GET(PageSalesHeader."Document Type"::Invoice, SalesInvoice."No.".VALUE()); ApiRecordRef.GETTABLE(ApiSalesHeader); PageRecordRef.GETTABLE(PageSalesHeader); + LibraryGraphMgt.AddFieldToIgnoreIfExists( + TempIgnoredFieldsForComparison, DATABASE::"Sales Header", 'Operation Occurred Date'); + Assert.RecordsAreEqualExceptCertainFields(ApiRecordRef, PageRecordRef, TempIgnoredFieldsForComparison, 'Page and API Invoice do not match'); @@ -595,6 +601,7 @@ codeunit 139709 "Sales Invoices E2E" // [SCENARIO 184721] When an invoice is created,the GET Method should update the invoice and assign a total // [GIVEN] 2 invoices, one posted and one unposted without totals assigned + LibraryApplicationArea.EnableFoundationSetup(); LibraryGraphDocumentTools.CreateDocumentWithDiscountPctPending( SalesHeader, DiscountPct, SalesHeader."Document Type"::Invoice); SalesHeader.CALCFIELDS("Recalculate Invoice Disc."); @@ -883,6 +890,7 @@ codeunit 139709 "Sales Invoices E2E" DocumentId := SalesInvoiceHeader."Draft Invoice SystemId"; // Special case for AU + EnsureReasonCode(); LibrarySales.SetDefaultCancelReasonCodeForSalesAndReceivablesSetup(); Commit(); @@ -920,6 +928,7 @@ codeunit 139709 "Sales Invoices E2E" DocumentId := SalesInvoiceHeader."Draft Invoice SystemId"; // Special case for AU + EnsureReasonCode(); LibrarySales.SetDefaultCancelReasonCodeForSalesAndReceivablesSetup(); Commit(); @@ -1235,9 +1244,22 @@ codeunit 139709 "Sales Invoices E2E" local procedure CreateCancelledSalesInvoice(var SalesInvoiceHeader: Record "Sales Invoice Header") begin CreatePostedSalesInvoice(SalesInvoiceHeader); + EnsureReasonCode(); + LibrarySales.SetDefaultCancelReasonCodeForSalesAndReceivablesSetup(); + Commit(); CODEUNIT.Run(CODEUNIT::"Correct Posted Sales Invoice", SalesInvoiceHeader); end; + local procedure EnsureReasonCode() + var + ReasonCode: Record "Reason Code"; + begin + if not ReasonCode.IsEmpty() then + exit; + + LibraryERM.CreateReasonCode(ReasonCode); + end; + local procedure CreateSalesInvoices(var InvoiceID1: Text; var InvoiceID2: Text) var SalesInvoiceHeader: Record "Sales Invoice Header"; diff --git a/src/Apps/W1/APIV1/test/src/TaxGroupsE2E.Codeunit.al b/src/Apps/W1/APIV1/test/src/TaxGroupsE2E.Codeunit.al index 15b2166d131..14660cf9468 100644 --- a/src/Apps/W1/APIV1/test/src/TaxGroupsE2E.Codeunit.al +++ b/src/Apps/W1/APIV1/test/src/TaxGroupsE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139708 "Tax Groups E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Tax Group] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2AccountingPeriodsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2AccountingPeriodsE2E.Codeunit.al index c578df54f2d..84145e2836f 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2AccountingPeriodsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2AccountingPeriodsE2E.Codeunit.al @@ -3,6 +3,12 @@ codeunit 139859 "APIV2 - Accounting Periods E2E" Subtype = Test; RequiredTestIsolation = Disabled; + trigger OnRun() + begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); + end; + var Assert: Codeunit Assert; LibraryGraphMgt: Codeunit "Library - Graph Mgt"; diff --git a/src/Apps/W1/APIV2/test/src/APIV2AccountsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2AccountsE2E.Codeunit.al index 9389de358ba..cd2f3f45f2d 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2AccountsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2AccountsE2E.Codeunit.al @@ -3,10 +3,13 @@ codeunit 139801 "APIV2 - Accounts E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Account] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2AgedAPE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2AgedAPE2E.Codeunit.al index 2418082ad5b..60ee23d08a4 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2AgedAPE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2AgedAPE2E.Codeunit.al @@ -3,10 +3,13 @@ codeunit 139819 "APIV2 - Aged AP E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Purchase] [Aged Report] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2AgedARE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2AgedARE2E.Codeunit.al index 2a280d83eb5..d38e7657186 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2AgedARE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2AgedARE2E.Codeunit.al @@ -3,10 +3,13 @@ codeunit 139820 "APIV2 - Aged AR E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Aged Report] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2ApplyVendorEntE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2ApplyVendorEntE2E.Codeunit.al index 33e17842d8e..c96c8eff9b5 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2ApplyVendorEntE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2ApplyVendorEntE2E.Codeunit.al @@ -1,11 +1,14 @@ codeunit 139867 "APIV2 - Apply Vendor Ent. E2E" { Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Vendor Payments] [Apply Vendor Entries] end; @@ -159,7 +162,8 @@ codeunit 139867 "APIV2 - Apply Vendor Ent. E2E" Assert.IsTrue(LibraryGraphMgt.GetObjectIDFromJSON(EntryJSON, 'id', EntryId), 'The apply vendor entry should have an id'); // [WHEN] we PATCH the entry to apply it - TargetURL := TargetURL + '(' + LibraryGraphMgt.StripBrackets(EntryId) + ')'; + TargetURL := LibraryGraphMgt.AppendPathToTargetURL( + TargetURL, '(' + LibraryGraphMgt.StripBrackets(EntryId) + ')'); LibraryGraphMgt.PatchToWebService(TargetURL, '{"applied": true}', ResponseText); // [THEN] the vendor payment is now applied diff --git a/src/Apps/W1/APIV2/test/src/APIV2ApprovalEntriesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2ApprovalEntriesE2E.Codeunit.al index 9ae78501641..e7909a8c44d 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2ApprovalEntriesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2ApprovalEntriesE2E.Codeunit.al @@ -1,10 +1,14 @@ codeunit 139917 "APIV2 - Approval Entries E2E" { - Subtype = Test; TestType = IntegrationTest; TestPermissions = Disabled; + trigger OnRun() + begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + end; + var Assert: Codeunit Assert; LibraryApproval: Codeunit "Library - Document Approvals"; diff --git a/src/Apps/W1/APIV2/test/src/APIV2ApprovalUserSetupE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2ApprovalUserSetupE2E.Codeunit.al index 2a259376141..e2db1b84094 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2ApprovalUserSetupE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2ApprovalUserSetupE2E.Codeunit.al @@ -1,10 +1,14 @@ codeunit 139918 "APIV2 - Approval UserSetup E2E" { - Subtype = Test; TestType = IntegrationTest; TestPermissions = Disabled; + trigger OnRun() + begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + end; + var Assert: Codeunit Assert; LibraryApproval: Codeunit "Library - Document Approvals"; diff --git a/src/Apps/W1/APIV2/test/src/APIV2AssemblyOrdersE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2AssemblyOrdersE2E.Codeunit.al index 9de9e6343ae..232ffc6bd7b 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2AssemblyOrdersE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2AssemblyOrdersE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139925 "APIV2 - Assembly Orders E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Assembly] [Order] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2AttachmentsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2AttachmentsE2E.Codeunit.al index 0ba1716ac2d..f54ed8e6e33 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2AttachmentsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2AttachmentsE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139833 "APIV2 - Attachments E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Attachment] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2AutomationRSPackage.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2AutomationRSPackage.Codeunit.al index 976aa5679b5..e27aeadffd3 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2AutomationRSPackage.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2AutomationRSPackage.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139831 "APIV2 - Automation RS Package" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Config. Package] end; @@ -16,7 +19,6 @@ codeunit 139831 "APIV2 - Automation RS Package" LibraryGraphMgt: Codeunit "Library - Graph Mgt"; LibraryUtility: Codeunit "Library - Utility"; Assert: Codeunit "Assert"; - IsInitialized: Boolean; SamplePackageFile: Text; PackageCodeTxt: Label 'code', Locked = true; ActionImportTxt: Label 'Microsoft.NAV.import'; @@ -31,11 +33,7 @@ codeunit 139831 "APIV2 - Automation RS Package" begin TenantConfigPackageFile.DELETEALL(true); - if IsInitialized then - exit; - SamplePackageFile := GenerateSamplePackageFile(); - IsInitialized := true; end; [Test] @@ -142,11 +140,12 @@ codeunit 139831 "APIV2 - Automation RS Package" StartTime := CurrentDateTime(); repeat + SelectLatestVersion(); ConfigPackage.Find(); until (not IsImportPending(ConfigPackage)) or (CurrentDateTime() - StartTime > 180000); - Assert.AreEqual(ConfigPackage."Import Status", ConfigPackage."Import Status"::Completed, 'Import Status should be completed.'); + Assert.AreEqual(ConfigPackage."Import Status"::Completed, ConfigPackage."Import Status", 'Import Status should be completed.'); // clean up after the test LibraryRapidStart.CleanUp(ConfigPackage.Code); @@ -190,11 +189,12 @@ codeunit 139831 "APIV2 - Automation RS Package" StartTime := CurrentDateTime(); repeat + SelectLatestVersion(); ConfigPackage.Find(); until (not IsImportPending(ConfigPackage)) or (CurrentDateTime() - StartTime > 180000); - Assert.AreEqual(ConfigPackage."Import Status", ConfigPackage."Import Status"::Error, 'Import Status should be error.'); + Assert.AreEqual(ConfigPackage."Import Status"::Error, ConfigPackage."Import Status", 'Import Status should be error.'); // clean up after the test LibraryRapidStart.CleanUp(ConfigPackage.Code); @@ -240,11 +240,12 @@ codeunit 139831 "APIV2 - Automation RS Package" StartTime := CurrentDateTime(); repeat + SelectLatestVersion(); ConfigPackage.Find(); until (not IsApplyPending(ConfigPackage)) or (CurrentDateTime() - StartTime > 180000); - Assert.AreEqual(ConfigPackage."Apply Status", ConfigPackage."Apply Status"::Completed, 'Apply Status should be completed.'); + Assert.AreEqual(ConfigPackage."Apply Status"::Completed, ConfigPackage."Apply Status", 'Apply Status should be completed.'); Assert.AreEqual(0, ConfigPackage."No. of Errors", 'There should be no errors.'); // clean up after the test @@ -323,7 +324,7 @@ codeunit 139831 "APIV2 - Automation RS Package" local procedure IsApplyPending(var ConfigPackage: Record "Config. Package"): Boolean begin - exit(ConfigPackage."Apply Status" IN [ConfigPackage."Import Status"::Scheduled, ConfigPackage."Apply Status"::InProgress]); + exit(ConfigPackage."Apply Status" IN [ConfigPackage."Apply Status"::Scheduled, ConfigPackage."Apply Status"::InProgress]); end; local procedure CreateTestPackage(var ConfigPackage: Record "Config. Package") diff --git a/src/Apps/W1/APIV2/test/src/APIV2BalanceSheetE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2BalanceSheetE2E.Codeunit.al index f99099da896..170bca913d9 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2BalanceSheetE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2BalanceSheetE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139815 "APIV2 - Balance Sheet E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Balance Sheet] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2BlPurchOrdersE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2BlPurchOrdersE2E.Codeunit.al index 25dbc2bfd72..eb5f06f51c8 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2BlPurchOrdersE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2BlPurchOrdersE2E.Codeunit.al @@ -8,6 +8,7 @@ codeunit 139908 "APIV2 - Bl. Purch. Orders E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); // [FEATURE] [Graph] [Purchase] [Blanket Order] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2BlSalesOrdersE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2BlSalesOrdersE2E.Codeunit.al index e70ad8a2eb3..22ab626cb64 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2BlSalesOrdersE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2BlSalesOrdersE2E.Codeunit.al @@ -8,6 +8,7 @@ codeunit 139909 "APIV2 - Bl. Sales Orders E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); // [FEATURE] [Graph] [Sales] [Blanket Order] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2CashFlowStatementE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2CashFlowStatementE2E.Codeunit.al index 9ff2fa17758..2e24faf1cca 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2CashFlowStatementE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2CashFlowStatementE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139817 "APIV2 - CashFlow Statement E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Cash Flow Statement] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2CompanyInfoE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2CompanyInfoE2E.Codeunit.al index d72100713e1..49f197ff4eb 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2CompanyInfoE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2CompanyInfoE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139806 "APIV2 - Company Info. E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = IntegrationTest; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Company Information] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2ContactsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2ContactsE2E.Codeunit.al index 431c3a98b1c..c0f50c7d175 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2ContactsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2ContactsE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139866 "APIV2 - Contacts E2E" // version Test,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Api] [Contact] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2ContactsInfE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2ContactsInfE2E.Codeunit.al index 9a1e8721d24..a258a925ddf 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2ContactsInfE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2ContactsInfE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139853 "APIV2 - Contacts Inf. E2E" // version Test,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Contact] end; @@ -73,7 +76,9 @@ codeunit 139853 "APIV2 - Contacts Inf. E2E" Customer.SystemId, Page::"APIV2 - Customers", CustomersServiceNameTxt, - ContactsInformationServiceNameTxt) + '(' + LibraryGraphMgt.StripBrackets(Format(Contact.SystemId)) + ')/' + ContactServiceNameTxt; + ContactsInformationServiceNameTxt); + TargetURL := LibraryGraphMgt.AppendPathToTargetURL( + TargetURL, '(' + LibraryGraphMgt.StripBrackets(Format(Contact.SystemId)) + ')/' + ContactServiceNameTxt); LibraryGraphMgt.GetFromWebService(ResponseText, TargetURL); // [THEN] Response contains two contacts @@ -133,7 +138,9 @@ codeunit 139853 "APIV2 - Contacts Inf. E2E" Vendor.SystemId, Page::"APIV2 - Vendors", VendorsServiceNameTxt, - ContactsInformationServiceNameTxt) + '(' + LibraryGraphMgt.StripBrackets(Format(Contact.SystemId)) + ')/' + ContactServiceNameTxt; + ContactsInformationServiceNameTxt); + TargetURL := LibraryGraphMgt.AppendPathToTargetURL( + TargetURL, '(' + LibraryGraphMgt.StripBrackets(Format(Contact.SystemId)) + ')/' + ContactServiceNameTxt); LibraryGraphMgt.GetFromWebService(ResponseText, TargetURL); // [THEN] Response contains two contacts diff --git a/src/Apps/W1/APIV2/test/src/APIV2CountriesRegionsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2CountriesRegionsE2E.Codeunit.al index 0bd63f98d47..b7b2b363706 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2CountriesRegionsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2CountriesRegionsE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139810 "APIV2 - Countries/Regions E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Country/Region] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2CurrenciesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2CurrenciesE2E.Codeunit.al index 5e8bfb987bc..b61bda6589d 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2CurrenciesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2CurrenciesE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139813 "APIV2 - Currencies E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Currency] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2CurrencyExchRateE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2CurrencyExchRateE2E.Codeunit.al index 36e62a1b344..e339500c6c3 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2CurrencyExchRateE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2CurrencyExchRateE2E.Codeunit.al @@ -1,6 +1,13 @@ codeunit 139858 "APIV2 Currency Exch. Rate E2E" { Subtype = Test; + RequiredTestIsolation = Disabled; + + trigger OnRun() + begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); + end; var LibraryERM: Codeunit "Library - ERM"; diff --git a/src/Apps/W1/APIV2/test/src/APIV2CustRetReasonsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2CustRetReasonsE2E.Codeunit.al index 5749e8a0fb7..12c7f561d70 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2CustRetReasonsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2CustRetReasonsE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139869 "APIV2 - Cust. Ret. Reasons E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Credit Memo] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2CustomerPaymentsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2CustomerPaymentsE2E.Codeunit.al index 98a0587a476..25947ca49d4 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2CustomerPaymentsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2CustomerPaymentsE2E.Codeunit.al @@ -1,11 +1,14 @@ codeunit 139840 "APIV2 - Customer Payments E2E" { Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Customer Payments] end; @@ -16,6 +19,7 @@ codeunit 139840 "APIV2 - Customer Payments E2E" Assert: Codeunit Assert; GraphMgtCustomerPayments: Codeunit "Graph Mgt - Customer Payments"; LibraryGraphJournalLines: Codeunit "Library - Graph Journal Lines"; + LibraryERM: Codeunit "Library - ERM"; GraphMgtJournal: Codeunit "Graph Mgt - Journal"; ServiceNameTxt: Label 'customerPaymentJournals'; ServiceSubpageNameTxt: Label 'customerPayments'; @@ -34,7 +38,6 @@ codeunit 139840 "APIV2 - Customer Payments E2E" SalesInvoiceHeader: Record "Sales Invoice Header"; GenJournalLine: Record "Gen. Journal Line"; GenJournalBatch: Record "Gen. Journal Batch"; - LibraryERM: Codeunit "Library - ERM"; SalesInvoiceAggregator: Codeunit "Sales Invoice Aggregator"; JournalName: Code[10]; Amount: Decimal; @@ -769,6 +772,7 @@ codeunit 139840 "APIV2 - Customer Payments E2E" local procedure Initialize() begin + LibraryGraphMgt.SetLicenseSafeWorkDate(); LibraryTestInitialize.OnTestInitialize(Codeunit::"APIV2 - Customer Payments E2E"); if not isInitialized then diff --git a/src/Apps/W1/APIV2/test/src/APIV2CustomersE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2CustomersE2E.Codeunit.al index 567d0166f0a..a8b5a09afa8 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2CustomersE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2CustomersE2E.Codeunit.al @@ -9,6 +9,8 @@ codeunit 139802 "APIV2 - Customers E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Customer] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2DefaultDimensionsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2DefaultDimensionsE2E.Codeunit.al index 5a72973f69d..451b9701d5e 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2DefaultDimensionsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2DefaultDimensionsE2E.Codeunit.al @@ -9,6 +9,8 @@ codeunit 139832 "APIV2 - Default Dimensions E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Default Dimension] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2DimSetLinesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2DimSetLinesE2E.Codeunit.al index 1348a46e0fc..179b6a814cd 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2DimSetLinesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2DimSetLinesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139825 "APIV2 - Dim. Set Lines E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Dimension Line] end; @@ -870,7 +873,9 @@ codeunit 139825 "APIV2 - Dim. Set Lines E2E" // [WHEN] we PATCH the JSON to the web service, with the corresponding keys ResponseText := ''; - TargetURL := LibraryGraphMgt.CreateTargetURLWithSubpage(DocumentId, APIPage, DocServiceNameTxt, ServiceNameTxt) + '(' + LibraryGraphMgt.StripBrackets(Format(DimensionGUID)) + ')'; + TargetURL := LibraryGraphMgt.CreateTargetURLWithSubpage(DocumentId, APIPage, DocServiceNameTxt, ServiceNameTxt); + TargetURL := LibraryGraphMgt.AppendPathToTargetURL( + TargetURL, '(' + LibraryGraphMgt.StripBrackets(Format(DimensionGUID)) + ')'); LibraryGraphMgt.PatchToWebService(TargetURL, LineJSON[2], ResponseText); // [THEN] the dimension lines in the journal should have the values that were given @@ -953,7 +958,10 @@ codeunit 139825 "APIV2 - Dim. Set Lines E2E" // [WHEN] we PATCH the JSON to the web service, with the new dimension code ResponseText := ''; - TargetURL := LibraryGraphMgt.CreateTargetURLWithSubpage(JournalLineGUID, Page::"APIV2 - JournalLines", 'journalLines', ServiceNameTxt) + '(' + LibraryGraphMgt.StripBrackets(Format(DimensionGUID)) + ')'; + TargetURL := LibraryGraphMgt.CreateTargetURLWithSubpage( + JournalLineGUID, Page::"APIV2 - JournalLines", 'journalLines', ServiceNameTxt); + TargetURL := LibraryGraphMgt.AppendPathToTargetURL( + TargetURL, '(' + LibraryGraphMgt.StripBrackets(Format(DimensionGUID)) + ')'); asserterror LibraryGraphMgt.PatchToWebService(TargetURL, LineJSON[2], ResponseText); // [THEN] the patch should fail and the dimension line should remain the same @@ -1185,7 +1193,9 @@ codeunit 139825 "APIV2 - Dim. Set Lines E2E" LibraryGraphMgt.PostToWebService(TargetURL, LineJSON, ResponseText); // [WHEN] we DELETE the dimension line from the web service, with the corresponding keys - TargetURL := LibraryGraphMgt.CreateTargetURLWithSubpage(DocumentId, APIPage, DocServiceNameTxt, ServiceNameTxt) + '(' + LibraryGraphMgt.StripBrackets(Format(Dimension.SystemId)) + ')'; + TargetURL := LibraryGraphMgt.CreateTargetURLWithSubpage(DocumentId, APIPage, DocServiceNameTxt, ServiceNameTxt); + TargetURL := LibraryGraphMgt.AppendPathToTargetURL( + TargetURL, '(' + LibraryGraphMgt.StripBrackets(Format(Dimension.SystemId)) + ')'); LibraryGraphMgt.DeleteFromWebService(TargetURL, '', ResponseText); case DocumentRecordRef.Number() of @@ -1241,14 +1251,17 @@ codeunit 139825 "APIV2 - Dim. Set Lines E2E" Commit(); TargetURL := LibraryGraphMgt.CreateTargetURLWithSubpage(ParentId, ParentAPIPage, ParentServiceNameTxt, LineServiceNameTxt); - TargetURL := TargetURL + '(' + LibraryGraphMgt.StripBrackets(LineId) + ')' + '/dimensionSetLines'; + TargetURL := LibraryGraphMgt.AppendPathToTargetURL( + TargetURL, '(' + LibraryGraphMgt.StripBrackets(LineId) + ')/dimensionSetLines'); LibraryGraphMgt.PostToWebService(TargetURL, LineJSON, ResponseText); // [WHEN] we DELETE the dimension line from the web service, with the corresponding keys ResponseText := ''; TargetURL := LibraryGraphMgt.CreateTargetURLWithSubpage(ParentId, ParentAPIPage, ParentServiceNameTxt, LineServiceNameTxt); - TargetURL := TargetURL + '(' + LibraryGraphMgt.StripBrackets(LineId) + ')' + '/dimensionSetLines'; - TargetURL := TargetURL + '(' + LibraryGraphMgt.StripBrackets(Format(Dimension.SystemId)) + ')'; + TargetURL := LibraryGraphMgt.AppendPathToTargetURL( + TargetURL, + '(' + LibraryGraphMgt.StripBrackets(LineId) + ')/dimensionSetLines(' + + LibraryGraphMgt.StripBrackets(Format(Dimension.SystemId)) + ')'); LibraryGraphMgt.DeleteFromWebService(TargetURL, '', ResponseText); @@ -1357,7 +1370,8 @@ codeunit 139825 "APIV2 - Dim. Set Lines E2E" // [WHEN] we POST the JSON to the web service TargetURL := LibraryGraphMgt.CreateTargetURLWithSubpage(ParentId, ParentAPIPage, ParentServiceNameTxt, LineServiceNameTxt); - TargetURL := TargetURL + '(' + LibraryGraphMgt.StripBrackets(LineId) + ')' + '/dimensionSetLines'; + TargetURL := LibraryGraphMgt.AppendPathToTargetURL( + TargetURL, '(' + LibraryGraphMgt.StripBrackets(LineId) + ')/dimensionSetLines'); LibraryGraphMgt.PostToWebService(TargetURL, LineJSON, ResponseText); @@ -1456,7 +1470,8 @@ codeunit 139825 "APIV2 - Dim. Set Lines E2E" // [GIVEN] the dimension lines are added // [WHEN] we POST the JSON to the web service TargetURL := LibraryGraphMgt.CreateTargetURLWithSubpage(ParentId, ParentAPIPage, ParentServiceNameTxt, LineServiceNameTxt); - TargetURL := TargetURL + '(' + LibraryGraphMgt.StripBrackets(DocumentId) + ')' + '/dimensionSetLines'; + TargetURL := LibraryGraphMgt.AppendPathToTargetURL( + TargetURL, '(' + LibraryGraphMgt.StripBrackets(DocumentId) + ')/dimensionSetLines'); LibraryGraphMgt.PostToWebService(TargetURL, LineJSON[2], ResponseText); LibraryGraphMgt.PostToWebService(TargetURL, LineJSON[1], ResponseText); @@ -1504,15 +1519,18 @@ codeunit 139825 "APIV2 - Dim. Set Lines E2E" Commit(); TargetURL := LibraryGraphMgt.CreateTargetURLWithSubpage(ParentId, ParentAPIPage, ParentServiceNameTxt, LineServiceNameTxt); - TargetURL := TargetURL + '(' + LibraryGraphMgt.StripBrackets(LineId) + ')' + '/dimensionSetLines'; + TargetURL := LibraryGraphMgt.AppendPathToTargetURL( + TargetURL, '(' + LibraryGraphMgt.StripBrackets(LineId) + ')/dimensionSetLines'); LibraryGraphMgt.PostToWebService(TargetURL, LineJSON[1], ResponseText); // [WHEN] we PATCH the JSON to the web service, with the corresponding keys ResponseText := ''; TargetURL := LibraryGraphMgt.CreateTargetURLWithSubpage(ParentId, ParentAPIPage, ParentServiceNameTxt, LineServiceNameTxt); - TargetURL := TargetURL + '(' + LibraryGraphMgt.StripBrackets(LineId) + ')' + '/dimensionSetLines'; - TargetURL := TargetURL + '(' + LibraryGraphMgt.StripBrackets(Format(DimensionGUID)) + ')'; + TargetURL := LibraryGraphMgt.AppendPathToTargetURL( + TargetURL, + '(' + LibraryGraphMgt.StripBrackets(LineId) + ')/dimensionSetLines(' + + LibraryGraphMgt.StripBrackets(Format(DimensionGUID)) + ')'); LibraryGraphMgt.PatchToWebService(TargetURL, LineJSON[2], ResponseText); // [THEN] the dimension lines in the journal should have the values that were given diff --git a/src/Apps/W1/APIV2/test/src/APIV2DimensionsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2DimensionsE2E.Codeunit.al index 9b14ca531ea..3a19c7bffb5 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2DimensionsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2DimensionsE2E.Codeunit.al @@ -3,10 +3,13 @@ codeunit 139824 "APIV2 - Dimensions E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Dimension] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2DocumentAttachE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2DocumentAttachE2E.Codeunit.al index d38126db6a0..73a6c39be5c 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2DocumentAttachE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2DocumentAttachE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139899 "APIV2 - Document Attach. E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Attachment] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2EmployeesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2EmployeesE2E.Codeunit.al index 9dca78748ec..115bc5c0775 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2EmployeesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2EmployeesE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139822 "APIV2 - Employees E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Employee] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2FALocationsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2FALocationsE2E.Codeunit.al index 9a23cb8f5c7..230df3680e1 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2FALocationsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2FALocationsE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139906 "APIV2 - FA Locations E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Api] [Location] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2FixedAssetsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2FixedAssetsE2E.Codeunit.al index 3efd9d6a789..c5e8b0ae738 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2FixedAssetsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2FixedAssetsE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139907 "APIV2 - Fixed Assets E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Customer] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2GLEntriesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2GLEntriesE2E.Codeunit.al index 29085e3a19e..28bd0ee224c 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2GLEntriesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2GLEntriesE2E.Codeunit.al @@ -3,20 +3,23 @@ codeunit 139830 "APIV2 - GLEntries E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [G/L Entry] end; var Assert: Codeunit "Assert"; LibraryERM: Codeunit "Library - ERM"; - LibraryVariableStorage: Codeunit "Library - Variable Storage"; LibraryGraphMgt: Codeunit "Library - Graph Mgt"; IsInitialized: Boolean; + JournalTemplateName: Code[10]; ServiceNameTxt: Label 'generalLedgerEntries'; local procedure Initialize() @@ -89,7 +92,7 @@ codeunit 139830 "APIV2 - GLEntries E2E" CreateGeneralJournalBatch(GenJournalBatch); // Create General Journal Line. - LibraryVariableStorage.Enqueue(GenJournalBatch."Journal Template Name"); + JournalTemplateName := GenJournalBatch."Journal Template Name"; GeneralJournal.TRAP(); GeneralJournal.OPENEDIT(); GeneralJournal."Account Type".SetValue(GenJournalLine."Account Type"::"G/L Account"); @@ -119,7 +122,6 @@ codeunit 139830 "APIV2 - GLEntries E2E" local procedure UpdateAmountOnGenJournalLine(GenJournalBatch: Record "Gen. Journal Batch"; var GeneralJournal: TestPage "General Journal") begin - LibraryVariableStorage.Enqueue(GenJournalBatch."Journal Template Name"); LibraryERM.UpdateAmountOnGenJournalLine(GenJournalBatch, GeneralJournal); end; @@ -145,7 +147,7 @@ codeunit 139830 "APIV2 - GLEntries E2E" [ModalPageHandler] procedure GeneralJournalTemplateHandler(var GeneralJournalTemplateList: TestPage 250) begin - GeneralJournalTemplateList.FILTER.SetFilter(Name, LibraryVariableStorage.DequeueText()); + GeneralJournalTemplateList.FILTER.SetFilter(Name, JournalTemplateName); GeneralJournalTemplateList.OK().INVOKE(); end; } @@ -163,4 +165,3 @@ codeunit 139830 "APIV2 - GLEntries E2E" - diff --git a/src/Apps/W1/APIV2/test/src/APIV2GLSetupE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2GLSetupE2E.Codeunit.al index 187cb7f3af7..37f8951ed30 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2GLSetupE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2GLSetupE2E.Codeunit.al @@ -1,6 +1,13 @@ codeunit 139860 "APIV2 - G/L Setup E2E" { Subtype = Test; + RequiredTestIsolation = Disabled; + + trigger OnRun() + begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); + end; var Assert: Codeunit "Assert"; diff --git a/src/Apps/W1/APIV2/test/src/APIV2GenProdPostGroupE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2GenProdPostGroupE2E.Codeunit.al index 6120bf37cdd..912b072ba82 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2GenProdPostGroupE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2GenProdPostGroupE2E.Codeunit.al @@ -1,10 +1,13 @@ codeunit 139856 "APIV2 - GenProdPostGroup E2E" { Subtype = Test; + RequiredTestIsolation = Disabled; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); end; var diff --git a/src/Apps/W1/APIV2/test/src/APIV2IncomeStatementE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2IncomeStatementE2E.Codeunit.al index 94109479bc6..ede4a7bdb65 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2IncomeStatementE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2IncomeStatementE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139816 "APIV2 - Income Statement E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Income Statement] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2InventoryPostGroupE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2InventoryPostGroupE2E.Codeunit.al index 3f357b613b8..4a9b1e656b1 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2InventoryPostGroupE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2InventoryPostGroupE2E.Codeunit.al @@ -1,9 +1,12 @@ codeunit 139857 "APIV2 - InventoryPostGroup E2E" { Subtype = Test; + RequiredTestIsolation = Disabled; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); end; var diff --git a/src/Apps/W1/APIV2/test/src/APIV2ItemCategoriesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2ItemCategoriesE2E.Codeunit.al index 48a2175efe0..b216c84996b 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2ItemCategoriesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2ItemCategoriesE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139807 "APIV2 - Item Categories E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Item Category] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2ItemVariantsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2ItemVariantsE2E.Codeunit.al index 2850134d790..911d54c5ef2 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2ItemVariantsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2ItemVariantsE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139839 "APIV2 - Item Variants E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Item] [Variant] end; @@ -342,6 +345,7 @@ codeunit 139839 "APIV2 - Item Variants E2E" var LibraryGraphMgt: Codeunit "Library - Graph Mgt"; + LibraryGraphDocumentTools: Codeunit "Library - Graph Document Tools"; LibraryUtility: Codeunit "Library - Utility"; LibraryRandom: Codeunit "Library - Random"; LibraryInventory: Codeunit "Library - Inventory"; @@ -425,6 +429,8 @@ codeunit 139839 "APIV2 - Item Variants E2E" LibrarySales: Codeunit "Library - Sales"; begin LibrarySales.CreateSalesOrder(SalesHeader); + LibraryGraphDocumentTools.EnsureVATPostingSetupExists( + SalesHeader."VAT Bus. Posting Group", Item."VAT Prod. Posting Group"); LibrarySales.CreateSalesLine(SalesLine, SalesHeader, SalesLine.Type::Item, Item."No.", 2); SalesLine."Variant Code" := ItemVariant.Code; SalesLine.Modify(); diff --git a/src/Apps/W1/APIV2/test/src/APIV2ItemsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2ItemsE2E.Codeunit.al index 16e5ef93d25..7335663d78e 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2ItemsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2ItemsE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139800 "APIV2 - Items E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Item] end; @@ -624,7 +627,8 @@ codeunit 139800 "APIV2 - Items E2E" // [WHEN] GETting the item with this relations expanded TargetURL := LibraryGraphMgt.CreateTargetURL(ItemGUID, Page::"APIV2 - Items", ServiceNameTxt); - TargetURL += '?$expand=generalProductPostingGroup,inventoryPostingGroup'; + TargetURL := LibraryGraphMgt.AppendQueryParameterToTargetURL( + TargetURL, '$expand=generalProductPostingGroup,inventoryPostingGroup'); LibraryGraphMgt.GetFromWebService(Response, TargetURL); // [THEN] the response should include them as properties @@ -937,6 +941,5 @@ codeunit 139800 "APIV2 - Items E2E" - diff --git a/src/Apps/W1/APIV2/test/src/APIV2JobQueueEntriesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2JobQueueEntriesE2E.Codeunit.al index c813481fe5d..35f195a89a5 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2JobQueueEntriesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2JobQueueEntriesE2E.Codeunit.al @@ -6,6 +6,8 @@ codeunit 139862 "APIV2JobQueueEntriesE2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [JobQueue] [JobQueueEntry] // This API only supports GET request and it is not editable. // User can only view the Job Queue Entries or use the action to restart the Job Queue Entry. @@ -114,7 +116,8 @@ codeunit 139862 "APIV2JobQueueEntriesE2E" // [WHEN] We trigger the JobQueueEntry reschedule action from the web service ClearLastError(); TargetURL := LibraryGraphMgt.CreateTargetURL(JobQueueEntry.SystemId, Page::"APIV2 - Job Queue Entries", ServiceNameTxt); - LibraryGraphMgt.PostToWebServiceAndCheckResponseCode(TargetURL + '/Microsoft.NAV.restart', '', ResponseText, 204); + TargetURL := LibraryGraphMgt.AppendPathToTargetURL(TargetURL, '/Microsoft.NAV.restart'); + LibraryGraphMgt.PostToWebServiceAndCheckResponseCode(TargetURL, '', ResponseText, 204); // [WHEN] We GET the JobQueueEntry from the web service TargetURL := LibraryGraphMgt.CreateTargetURL('', Page::"APIV2 - Job Queue Entries", ServiceNameTxt); diff --git a/src/Apps/W1/APIV2/test/src/APIV2JobQueueLogEntriesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2JobQueueLogEntriesE2E.Codeunit.al index 85e8931992b..0cb1df8f885 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2JobQueueLogEntriesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2JobQueueLogEntriesE2E.Codeunit.al @@ -6,6 +6,8 @@ codeunit 139861 "APIV2JobQueueLogEntriesE2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [JobQueue] [JobQueueLogEntry] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2JournalsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2JournalsE2E.Codeunit.al index 5d6b35a0891..bbb9cd8277e 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2JournalsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2JournalsE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139827 "APIV2 - Journals E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Journal] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2LocationsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2LocationsE2E.Codeunit.al index 667ae62e2f1..01f511ed2ad 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2LocationsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2LocationsE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139868 "APIV2 - Locations E2E" // version Test,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Api] [Location] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2OpportunitiesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2OpportunitiesE2E.Codeunit.al index 50b6a4c45dd..ba92ac2353e 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2OpportunitiesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2OpportunitiesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139855 "APIV2 - Opportunities E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Opportunity] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2PDFDocumentE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2PDFDocumentE2E.Codeunit.al index 63c5aabb741..e212602e8ee 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2PDFDocumentE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2PDFDocumentE2E.Codeunit.al @@ -1,11 +1,14 @@ codeunit 139841 "APIV2 - PDF Document E2E" { Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [PDF] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2PaymentMethodsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2PaymentMethodsE2E.Codeunit.al index ca63c08260f..46adb548f0c 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2PaymentMethodsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2PaymentMethodsE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139814 "APIV2 - Payment Methods E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Payment Method] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2PaymentTermsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2PaymentTermsE2E.Codeunit.al index 0e56cd7e8dc..25f8a81dd46 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2PaymentTermsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2PaymentTermsE2E.Codeunit.al @@ -3,10 +3,13 @@ codeunit 139804 "APIV2 - Payment Terms E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Payment Terms] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2PicturesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2PicturesE2E.Codeunit.al index 315e0aa2d3d..b92136da197 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2PicturesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2PicturesE2E.Codeunit.al @@ -1,11 +1,14 @@ codeunit 139842 "APIV2 - Pictures E2E" { Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Image] end; @@ -1050,7 +1053,8 @@ codeunit 139842 "APIV2 - Pictures E2E" var TargetURL: Text; begin - TargetURL := GeneratePictureSubPageURL(APIName, APIPageNumber, ID) + '/pictureContent'; + TargetURL := LibraryGraphMgt.AppendPathToTargetURL( + GeneratePictureSubPageURL(APIName, APIPageNumber, ID), '/pictureContent'); exit(TargetURL); end; @@ -1101,4 +1105,3 @@ codeunit 139842 "APIV2 - Pictures E2E" end; } - diff --git a/src/Apps/W1/APIV2/test/src/APIV2PstdApprovalEntriesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2PstdApprovalEntriesE2E.Codeunit.al index 8db85c18246..0a66011ad46 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2PstdApprovalEntriesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2PstdApprovalEntriesE2E.Codeunit.al @@ -4,6 +4,11 @@ codeunit 139919 "APIV2 PstdApprovalEntries E2E" TestType = IntegrationTest; TestPermissions = Disabled; + trigger OnRun() + begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + end; + var Assert: Codeunit Assert; LibrarySales: Codeunit "Library - Sales"; diff --git a/src/Apps/W1/APIV2/test/src/APIV2PurchCrMLinesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2PurchCrMLinesE2E.Codeunit.al index 71212c1efab..e730ff5e20e 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2PurchCrMLinesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2PurchCrMLinesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139874 "APIV2 - Purch. Cr.M. Lines E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Purchase] [Credit Memo] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2PurchCrMemosE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2PurchCrMemosE2E.Codeunit.al index 99bf5468337..056da516dda 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2PurchCrMemosE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2PurchCrMemosE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139865 "APIV2 - Purch. Cr. Memos E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Purchase] [Credit Memo] end; @@ -73,6 +76,7 @@ codeunit 139865 "APIV2 - Purch. Cr. Memos E2E" begin // [SCENARIO] Create posted and unposted Purchase credit memos and use HTTP POST to delete them // [GIVEN] 2 credit memos, one posted and one unposted + LibraryGraphMgt.SetLicenseSafeWorkDate(); LibraryPurchase.CreateVendorWithAddress(BuyFromVendor); LibraryPurchase.CreateVendorWithAddress(PayToVendor); VendorNo := BuyFromVendor."No."; @@ -308,6 +312,7 @@ codeunit 139865 "APIV2 - Purch. Cr. Memos E2E" // [SCENARIO] Create an credit memo both through the client UI and through the API // [SCENARIO] and compare them. They should be the same and have the same fields autocompleted wherever needed. // [GIVEN] An unposted credit memo + LibraryGraphMgt.SetLicenseSafeWorkDate(); LibraryGraphDocumentTools.InitializeUIPage(); LibraryPurchase.CreateVendor(BuyFromVendor); @@ -669,6 +674,8 @@ codeunit 139865 "APIV2 - Purch. Cr. Memos E2E" PurchaseHeader1RecordRef.GetTable(PurchaseHeader1); PurchaseHeader2RecordRef.GetTable(PurchaseHeader2); + LibraryGraphMgt.AddFieldToIgnoreIfExists( + TempIgnoredFieldsForComparison, Database::"Purchase Header", 'Operation Occurred Date'); Assert.RecordsAreEqualExceptCertainFields( PurchaseHeader1RecordRef, PurchaseHeader2RecordRef, TempIgnoredFieldsForComparison, 'Credit Memos do not match'); @@ -715,4 +722,3 @@ codeunit 139865 "APIV2 - Purch. Cr. Memos E2E" Assert.AreEqual(Status, PurchCrMemoEntityBuffer.Status, CreditMemoStatusErr); end; } - diff --git a/src/Apps/W1/APIV2/test/src/APIV2PurchOrderLinesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2PurchOrderLinesE2E.Codeunit.al index 10c1f29cd26..cc3d5b2a11b 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2PurchOrderLinesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2PurchOrderLinesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139852 "APIV2 - Purch. Order Lines E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Purchase] [Order] end; @@ -866,6 +869,8 @@ codeunit 139852 "APIV2 - Purch. Order Lines E2E" Assert.AreNotEqual('', OrderId, 'ID should not be empty'); LibraryInventory.CreateItem(Item); + LibraryGraphDocumentTools.EnsureVATPostingSetupExists( + PurchaseLine."VAT Bus. Posting Group", Item."VAT Prod. Posting Group"); OrderLineJSON := StrSubstNo('{"itemId":"%1"}', LibraryGraphMgt.StripBrackets(Item.SystemId)); Commit(); diff --git a/src/Apps/W1/APIV2/test/src/APIV2PurchQuotesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2PurchQuotesE2E.Codeunit.al index fff9ebbec3e..5f90301156c 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2PurchQuotesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2PurchQuotesE2E.Codeunit.al @@ -8,6 +8,7 @@ codeunit 139922 "APIV2 - Purch. Quotes E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); // [FEATURE] [Graph] [Purchase] [Quote] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2PurchRcptLinesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2PurchRcptLinesE2E.Codeunit.al index c3c96805fb3..80fe42c9942 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2PurchRcptLinesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2PurchRcptLinesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139850 "APIV2 - Purch. Rcpt. Lines E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Purchase] [Receipt] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2PurchRetOrdersE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2PurchRetOrdersE2E.Codeunit.al index a80fc37128d..aaf08b26eeb 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2PurchRetOrdersE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2PurchRetOrdersE2E.Codeunit.al @@ -8,6 +8,7 @@ codeunit 139923 "APIV2 - Purch. Ret. Orders E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); // [FEATURE] [Graph] [Purchase] [Return Order] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2PurchRetShptsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2PurchRetShptsE2E.Codeunit.al index 7df56e4842f..457a77fc7b1 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2PurchRetShptsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2PurchRetShptsE2E.Codeunit.al @@ -8,6 +8,7 @@ codeunit 139928 "APIV2 - Purch. Ret. Shpts. E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); // [FEATURE] [Graph] [Purchase] [Return Shipment] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2PurchaseInvLinesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2PurchaseInvLinesE2E.Codeunit.al index 0dbd34f7443..7afdaeef3eb 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2PurchaseInvLinesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2PurchaseInvLinesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139838 "APIV2 - Purchase Inv Lines E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Purchase] [Invoice] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2PurchaseInvoicesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2PurchaseInvoicesE2E.Codeunit.al index 2477d02b2ad..92213599eb9 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2PurchaseInvoicesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2PurchaseInvoicesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139829 "APIV2 - Purchase Invoices E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Purchase] [Invoice] end; @@ -30,6 +33,7 @@ codeunit 139829 "APIV2 - Purchase Invoices E2E" local procedure Initialize() begin + LibraryGraphMgt.SetLicenseSafeWorkDate(); end; [Test] diff --git a/src/Apps/W1/APIV2/test/src/APIV2PurchaseOrdersE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2PurchaseOrdersE2E.Codeunit.al index 1b799612203..3d3145f723c 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2PurchaseOrdersE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2PurchaseOrdersE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139851 "APIV2 - Purchase Orders E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Purchase] [Order] end; @@ -31,7 +34,7 @@ codeunit 139851 "APIV2 - Purchase Orders E2E" local procedure Initialize() begin - WorkDate := Today(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); end; [Test] @@ -92,8 +95,8 @@ codeunit 139851 "APIV2 - Purchase Orders E2E" ShipToVendor.Modify(true); Commit(); VendorNo := BuyFromVendor."No."; - OrderDate := Today(); - PostingDate := Today(); + OrderDate := WorkDate(); + PostingDate := WorkDate(); // [GIVEN] a JSON text with an order that contains the vendor and an address OrderJSON := CreateOrderJSONWithAddress(BuyFromVendor, PayToVendor, ShipToVendor, OrderDate, PostingDate); @@ -143,8 +146,8 @@ codeunit 139851 "APIV2 - Purchase Orders E2E" LibraryPurchase.CreateVendorWithAddress(BuyFromVendor); LibraryPurchase.CreateVendorWithAddress(PayToVendor); VendorNo := BuyFromVendor."No."; - OrderDate := Today(); - PostingDate := Today(); + OrderDate := WorkDate(); + PostingDate := WorkDate(); // [GIVEN] a JSON text with an order that contains the vendor and an address OrderJSON := CreateOrderJSONWithoutShipTo(BuyFromVendor, PayToVendor, OrderDate, PostingDate); @@ -402,8 +405,8 @@ codeunit 139851 "APIV2 - Purchase Orders E2E" // [GIVEN] a customer LibraryPurchase.CreateVendor(Vendor); VendorNo := Vendor."No."; - OrderDate := Today(); - PostingDate := Today(); + OrderDate := WorkDate(); + PostingDate := WorkDate(); // [GIVEN] a json describing our new order OrderJSON := CreateOrderJSONWithAddress(Vendor, Vendor, Vendor, OrderDate, PostingDate); @@ -427,6 +430,8 @@ codeunit 139851 "APIV2 - Purchase Orders E2E" LibraryUtility.AddTempField(TempIgnoredFieldsForComparison, ApiPurchaseHeader.FieldNo("No."), Database::"Purchase Header"); LibraryUtility.AddTempField( TempIgnoredFieldsForComparison, ApiPurchaseHeader.FieldNo("Posting Description"), Database::"Purchase Header"); + LibraryUtility.AddTempField( + TempIgnoredFieldsForComparison, ApiPurchaseHeader.FieldNo("Order Date"), Database::"Purchase Header"); // Special ignore case for GB LibraryUtility.AddTempField(TempIgnoredFieldsForComparison, ApiPurchaseHeader.FieldNo("Invoice Received Date"), Database::"Purchase Header"); // Special ignore case for ES @@ -441,14 +446,14 @@ codeunit 139851 "APIV2 - Purchase Orders E2E" LibraryUtility.AddTempField(TempIgnoredFieldsForComparison, RecordField."No.", Database::"Purchase Header"); // Time zone will impact how the date from the page vs WebService is saved. If removed this will fail in snap between 12:00 - 1 AM - if Time() < 020000T then begin - LibraryUtility.AddTempField(TempIgnoredFieldsForComparison, ApiPurchaseHeader.FieldNo("Order Date"), Database::"Purchase Header"); + if Time() < 020000T then LibraryUtility.AddTempField(TempIgnoredFieldsForComparison, ApiPurchaseHeader.FieldNo("Posting Date"), Database::"Purchase Header"); - end; PagePurchaseHeader.Get(PagePurchaseHeader."Document Type"::Order, PurchaseOrder."No.".Value()); ApiRecordRef.GetTable(ApiPurchaseHeader); PageRecordRef.GetTable(PagePurchaseHeader); + LibraryGraphMgt.AddFieldToIgnoreIfExists( + TempIgnoredFieldsForComparison, Database::"Purchase Header", 'Operation Occurred Date'); Assert.RecordsAreEqualExceptCertainFields(ApiRecordRef, PageRecordRef, TempIgnoredFieldsForComparison, 'Page and API order do not match'); @@ -667,6 +672,7 @@ codeunit 139851 "APIV2 - Purchase Orders E2E" PurchaseOrder."Buy-from Vendor No.".SetValue(Vendor."No."); PurchaseOrder."Document Date".SetValue(DocumentDate); PurchaseOrder."Posting Date".SetValue(PostingDate); + PurchaseOrder."Order Date".SetValue(DocumentDate); end; local procedure CheckShippingDetailsNotEmpty(var PurchaseHeader: Record "Purchase Header") diff --git a/src/Apps/W1/APIV2/test/src/APIV2PurchaseReceiptsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2PurchaseReceiptsE2E.Codeunit.al index da2b96c946c..00b9945e0f8 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2PurchaseReceiptsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2PurchaseReceiptsE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139849 "APIV2 - Purchase Receipts E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Purchase] [Receipt] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2RetEarningsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2RetEarningsE2E.Codeunit.al index 771bc75dd2f..3da18822c2d 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2RetEarningsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2RetEarningsE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139821 "APIV2 - Ret. Earnings E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Retained Earnings] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2SalesCrMemoLinesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2SalesCrMemoLinesE2E.Codeunit.al index a91ece4eef8..b0e298a0ef1 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2SalesCrMemoLinesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2SalesCrMemoLinesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139837 "APIV2 - Sales CrMemo Lines E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Credit Memo] end; @@ -20,6 +23,7 @@ codeunit 139837 "APIV2 - Sales CrMemo Lines E2E" LibraryGraphDocumentTools: Codeunit "Library - Graph Document Tools"; LibraryRandom: Codeunit "Library - Random"; LibrarySales: Codeunit "Library - Sales"; + LibraryERM: Codeunit "Library - ERM"; LibrarySmallBusiness: Codeunit "Library - Small Business"; LibraryApplicationArea: Codeunit "Library - Application Area"; IsInitialized: Boolean; @@ -29,6 +33,8 @@ codeunit 139837 "APIV2 - Sales CrMemo Lines E2E" local procedure Initialize() begin + LibraryGraphMgt.SetLicenseSafeWorkDate(); + if IsInitialized then exit; @@ -1267,7 +1273,6 @@ codeunit 139837 "APIV2 - Sales CrMemo Lines E2E" Resource: Record "Resource"; VATBusinessPostingGroup: Record "VAT Business Posting Group"; FixedAsset: Record "Fixed Asset"; - LibraryERM: Codeunit "Library - ERM"; LibraryResource: Codeunit "Library - Resource"; LibraryFixedAsset: Codeunit "Library - Fixed Asset"; begin @@ -1415,6 +1420,5 @@ codeunit 139837 "APIV2 - Sales CrMemo Lines E2E" - diff --git a/src/Apps/W1/APIV2/test/src/APIV2SalesCreditMemosE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2SalesCreditMemosE2E.Codeunit.al index 91631a22534..8c0ecaa1996 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2SalesCreditMemosE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2SalesCreditMemosE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139828 "APIV2 - Sales Credit Memos E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Credit Memo] end; @@ -91,6 +94,7 @@ codeunit 139828 "APIV2 - Sales Credit Memos E2E" // [SCENARIO] Create posted and unposted Sales credit memos and use HTTP POST to delete them // [GIVEN] 2 credit memos, one posted and one unposted + LibraryGraphMgt.SetLicenseSafeWorkDate(); LibrarySales.CreateCustomerWithAddress(SellToCustomer); LibrarySales.CreateCustomerWithAddress(BillToCustomer); CustomerNo := SellToCustomer."No."; @@ -286,6 +290,7 @@ codeunit 139828 "APIV2 - Sales Credit Memos E2E" // [SCENARIO] Create an credit memo both through the client UI and through the API // [SCENARIO] and compare them. They should be the same and have the same fields autocompleted wherever needed. // [GIVEN] An unposted credit memo + LibraryGraphMgt.SetLicenseSafeWorkDate(); LibraryGraphDocumentTools.InitializeUIPage(); LibrarySales.CreateCustomer(SellToCustomer); @@ -754,11 +759,16 @@ codeunit 139828 "APIV2 - Sales Credit Memos E2E" local procedure CreateCorrectiveSalesCreditMemo(var SalesCrMemoHeader: Record "Sales Cr.Memo Header") var + ReasonCode: Record "Reason Code"; SalesInvoiceHeader: Record "Sales Invoice Header"; SalesHeader: Record "Sales Header"; InvoiceCode: Code[20]; begin LibrarySales.CreateSalesInvoice(SalesHeader); + EnsureReasonCode(); + ReasonCode.FindFirst(); + SalesHeader.Validate("Reason Code", ReasonCode.Code); + SalesHeader.Modify(true); InvoiceCode := LibrarySales.PostSalesDocument(SalesHeader, false, true); SalesInvoiceHeader.Get(InvoiceCode); Commit(); @@ -767,6 +777,16 @@ codeunit 139828 "APIV2 - Sales Credit Memos E2E" SalesCrMemoHeader.FindFirst(); end; + local procedure EnsureReasonCode() + var + ReasonCode: Record "Reason Code"; + begin + if not ReasonCode.IsEmpty() then + exit; + + LibraryERM.CreateReasonCode(ReasonCode); + end; + local procedure CreateDraftSalesCreditMemo(var SalesHeader: Record "Sales Header") begin LibrarySales.CreateSalesCreditMemo(SalesHeader); @@ -925,6 +945,8 @@ codeunit 139828 "APIV2 - Sales Credit Memos E2E" SalesHeader1RecordRef.GetTable(SalesHeader1); SalesHeader2RecordRef.GetTable(SalesHeader2); + LibraryGraphMgt.AddFieldToIgnoreIfExists( + TempIgnoredFieldsForComparison, Database::"Sales Header", 'Operation Occurred Date'); Assert.RecordsAreEqualExceptCertainFields( SalesHeader1RecordRef, SalesHeader2RecordRef, TempIgnoredFieldsForComparison, 'Credit Memos do not match'); @@ -1044,4 +1066,3 @@ codeunit 139828 "APIV2 - Sales Credit Memos E2E" JobQueueEntry.Cancel(); end; } - diff --git a/src/Apps/W1/APIV2/test/src/APIV2SalesInvLinesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2SalesInvLinesE2E.Codeunit.al index 3a88184d347..8322b9b8f78 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2SalesInvLinesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2SalesInvLinesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139834 "APIV2 - Sales Inv. Lines E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Invoice] end; @@ -1079,6 +1082,8 @@ codeunit 139834 "APIV2 - Sales Inv. Lines E2E" Assert.AreNotEqual('', InvoiceLineID, 'ID should not be empty'); LibraryInventory.CreateItem(Item); + LibraryGraphDocumentTools.EnsureVATPostingSetupExists( + SalesLine."VAT Bus. Posting Group", Item."VAT Prod. Posting Group"); InvoiceLineJSON := StrSubstNo('{"itemId":"%1"}', LibraryGraphMgt.StripBrackets(Item.SystemId)); Commit(); diff --git a/src/Apps/W1/APIV2/test/src/APIV2SalesInvoicesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2SalesInvoicesE2E.Codeunit.al index 57447768ade..bd5eab08b74 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2SalesInvoicesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2SalesInvoicesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139809 "APIV2 - Sales Invoices E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Invoice] end; @@ -148,6 +151,7 @@ codeunit 139809 "APIV2 - Sales Invoices E2E" // [SCENARIO 184721] Create posted and unposted Sales invoices and use HTTP POST to delete them // [GIVEN] 2 invoices, one posted and one unposted + LibraryGraphMgt.SetLicenseSafeWorkDate(); LibrarySales.CreateCustomer(SellToCustomer); LibrarySales.CreateCustomer(BillToCustomer); LibrarySales.CreateCustomer(ShipToCustomer); @@ -295,6 +299,8 @@ codeunit 139809 "APIV2 - Sales Invoices E2E" begin // [SCENARIO 184721] Create unposted with specific document and due date set and use HTTP POST to create them + LibraryGraphMgt.SetLicenseSafeWorkDate(); + // [GIVEN] an Invoice with a document and due date set LibrarySales.CreateCustomer(Customer); CustomerNo := Customer."No."; @@ -562,6 +568,7 @@ codeunit 139809 "APIV2 - Sales Invoices E2E" // [SCENARIO 184721] Create an invoice both through the client UI and through the API // [SCENARIO] and compare them. They should be the same and have the same fields autocompleted wherever needed. // [GIVEN] An unposted invoice + LibraryGraphMgt.SetLicenseSafeWorkDate(); LibraryGraphDocumentTools.InitializeUIPage(); LibraryApplicationArea.DisableApplicationAreaSetup(); @@ -606,6 +613,9 @@ codeunit 139809 "APIV2 - Sales Invoices E2E" PageSalesHeader.Get(PageSalesHeader."Document Type"::Invoice, SalesInvoice."No.".Value()); ApiRecordRef.GetTable(ApiSalesHeader); PageRecordRef.GetTable(PageSalesHeader); + LibraryGraphMgt.AddFieldToIgnoreIfExists( + TempIgnoredFieldsForComparison, Database::"Sales Header", 'Operation Occurred Date'); + Assert.RecordsAreEqualExceptCertainFields(ApiRecordRef, PageRecordRef, TempIgnoredFieldsForComparison, 'Page and API Invoice do not match'); @@ -623,6 +633,7 @@ codeunit 139809 "APIV2 - Sales Invoices E2E" begin // [SCENARIO 184721] When an invoice is created,the GET Method should update the invoice and assign a total // [GIVEN] 2 invoices, one posted and one unposted without totals assigned + LibraryApplicationArea.EnableFoundationSetup(); LibraryGraphDocumentTools.CreateDocumentWithDiscountPctPending( SalesHeader, DiscountPct, SalesHeader."Document Type"::Invoice); SalesHeader.CALCFIELDS("Recalculate Invoice Disc."); @@ -910,6 +921,7 @@ codeunit 139809 "APIV2 - Sales Invoices E2E" DocumentId := SalesInvoiceHeader."Draft Invoice SystemId"; // Special case for AU + EnsureReasonCode(); LibrarySales.SetDefaultCancelReasonCodeForSalesAndReceivablesSetup(); Commit(); @@ -947,6 +959,7 @@ codeunit 139809 "APIV2 - Sales Invoices E2E" DocumentId := SalesInvoiceHeader."Draft Invoice SystemId"; // Special case for AU + EnsureReasonCode(); LibrarySales.SetDefaultCancelReasonCodeForSalesAndReceivablesSetup(); Commit(); @@ -1298,9 +1311,22 @@ codeunit 139809 "APIV2 - Sales Invoices E2E" local procedure CreateCancelledSalesInvoice(var SalesInvoiceHeader: Record "Sales Invoice Header") begin CreatePostedSalesInvoice(SalesInvoiceHeader); + EnsureReasonCode(); + LibrarySales.SetDefaultCancelReasonCodeForSalesAndReceivablesSetup(); + Commit(); CODEUNIT.Run(CODEUNIT::"Correct Posted Sales Invoice", SalesInvoiceHeader); end; + local procedure EnsureReasonCode() + var + ReasonCode: Record "Reason Code"; + begin + if not ReasonCode.IsEmpty() then + exit; + + LibraryERM.CreateReasonCode(ReasonCode); + end; + local procedure CreateSalesInvoices(var InvoiceID1: Text; var InvoiceID2: Text) var SalesInvoiceHeader: Record "Sales Invoice Header"; diff --git a/src/Apps/W1/APIV2/test/src/APIV2SalesOrdArchE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2SalesOrdArchE2E.Codeunit.al index 43a0cf41433..7fa59b35b49 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2SalesOrdArchE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2SalesOrdArchE2E.Codeunit.al @@ -8,6 +8,7 @@ codeunit 139927 "APIV2 - Sales Ord. Arch. E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); // [FEATURE] [Graph] [Sales] [Order] [Archive] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2SalesOrderLinesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2SalesOrderLinesE2E.Codeunit.al index 280882e872d..eadd2782099 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2SalesOrderLinesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2SalesOrderLinesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139835 "APIV2 - Sales Order Lines E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Order] end; @@ -863,6 +866,8 @@ codeunit 139835 "APIV2 - Sales Order Lines E2E" Assert.AreNotEqual('', OrderId, 'ID should not be empty'); LibraryInventory.CreateItem(Item); + LibraryGraphDocumentTools.EnsureVATPostingSetupExists( + SalesLine."VAT Bus. Posting Group", Item."VAT Prod. Posting Group"); OrderLineJSON := StrSubstNo('{"itemId":"%1"}', LibraryGraphMgt.StripBrackets(Item.SystemId)); Commit(); @@ -1479,8 +1484,6 @@ codeunit 139835 "APIV2 - Sales Order Lines E2E" - - diff --git a/src/Apps/W1/APIV2/test/src/APIV2SalesOrdersE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2SalesOrdersE2E.Codeunit.al index 16759bdf1b6..da19639c60e 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2SalesOrdersE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2SalesOrdersE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139811 "APIV2 - Sales Orders E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Order] end; @@ -78,6 +81,8 @@ codeunit 139811 "APIV2 - Sales Orders E2E" begin // [SCENARIO 184721] Create sales orders JSON and use HTTP POST to create them + LibraryGraphMgt.SetLicenseSafeWorkDate(); + // [GIVEN] a customer LibrarySales.CreateCustomerWithAddress(SellToCustomer); LibrarySales.CreateCustomerWithAddress(BillToCustomer); @@ -330,6 +335,7 @@ codeunit 139811 "APIV2 - Sales Orders E2E" OrderJSON: Text; begin // [SCENARIO 184721] Create an order both through the client UI and through the API and compare them. They should be the same and have the same fields autocompleted wherever needed. + LibraryGraphMgt.SetLicenseSafeWorkDate(); LibraryGraphDocumentTools.InitializeUIPage(); // [GIVEN] a customer @@ -375,6 +381,8 @@ codeunit 139811 "APIV2 - Sales Orders E2E" PageSalesHeader.Get(PageSalesHeader."Document Type"::Order, SalesOrder."No.".Value()); ApiRecordRef.GetTable(ApiSalesHeader); PageRecordRef.GetTable(PageSalesHeader); + LibraryGraphMgt.AddFieldToIgnoreIfExists( + TempIgnoredFieldsForComparison, Database::"Sales Header", 'Operation Occurred Date'); Assert.RecordsAreEqualExceptCertainFields(ApiRecordRef, PageRecordRef, TempIgnoredFieldsForComparison, 'Page and API order do not match'); diff --git a/src/Apps/W1/APIV2/test/src/APIV2SalesQuoteLinesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2SalesQuoteLinesE2E.Codeunit.al index 803ae25520c..19615c978c1 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2SalesQuoteLinesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2SalesQuoteLinesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139836 "APIV2 - Sales Quote Lines E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Quote] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2SalesQuotesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2SalesQuotesE2E.Codeunit.al index e934a55669a..62115dfbc17 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2SalesQuotesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2SalesQuotesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139823 "APIV2 - Sales Quotes E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Quote] end; @@ -100,6 +103,8 @@ codeunit 139823 "APIV2 - Sales Quotes E2E" begin // [SCENARIO] Create sales quotes JSON and use HTTP POST to create them + LibraryGraphMgt.SetLicenseSafeWorkDate(); + // [GIVEN] a customer LibrarySales.CreateCustomerWithAddress(SellToCustomer); LibrarySales.CreateCustomerWithAddress(ShipToCustomer); @@ -316,6 +321,7 @@ codeunit 139823 "APIV2 - Sales Quotes E2E" QuoteExists: Boolean; begin // [SCENARIO] Create a quote both through the client UI and through the API and compare them. They should be the same and have the same fields autocompleted wherever needed. + LibraryGraphMgt.SetLicenseSafeWorkDate(); LibraryGraphDocumentTools.InitializeUIPage(); // [GIVEN] a customer @@ -357,6 +363,11 @@ codeunit 139823 "APIV2 - Sales Quotes E2E" PageSalesHeader.Get(PageSalesHeader."Document Type"::Quote, SalesQuote."No.".Value()); ApiRecordRef.GetTable(ApiSalesHeader); PageRecordRef.GetTable(PageSalesHeader); + LibraryGraphMgt.AddFieldToIgnoreIfExists( + TempIgnoredFieldsForComparison, Database::"Sales Header", 'Operation Occurred Date'); + LibraryGraphMgt.AddFieldToIgnoreIfExists( + TempIgnoredFieldsForComparison, Database::"Sales Header", 'VAT Reporting Date'); + Assert.RecordsAreEqualExceptCertainFields(ApiRecordRef, PageRecordRef, TempIgnoredFieldsForComparison, 'Page and API quote do not match'); end; @@ -751,6 +762,9 @@ codeunit 139823 "APIV2 - Sales Quotes E2E" LibrarySmallBusiness.CreateCustomer(Customer); LibrarySmallBusiness.CreateItem(Item); LibrarySmallBusiness.CreateSalesQuoteHeaderWithLines(SalesHeader, Customer, Item, 1, 1); + SalesHeader.Validate("Posting Date", WorkDate()); + SalesHeader.Validate("Document Date", WorkDate()); + SalesHeader.Modify(true); end; local procedure FindSalesHeader(var SalesHeader: Record "Sales Header"; CustomerNo: Text; QuoteNumber: Text): Boolean diff --git a/src/Apps/W1/APIV2/test/src/APIV2SalesRetOrdersE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2SalesRetOrdersE2E.Codeunit.al index c049e3837f6..8e86f0463df 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2SalesRetOrdersE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2SalesRetOrdersE2E.Codeunit.al @@ -8,6 +8,7 @@ codeunit 139924 "APIV2 - Sales Ret. Orders E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); // [FEATURE] [Graph] [Sales] [Return Order] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2SalesShipLinesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2SalesShipLinesE2E.Codeunit.al index 3081e6c6df6..096624cd04a 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2SalesShipLinesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2SalesShipLinesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139848 "APIV2 - Sales Ship. Lines E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Shipment] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2SalesShipmentsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2SalesShipmentsE2E.Codeunit.al index 230e2af2a5b..2f0a04bcb84 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2SalesShipmentsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2SalesShipmentsE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139847 "APIV2 - Sales Shipments E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Sales] [Shipment] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2SalespersonPurchE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2SalespersonPurchE2E.Codeunit.al index 00b9b57cfd8..22ebff84b92 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2SalespersonPurchE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2SalespersonPurchE2E.Codeunit.al @@ -3,6 +3,12 @@ codeunit 139882 "APIV2 - Salesperson/Purch E2E" Subtype = Test; RequiredTestIsolation = Disabled; + trigger OnRun() + begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); + end; + var Assert: Codeunit Assert; LibraryGraphMgt: Codeunit "Library - Graph Mgt"; diff --git a/src/Apps/W1/APIV2/test/src/APIV2ShipmentMethodsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2ShipmentMethodsE2E.Codeunit.al index b7f25bf36dd..a73a4297006 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2ShipmentMethodsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2ShipmentMethodsE2E.Codeunit.al @@ -3,10 +3,13 @@ codeunit 139805 "APIV2 - Shipment Methods E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Shipment Method] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2TaxAreasE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2TaxAreasE2E.Codeunit.al index 3e579576ff6..ac3daba4957 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2TaxAreasE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2TaxAreasE2E.Codeunit.al @@ -9,6 +9,8 @@ codeunit 139826 "APIV2 - Tax Areas E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Tax Area] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2TaxGroupsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2TaxGroupsE2E.Codeunit.al index 71058576f58..5bb8938d601 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2TaxGroupsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2TaxGroupsE2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139808 "APIV2 - Tax Groups E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Tax Group] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2TransferOrdersE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2TransferOrdersE2E.Codeunit.al index 93bda0b6eed..24c2446b50f 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2TransferOrdersE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2TransferOrdersE2E.Codeunit.al @@ -8,6 +8,7 @@ codeunit 139926 "APIV2 - Transfer Orders E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); // [FEATURE] [Graph] [Inventory] [Transfer] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2TrialBalanceE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2TrialBalanceE2E.Codeunit.al index f94f316fc30..7a959092083 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2TrialBalanceE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2TrialBalanceE2E.Codeunit.al @@ -3,10 +3,13 @@ codeunit 139818 "APIV2 - Trial Balance E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Trial Balance] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2UofME2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2UofME2E.Codeunit.al index 496d746235c..3a7601a0c72 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2UofME2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2UofME2E.Codeunit.al @@ -8,6 +8,8 @@ codeunit 139812 "APIV2 - UofM E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Unit of Measure] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2VendorPaymentsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2VendorPaymentsE2E.Codeunit.al index 780e34e7c78..8ac2424d47c 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2VendorPaymentsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2VendorPaymentsE2E.Codeunit.al @@ -1,11 +1,14 @@ codeunit 139843 "APIV2 - Vendor Payments E2E" { Subtype = Test; + RequiredTestIsolation = Disabled; TestType = Uncategorized; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Vendor Payments] end; @@ -16,6 +19,7 @@ codeunit 139843 "APIV2 - Vendor Payments E2E" Assert: Codeunit Assert; GraphMgtVendorPayments: Codeunit "Graph Mgt - Vendor Payments"; LibraryGraphJournalLines: Codeunit "Library - Graph Journal Lines"; + LibraryERM: Codeunit "Library - ERM"; GraphMgtJournal: Codeunit "Graph Mgt - Journal"; ServiceNameTxt: Label 'vendorPaymentJournals'; ServiceSubpageNameTxt: Label 'vendorPayments'; @@ -34,7 +38,6 @@ codeunit 139843 "APIV2 - Vendor Payments E2E" PurchInvHeader: Record "Purch. Inv. Header"; GenJournalLine: Record "Gen. Journal Line"; GenJournalBatch: Record "Gen. Journal Batch"; - LibraryERM: Codeunit "Library - ERM"; PurchInvAggregator: Codeunit "Purch. Inv. Aggregator"; JournalName: Code[10]; Amount: Decimal; @@ -884,6 +887,7 @@ codeunit 139843 "APIV2 - Vendor Payments E2E" local procedure Initialize() begin + LibraryGraphMgt.SetLicenseSafeWorkDate(); LibraryTestInitialize.OnTestInitialize(Codeunit::"APIV2 - Vendor Payments E2E"); if not isInitialized then diff --git a/src/Apps/W1/APIV2/test/src/APIV2VendorsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2VendorsE2E.Codeunit.al index fe84521cbd5..5becc6ff467 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2VendorsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2VendorsE2E.Codeunit.al @@ -9,6 +9,8 @@ codeunit 139803 "APIV2 - Vendors E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Vendor] end; diff --git a/src/Apps/W1/APIV2/test/src/APIV2WorkflowApproversE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2WorkflowApproversE2E.Codeunit.al index 4a11340aa53..587c7ec7cd9 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2WorkflowApproversE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2WorkflowApproversE2E.Codeunit.al @@ -1,10 +1,14 @@ codeunit 139920 "APIV2 - Workflow Approvers E2E" { - Subtype = Test; TestType = IntegrationTest; TestPermissions = Disabled; + trigger OnRun() + begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + end; + var Assert: Codeunit Assert; LibraryWorkflow: Codeunit "Library - Workflow"; diff --git a/src/Apps/W1/APIV2/test/src/APIV2WorkflowsE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2WorkflowsE2E.Codeunit.al index d5973d08348..341439fbbb4 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2WorkflowsE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2WorkflowsE2E.Codeunit.al @@ -1,10 +1,14 @@ codeunit 139921 "APIV2 - Workflows E2E" { - Subtype = Test; TestType = IntegrationTest; TestPermissions = Disabled; + trigger OnRun() + begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + end; + var Assert: Codeunit Assert; LibraryWorkflow: Codeunit "Library - Workflow"; diff --git a/src/Apps/W1/APIV2/test/src/APIV2itemLedgEntriesE2E.Codeunit.al b/src/Apps/W1/APIV2/test/src/APIV2itemLedgEntriesE2E.Codeunit.al index f8f1374ccec..615be21785a 100644 --- a/src/Apps/W1/APIV2/test/src/APIV2itemLedgEntriesE2E.Codeunit.al +++ b/src/Apps/W1/APIV2/test/src/APIV2itemLedgEntriesE2E.Codeunit.al @@ -3,11 +3,14 @@ codeunit 139854 "APIV2 - Item Ledg. Entries E2E" // version Test,ERM,W1,All Subtype = Test; + RequiredTestIsolation = Disabled; TestType = IntegrationTest; TestPermissions = Disabled; trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); // [FEATURE] [Graph] [Item Ledger Entry] end; diff --git a/src/Apps/W1/EDocument/Test/src/Processing/EDocAPITest.Codeunit.al b/src/Apps/W1/EDocument/Test/src/Processing/EDocAPITest.Codeunit.al index 80b678db590..c0478a11dc9 100644 --- a/src/Apps/W1/EDocument/Test/src/Processing/EDocAPITest.Codeunit.al +++ b/src/Apps/W1/EDocument/Test/src/Processing/EDocAPITest.Codeunit.al @@ -16,12 +16,20 @@ codeunit 135575 "E-Doc. API Test" TestType = IntegrationTest; TestPermissions = Disabled; + trigger OnRun() + begin + LibraryGraphMgtForAuthentication.EnsureAuthenticationAvailable(); + end; + + var + LibraryGraphMgtForAuthentication: Codeunit "Library - Graph Mgt"; + [Test] procedure GetEDocument() var PurchaseHeader: Record "Purchase Header"; EDocument: Record "E-Document"; - LibrarygraphMgt: Codeunit "Library - Graph Mgt"; + LibraryGraphMgt: Codeunit "Library - Graph Mgt"; TargetURL: Text; Response: Text; EDocsApiServiceNameTok: Label 'eDocuments', Locked = true; diff --git a/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseActivityLogAPITest.Codeunit.al b/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseActivityLogAPITest.Codeunit.al index e7672c950a6..e6bf324d1ee 100644 --- a/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseActivityLogAPITest.Codeunit.al +++ b/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseActivityLogAPITest.Codeunit.al @@ -14,12 +14,16 @@ codeunit 148343 "Expense Activity Log API Test" RequiredTestIsolation = Disabled; TestPermissions = Disabled; + trigger OnRun() + begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + end; + var Assert: Codeunit Assert; LibraryExpense: Codeunit "Library - Expense"; LibraryGraphMgt: Codeunit "Library - Graph Mgt"; LibraryTestInitialize: Codeunit "Library - Test Initialize"; - APITestAuthHelper: Codeunit "Expense API Test Auth Helper"; IsInitialized: Boolean; ServiceNameTok: Label 'expenseActivityLogEntries', Locked = true; ExpenseReportsServiceNameTok: Label 'expenseReports', Locked = true; @@ -47,6 +51,7 @@ codeunit 148343 "Expense Activity Log API Test" Initialize(); CreateTestExpenseUser(ExpenseUser); CreateTestExpenseReport(ExpenseReportHeader, ExpenseUser."No."); + CreateTestExpenseReportLine(ExpenseReportHeader, ExpenseUser."No."); EntryNo := ExpenseActivityLogMgt.LogExpenseReportEvent( ExpenseReportHeader, Enum::"Expense Activity Event Type"::Submitted, @@ -118,9 +123,9 @@ codeunit 148343 "Expense Activity Log API Test" Page::"Expense Reports API", ExpenseReportsServiceNameTok, ServiceNameTok); - EntryURL := - CollectionURL + '(' + - LibraryGraphMgt.StripBrackets(Format(ExpenseActivityLogEntry.SystemId)) + ')'; + EntryURL := LibraryGraphMgt.AppendPathToTargetURL( + CollectionURL, + '(' + LibraryGraphMgt.StripBrackets(Format(ExpenseActivityLogEntry.SystemId)) + ')'); // [WHEN] A POST is attempted. // [THEN] The API rejects it with Method Not Allowed. @@ -171,7 +176,8 @@ codeunit 148343 "Expense Activity Log API Test" Page::"Expense Reports API", ExpenseReportsServiceNameTok, ServiceNameTok); - TargetURL += '(' + LibraryGraphMgt.StripBrackets(Format(ExpenseActivityLogEntry.SystemId)) + ')'; + TargetURL := LibraryGraphMgt.AppendPathToTargetURL( + TargetURL, '(' + LibraryGraphMgt.StripBrackets(Format(ExpenseActivityLogEntry.SystemId)) + ')'); LibraryGraphMgt.GetFromWebServiceAndCheckResponseCode(ResponseText, TargetURL, 200); ResponseText := LowerCase(ResponseText); @@ -278,7 +284,8 @@ codeunit 148343 "Expense Activity Log API Test" Assert.ExpectedError('The historyActorRole filter must be specified as Submitter or Approver.'); // [WHEN] Submitter history is requested through the first Expense User. - TargetURL += '?$filter=historyActorRole eq ''Submitter'''; + TargetURL := LibraryGraphMgt.AppendQueryParameterToTargetURL( + TargetURL, '$filter=historyActorRole eq ''Submitter'''); LibraryGraphMgt.GetFromWebServiceAndCheckResponseCode(ResponseText, TargetURL, 200); ResponseText := LowerCase(ResponseText); @@ -348,7 +355,8 @@ codeunit 148343 "Expense Activity Log API Test" Page::"Expense Users API", ExpenseUsersServiceNameTok, ServiceNameTok); - TargetURL += '?$filter=historyActorRole eq ''Approver'''; + TargetURL := LibraryGraphMgt.AppendQueryParameterToTargetURL( + TargetURL, '$filter=historyActorRole eq ''Approver'''); LibraryGraphMgt.GetFromWebServiceAndCheckResponseCode(ResponseText, TargetURL, 200); ResponseText := LowerCase(ResponseText); @@ -551,7 +559,8 @@ codeunit 148343 "Expense Activity Log API Test" Page::"Expense Users API", ExpenseUsersServiceNameTok, ServiceNameTok); - TargetURL += '?$filter=historyActorRole eq ''' + HistoryRole + ''''; + TargetURL := LibraryGraphMgt.AppendQueryParameterToTargetURL( + TargetURL, '$filter=historyActorRole eq ''' + HistoryRole + ''''); LibraryGraphMgt.GetFromWebServiceAndCheckResponseCode(ResponseText, TargetURL, 200); Assert.AreNotEqual( 0, @@ -569,14 +578,16 @@ codeunit 148343 "Expense Activity Log API Test" local procedure Initialize() var ExpenseAgentSetup: Record "Expense Agent Setup"; + LibraryERMCountryData: Codeunit "Library - ERM Country Data"; begin LibraryTestInitialize.OnTestInitialize(Codeunit::"Expense Activity Log API Test"); CleanupTestData(); + LibraryGraphMgt.EnsureAuthenticationAvailable(); if IsInitialized then exit; - BindSubscription(APITestAuthHelper); LibraryTestInitialize.OnBeforeTestSuiteInitialize(Codeunit::"Expense Activity Log API Test"); + LibraryERMCountryData.UpdateGeneralLedgerSetup(); if not ExpenseAgentSetup.Get() then begin ExpenseAgentSetup.Init(); ExpenseAgentSetup.Insert(); @@ -600,6 +611,32 @@ codeunit 148343 "Expense Activity Log API Test" ExpenseReportHeader.Modify(); end; + local procedure CreateTestExpenseReportLine(ExpenseReportHeader: Record "Expense Report Header"; ExpenseUserNo: Code[20]) + var + ExpenseCategory: Record "Expense Category"; + ExpensePaymentMethod: Record "Expense Payment Method"; + ExpenseReportLine: Record "Expense Report Line"; + begin + LibraryExpense.CreateExpenseCategory( + ExpenseCategory, + ExpenseCategory."Reimbursement Type"::"Employee Paid", + ExpenseCategory."Expense Detail Required"::" "); + ExpenseCategory.Description := + CopyStr(TestDescriptionPrefixLbl + Format(CreateGuid()), 1, MaxStrLen(ExpenseCategory.Description)); + ExpenseCategory.Modify(); + LibraryExpense.FindExpensePaymentMethod( + ExpensePaymentMethod, ExpensePaymentMethod."Reimbursement Type"::"Employee Paid"); + LibraryExpense.CreateExpenseReportLine( + ExpenseReportLine, + ExpenseReportHeader, + ExpenseUserNo, + ExpenseCategory.Code, + ExpensePaymentMethod.Code, + true, + '', + 100); + end; + local procedure CreateTestExpenseUser(var ExpenseUser: Record "Expense User") begin LibraryExpense.CreateExpenseUser(ExpenseUser); diff --git a/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseAgentSetupAPITest.Codeunit.al b/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseAgentSetupAPITest.Codeunit.al index 50bb3595b39..f5cd5d3f3bf 100644 --- a/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseAgentSetupAPITest.Codeunit.al +++ b/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseAgentSetupAPITest.Codeunit.al @@ -12,6 +12,11 @@ codeunit 148333 "Expense Agent Setup API Test" TestType = IntegrationTest; TestPermissions = Disabled; + trigger OnRun() + begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + end; + var Assert: Codeunit Assert; LibraryExpense: Codeunit "Library - Expense"; diff --git a/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseCapabilitiesAPITest.Codeunit.al b/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseCapabilitiesAPITest.Codeunit.al index 647fbc39d49..dd1a57a4d0a 100644 --- a/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseCapabilitiesAPITest.Codeunit.al +++ b/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseCapabilitiesAPITest.Codeunit.al @@ -13,12 +13,16 @@ codeunit 148318 "Expense Capabilities API Test" RequiredTestIsolation = Disabled; TestPermissions = Disabled; + trigger OnRun() + begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + end; + var Assert: Codeunit Assert; LibraryExpenseAgent: Codeunit "Library - Expense Agent"; LibraryGraphMgt: Codeunit "Library - Graph Mgt"; LibraryTestInitialize: Codeunit "Library - Test Initialize"; - APITestAuthHelper: Codeunit "Expense API Test Auth Helper"; IsInitialized: Boolean; ServiceNameTok: Label 'expenseCapabilities', Locked = true; ActivityLogCapabilityNameTok: Label 'activityLog', Locked = true; @@ -206,7 +210,6 @@ codeunit 148318 "Expense Capabilities API Test" if IsInitialized then exit; - BindSubscription(APITestAuthHelper); LibraryTestInitialize.OnBeforeTestSuiteInitialize(Codeunit::"Expense Capabilities API Test"); IsInitialized := true; Commit(); diff --git a/src/Apps/W1/ExpenseAgent/test/src/API/ExpensePerDiemLocationsTest.Codeunit.al b/src/Apps/W1/ExpenseAgent/test/src/API/ExpensePerDiemLocationsTest.Codeunit.al index 40fdf025b82..11c2a57c395 100644 --- a/src/Apps/W1/ExpenseAgent/test/src/API/ExpensePerDiemLocationsTest.Codeunit.al +++ b/src/Apps/W1/ExpenseAgent/test/src/API/ExpensePerDiemLocationsTest.Codeunit.al @@ -12,12 +12,17 @@ codeunit 148349 "Expense PerDiem Locations Test" TestType = IntegrationTest; TestPermissions = Disabled; + trigger OnRun() + begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + LibraryGraphMgt.SetLicenseSafeWorkDate(); + end; + var Assert: Codeunit Assert; LibraryUtility: Codeunit "Library - Utility"; LibraryGraphMgt: Codeunit "Library - Graph Mgt"; LibraryTestInitialize: Codeunit "Library - Test Initialize"; - APITestAuthHelper: Codeunit "Expense API Test Auth Helper"; IsInitialized: Boolean; [Test] @@ -86,7 +91,6 @@ codeunit 148349 "Expense PerDiem Locations Test" if IsInitialized then exit; - BindSubscription(APITestAuthHelper); LibraryTestInitialize.OnBeforeTestSuiteInitialize(Codeunit::"Expense PerDiem Locations Test"); IsInitialized := true; Commit(); diff --git a/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseProjectsAPITest.Codeunit.al b/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseProjectsAPITest.Codeunit.al index 45ed9ae6d25..1c82e58b8d2 100644 --- a/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseProjectsAPITest.Codeunit.al +++ b/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseProjectsAPITest.Codeunit.al @@ -16,6 +16,11 @@ codeunit 148331 "Expense Projects API Test" TestType = IntegrationTest; TestPermissions = Disabled; + trigger OnRun() + begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + end; + var Assert: Codeunit Assert; LibraryExpense: Codeunit "Library - Expense"; @@ -24,7 +29,6 @@ codeunit 148331 "Expense Projects API Test" LibraryHumanResource: Codeunit "Library - Human Resource"; LibraryGraphMgt: Codeunit "Library - Graph Mgt"; LibraryTestInitialize: Codeunit "Library - Test Initialize"; - APITestAuthHelper: Codeunit "Expense API Test Auth Helper"; IsInitialized: Boolean; ExpenseUsersServiceNameTok: Label 'expenseUsers', Locked = true; ProjectsServiceNameTok: Label 'expenseProjects', Locked = true; @@ -723,7 +727,6 @@ codeunit 148331 "Expense Projects API Test" if IsInitialized then exit; - BindSubscription(APITestAuthHelper); LibraryTestInitialize.OnBeforeTestSuiteInitialize(Codeunit::"Expense Projects API Test"); if not ExpenseAgentSetup.Get() then begin ExpenseAgentSetup.Init(); diff --git a/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseUsersAPITest.Codeunit.al b/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseUsersAPITest.Codeunit.al index f724ba018d3..d04a79aebf0 100644 --- a/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseUsersAPITest.Codeunit.al +++ b/src/Apps/W1/ExpenseAgent/test/src/API/ExpenseUsersAPITest.Codeunit.al @@ -12,13 +12,17 @@ codeunit 148315 "Expense Users API Test" TestType = IntegrationTest; TestPermissions = Disabled; + trigger OnRun() + begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); + end; + var Assert: Codeunit Assert; LibraryExpense: Codeunit "Library - Expense"; LibraryUtility: Codeunit "Library - Utility"; LibraryGraphMgt: Codeunit "Library - Graph Mgt"; LibraryTestInitialize: Codeunit "Library - Test Initialize"; - APITestAuthHelper: Codeunit "Expense API Test Auth Helper"; IsInitialized: Boolean; ServiceNameTok: Label 'expenseUsers', Locked = true; @@ -87,7 +91,6 @@ codeunit 148315 "Expense Users API Test" if IsInitialized then exit; - BindSubscription(APITestAuthHelper); LibraryTestInitialize.OnBeforeTestSuiteInitialize(Codeunit::"Expense Users API Test"); if not ExpenseAgentSetup.Get() then begin ExpenseAgentSetup.Init(); diff --git a/src/Apps/W1/ExpenseAgent/test/src/API/PoliciesToEvaluateAPITest.Codeunit.al b/src/Apps/W1/ExpenseAgent/test/src/API/PoliciesToEvaluateAPITest.Codeunit.al index ef512122f3d..ff2ad168cc7 100644 --- a/src/Apps/W1/ExpenseAgent/test/src/API/PoliciesToEvaluateAPITest.Codeunit.al +++ b/src/Apps/W1/ExpenseAgent/test/src/API/PoliciesToEvaluateAPITest.Codeunit.al @@ -18,7 +18,6 @@ codeunit 148345 "Policies To Evaluate API Test" LibraryExpense: Codeunit "Library - Expense"; LibraryGraphMgt: Codeunit "Library - Graph Mgt"; LibraryTestInitialize: Codeunit "Library - Test Initialize"; - APITestAuthHelper: Codeunit "Expense API Test Auth Helper"; IsInitialized: Boolean; ExpenseReportLinesServiceNameTok: Label 'expenseReportLines', Locked = true; @@ -114,10 +113,10 @@ codeunit 148345 "Policies To Evaluate API Test" begin LibraryTestInitialize.OnTestInitialize(Codeunit::"Policies To Evaluate API Test"); LibraryExpense.CleanUpBeforeTesting(); + LibraryGraphMgt.EnsureAuthenticationAvailable(); if IsInitialized then exit; - BindSubscription(APITestAuthHelper); LibraryTestInitialize.OnBeforeTestSuiteInitialize(Codeunit::"Policies To Evaluate API Test"); LibraryERMCountryData.CreateVATData(); LibraryERMCountryData.UpdateGeneralPostingSetup(); diff --git a/src/Apps/W1/ExpenseAgent/test/src/API/PolicyEvaluationsAPITest.Codeunit.al b/src/Apps/W1/ExpenseAgent/test/src/API/PolicyEvaluationsAPITest.Codeunit.al index 427bcd4a600..4f24c80f717 100644 --- a/src/Apps/W1/ExpenseAgent/test/src/API/PolicyEvaluationsAPITest.Codeunit.al +++ b/src/Apps/W1/ExpenseAgent/test/src/API/PolicyEvaluationsAPITest.Codeunit.al @@ -18,12 +18,12 @@ codeunit 148344 "Policy Evaluations API Test" LibraryExpense: Codeunit "Library - Expense"; LibraryGraphMgt: Codeunit "Library - Graph Mgt"; LibraryTestInitialize: Codeunit "Library - Test Initialize"; - APITestAuthHelper: Codeunit "Expense API Test Auth Helper"; IsInitialized: Boolean; ServiceNameTok: Label 'expensePolicyEvaluations', Locked = true; BadRequestResponseErr: Label 'Response code is 400', Locked = true; SubjectVersionRequiredErr: Label 'Subject Version is required.'; PolicyVersionRequiredErr: Label 'Policy Version is required.'; + ExpenseReportLineSubjectTypeTok: Label 'Expense_x0020_Report_x0020_Line', Locked = true; [Test] procedure PolicyEvaluationAPIInsertsFlagWithRequiredVersions() @@ -80,7 +80,7 @@ codeunit 148344 "Policy Evaluations API Test" TargetURL := LibraryGraphMgt.CreateTargetURL('', Page::"Expense Policy Evaluations API", ServiceNameTok); asserterror LibraryGraphMgt.PostToWebServiceAndCheckResponseCode(TargetURL, RequestBodyText, ResponseText, 400); Assert.ExpectedError(BadRequestResponseErr); - Assert.AreNotEqual(0, StrPos(ResponseText, SubjectVersionRequiredErr), 'The response must identify the missing subject version.'); + Assert.ExpectedError(SubjectVersionRequiredErr); CompleteTest(); end; @@ -106,7 +106,7 @@ codeunit 148344 "Policy Evaluations API Test" TargetURL := LibraryGraphMgt.CreateTargetURL('', Page::"Expense Policy Evaluations API", ServiceNameTok); asserterror LibraryGraphMgt.PostToWebServiceAndCheckResponseCode(TargetURL, RequestBodyText, ResponseText, 400); Assert.ExpectedError(BadRequestResponseErr); - Assert.AreNotEqual(0, StrPos(ResponseText, PolicyVersionRequiredErr), 'The response must identify the missing policy version.'); + Assert.ExpectedError(PolicyVersionRequiredErr); CompleteTest(); end; @@ -117,10 +117,10 @@ codeunit 148344 "Policy Evaluations API Test" begin LibraryTestInitialize.OnTestInitialize(Codeunit::"Policy Evaluations API Test"); LibraryExpense.CleanUpBeforeTesting(); + LibraryGraphMgt.EnsureAuthenticationAvailable(); if IsInitialized then exit; - BindSubscription(APITestAuthHelper); LibraryTestInitialize.OnBeforeTestSuiteInitialize(Codeunit::"Policy Evaluations API Test"); LibraryERMCountryData.CreateVATData(); LibraryERMCountryData.UpdateGeneralPostingSetup(); @@ -174,7 +174,7 @@ codeunit 148344 "Policy Evaluations API Test" IncludePolicyVersion: Boolean) begin RequestBody.Add('subjectSystemId', ExpenseReportLine.SystemId); - RequestBody.Add('subjectType', 'expenseReportLine'); + RequestBody.Add('subjectType', ExpenseReportLineSubjectTypeTok); if IncludeSubjectVersion then RequestBody.Add('subjectVersion', ExpenseReportLine."Policy Eval Version"); RequestBody.Add('policySystemId', ExpensePolicy.SystemId); diff --git a/src/Apps/W1/ExpenseAgent/test/src/Helper/ExpenseAPITestAuthHelper.Codeunit.al b/src/Apps/W1/ExpenseAgent/test/src/Helper/ExpenseAPITestAuthHelper.Codeunit.al deleted file mode 100644 index 4e34344be7a..00000000000 --- a/src/Apps/W1/ExpenseAgent/test/src/Helper/ExpenseAPITestAuthHelper.Codeunit.al +++ /dev/null @@ -1,61 +0,0 @@ -// ------------------------------------------------------------------------------------------------ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. -// ------------------------------------------------------------------------------------------------ -namespace Microsoft.Test.ExpenseAgent; - -using System.Azure.KeyVault; -using System.Environment; -using System.Integration; -using System.Security.AccessControl; - -/// -/// Test-only authentication helper for the API test codeunits in this app. -/// -codeunit 148332 "Expense API Test Auth Helper" -{ - Access = Internal; - EventSubscriberInstance = Manual; - - var - NavServerUserPasswordKeyTok: Label 'NavServerUserPassword', Locked = true; - - [EventSubscriber(ObjectType::Codeunit, Codeunit::"Library - Graph Mgt", OnAfterInitializeWebRequestWithURL, '', false, false)] - local procedure OnAfterInitializeWebRequest(var HttpWebRequestMgt: Codeunit "Http Web Request Mgt.") - var - Password: SecretText; - begin - if not ShouldInjectBasicAuth() then - exit; - if not TryGetPassword(Password) then - exit; - HttpWebRequestMgt.AddBasicAuthentication(UserId(), Password); - end; - - local procedure ShouldInjectBasicAuth(): Boolean - var - User: Record User; - EnvironmentInfo: Codeunit "Environment Information"; - begin - if EnvironmentInfo.IsSaaSInfrastructure() then - exit(false); - - // If the current user authenticates via Windows - if not User.Get(UserSecurityId()) then - exit(false); - if User."Windows Security ID" <> '' then - exit(false); - - // Inject Basic auth when using username password authentication. - exit(true); - end; - - [TryFunction] - local procedure TryGetPassword(var Password: SecretText) - var - AzureKeyVault: Codeunit "Azure Key Vault"; - begin - AzureKeyVault.GetAzureKeyVaultSecret(NavServerUserPasswordKeyTok, Password); - end; -} - diff --git a/src/Apps/W1/Quality Management/test/src/QltyTestsInspectionsAPI.Codeunit.al b/src/Apps/W1/Quality Management/test/src/QltyTestsInspectionsAPI.Codeunit.al index b2a38ac3f7b..3adaaaa8981 100644 --- a/src/Apps/W1/Quality Management/test/src/QltyTestsInspectionsAPI.Codeunit.al +++ b/src/Apps/W1/Quality Management/test/src/QltyTestsInspectionsAPI.Codeunit.al @@ -22,6 +22,7 @@ codeunit 139972 "Qlty. Tests - Inspections API" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); // [FEATURE] [Quality Management] [API] end; diff --git a/src/Apps/W1/Sustainability/test/src/SustainabilityAPITests.Codeunit.al b/src/Apps/W1/Sustainability/test/src/SustainabilityAPITests.Codeunit.al index 8c0064704ab..5204c5fa3dc 100644 --- a/src/Apps/W1/Sustainability/test/src/SustainabilityAPITests.Codeunit.al +++ b/src/Apps/W1/Sustainability/test/src/SustainabilityAPITests.Codeunit.al @@ -14,6 +14,7 @@ codeunit 148185 "Sustainability API Tests" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); // [FEATURE] [Sustainability] [API] [UI] end; diff --git a/src/DisabledTests/E-Document_Core_Tests/E-Document Core Tests.DisabledTest.json b/src/DisabledTests/E-Document_Core_Tests/E-Document Core Tests.DisabledTest.json index 2a0b6b498c3..1db9a8feddd 100644 --- a/src/DisabledTests/E-Document_Core_Tests/E-Document Core Tests.DisabledTest.json +++ b/src/DisabledTests/E-Document_Core_Tests/E-Document Core Tests.DisabledTest.json @@ -314,11 +314,6 @@ "codeunitName": "EDocCopilotPOGeneralHarms", "method": "*" }, - { - "codeunitId": 135575, - "codeunitName": "E-Doc. API Test", - "method": "*" - }, { "codeunitId": 139235, "codeunitName": "PEPPOL30 Management Tests", diff --git a/src/DisabledTests/Expense_Agent_Tests/Expense_Agent_Tests.DisabledTest.json b/src/DisabledTests/Expense_Agent_Tests/Expense_Agent_Tests.DisabledTest.json index 44be58a7731..02c2392f10b 100644 --- a/src/DisabledTests/Expense_Agent_Tests/Expense_Agent_Tests.DisabledTest.json +++ b/src/DisabledTests/Expense_Agent_Tests/Expense_Agent_Tests.DisabledTest.json @@ -1,164 +1,4 @@ [ - { - "codeunitId": 148315, - "codeunitName": "Expense Users API Test", - "method": "UnlinkedExpenseUserIsHiddenFromAPI" - }, - { - "codeunitId": 148318, - "codeunitName": "Expense Capabilities API Test", - "method": "CapabilitiesProjectsEnabledViaAPI" - }, - { - "codeunitId": 148318, - "codeunitName": "Expense Capabilities API Test", - "method": "CapabilitiesProjectsDisabledViaAPI" - }, - { - "codeunitId": 148318, - "codeunitName": "Expense Capabilities API Test", - "method": "CapabilitiesConsolidatedProjectsFollowsProjectFieldsViaAPI" - }, - { - "codeunitId": 148318, - "codeunitName": "Expense Capabilities API Test", - "method": "ActivityLogCapabilityEnabledViaAPI" - }, - { - "codeunitId": 148343, - "codeunitName": "Expense Activity Log API Test", - "method": "ActivityLogEntryIsExposedThroughReadOnlyAPI" - }, - { - "codeunitId": 148343, - "codeunitName": "Expense Activity Log API Test", - "method": "ActivityLogAPIRejectsWrites" - }, - { - "codeunitId": 148343, - "codeunitName": "Expense Activity Log API Test", - "method": "NonSnapshotActivityDoesNotExposeCurrencies" - }, - { - "codeunitId": 148343, - "codeunitName": "Expense Activity Log API Test", - "method": "UnscopedActivityAPIHidesEntries" - }, - { - "codeunitId": 148343, - "codeunitName": "Expense Activity Log API Test", - "method": "SubmitterHistoryReturnsCompleteTimelinesForSubmittedReports" - }, - { - "codeunitId": 148343, - "codeunitName": "Expense Activity Log API Test", - "method": "ApproverHistoryReturnsCompleteTimelinesForActedOnReports" - }, - { - "codeunitId": 148343, - "codeunitName": "Expense Activity Log API Test", - "method": "E2EActivityLogScenario" - }, - { - "codeunitId": 148333, - "codeunitName": "Expense Agent Setup API Test", - "method": "EmailAddressFieldIsExposedThroughAPI" - }, - { - "codeunitId": 148349, - "codeunitName": "Expense PerDiem Locations Test", - "method": "PerDiemLocationsReturnsLinkedLocationViaAPI" - }, - { - "codeunitId": 148349, - "codeunitName": "Expense PerDiem Locations Test", - "method": "PerDiemLocationsExcludesNonPerDiemCategoryViaAPI" - }, - { - "codeunitId": 148331, - "codeunitName": "Expense Projects API Test", - "method": "AssignedByPersonResponsibleReturnsWholeProjectViaAPI" - }, - { - "codeunitId": 148331, - "codeunitName": "Expense Projects API Test", - "method": "AssignedByProjectManagerReturnsWholeProjectViaAPI" - }, - { - "codeunitId": 148331, - "codeunitName": "Expense Projects API Test", - "method": "AssignedByProjectLevelResourceReturnsWholeProjectViaAPI" - }, - { - "codeunitId": 148331, - "codeunitName": "Expense Projects API Test", - "method": "AssignedByTaskLevelResourceReturnsOnlyThatTaskViaAPI" - }, - { - "codeunitId": 148331, - "codeunitName": "Expense Projects API Test", - "method": "AssignedByPlanningLineReturnsOnlyThatTaskViaAPI" - }, - { - "codeunitId": 148331, - "codeunitName": "Expense Projects API Test", - "method": "WholeProjectSignalSupersedesTaskLevelViaAPI" - }, - { - "codeunitId": 148331, - "codeunitName": "Expense Projects API Test", - "method": "OverlappingSignalsForSameResourceAreDeduplicatedViaAPI" - }, - { - "codeunitId": 148331, - "codeunitName": "Expense Projects API Test", - "method": "CompletedProjectExcludedEvenWhenAssignedViaAPI" - }, - { - "codeunitId": 148331, - "codeunitName": "Expense Projects API Test", - "method": "EmptyResourceUserMatchesNothingViaAPI" - }, - { - "codeunitId": 148331, - "codeunitName": "Expense Projects API Test", - "method": "BlankUserIdDoesNotMatchBlankProjectManagerViaAPI" - }, - { - "codeunitId": 148331, - "codeunitName": "Expense Projects API Test", - "method": "ProjectManagerMatchWithBlankResourceReturnsProjectViaAPI" - }, - { - "codeunitId": 148331, - "codeunitName": "Expense Projects API Test", - "method": "TasklessProjectExcludedViaAPI" - }, - { - "codeunitId": 148331, - "codeunitName": "Expense Projects API Test", - "method": "WholeProjectAndTaskLevelAcrossProjectsNoLeakageViaAPI" - }, - { - "codeunitId": 148331, - "codeunitName": "Expense Projects API Test", - "method": "AllProjectsVisibilityReturnsAllProjectsViaAPI" - }, - { - "codeunitId": 148331, - "codeunitName": "Expense Projects API Test", - "method": "AllProjectsVisibilityIncludesActiveStatusesAndPostingTasksViaAPI" - }, - { - "codeunitId": 148331, - "codeunitName": "Expense Projects API Test", - "method": "AssignedProjectsRequiresScopeFilterViaAPI" - }, - { - "codeunitId": 148331, - "codeunitName": "Expense Projects API Test", - "method": "AssignedProjectsBlockedWhenProjectFieldsDisabledViaAPI" - }, { "codeunitId": 148305, "codeunitName": "Expense Test", diff --git a/src/DisabledTests/_Exclude_APIV1__Tests/_Exclude_APIV1__Tests.DisabledTest.json b/src/DisabledTests/_Exclude_APIV1__Tests/_Exclude_APIV1__Tests.DisabledTest.json deleted file mode 100644 index ad692000a56..00000000000 --- a/src/DisabledTests/_Exclude_APIV1__Tests/_Exclude_APIV1__Tests.DisabledTest.json +++ /dev/null @@ -1,1457 +0,0 @@ -[ - { - "codeunitId": 139701, - "codeunitName": "APIV1 - Accounts E2E", - "method": "TestGetAccounts" - }, - { - "codeunitId": 139704, - "codeunitName": "APIV1 - Payment Terms E2E", - "method": "TestGetPaymentTerms" - }, - { - "codeunitId": 139705, - "codeunitName": "APIV1 - Shipment Methods E2E", - "method": "TestGetShipmentMethods" - }, - { - "codeunitId": 139706, - "codeunitName": "APIV1 - Company Info. E2E", - "method": "TestGetCompanyInformationWithComplexType" - }, - { - "codeunitId": 139706, - "codeunitName": "APIV1 - Company Info. E2E", - "method": "TestModifyCompanyInformation" - }, - { - "codeunitId": 139706, - "codeunitName": "APIV1 - Company Info. E2E", - "method": "TestModifyCompanyInformationWithComplexType" - }, - { - "codeunitId": 139706, - "codeunitName": "APIV1 - Company Info. E2E", - "method": "TestRemoveComplexTypeFromCompanyInformation" - }, - { - "codeunitId": 139707, - "codeunitName": "APIV1 - Item Categories E2E", - "method": "TestCreateItemCategory" - }, - { - "codeunitId": 139707, - "codeunitName": "APIV1 - Item Categories E2E", - "method": "TestDeleteItemCategory" - }, - { - "codeunitId": 139707, - "codeunitName": "APIV1 - Item Categories E2E", - "method": "TestGetItemCategories" - }, - { - "codeunitId": 139707, - "codeunitName": "APIV1 - Item Categories E2E", - "method": "TestModifyItemCategory" - }, - { - "codeunitId": 139708, - "codeunitName": "Tax Groups E2E", - "method": "TestCreateTaxGroup" - }, - { - "codeunitId": 139708, - "codeunitName": "Tax Groups E2E", - "method": "TestDeleteTaxGroup" - }, - { - "codeunitId": 139708, - "codeunitName": "Tax Groups E2E", - "method": "TestGetTaxGroup" - }, - { - "codeunitId": 139708, - "codeunitName": "Tax Groups E2E", - "method": "TestGetTaxGroups" - }, - { - "codeunitId": 139708, - "codeunitName": "Tax Groups E2E", - "method": "TestModifyTaxGroup" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestActionCancelAndSendInvoice" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestActionCancelInvoice" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestActionMakeCorrectiveCreditMemo" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestActionPostAndSendInvoice" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestActionPostInvoice" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestActionSendCancelledInvoice" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestActionSendDraftInvoice" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestActionSendPostedInvoice" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestClearingManualDiscounts" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestCreateInvoiceThroughPageAndAPI" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestDeleteInvoice" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestEmptyModifyInvoices" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestGetInvoices" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestGetInvoicesAppliesDiscountPct" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestGetInvoicesRedistributesDiscountAmt" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestModifyingWithBlankIdEmptiesTheCodeAndTheId" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestModifyInvoiceNumberForDraftInvoice" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestModifyInvoices" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestModifyInvoiceSetManualDiscount" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestPartialModifyInvoices" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestPostInvoices" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestPostInvoiceWithCurrency" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestPostInvoiceWithDates" - }, - { - "codeunitId": 139709, - "codeunitName": "Sales Invoices E2E", - "method": "TestPostInvoiceWithEmail" - }, - { - "codeunitId": 139710, - "codeunitName": "Countries/Regions E2E", - "method": "TestCreateCountriesRegions" - }, - { - "codeunitId": 139710, - "codeunitName": "Countries/Regions E2E", - "method": "TestDeleteCountriesRegions" - }, - { - "codeunitId": 139710, - "codeunitName": "Countries/Regions E2E", - "method": "TestGetCountriesRegions" - }, - { - "codeunitId": 139710, - "codeunitName": "Countries/Regions E2E", - "method": "TestModifyCountriesRegions" - }, - { - "codeunitId": 139711, - "codeunitName": "APIV1 - Sales Orders E2E", - "method": "TestActionShipAndInvoice" - }, - { - "codeunitId": 139711, - "codeunitName": "APIV1 - Sales Orders E2E", - "method": "TestClearingManualDiscounts" - }, - { - "codeunitId": 139711, - "codeunitName": "APIV1 - Sales Orders E2E", - "method": "TestCreateOrderThroughPageAndAPI" - }, - { - "codeunitId": 139711, - "codeunitName": "APIV1 - Sales Orders E2E", - "method": "TestDeleteOrders" - }, - { - "codeunitId": 139711, - "codeunitName": "APIV1 - Sales Orders E2E", - "method": "TestEmptyModifyOrders" - }, - { - "codeunitId": 139711, - "codeunitName": "APIV1 - Sales Orders E2E", - "method": "TestGetOrders" - }, - { - "codeunitId": 139711, - "codeunitName": "APIV1 - Sales Orders E2E", - "method": "TestGetOrdersAppliesDiscountPct" - }, - { - "codeunitId": 139711, - "codeunitName": "APIV1 - Sales Orders E2E", - "method": "TestGetOrdersRedistributesDiscountAmt" - }, - { - "codeunitId": 139711, - "codeunitName": "APIV1 - Sales Orders E2E", - "method": "TestModifyOrders" - }, - { - "codeunitId": 139711, - "codeunitName": "APIV1 - Sales Orders E2E", - "method": "TestModifyOrderSetManualDiscount" - }, - { - "codeunitId": 139711, - "codeunitName": "APIV1 - Sales Orders E2E", - "method": "TestPartialModifyOrders" - }, - { - "codeunitId": 139711, - "codeunitName": "APIV1 - Sales Orders E2E", - "method": "TestPostOrderForCustomerWithLocationCode" - }, - { - "codeunitId": 139711, - "codeunitName": "APIV1 - Sales Orders E2E", - "method": "TestPostOrders" - }, - { - "codeunitId": 139711, - "codeunitName": "APIV1 - Sales Orders E2E", - "method": "TestPostOrderWithCurrency" - }, - { - "codeunitId": 139712, - "codeunitName": "APIV1 - UofM E2E", - "method": "TestDeleteUnitOfMeasure" - }, - { - "codeunitId": 139712, - "codeunitName": "APIV1 - UofM E2E", - "method": "TestGetUnitOfMeasure" - }, - { - "codeunitId": 139712, - "codeunitName": "APIV1 - UofM E2E", - "method": "TestInsertUnitOfMeasure" - }, - { - "codeunitId": 139712, - "codeunitName": "APIV1 - UofM E2E", - "method": "TestModifyUnitOfMeasure" - }, - { - "codeunitId": 139713, - "codeunitName": "APIV1 - Currencies E2E", - "method": "TestCreateCurrency" - }, - { - "codeunitId": 139713, - "codeunitName": "APIV1 - Currencies E2E", - "method": "TestDeleteCurrency" - }, - { - "codeunitId": 139713, - "codeunitName": "APIV1 - Currencies E2E", - "method": "TestGetCurrencies" - }, - { - "codeunitId": 139713, - "codeunitName": "APIV1 - Currencies E2E", - "method": "TestModifyCurrency" - }, - { - "codeunitId": 139714, - "codeunitName": "Payment Methods E2E", - "method": "TestCreatePaymentMethods" - }, - { - "codeunitId": 139714, - "codeunitName": "Payment Methods E2E", - "method": "TestDeletePaymentMethods" - }, - { - "codeunitId": 139714, - "codeunitName": "Payment Methods E2E", - "method": "TestGetPaymentMethods" - }, - { - "codeunitId": 139714, - "codeunitName": "Payment Methods E2E", - "method": "TestModifyPaymentMethods" - }, - { - "codeunitId": 139715, - "codeunitName": "APIV1 - Balance Sheet E2E", - "method": "TestGetBalanceSheetRecords" - }, - { - "codeunitId": 139716, - "codeunitName": "APIV1 - Income Statement E2E", - "method": "TestGetIncomeStatementRecords" - }, - { - "codeunitId": 139717, - "codeunitName": "APIV1 - CashFlow Statement E2E", - "method": "TestGetCashFlowRecords" - }, - { - "codeunitId": 139718, - "codeunitName": "APIV1 - Trial Balance E2E", - "method": "TestGetTrialBalanceRecords" - }, - { - "codeunitId": 139719, - "codeunitName": "APIV1 - Aged AP E2E", - "method": "TestGetAgedAPRecords" - }, - { - "codeunitId": 139720, - "codeunitName": "APIV1 - Aged AR E2E", - "method": "TestGetAgedARRecords" - }, - { - "codeunitId": 139721, - "codeunitName": "APIV1 - Ret. Earnings E2E", - "method": "TestRetainedEarningsStatementRecords" - }, - { - "codeunitId": 139722, - "codeunitName": "APIV1 - Employees E2E", - "method": "TestCreateEmployee" - }, - { - "codeunitId": 139722, - "codeunitName": "APIV1 - Employees E2E", - "method": "TestDeleteEmployee" - }, - { - "codeunitId": 139722, - "codeunitName": "APIV1 - Employees E2E", - "method": "TestGetEmployee" - }, - { - "codeunitId": 139722, - "codeunitName": "APIV1 - Employees E2E", - "method": "TestModifyEmployee" - }, - { - "codeunitId": 139723, - "codeunitName": "APIV1 - Sales Quotes E2E", - "method": "TestActionMakeInvoiceFromQuote" - }, - { - "codeunitId": 139723, - "codeunitName": "APIV1 - Sales Quotes E2E", - "method": "TestActionMakeOrderFromQuote" - }, - { - "codeunitId": 139723, - "codeunitName": "APIV1 - Sales Quotes E2E", - "method": "TestActionSendQuote" - }, - { - "codeunitId": 139723, - "codeunitName": "APIV1 - Sales Quotes E2E", - "method": "TestClearingManualDiscounts" - }, - { - "codeunitId": 139723, - "codeunitName": "APIV1 - Sales Quotes E2E", - "method": "TestCreateQuoteThroughPageAndAPI" - }, - { - "codeunitId": 139723, - "codeunitName": "APIV1 - Sales Quotes E2E", - "method": "TestDeleteQuotes" - }, - { - "codeunitId": 139723, - "codeunitName": "APIV1 - Sales Quotes E2E", - "method": "TestEmptyModifyQuotes" - }, - { - "codeunitId": 139723, - "codeunitName": "APIV1 - Sales Quotes E2E", - "method": "TestGetQuotes" - }, - { - "codeunitId": 139723, - "codeunitName": "APIV1 - Sales Quotes E2E", - "method": "TestGetQuotesAppliesDiscountPct" - }, - { - "codeunitId": 139723, - "codeunitName": "APIV1 - Sales Quotes E2E", - "method": "TestGetQuotesRedistributesDiscountAmt" - }, - { - "codeunitId": 139723, - "codeunitName": "APIV1 - Sales Quotes E2E", - "method": "TestModifyQuotes" - }, - { - "codeunitId": 139723, - "codeunitName": "APIV1 - Sales Quotes E2E", - "method": "TestModifyQuoteSetManualDiscount" - }, - { - "codeunitId": 139723, - "codeunitName": "APIV1 - Sales Quotes E2E", - "method": "TestPartialModifyQuotes" - }, - { - "codeunitId": 139723, - "codeunitName": "APIV1 - Sales Quotes E2E", - "method": "TestPostQuotes" - }, - { - "codeunitId": 139723, - "codeunitName": "APIV1 - Sales Quotes E2E", - "method": "TestPostQuoteWithCurrency" - }, - { - "codeunitId": 139724, - "codeunitName": "APIV1 - Dimensions E2E", - "method": "TestGetDimensions" - }, - { - "codeunitId": 139724, - "codeunitName": "APIV1 - Dimensions E2E", - "method": "TestGetDimensionValues" - }, - { - "codeunitId": 139727, - "codeunitName": "APIV1 - Journals E2E", - "method": "TestActionPostGenJournalBatch" - }, - { - "codeunitId": 139727, - "codeunitName": "APIV1 - Journals E2E", - "method": "TestCreateJournal" - }, - { - "codeunitId": 139727, - "codeunitName": "APIV1 - Journals E2E", - "method": "TestDeleteJournal" - }, - { - "codeunitId": 139727, - "codeunitName": "APIV1 - Journals E2E", - "method": "TestGetJournals" - }, - { - "codeunitId": 139727, - "codeunitName": "APIV1 - Journals E2E", - "method": "TestModifyJournal" - }, - { - "codeunitId": 139728, - "codeunitName": "APIV1 - Sales Credit Memos E2E", - "method": "TestActionCancelAndSendCorrectiveCreditMemo" - }, - { - "codeunitId": 139728, - "codeunitName": "APIV1 - Sales Credit Memos E2E", - "method": "TestActionCancelCorrectiveCreditMemo" - }, - { - "codeunitId": 139728, - "codeunitName": "APIV1 - Sales Credit Memos E2E", - "method": "TestActionPostAndSendCreditMemo" - }, - { - "codeunitId": 139728, - "codeunitName": "APIV1 - Sales Credit Memos E2E", - "method": "TestActionPostCreditMemo" - }, - { - "codeunitId": 139728, - "codeunitName": "APIV1 - Sales Credit Memos E2E", - "method": "TestActionSendCancelledCreditMemo" - }, - { - "codeunitId": 139728, - "codeunitName": "APIV1 - Sales Credit Memos E2E", - "method": "TestActionSendPostedCreditMemo" - }, - { - "codeunitId": 139728, - "codeunitName": "APIV1 - Sales Credit Memos E2E", - "method": "TestClearingManualDiscounts" - }, - { - "codeunitId": 139728, - "codeunitName": "APIV1 - Sales Credit Memos E2E", - "method": "TestCreateCreditMemoThroughPageAndAPI" - }, - { - "codeunitId": 139728, - "codeunitName": "APIV1 - Sales Credit Memos E2E", - "method": "TestDeleteCreditMemo" - }, - { - "codeunitId": 139728, - "codeunitName": "APIV1 - Sales Credit Memos E2E", - "method": "TestEmptyModifyCreditMemos" - }, - { - "codeunitId": 139728, - "codeunitName": "APIV1 - Sales Credit Memos E2E", - "method": "TestGetCreditMemos" - }, - { - "codeunitId": 139728, - "codeunitName": "APIV1 - Sales Credit Memos E2E", - "method": "TestGetCreditMemosAppliesDiscountPct" - }, - { - "codeunitId": 139728, - "codeunitName": "APIV1 - Sales Credit Memos E2E", - "method": "TestGetCreditMemosRedistributesDiscountAmt" - }, - { - "codeunitId": 139728, - "codeunitName": "APIV1 - Sales Credit Memos E2E", - "method": "TestModifyCreditMemos" - }, - { - "codeunitId": 139728, - "codeunitName": "APIV1 - Sales Credit Memos E2E", - "method": "TestModifyCreditMemoSetManualDiscount" - }, - { - "codeunitId": 139728, - "codeunitName": "APIV1 - Sales Credit Memos E2E", - "method": "TestPartialModifyCreditMemos" - }, - { - "codeunitId": 139728, - "codeunitName": "APIV1 - Sales Credit Memos E2E", - "method": "TestPostCreditMemos" - }, - { - "codeunitId": 139728, - "codeunitName": "APIV1 - Sales Credit Memos E2E", - "method": "TestPostCreditMemoWithCurrency" - }, - { - "codeunitId": 139729, - "codeunitName": "APIV1 - Purchase Invoices E2E", - "method": "TestActionPostPurchaseInvoice" - }, - { - "codeunitId": 139729, - "codeunitName": "APIV1 - Purchase Invoices E2E", - "method": "TestCreateInvoiceThroughPageAndAPI" - }, - { - "codeunitId": 139729, - "codeunitName": "APIV1 - Purchase Invoices E2E", - "method": "TestDeleteInvoice" - }, - { - "codeunitId": 139729, - "codeunitName": "APIV1 - Purchase Invoices E2E", - "method": "TestEmptyModifyInvoices" - }, - { - "codeunitId": 139729, - "codeunitName": "APIV1 - Purchase Invoices E2E", - "method": "TestGetInvoices" - }, - { - "codeunitId": 139729, - "codeunitName": "APIV1 - Purchase Invoices E2E", - "method": "TestModifyInvoices" - }, - { - "codeunitId": 139729, - "codeunitName": "APIV1 - Purchase Invoices E2E", - "method": "TestPartialModifyInvoices" - }, - { - "codeunitId": 139729, - "codeunitName": "APIV1 - Purchase Invoices E2E", - "method": "TestPostInvoices" - }, - { - "codeunitId": 139729, - "codeunitName": "APIV1 - Purchase Invoices E2E", - "method": "TestPostPurchaseInvoiceWithCurrency" - }, - { - "codeunitId": 139729, - "codeunitName": "APIV1 - Purchase Invoices E2E", - "method": "TestPurchaseInvoiceWithPaymentDiscount" - }, - { - "codeunitId": 139730, - "codeunitName": "APIV1 - GLEntries E2E", - "method": "TestGetGLEntries" - }, - { - "codeunitId": 139731, - "codeunitName": "APIV1 - Automation RS Package", - "method": "TestApplyRSPackage" - }, - { - "codeunitId": 139731, - "codeunitName": "APIV1 - Automation RS Package", - "method": "TestCreateRSPackage" - }, - { - "codeunitId": 139731, - "codeunitName": "APIV1 - Automation RS Package", - "method": "TestImportRSPackage" - }, - { - "codeunitId": 139731, - "codeunitName": "APIV1 - Automation RS Package", - "method": "TestImportWrongRSPackage" - }, - { - "codeunitId": 139731, - "codeunitName": "APIV1 - Automation RS Package", - "method": "TestUploadRSPackageFile" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestCreateDraftInvoiceAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestCreateDraftPurchaseInvoiceAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestCreateGLEntryAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestCreateJournalLineAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestCreatePostedInvoiceAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestCreatePostedPurchaseInvoiceAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestCreateQuoteAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestDeleteDraftInvoiceAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestDeleteDraftPurchaseInvoiceAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestDeleteGLEntryAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestDeleteJournalLineAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestDeletePostedInvoiceAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestDeletePostedPurchaseInvoiceAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestDeleteQuoteAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestGetDraftInvoiceAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestGetDraftInvoiceAttachments" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestGetDraftPurchaseInvoiceAttachments" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestGetGLEntryAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestGetGLEntryAttachments" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestGetJournalAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestGetJournalLineAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestGetJournalLineAttachments" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestGetPostedInvoiceAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestGetPostedInvoiceAttachments" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestGetPostedPurchaseInvoiceAttachments" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestGetQuoteAttachment" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestGetQuoteAttachments" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestLinkedAttachmentContentChangeKeepsOtherFieldsUnchanged" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestLinkedAttachmentDocumentIdChangeNotAllowed" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestLinkedAttachmentFileNameChangeKeepsOtherFieldsUnchanged" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestLinkedAttachmentIdChangeNotAllowed" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestTransferAttachmentFromDraftToPostedInvoice" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestTransferAttachmentFromDraftToPostedPurchaseInvoice" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestUpdateGenJournalLineAttachmentBinaryContent" - }, - { - "codeunitId": 139733, - "codeunitName": "APIV1 - Attachments E2E", - "method": "TestUpdateGLEntryAttachmentBinaryContent" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestCreateLineThroughPageAndAPI" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestDeleteInvoiceLine" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestDeletingLineKeepsInvoiceDiscountAmt" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestDeletingLineMovesInvoiceDiscountPct" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestDeletingLineRemovesInvoiceDiscountPct" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestGetInvoiceLineDirectly" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestGetInvoiceLines" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestGetInvoiceLinesDirectlyWithDocumentIdFilter" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestGetPostedInvoiceLines" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestGettingLinesWithDifferentTypes" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestInsertingLineUpdatesInvoiceDiscountPct" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestModifyingLineKeepsInvoiceDiscountAmt" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestModifyingLineUpdatesInvoiceDiscountPct" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestModifyInvoiceLine" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestModifyInvoiceLineWithUoM" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestPatchingTheIdToAccountChangesLineType" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestPatchingTheIdToItemChangesLineType" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestPatchingTheTypeBlanksIds" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestPostingBlankLineDefaultsToItemType" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestPostingCommentLine" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestPostInvoiceLines" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestPostInvoiceLinesWithItemVariant" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestPostInvoiceLinesWithUoM" - }, - { - "codeunitId": 139734, - "codeunitName": "APIV1 - Sales Inv. Lines E2E", - "method": "TestPostInvoiceLineWithSequence" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestCreateLineThroughPageAndAPI" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestDeleteOrderLine" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestDeletingLineKeepsOrderDiscountAmt" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestDeletingLineMovesOrderDiscountPct" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestDeletingLineRemovesOrderDiscountPct" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestGetOrderLineDirectly" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestGetOrderLines" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestGetOrderLinesDirectlyWithDocumentIdFilter" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestGettingLinesWithDifferentTypes" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestInsertingLineUpdatesOrderDiscountPct" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestModifyingLineKeepsOrderDiscountAmt" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestModifyingLineUpdatesOrderDiscountPct" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestModifyOrderLines" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestPatchingTheIdToAccountChangesLineType" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestPatchingTheIdToItemChangesLineType" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestPatchingTheTypeBlanksIds" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestPostingBlankLineDefaultsToItemType" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestPostingCommentLine" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestPostOrderLines" - }, - { - "codeunitId": 139735, - "codeunitName": "APIV1 - Sales Order Lines E2E", - "method": "TestPostOrderLineWithItemVariant" - }, - { - "codeunitId": 139736, - "codeunitName": "APIV1 - Sales Quote Lines E2E", - "method": "TestDeleteQuoteLine" - }, - { - "codeunitId": 139736, - "codeunitName": "APIV1 - Sales Quote Lines E2E", - "method": "TestDeletingLineKeepsQuoteDiscountAmt" - }, - { - "codeunitId": 139736, - "codeunitName": "APIV1 - Sales Quote Lines E2E", - "method": "TestDeletingLineMovesQuoteDiscountPct" - }, - { - "codeunitId": 139736, - "codeunitName": "APIV1 - Sales Quote Lines E2E", - "method": "TestDeletingLineRemovesQuoteDiscountPct" - }, - { - "codeunitId": 139736, - "codeunitName": "APIV1 - Sales Quote Lines E2E", - "method": "TestGetQuoteLineDirectly" - }, - { - "codeunitId": 139736, - "codeunitName": "APIV1 - Sales Quote Lines E2E", - "method": "TestGetQuoteLines" - }, - { - "codeunitId": 139736, - "codeunitName": "APIV1 - Sales Quote Lines E2E", - "method": "TestGetQuoteLinesDirectlyWithDocumentIdFilter" - }, - { - "codeunitId": 139736, - "codeunitName": "APIV1 - Sales Quote Lines E2E", - "method": "TestInsertingLineKeepsQuoteDiscountAmt" - }, - { - "codeunitId": 139736, - "codeunitName": "APIV1 - Sales Quote Lines E2E", - "method": "TestInsertingLineUpdatesQuoteDiscountPct" - }, - { - "codeunitId": 139736, - "codeunitName": "APIV1 - Sales Quote Lines E2E", - "method": "TestModifyingLineKeepsQuoteDiscountAmt" - }, - { - "codeunitId": 139736, - "codeunitName": "APIV1 - Sales Quote Lines E2E", - "method": "TestModifyingLineUpdatesQuoteDiscountPct" - }, - { - "codeunitId": 139736, - "codeunitName": "APIV1 - Sales Quote Lines E2E", - "method": "TestModifyQuoteLines" - }, - { - "codeunitId": 139736, - "codeunitName": "APIV1 - Sales Quote Lines E2E", - "method": "TestPatchingTheTypeBlanksIds" - }, - { - "codeunitId": 139736, - "codeunitName": "APIV1 - Sales Quote Lines E2E", - "method": "TestPostingBlankLineDefaultsToItemType" - }, - { - "codeunitId": 139736, - "codeunitName": "APIV1 - Sales Quote Lines E2E", - "method": "TestPostingCommentLine" - }, - { - "codeunitId": 139736, - "codeunitName": "APIV1 - Sales Quote Lines E2E", - "method": "TestPostQuoteLines" - }, - { - "codeunitId": 139736, - "codeunitName": "APIV1 - Sales Quote Lines E2E", - "method": "TestPostQuoteLinesWithItemVariant" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestCreateLineThroughPageAndAPI" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestDeleteCreditMemoLine" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestDeletePostedCreditMemoLine" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestDeletingLineKeepsCreditMemoDiscountAmt" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestDeletingLineMovesCreditMemoDiscountPct" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestDeletingLineRemovesCreditMemoDiscountPct" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestGetCreditMemoLineDirectly" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestGetCreditMemoLines" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestGetCreditMemoLinesDirectlyWithDocumentIdFilter" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestGetPostedCreditMemoLines" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestGettingLinesWithDifferentTypes" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestInsertingLineUpdatesCreditMemoDiscountPct" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestModifyCreditMemoLines" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestModifyingLineKeepsCreditMemoDiscountAmt" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestModifyingLineUpdatesCreditMemoDiscountPct" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestPatchingTheIdToAccountChangesLineType" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestPatchingTheIdToItemChangesLineType" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestPatchingTheTypeBlanksIds" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestPostCreditMemoLines" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestPostCreditMemoLinesWithItemVariant" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestPostCreditMemoLineWithSequence" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestPostingBlankLineDefaultsToItemType" - }, - { - "codeunitId": 139737, - "codeunitName": "APIV1 - Sales CrMemo Lines E2E", - "method": "TestPostingCommentLine" - }, - { - "codeunitId": 139738, - "codeunitName": "APIV1 - Purchase Inv Lines E2E", - "method": "TestCreateLineThroughPageAndAPI" - }, - { - "codeunitId": 139738, - "codeunitName": "APIV1 - Purchase Inv Lines E2E", - "method": "TestDeleteInvoiceLine" - }, - { - "codeunitId": 139738, - "codeunitName": "APIV1 - Purchase Inv Lines E2E", - "method": "TestDeletingLineRemovesInvoiceDiscountPct" - }, - { - "codeunitId": 139738, - "codeunitName": "APIV1 - Purchase Inv Lines E2E", - "method": "TestGetInvoiceLineDirectly" - }, - { - "codeunitId": 139738, - "codeunitName": "APIV1 - Purchase Inv Lines E2E", - "method": "TestGetInvoiceLines" - }, - { - "codeunitId": 139738, - "codeunitName": "APIV1 - Purchase Inv Lines E2E", - "method": "TestGetInvoiceLinesDirectlyWithDocumentIdFilter" - }, - { - "codeunitId": 139738, - "codeunitName": "APIV1 - Purchase Inv Lines E2E", - "method": "TestGetPostedInvoiceLines" - }, - { - "codeunitId": 139738, - "codeunitName": "APIV1 - Purchase Inv Lines E2E", - "method": "TestInsertingLineUpdatesInvoiceDiscountPct" - }, - { - "codeunitId": 139738, - "codeunitName": "APIV1 - Purchase Inv Lines E2E", - "method": "TestModifyingLineUpdatesInvoiceDiscountPct" - }, - { - "codeunitId": 139738, - "codeunitName": "APIV1 - Purchase Inv Lines E2E", - "method": "TestModifyInvoiceLines" - }, - { - "codeunitId": 139738, - "codeunitName": "APIV1 - Purchase Inv Lines E2E", - "method": "TestPatchingTheTypeBlanksIds" - }, - { - "codeunitId": 139738, - "codeunitName": "APIV1 - Purchase Inv Lines E2E", - "method": "TestPostingBlankLineDefaultsToItemType" - }, - { - "codeunitId": 139738, - "codeunitName": "APIV1 - Purchase Inv Lines E2E", - "method": "TestPostingCommentLine" - }, - { - "codeunitId": 139738, - "codeunitName": "APIV1 - Purchase Inv Lines E2E", - "method": "TestPostInvoiceLines" - }, - { - "codeunitId": 139738, - "codeunitName": "APIV1 - Purchase Inv Lines E2E", - "method": "TestPostInvoiceLinesWithItemVariant" - }, - { - "codeunitId": 139738, - "codeunitName": "APIV1 - Purchase Inv Lines E2E", - "method": "TestPostInvoiceLineWithSequence" - }, - { - "codeunitId": 139743, - "codeunitName": "APIV1 - Customer Payments E2E", - "method": "TestAppliesToInvoiceNoAndIdSync" - }, - { - "codeunitId": 139743, - "codeunitName": "APIV1 - Customer Payments E2E", - "method": "TestCreateCustomerPayment" - }, - { - "codeunitId": 139743, - "codeunitName": "APIV1 - Customer Payments E2E", - "method": "TestCreateCustomerPaymentWithInvoiceId" - }, - { - "codeunitId": 139743, - "codeunitName": "APIV1 - Customer Payments E2E", - "method": "TestCreateCustomerPaymentWithoutDocNo" - }, - { - "codeunitId": 139743, - "codeunitName": "APIV1 - Customer Payments E2E", - "method": "TestCustomerAutofillDoesNotOverwrite" - }, - { - "codeunitId": 139743, - "codeunitName": "APIV1 - Customer Payments E2E", - "method": "TestCustomerAutofillWhenGivingInvoiceNumber" - }, - { - "codeunitId": 139743, - "codeunitName": "APIV1 - Customer Payments E2E", - "method": "TestCustomerNoAndIdSync" - }, - { - "codeunitId": 139743, - "codeunitName": "APIV1 - Customer Payments E2E", - "method": "TestDeleteCustomerPayment" - }, - { - "codeunitId": 139743, - "codeunitName": "APIV1 - Customer Payments E2E", - "method": "TestGetCustomerPayment" - }, - { - "codeunitId": 139743, - "codeunitName": "APIV1 - Customer Payments E2E", - "method": "TestModifyCustomerPayment" - }, - { - "codeunitId": 139743, - "codeunitName": "APIV1 - Customer Payments E2E", - "method": "TestModifyCustomerPaymentWithRandomDocNo" - }, - { - "codeunitId": 139744, - "codeunitName": "APIV1 - PDF Document E2E", - "method": "TestGetPDFPurchaseInvoice" - }, - { - "codeunitId": 139744, - "codeunitName": "APIV1 - PDF Document E2E", - "method": "TestGetPDFSalesCreditMemo" - }, - { - "codeunitId": 139744, - "codeunitName": "APIV1 - PDF Document E2E", - "method": "TestGetPDFSalesInvoice" - }, - { - "codeunitId": 139744, - "codeunitName": "APIV1 - PDF Document E2E", - "method": "TestGetPDFSalesQuote" - }, - { - "codeunitId": 139745, - "codeunitName": "APIV1 - Journal Lines E2E", - "method": "TestCreateJournalLineWithDimensionsOnAccountWithDimensionSetup" - }, - { - "codeunitId": 139745, - "codeunitName": "APIV1 - Journal Lines E2E", - "method": "TestCreateJournalLineWithDisabledCopyVATSetup" - }, - { - "codeunitId": 139745, - "codeunitName": "APIV1 - Journal Lines E2E", - "method": "TestCreateJournalLineWithoutDimensionsOnAccountWithDimensionSetup" - }, - { - "codeunitId": 139745, - "codeunitName": "APIV1 - Journal Lines E2E", - "method": "TestCreateJournalLineWithOverridenDefaultDimension" - } -] diff --git a/src/DisabledTests/_Exclude_APIV2__Tests/_Exclude_APIV2__Tests.DisabledTest.json b/src/DisabledTests/_Exclude_APIV2__Tests/_Exclude_APIV2__Tests.DisabledTest.json index 9c764cbf7e2..63514a3f50d 100644 --- a/src/DisabledTests/_Exclude_APIV2__Tests/_Exclude_APIV2__Tests.DisabledTest.json +++ b/src/DisabledTests/_Exclude_APIV2__Tests/_Exclude_APIV2__Tests.DisabledTest.json @@ -1,3582 +1,47 @@ [ - { - "codeunitId": 139800, - "codeunitName": "APIV2 - Items E2E", - "method": "TestCreateItemWithCategoryCode" - }, - { - "codeunitId": 139800, - "codeunitName": "APIV2 - Items E2E", - "method": "TestCreateItemWithCategoryId" - }, - { - "codeunitId": 139800, - "codeunitName": "APIV2 - Items E2E", - "method": "TestCreateItemWithTemplate" - }, - { - "codeunitId": 139800, - "codeunitName": "APIV2 - Items E2E", - "method": "TestCreateItemWithTemplateIgnoresFieldsSet" - }, - { - "codeunitId": 139800, - "codeunitName": "APIV2 - Items E2E", - "method": "TestCreateItemWithUoMCode" - }, - { - "codeunitId": 139800, - "codeunitName": "APIV2 - Items E2E", - "method": "TestCreateItemWithUoMId" - }, - { - "codeunitId": 139800, - "codeunitName": "APIV2 - Items E2E", - "method": "TestCreateSimpleItem" - }, - { - "codeunitId": 139800, - "codeunitName": "APIV2 - Items E2E", - "method": "TestDeleteItem" - }, - { - "codeunitId": 139800, - "codeunitName": "APIV2 - Items E2E", - "method": "TestGetItemWithCategory" - }, - { - "codeunitId": 139800, - "codeunitName": "APIV2 - Items E2E", - "method": "TestGetRelatedEntities" - }, - { - "codeunitId": 139800, - "codeunitName": "APIV2 - Items E2E", - "method": "TestGetSimpleItem" - }, - { - "codeunitId": 139800, - "codeunitName": "APIV2 - Items E2E", - "method": "TestModifyItem" - }, - { - "codeunitId": 139800, - "codeunitName": "APIV2 - Items E2E", - "method": "TestModifyItemInventory" - }, - { - "codeunitId": 139800, - "codeunitName": "APIV2 - Items E2E", - "method": "TestPatchItemWithCategoryCode" - }, - { - "codeunitId": 139800, - "codeunitName": "APIV2 - Items E2E", - "method": "TestPatchItemWithCategoryId" - }, - { - "codeunitId": 139800, - "codeunitName": "APIV2 - Items E2E", - "method": "TestPatchItemWithGenProdPostingGroup" - }, - { - "codeunitId": 139800, - "codeunitName": "APIV2 - Items E2E", - "method": "TestPatchItemWithInventoryPostingGroup" - }, - { - "codeunitId": 139800, - "codeunitName": "APIV2 - Items E2E", - "method": "TestUnassignGenProdPostingGroup" - }, - { - "codeunitId": 139800, - "codeunitName": "APIV2 - Items E2E", - "method": "TestUnassignInventoryPostingGroup" - }, - { - "codeunitId": 139801, - "codeunitName": "APIV2 - Accounts E2E", - "method": "TestGetAccounts" - }, - { - "codeunitId": 139804, - "codeunitName": "APIV2 - Payment Terms E2E", - "method": "TestGetPaymentTerms" - }, - { - "codeunitId": 139805, - "codeunitName": "APIV2 - Shipment Methods E2E", - "method": "TestGetShipmentMethods" - }, - { - "codeunitId": 139806, - "codeunitName": "APIV2 - Company Info. E2E", - "method": "TestGetCompanyInformation" - }, - { - "codeunitId": 139806, - "codeunitName": "APIV2 - Company Info. E2E", - "method": "TestModifyCompanyInformation" - }, - { - "codeunitId": 139806, - "codeunitName": "APIV2 - Company Info. E2E", - "method": "TestModifyInvalidExperinceTier" - }, - { - "codeunitId": 139806, - "codeunitName": "APIV2 - Company Info. E2E", - "method": "TestModifyValidExperinceTier" - }, - { - "codeunitId": 139807, - "codeunitName": "APIV2 - Item Categories E2E", - "method": "TestCreateItemCategory" - }, - { - "codeunitId": 139807, - "codeunitName": "APIV2 - Item Categories E2E", - "method": "TestDeleteItemCategory" - }, - { - "codeunitId": 139807, - "codeunitName": "APIV2 - Item Categories E2E", - "method": "TestGetItemCategories" - }, - { - "codeunitId": 139807, - "codeunitName": "APIV2 - Item Categories E2E", - "method": "TestModifyItemCategory" - }, - { - "codeunitId": 139808, - "codeunitName": "APIV2 - Tax Groups E2E", - "method": "TestCreateTaxGroup" - }, - { - "codeunitId": 139808, - "codeunitName": "APIV2 - Tax Groups E2E", - "method": "TestDeleteTaxGroup" - }, - { - "codeunitId": 139808, - "codeunitName": "APIV2 - Tax Groups E2E", - "method": "TestGetTaxGroup" - }, - { - "codeunitId": 139808, - "codeunitName": "APIV2 - Tax Groups E2E", - "method": "TestGetTaxGroups" - }, - { - "codeunitId": 139808, - "codeunitName": "APIV2 - Tax Groups E2E", - "method": "TestModifyTaxGroup" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestActionCancelAndSendInvoice" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestActionCancelInvoice" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestActionMakeCorrectiveCreditMemo" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestActionPostAndSendInvoice" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestActionPostInvoice" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestActionSendCancelledInvoice" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestActionSendDraftInvoice" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestActionSendPostedInvoice" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestClearingManualDiscounts" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestCreateInvoiceThroughPageAndAPI" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestDeleteInvoice" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestEmptyModifyInvoices" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestGetInvoiceFromPostedOrderCorrectOrderIdAndNo" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestGetInvoices" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestGetInvoicesAppliesDiscountPct" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestGetInvoicesRedistributesDiscountAmt" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestGetSalesInvoiceFromDraftId" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestModifyingWithBlankIdEmptiesTheCodeAndTheId" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestModifyInvoiceNumberForDraftInvoice" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestModifyInvoices" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestModifyInvoiceSetManualDiscount" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestPartialModifyInvoices" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestPostInvoices" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestPostInvoiceWithCurrency" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestPostInvoiceWithDates" - }, - { - "codeunitId": 139809, - "codeunitName": "APIV2 - Sales Invoices E2E", - "method": "TestPostInvoiceWithEmail" - }, - { - "codeunitId": 139810, - "codeunitName": "APIV2 - Countries/Regions E2E", - "method": "TestCreateCountriesRegions" - }, - { - "codeunitId": 139810, - "codeunitName": "APIV2 - Countries/Regions E2E", - "method": "TestDeleteCountriesRegions" - }, - { - "codeunitId": 139810, - "codeunitName": "APIV2 - Countries/Regions E2E", - "method": "TestGetCountriesRegions" - }, - { - "codeunitId": 139810, - "codeunitName": "APIV2 - Countries/Regions E2E", - "method": "TestModifyCountriesRegions" - }, - { - "codeunitId": 139811, - "codeunitName": "APIV2 - Sales Orders E2E", - "method": "TestActionShipAndInvoice" - }, - { - "codeunitId": 139811, - "codeunitName": "APIV2 - Sales Orders E2E", - "method": "TestClearingManualDiscounts" - }, - { - "codeunitId": 139811, - "codeunitName": "APIV2 - Sales Orders E2E", - "method": "TestCreateOrderThroughPageAndAPI" - }, - { - "codeunitId": 139811, - "codeunitName": "APIV2 - Sales Orders E2E", - "method": "TestDeleteOrders" - }, - { - "codeunitId": 139811, - "codeunitName": "APIV2 - Sales Orders E2E", - "method": "TestEmptyModifyOrders" - }, - { - "codeunitId": 139811, - "codeunitName": "APIV2 - Sales Orders E2E", - "method": "TestGetOrders" - }, - { - "codeunitId": 139811, - "codeunitName": "APIV2 - Sales Orders E2E", - "method": "TestGetOrdersAppliesDiscountPct" - }, - { - "codeunitId": 139811, - "codeunitName": "APIV2 - Sales Orders E2E", - "method": "TestGetOrdersRedistributesDiscountAmt" - }, - { - "codeunitId": 139811, - "codeunitName": "APIV2 - Sales Orders E2E", - "method": "TestModifyOrders" - }, - { - "codeunitId": 139811, - "codeunitName": "APIV2 - Sales Orders E2E", - "method": "TestModifyOrderSetManualDiscount" - }, - { - "codeunitId": 139811, - "codeunitName": "APIV2 - Sales Orders E2E", - "method": "TestPartialModifyOrders" - }, - { - "codeunitId": 139811, - "codeunitName": "APIV2 - Sales Orders E2E", - "method": "TestPostOrderForCustomerWithLocationCode" - }, - { - "codeunitId": 139811, - "codeunitName": "APIV2 - Sales Orders E2E", - "method": "TestPostOrders" - }, - { - "codeunitId": 139811, - "codeunitName": "APIV2 - Sales Orders E2E", - "method": "TestPostOrderWithCurrency" - }, - { - "codeunitId": 139812, - "codeunitName": "APIV2 - UofM E2E", - "method": "TestDeleteUnitOfMeasure" - }, - { - "codeunitId": 139812, - "codeunitName": "APIV2 - UofM E2E", - "method": "TestGetUnitOfMeasure" - }, - { - "codeunitId": 139812, - "codeunitName": "APIV2 - UofM E2E", - "method": "TestInsertUnitOfMeasure" - }, - { - "codeunitId": 139812, - "codeunitName": "APIV2 - UofM E2E", - "method": "TestModifyUnitOfMeasure" - }, - { - "codeunitId": 139813, - "codeunitName": "APIV2 - Currencies E2E", - "method": "TestCreateCurrency" - }, - { - "codeunitId": 139813, - "codeunitName": "APIV2 - Currencies E2E", - "method": "TestDeleteCurrency" - }, - { - "codeunitId": 139813, - "codeunitName": "APIV2 - Currencies E2E", - "method": "TestGetCurrencies" - }, - { - "codeunitId": 139813, - "codeunitName": "APIV2 - Currencies E2E", - "method": "TestModifyCurrency" - }, - { - "codeunitId": 139814, - "codeunitName": "APIV2 - Payment Methods E2E", - "method": "TestCreatePaymentMethods" - }, - { - "codeunitId": 139814, - "codeunitName": "APIV2 - Payment Methods E2E", - "method": "TestDeletePaymentMethods" - }, - { - "codeunitId": 139814, - "codeunitName": "APIV2 - Payment Methods E2E", - "method": "TestGetPaymentMethods" - }, - { - "codeunitId": 139814, - "codeunitName": "APIV2 - Payment Methods E2E", - "method": "TestModifyPaymentMethods" - }, - { - "codeunitId": 139815, - "codeunitName": "APIV2 - Balance Sheet E2E", - "method": "TestGetBalanceSheetRecords" - }, - { - "codeunitId": 139816, - "codeunitName": "APIV2 - Income Statement E2E", - "method": "TestGetIncomeStatementRecords" - }, - { - "codeunitId": 139817, - "codeunitName": "APIV2 - CashFlow Statement E2E", - "method": "TestGetCashFlowRecords" - }, - { - "codeunitId": 139818, - "codeunitName": "APIV2 - Trial Balance E2E", - "method": "TestGetTrialBalanceRecords" - }, - { - "codeunitId": 139819, - "codeunitName": "APIV2 - Aged AP E2E", - "method": "TestGetAgedAPRecords" - }, - { - "codeunitId": 139820, - "codeunitName": "APIV2 - Aged AR E2E", - "method": "TestGetAgedARRecords" - }, - { - "codeunitId": 139821, - "codeunitName": "APIV2 - Ret. Earnings E2E", - "method": "TestRetainedEarningsStatementRecords" - }, - { - "codeunitId": 139822, - "codeunitName": "APIV2 - Employees E2E", - "method": "TestCreateEmployee" - }, - { - "codeunitId": 139822, - "codeunitName": "APIV2 - Employees E2E", - "method": "TestDeleteEmployee" - }, - { - "codeunitId": 139822, - "codeunitName": "APIV2 - Employees E2E", - "method": "TestGetEmployee" - }, - { - "codeunitId": 139822, - "codeunitName": "APIV2 - Employees E2E", - "method": "TestModifyEmployee" - }, - { - "codeunitId": 139823, - "codeunitName": "APIV2 - Sales Quotes E2E", - "method": "TestActionMakeInvoiceFromQuote" - }, - { - "codeunitId": 139823, - "codeunitName": "APIV2 - Sales Quotes E2E", - "method": "TestActionMakeOrderFromQuote" - }, - { - "codeunitId": 139823, - "codeunitName": "APIV2 - Sales Quotes E2E", - "method": "TestActionSendQuote" - }, - { - "codeunitId": 139823, - "codeunitName": "APIV2 - Sales Quotes E2E", - "method": "TestClearingManualDiscounts" - }, - { - "codeunitId": 139823, - "codeunitName": "APIV2 - Sales Quotes E2E", - "method": "TestCreateQuoteThroughPageAndAPI" - }, - { - "codeunitId": 139823, - "codeunitName": "APIV2 - Sales Quotes E2E", - "method": "TestDeleteQuotes" - }, - { - "codeunitId": 139823, - "codeunitName": "APIV2 - Sales Quotes E2E", - "method": "TestEmptyModifyQuotes" - }, - { - "codeunitId": 139823, - "codeunitName": "APIV2 - Sales Quotes E2E", - "method": "TestGetQuotes" - }, - { - "codeunitId": 139823, - "codeunitName": "APIV2 - Sales Quotes E2E", - "method": "TestGetQuotesAppliesDiscountPct" - }, - { - "codeunitId": 139823, - "codeunitName": "APIV2 - Sales Quotes E2E", - "method": "TestGetQuotesRedistributesDiscountAmt" - }, - { - "codeunitId": 139823, - "codeunitName": "APIV2 - Sales Quotes E2E", - "method": "TestModifyQuotes" - }, - { - "codeunitId": 139823, - "codeunitName": "APIV2 - Sales Quotes E2E", - "method": "TestModifyQuoteSetManualDiscount" - }, - { - "codeunitId": 139823, - "codeunitName": "APIV2 - Sales Quotes E2E", - "method": "TestPartialModifyQuotes" - }, - { - "codeunitId": 139823, - "codeunitName": "APIV2 - Sales Quotes E2E", - "method": "TestPostQuotes" - }, - { - "codeunitId": 139823, - "codeunitName": "APIV2 - Sales Quotes E2E", - "method": "TestPostQuoteWithCurrency" - }, - { - "codeunitId": 139824, - "codeunitName": "APIV2 - Dimensions E2E", - "method": "TestGetDimensions" - }, - { - "codeunitId": 139824, - "codeunitName": "APIV2 - Dimensions E2E", - "method": "TestGetDimensionValues" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestCreateDoesntWorkWithAlreadyExistingCode" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestCreateJournalLineDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestCreatePurchaseCrMemoDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestCreatePurchaseInvoiceDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestCreatePurchaseOrderDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestCreateSalesCrMemoDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestCreateSalesInvoiceDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestCreateSalesOrderDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestCreateSalesQuoteDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestCreateTimeRegEntryDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestDeleteDimensionSetLineOfGenJournalLines" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestDeletePurchaseCrMemoDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestDeletePurchaseInvoiceDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestDeletePurchaseOrderDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestDeleteSalesCrMemoDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestDeleteSalesInvoiceDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestDeleteSalesOrderDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestDeleteSalesQuoteDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestDeleteTimeRegEntryDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestGetDimensionSetLinesOfGLEntry" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestGetDimensionSetLinesOfJournalLines" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestGetDimensionSetLinesOfPurchaseCrMemo" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestGetDimensionSetLinesOfPurchaseInvoice" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestGetDimensionSetLinesOfPurchaseOrder" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestGetDimensionSetLinesOfSalesCrMemo" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestGetDimensionSetLinesOfSalesInvoice" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestGetDimensionSetLinesOfSalesOrder" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestGetDimensionSetLinesOfSalesQuote" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestGetDimensionSetLinesOfTimeRegEntry" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestModifyDimensionSetLineOfGenJournalLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestModifyDimensionSetLineOfSalesOrder" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestModifyDimensionSetLineOfSalesQuote" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestModifyOfDimensionCodeDoesntWork" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestModifyPurchaseCrMemoDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestModifyPurchaseInvoiceDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestModifyPurchaseOrderDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestModifySalesCrMemoDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestModifySalesInvoiceDimensionSetLine" - }, - { - "codeunitId": 139825, - "codeunitName": "APIV2 - Dim. Set Lines E2E", - "method": "TestModifyTimeRegEntryDimensionSetLine" - }, - { - "codeunitId": 139827, - "codeunitName": "APIV2 - Journals E2E", - "method": "TestActionPostGenJournalBatch" - }, - { - "codeunitId": 139827, - "codeunitName": "APIV2 - Journals E2E", - "method": "TestCreateJournal" - }, - { - "codeunitId": 139827, - "codeunitName": "APIV2 - Journals E2E", - "method": "TestDeleteJournal" - }, - { - "codeunitId": 139827, - "codeunitName": "APIV2 - Journals E2E", - "method": "TestGetJournals" - }, - { - "codeunitId": 139827, - "codeunitName": "APIV2 - Journals E2E", - "method": "TestModifyJournal" - }, - { - "codeunitId": 139828, - "codeunitName": "APIV2 - Sales Credit Memos E2E", - "method": "TestActionCancelAndSendCorrectiveCreditMemo" - }, - { - "codeunitId": 139828, - "codeunitName": "APIV2 - Sales Credit Memos E2E", - "method": "TestActionCancelCorrectiveCreditMemo" - }, - { - "codeunitId": 139828, - "codeunitName": "APIV2 - Sales Credit Memos E2E", - "method": "TestActionPostAndSendCreditMemo" - }, - { - "codeunitId": 139828, - "codeunitName": "APIV2 - Sales Credit Memos E2E", - "method": "TestActionPostCreditMemo" - }, - { - "codeunitId": 139828, - "codeunitName": "APIV2 - Sales Credit Memos E2E", - "method": "TestActionSendCancelledCreditMemo" - }, - { - "codeunitId": 139828, - "codeunitName": "APIV2 - Sales Credit Memos E2E", - "method": "TestActionSendPostedCreditMemo" - }, - { - "codeunitId": 139828, - "codeunitName": "APIV2 - Sales Credit Memos E2E", - "method": "TestClearingManualDiscounts" - }, - { - "codeunitId": 139828, - "codeunitName": "APIV2 - Sales Credit Memos E2E", - "method": "TestCreateCreditMemoThroughPageAndAPI" - }, - { - "codeunitId": 139828, - "codeunitName": "APIV2 - Sales Credit Memos E2E", - "method": "TestDeleteCreditMemo" - }, - { - "codeunitId": 139828, - "codeunitName": "APIV2 - Sales Credit Memos E2E", - "method": "TestEmptyModifyCreditMemos" - }, - { - "codeunitId": 139828, - "codeunitName": "APIV2 - Sales Credit Memos E2E", - "method": "TestGetCreditMemos" - }, - { - "codeunitId": 139828, - "codeunitName": "APIV2 - Sales Credit Memos E2E", - "method": "TestGetCreditMemosAppliesDiscountPct" - }, - { - "codeunitId": 139828, - "codeunitName": "APIV2 - Sales Credit Memos E2E", - "method": "TestGetCreditMemosRedistributesDiscountAmt" - }, - { - "codeunitId": 139828, - "codeunitName": "APIV2 - Sales Credit Memos E2E", - "method": "TestModifyCreditMemos" - }, - { - "codeunitId": 139828, - "codeunitName": "APIV2 - Sales Credit Memos E2E", - "method": "TestModifyCreditMemoSetManualDiscount" - }, - { - "codeunitId": 139828, - "codeunitName": "APIV2 - Sales Credit Memos E2E", - "method": "TestPartialModifyCreditMemos" - }, - { - "codeunitId": 139828, - "codeunitName": "APIV2 - Sales Credit Memos E2E", - "method": "TestPostCreditMemos" - }, - { - "codeunitId": 139828, - "codeunitName": "APIV2 - Sales Credit Memos E2E", - "method": "TestPostCreditMemoWithCurrency" - }, - { - "codeunitId": 139829, - "codeunitName": "APIV2 - Purchase Invoices E2E", - "method": "TestActionPostPurchaseInvoice" - }, - { - "codeunitId": 139829, - "codeunitName": "APIV2 - Purchase Invoices E2E", - "method": "TestCreateInvoiceThroughPageAndAPI" - }, - { - "codeunitId": 139829, - "codeunitName": "APIV2 - Purchase Invoices E2E", - "method": "TestDeleteInvoice" - }, - { - "codeunitId": 139829, - "codeunitName": "APIV2 - Purchase Invoices E2E", - "method": "TestEmptyModifyInvoices" - }, - { - "codeunitId": 139829, - "codeunitName": "APIV2 - Purchase Invoices E2E", - "method": "TestGetInvoiceFromPostedOrderCorrectOrderIdAndNo" - }, - { - "codeunitId": 139829, - "codeunitName": "APIV2 - Purchase Invoices E2E", - "method": "TestGetInvoices" - }, - { - "codeunitId": 139829, - "codeunitName": "APIV2 - Purchase Invoices E2E", - "method": "TestGetPurchaseInvoiceFromDraftId" - }, - { - "codeunitId": 139829, - "codeunitName": "APIV2 - Purchase Invoices E2E", - "method": "TestModifyInvoices" - }, - { - "codeunitId": 139829, - "codeunitName": "APIV2 - Purchase Invoices E2E", - "method": "TestPartialModifyInvoices" - }, - { - "codeunitId": 139829, - "codeunitName": "APIV2 - Purchase Invoices E2E", - "method": "TestPostInvoices" - }, - { - "codeunitId": 139829, - "codeunitName": "APIV2 - Purchase Invoices E2E", - "method": "TestPostPurchaseInvoiceWithCurrency" - }, - { - "codeunitId": 139830, - "codeunitName": "APIV2 - GLEntries E2E", - "method": "TestGetGLEntries" - }, - { - "codeunitId": 139831, - "codeunitName": "APIV2 - Automation RS Package", - "method": "TestApplyRSPackage" - }, - { - "codeunitId": 139831, - "codeunitName": "APIV2 - Automation RS Package", - "method": "TestCreateRSPackage" - }, - { - "codeunitId": 139831, - "codeunitName": "APIV2 - Automation RS Package", - "method": "TestImportRSPackage" - }, - { - "codeunitId": 139831, - "codeunitName": "APIV2 - Automation RS Package", - "method": "TestImportWrongRSPackage" - }, - { - "codeunitId": 139831, - "codeunitName": "APIV2 - Automation RS Package", - "method": "TestUploadRSPackageFile" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestCreateDraftInvoiceAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestCreateDraftOrderAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestCreateDraftPurchaseCreditMemoAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestCreateDraftPurchaseInvoiceAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestCreateDraftPurchaseOrderAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestCreateGLEntryAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestCreateJournalLineAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestCreatePostedInvoiceAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestCreatePostedPurchaseCreditMemoAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestCreatePostedPurchaseInvoiceAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestCreateQuoteAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestDeleteDraftInvoiceAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestDeleteDraftPurchaseCreditMemoAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestDeleteDraftPurchaseInvoiceAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestDeleteGLEntryAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestDeleteJournalLineAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestDeletePostedInvoiceAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestDeletePostedPurchaseCreditMemoAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestDeletePostedPurchaseInvoiceAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestDeleteQuoteAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestGetDraftInvoiceAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestGetDraftInvoiceAttachments" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestGetDraftOrderAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestGetDraftOrderAttachments" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestGetDraftPurchaseCreditMemoAttachments" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestGetDraftPurchaseInvoiceAttachments" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestGetDraftPurchaseOrderAttachments" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestGetGLEntryAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestGetGLEntryAttachments" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestGetJournalAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestGetJournalLineAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestGetJournalLineAttachments" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestGetPostedInvoiceAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestGetPostedInvoiceAttachments" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestGetPostedPurchaseCreditMemoAttachments" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestGetPostedPurchaseInvoiceAttachments" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestGetQuoteAttachment" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestGetQuoteAttachments" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestLinkedAttachmentContentChangeKeepsOtherFieldsUnchanged" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestLinkedAttachmentDocumentIdChangeNotAllowed" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestLinkedAttachmentFileNameChangeKeepsOtherFieldsUnchanged" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestTransferAttachmentFromDraftToPostedInvoice" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestTransferAttachmentFromDraftToPostedPurchaseCreditMemo" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestTransferAttachmentFromDraftToPostedPurchaseInvoice" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestUpdateGenJournalLineAttachmentBinaryContent" - }, - { - "codeunitId": 139833, - "codeunitName": "APIV2 - Attachments E2E", - "method": "TestUpdateGLEntryAttachmentBinaryContent" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestCreateLineThroughPageAndAPI" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestDeleteInvoiceLine" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestDeletingLineKeepsInvoiceDiscountAmt" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestDeletingLineMovesInvoiceDiscountPct" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestDeletingLineRemovesInvoiceDiscountPct" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestGetInvoiceLineDirectly" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestGetInvoiceLines" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestGetInvoiceLinesDirectlyWithDocumentIdFilter" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestGetPostedInvoiceLines" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestGettingLinesWithDifferentTypes" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestInsertingLineKeepsInvoiceDiscountAmt" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestInsertingLineUpdatesInvoiceDiscountPct" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestModifyingLineKeepsInvoiceDiscountAmt" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestModifyingLineUpdatesInvoiceDiscountPct" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestModifyInvoiceLine" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestModifyInvoiceLineWithUoM" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestPatchingTheIdToAccountChangesLineType" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestPatchingTheIdToItemChangesLineType" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestPatchingTheTypeBlanksIds" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestPostingBlankLineDefaultsToCommentType" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestPostingCommentLine" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestPostInvoiceLines" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestPostInvoiceLinesWithItemVariant" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestPostInvoiceLinesWithUoM" - }, - { - "codeunitId": 139834, - "codeunitName": "APIV2 - Sales Inv. Lines E2E", - "method": "TestPostInvoiceLineWithSequence" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestCreateLineThroughPageAndAPI" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestCreatingOrderLineWithAssemblyBOM" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestDeleteOrderLine" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestDeletingLineKeepsOrderDiscountAmt" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestDeletingLineMovesOrderDiscountPct" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestDeletingLineRemovesOrderDiscountPct" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestExpandReturnsCorrectDocumentLines" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestExpandReturnsCorrectDocumentLinesWithMultipleDocuments" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestGetOrderLineDirectly" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestGetOrderLines" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestGetOrderLinesDirectlyWithDocumentIdFilter" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestGettingLinesWithDifferentTypes" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestInsertingLineKeepsOrderDiscountAmt" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestInsertingLineUpdatesOrderDiscountPct" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestModifyingLineKeepsOrderDiscountAmt" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestModifyingLineUpdatesOrderDiscountPct" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestModifyOrderLines" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestPatchingTheIdToAccountChangesLineType" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestPatchingTheIdToItemChangesLineType" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestPatchingTheTypeBlanksIds" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestPostingBlankLineDefaultsToCommentType" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestPostingCommentLine" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestPostOrderLines" - }, - { - "codeunitId": 139835, - "codeunitName": "APIV2 - Sales Order Lines E2E", - "method": "TestPostOrderLineWithItemVariant" - }, - { - "codeunitId": 139836, - "codeunitName": "APIV2 - Sales Quote Lines E2E", - "method": "TestDeleteQuoteLine" - }, - { - "codeunitId": 139836, - "codeunitName": "APIV2 - Sales Quote Lines E2E", - "method": "TestDeletingLineKeepsQuoteDiscountAmt" - }, - { - "codeunitId": 139836, - "codeunitName": "APIV2 - Sales Quote Lines E2E", - "method": "TestDeletingLineMovesQuoteDiscountPct" - }, - { - "codeunitId": 139836, - "codeunitName": "APIV2 - Sales Quote Lines E2E", - "method": "TestDeletingLineRemovesQuoteDiscountPct" - }, - { - "codeunitId": 139836, - "codeunitName": "APIV2 - Sales Quote Lines E2E", - "method": "TestGetQuoteLineDirectly" - }, - { - "codeunitId": 139836, - "codeunitName": "APIV2 - Sales Quote Lines E2E", - "method": "TestGetQuoteLines" - }, - { - "codeunitId": 139836, - "codeunitName": "APIV2 - Sales Quote Lines E2E", - "method": "TestGetQuoteLinesDirectlyWithDocumentIdFilter" - }, - { - "codeunitId": 139836, - "codeunitName": "APIV2 - Sales Quote Lines E2E", - "method": "TestInsertingLineKeepsQuoteDiscountAmt" - }, - { - "codeunitId": 139836, - "codeunitName": "APIV2 - Sales Quote Lines E2E", - "method": "TestInsertingLineUpdatesQuoteDiscountPct" - }, - { - "codeunitId": 139836, - "codeunitName": "APIV2 - Sales Quote Lines E2E", - "method": "TestModifyingLineKeepsQuoteDiscountAmt" - }, - { - "codeunitId": 139836, - "codeunitName": "APIV2 - Sales Quote Lines E2E", - "method": "TestModifyingLineUpdatesQuoteDiscountPct" - }, - { - "codeunitId": 139836, - "codeunitName": "APIV2 - Sales Quote Lines E2E", - "method": "TestModifyQuoteLines" - }, - { - "codeunitId": 139836, - "codeunitName": "APIV2 - Sales Quote Lines E2E", - "method": "TestPatchingTheTypeBlanksIds" - }, - { - "codeunitId": 139836, - "codeunitName": "APIV2 - Sales Quote Lines E2E", - "method": "TestPostingBlankLineDefaultsToCommentType" - }, - { - "codeunitId": 139836, - "codeunitName": "APIV2 - Sales Quote Lines E2E", - "method": "TestPostingCommentLine" - }, - { - "codeunitId": 139836, - "codeunitName": "APIV2 - Sales Quote Lines E2E", - "method": "TestPostQuoteLines" - }, - { - "codeunitId": 139836, - "codeunitName": "APIV2 - Sales Quote Lines E2E", - "method": "TestPostQuoteLinesWithItemVariant" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestCreateLineThroughPageAndAPI" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestDeleteCreditMemoLine" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestDeletePostedCreditMemoLine" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestDeletingLineKeepsCreditMemoDiscountAmt" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestDeletingLineMovesCreditMemoDiscountPct" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestDeletingLineRemovesCreditMemoDiscountPct" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestGetCreditMemoLineDirectly" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestGetCreditMemoLines" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestGetCreditMemoLinesDirectlyWithDocumentIdFilter" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestGetPostedCreditMemoLines" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestGettingLinesWithDifferentTypes" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestInsertingLineKeepsCreditMemoDiscountAmt" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestInsertingLineUpdatesCreditMemoDiscountPct" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestModifyCreditMemoLines" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestModifyingLineKeepsCreditMemoDiscountAmt" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestModifyingLineUpdatesCreditMemoDiscountPct" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestPatchingTheIdToAccountChangesLineType" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestPatchingTheIdToItemChangesLineType" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestPatchingTheTypeBlanksIds" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestPostCreditMemoLines" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestPostCreditMemoLinesWithItemVariant" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestPostCreditMemoLineWithSequence" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestPostingBlankLineDefaultsToCommentType" - }, - { - "codeunitId": 139837, - "codeunitName": "APIV2 - Sales CrMemo Lines E2E", - "method": "TestPostingCommentLine" - }, - { - "codeunitId": 139838, - "codeunitName": "APIV2 - Purchase Inv Lines E2E", - "method": "TestCreateLineThroughPageAndAPI" - }, - { - "codeunitId": 139838, - "codeunitName": "APIV2 - Purchase Inv Lines E2E", - "method": "TestDeleteInvoiceLine" - }, - { - "codeunitId": 139838, - "codeunitName": "APIV2 - Purchase Inv Lines E2E", - "method": "TestDeletingLineRemovesInvoiceDiscountPct" - }, - { - "codeunitId": 139838, - "codeunitName": "APIV2 - Purchase Inv Lines E2E", - "method": "TestGetInvoiceLineDirectly" - }, - { - "codeunitId": 139838, - "codeunitName": "APIV2 - Purchase Inv Lines E2E", - "method": "TestGetInvoiceLines" - }, - { - "codeunitId": 139838, - "codeunitName": "APIV2 - Purchase Inv Lines E2E", - "method": "TestGetInvoiceLinesDirectlyWithDocumentIdFilter" - }, - { - "codeunitId": 139838, - "codeunitName": "APIV2 - Purchase Inv Lines E2E", - "method": "TestGetPostedInvoiceLines" - }, - { - "codeunitId": 139838, - "codeunitName": "APIV2 - Purchase Inv Lines E2E", - "method": "TestInsertingLineKeepsInvoiceDiscountAmt" - }, - { - "codeunitId": 139838, - "codeunitName": "APIV2 - Purchase Inv Lines E2E", - "method": "TestInsertingLineUpdatesInvoiceDiscountPct" - }, - { - "codeunitId": 139838, - "codeunitName": "APIV2 - Purchase Inv Lines E2E", - "method": "TestModifyingLineUpdatesInvoiceDiscountPct" - }, - { - "codeunitId": 139838, - "codeunitName": "APIV2 - Purchase Inv Lines E2E", - "method": "TestModifyInvoiceLines" - }, - { - "codeunitId": 139838, - "codeunitName": "APIV2 - Purchase Inv Lines E2E", - "method": "TestPatchingTheTypeBlanksIds" - }, - { - "codeunitId": 139838, - "codeunitName": "APIV2 - Purchase Inv Lines E2E", - "method": "TestPostingBlankLineDefaultsToCommentType" - }, - { - "codeunitId": 139838, - "codeunitName": "APIV2 - Purchase Inv Lines E2E", - "method": "TestPostingCommentLine" - }, - { - "codeunitId": 139838, - "codeunitName": "APIV2 - Purchase Inv Lines E2E", - "method": "TestPostInvoiceLines" - }, - { - "codeunitId": 139838, - "codeunitName": "APIV2 - Purchase Inv Lines E2E", - "method": "TestPostInvoiceLinesWithItemVariant" - }, - { - "codeunitId": 139838, - "codeunitName": "APIV2 - Purchase Inv Lines E2E", - "method": "TestPostInvoiceLineWithSequence" - }, - { - "codeunitId": 139839, - "codeunitName": "APIV2 - Item Variants E2E", - "method": "TestCreateItemVariantWithItemId" - }, - { - "codeunitId": 139839, - "codeunitName": "APIV2 - Item Variants E2E", - "method": "TestCreateItemVariantWithItemNumber" - }, - { - "codeunitId": 139839, - "codeunitName": "APIV2 - Item Variants E2E", - "method": "TestCreateItemVariantWithItemNumberAndItemId" - }, - { - "codeunitId": 139839, - "codeunitName": "APIV2 - Item Variants E2E", - "method": "TestDeleteInUse" - }, - { - "codeunitId": 139839, - "codeunitName": "APIV2 - Item Variants E2E", - "method": "TestDeleteItemVariant" - }, - { - "codeunitId": 139839, - "codeunitName": "APIV2 - Item Variants E2E", - "method": "TestGetItemVariant" - }, - { - "codeunitId": 139839, - "codeunitName": "APIV2 - Item Variants E2E", - "method": "TestModifyItemVariant" - }, - { - "codeunitId": 139839, - "codeunitName": "APIV2 - Item Variants E2E", - "method": "TestModifyItemVariantItemId" - }, - { - "codeunitId": 139839, - "codeunitName": "APIV2 - Item Variants E2E", - "method": "TestModifyItemVariantItemNumber" - }, - { - "codeunitId": 139840, - "codeunitName": "APIV2 - Customer Payments E2E", - "method": "TestAppliesToInvoiceNoAndIdSync" - }, - { - "codeunitId": 139840, - "codeunitName": "APIV2 - Customer Payments E2E", - "method": "TestCreateCustomerPayment" - }, - { - "codeunitId": 139840, - "codeunitName": "APIV2 - Customer Payments E2E", - "method": "TestCreateCustomerPaymentWithInvoiceId" - }, - { - "codeunitId": 139840, - "codeunitName": "APIV2 - Customer Payments E2E", - "method": "TestCreateCustomerPaymentWithoutDocNo" - }, - { - "codeunitId": 139840, - "codeunitName": "APIV2 - Customer Payments E2E", - "method": "TestCustomerAutofillDoesNotOverwrite" - }, - { - "codeunitId": 139840, - "codeunitName": "APIV2 - Customer Payments E2E", - "method": "TestCustomerAutofillWhenGivingInvoiceNumber" - }, - { - "codeunitId": 139840, - "codeunitName": "APIV2 - Customer Payments E2E", - "method": "TestCustomerNoAndIdSync" - }, - { - "codeunitId": 139840, - "codeunitName": "APIV2 - Customer Payments E2E", - "method": "TestDeleteCustomerPayment" - }, - { - "codeunitId": 139840, - "codeunitName": "APIV2 - Customer Payments E2E", - "method": "TestGetCustomerPayment" - }, - { - "codeunitId": 139840, - "codeunitName": "APIV2 - Customer Payments E2E", - "method": "TestModifyCustomerPayment" - }, - { - "codeunitId": 139840, - "codeunitName": "APIV2 - Customer Payments E2E", - "method": "TestModifyCustomerPaymentWithRandomDocNo" - }, - { - "codeunitId": 139841, - "codeunitName": "APIV2 - PDF Document E2E", - "method": "TestGetPDFPurchaseCreditMemo" - }, - { - "codeunitId": 139841, - "codeunitName": "APIV2 - PDF Document E2E", - "method": "TestGetPDFPurchaseInvoice" - }, - { - "codeunitId": 139841, - "codeunitName": "APIV2 - PDF Document E2E", - "method": "TestGetPDFSalesCreditMemo" - }, - { - "codeunitId": 139841, - "codeunitName": "APIV2 - PDF Document E2E", - "method": "TestGetPDFSalesInvoice" - }, - { - "codeunitId": 139841, - "codeunitName": "APIV2 - PDF Document E2E", - "method": "TestGetPDFSalesOrder" - }, - { - "codeunitId": 139841, - "codeunitName": "APIV2 - PDF Document E2E", - "method": "TestGetPDFSalesQuote" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureMetadataContact" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureMetadataContactWithoutPicture" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureMetadataCustomer" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureMetadataCustomerWithoutPicture" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureMetadataEmployee" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureMetadataEmployeeWithoutPicture" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureMetadataItem" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureMetadataVendor" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureMetadataVendorWithoutPicture" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureMetadatItemWithoutPicture" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureValueContact" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureValueContactWithoutPicture" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureValueCustomer" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureValueCustomerWithoutPicture" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureValueEmployee" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureValueEmployeeWithoutPicture" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureValueItem" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureValueItemWithoutPicture" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureValueVendor" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestGetPictureValueVendorWithoutPicture" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestPictureDeleteContact" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestPictureDeleteCustomer" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestPictureDeleteEmployee" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestPictureDeleteItem" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestPictureDeleteVendor" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestPictureReplaceContact" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestPictureReplaceCustomer" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestPictureReplaceEmployee" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestPictureReplaceItem" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestPictureReplaceVendor" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestPictureUploadContact" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestPictureUploadCustomer" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestPictureUploadEmployee" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestPictureUploadItem" - }, - { - "codeunitId": 139842, - "codeunitName": "APIV2 - Pictures E2E", - "method": "TestPictureUploadVendor" - }, - { - "codeunitId": 139843, - "codeunitName": "APIV2 - Vendor Payments E2E", - "method": "TestAppliesToInvoiceNoAndIdSync" - }, - { - "codeunitId": 139843, - "codeunitName": "APIV2 - Vendor Payments E2E", - "method": "TestAppliesToInvoiceNumberEmptyForNonInvoiceApplication" - }, - { - "codeunitId": 139843, - "codeunitName": "APIV2 - Vendor Payments E2E", - "method": "TestCreateVendorPayment" - }, - { - "codeunitId": 139843, - "codeunitName": "APIV2 - Vendor Payments E2E", - "method": "TestCreateVendorPaymentWithInvoiceId" - }, - { - "codeunitId": 139843, - "codeunitName": "APIV2 - Vendor Payments E2E", - "method": "TestCreateVendorPaymentWithoutDocNo" - }, - { - "codeunitId": 139843, - "codeunitName": "APIV2 - Vendor Payments E2E", - "method": "TestDeleteVendorPayment" - }, - { - "codeunitId": 139843, - "codeunitName": "APIV2 - Vendor Payments E2E", - "method": "TestGetVendorPayment" - }, - { - "codeunitId": 139843, - "codeunitName": "APIV2 - Vendor Payments E2E", - "method": "TestGetVendorPaymentWithoutInvoiceApplicationIsVisible" - }, - { - "codeunitId": 139843, - "codeunitName": "APIV2 - Vendor Payments E2E", - "method": "TestModifyVendorPayment" - }, - { - "codeunitId": 139843, - "codeunitName": "APIV2 - Vendor Payments E2E", - "method": "TestModifyVendorPaymentWithRandomDocNo" - }, - { - "codeunitId": 139843, - "codeunitName": "APIV2 - Vendor Payments E2E", - "method": "TestVendorAutofillDoesNotOverwrite" - }, - { - "codeunitId": 139843, - "codeunitName": "APIV2 - Vendor Payments E2E", - "method": "TestVendorAutofillWhenGivingInvoiceNumber" - }, - { - "codeunitId": 139843, - "codeunitName": "APIV2 - Vendor Payments E2E", - "method": "TestVendorNoAndIdSync" - }, - { - "codeunitId": 139847, - "codeunitName": "APIV2 - Sales Shipments E2E", - "method": "TestExpandDimensions" - }, - { - "codeunitId": 139847, - "codeunitName": "APIV2 - Sales Shipments E2E", - "method": "TestGetSalesShipments" - }, - { - "codeunitId": 139848, - "codeunitName": "APIV2 - Sales Ship. Lines E2E", - "method": "TestExpandDimensions" - }, - { - "codeunitId": 139848, - "codeunitName": "APIV2 - Sales Ship. Lines E2E", - "method": "TestGetLineDirectly" - }, - { - "codeunitId": 139848, - "codeunitName": "APIV2 - Sales Ship. Lines E2E", - "method": "TestGetShipmentLines" - }, - { - "codeunitId": 139848, - "codeunitName": "APIV2 - Sales Ship. Lines E2E", - "method": "TestGetShipmentLinesDirectlyWithDocumentIdFilter" - }, - { - "codeunitId": 139849, - "codeunitName": "APIV2 - Purchase Receipts E2E", - "method": "TestExpandDimensions" - }, - { - "codeunitId": 139849, - "codeunitName": "APIV2 - Purchase Receipts E2E", - "method": "TestGetPurchaseReceipts" - }, - { - "codeunitId": 139850, - "codeunitName": "APIV2 - Purch. Rcpt. Lines E2E", - "method": "TestExpandDimensions" - }, - { - "codeunitId": 139850, - "codeunitName": "APIV2 - Purch. Rcpt. Lines E2E", - "method": "TestGetLineDirectly" - }, - { - "codeunitId": 139850, - "codeunitName": "APIV2 - Purch. Rcpt. Lines E2E", - "method": "TestGetReceiptLines" - }, - { - "codeunitId": 139850, - "codeunitName": "APIV2 - Purch. Rcpt. Lines E2E", - "method": "TestGetReceiptLinesDirectlyWithDocumentIdFilter" - }, - { - "codeunitId": 139851, - "codeunitName": "APIV2 - Purchase Orders E2E", - "method": "TestActionRecieveAndInvoice" - }, - { - "codeunitId": 139851, - "codeunitName": "APIV2 - Purchase Orders E2E", - "method": "TestClearingManualDiscounts" - }, - { - "codeunitId": 139851, - "codeunitName": "APIV2 - Purchase Orders E2E", - "method": "TestCreateOrderThroughPageAndAPI" - }, - { - "codeunitId": 139851, - "codeunitName": "APIV2 - Purchase Orders E2E", - "method": "TestDeleteOrders" - }, - { - "codeunitId": 139851, - "codeunitName": "APIV2 - Purchase Orders E2E", - "method": "TestEmptyModifyOrders" - }, - { - "codeunitId": 139851, - "codeunitName": "APIV2 - Purchase Orders E2E", - "method": "TestGetOrders" - }, - { - "codeunitId": 139851, - "codeunitName": "APIV2 - Purchase Orders E2E", - "method": "TestGetOrdersAppliesDiscountPct" - }, - { - "codeunitId": 139851, - "codeunitName": "APIV2 - Purchase Orders E2E", - "method": "TestGetOrdersRedistributesDiscountAmt" - }, - { - "codeunitId": 139851, - "codeunitName": "APIV2 - Purchase Orders E2E", - "method": "TestModifyOrders" - }, - { - "codeunitId": 139851, - "codeunitName": "APIV2 - Purchase Orders E2E", - "method": "TestModifyOrderSetManualDiscount" - }, - { - "codeunitId": 139851, - "codeunitName": "APIV2 - Purchase Orders E2E", - "method": "TestPartialModifyOrders" - }, - { - "codeunitId": 139851, - "codeunitName": "APIV2 - Purchase Orders E2E", - "method": "TestPostOrderForCustomerWithLocationCode" - }, - { - "codeunitId": 139851, - "codeunitName": "APIV2 - Purchase Orders E2E", - "method": "TestPostOrders" - }, - { - "codeunitId": 139851, - "codeunitName": "APIV2 - Purchase Orders E2E", - "method": "TestPostOrdersWithEmptyShippingAddress" - }, - { - "codeunitId": 139851, - "codeunitName": "APIV2 - Purchase Orders E2E", - "method": "TestPostOrderWithCurrency" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestCreateLineThroughPageAndAPI" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestDeleteOrderLine" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestDeletingLineKeepsOrderDiscountAmt" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestDeletingLineMovesOrderDiscountPct" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestDeletingLineRemovesOrderDiscountPct" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestGetOrderLineDirectly" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestGetOrderLines" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestGetOrderLinesDirectlyWithDocumentIdFilter" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestGettingLinesWithDifferentTypes" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestInsertingLineKeepsOrderDiscountAmt" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestInsertingLineUpdatesOrderDiscountPct" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestModifyingLineKeepsOrderDiscountAmt" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestModifyingLineUpdatesOrderDiscountPct" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestModifyOrderLines" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestPatchingTheIdToAccountChangesLineType" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestPatchingTheIdToItemChangesLineType" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestPatchingTheTypeBlanksIds" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestPostingBlankLineDefaultsToCommentType" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestPostingCommentLine" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestPostOrderLines" - }, - { - "codeunitId": 139852, - "codeunitName": "APIV2 - Purch. Order Lines E2E", - "method": "TestPostOrderLineWithItemVariant" - }, - { - "codeunitId": 139853, - "codeunitName": "APIV2 - Contacts Inf. E2E", - "method": "TestGetCustomerContactInformation" - }, - { - "codeunitId": 139853, - "codeunitName": "APIV2 - Contacts Inf. E2E", - "method": "TestGetCustomerContactsInformation" - }, - { - "codeunitId": 139853, - "codeunitName": "APIV2 - Contacts Inf. E2E", - "method": "TestGetVendorContactInformation" - }, - { - "codeunitId": 139853, - "codeunitName": "APIV2 - Contacts Inf. E2E", - "method": "TestGetVendorContactsInformation" - }, - { - "codeunitId": 139854, - "codeunitName": "APIV2 - Item Ledg. Entries E2E", - "method": "TestGetItemLedgerEntries" - }, - { - "codeunitId": 139855, - "codeunitName": "APIV2 - Opportunities E2E", - "method": "TestCannotPatchContactNoOfWonOpportunity" - }, - { - "codeunitId": 139855, - "codeunitName": "APIV2 - Opportunities E2E", - "method": "TestCannotPatchSPCodeOfWonOpportunity" - }, - { - "codeunitId": 139855, - "codeunitName": "APIV2 - Opportunities E2E", - "method": "TestCreateOpportunity" - }, - { - "codeunitId": 139855, - "codeunitName": "APIV2 - Opportunities E2E", - "method": "TestCreateOpportunityContactNo" - }, - { - "codeunitId": 139855, - "codeunitName": "APIV2 - Opportunities E2E", - "method": "TestGetOpportunities" - }, - { - "codeunitId": 139855, - "codeunitName": "APIV2 - Opportunities E2E", - "method": "TestPatchOpportunity" - }, - { - "codeunitId": 139856, - "codeunitName": "APIV2 - GenProdPostGroup E2E", - "method": "TestGetGenProdPostGroups" - }, - { - "codeunitId": 139857, - "codeunitName": "APIV2 - InventoryPostGroup E2E", - "method": "TestGetInventoryPostGroups" - }, - { - "codeunitId": 139858, - "codeunitName": "APIV2 Currency Exch. Rate E2E", - "method": "TestGetCurrencyExchangeRates" - }, - { - "codeunitId": 139858, - "codeunitName": "APIV2 Currency Exch. Rate E2E", - "method": "TestSingleGetCurrencyExchangeRate" - }, - { - "codeunitId": 139859, - "codeunitName": "APIV2 - Accounting Periods E2E", - "method": "TestGetAccountingPeriods" - }, - { - "codeunitId": 139860, - "codeunitName": "APIV2 - G/L Setup E2E", - "method": "TestGetGLSetup" - }, - { - "codeunitId": 139861, - "codeunitName": "APIV2JobQueueLogEntriesE2E", - "method": "TestGetJobQueueLogEntry" - }, - { - "codeunitId": 139862, - "codeunitName": "APIV2JobQueueEntriesE2E", - "method": "TestGetCorrespondingJobQueueLogEntryFromExpand" - }, - { - "codeunitId": 139862, - "codeunitName": "APIV2JobQueueEntriesE2E", - "method": "TestGetCorrespondingJobQueueLogEntryFromSubPage" - }, - { - "codeunitId": 139862, - "codeunitName": "APIV2JobQueueEntriesE2E", - "method": "TestGetJobQueueEntry" - }, - { - "codeunitId": 139862, - "codeunitName": "APIV2JobQueueEntriesE2E", - "method": "TestRescheduleJobQueueEntry" - }, - { - "codeunitId": 139865, - "codeunitName": "APIV2 - Purch. Cr. Memos E2E", - "method": "TestActionCancelCorrectiveCreditMemo" - }, - { - "codeunitId": 139865, - "codeunitName": "APIV2 - Purch. Cr. Memos E2E", - "method": "TestActionPostCreditMemo" - }, - { - "codeunitId": 139865, - "codeunitName": "APIV2 - Purch. Cr. Memos E2E", - "method": "TestClearingManualDiscounts" - }, - { - "codeunitId": 139865, - "codeunitName": "APIV2 - Purch. Cr. Memos E2E", - "method": "TestCreateCreditMemoThroughPageAndAPI" - }, - { - "codeunitId": 139865, - "codeunitName": "APIV2 - Purch. Cr. Memos E2E", - "method": "TestDeleteCreditMemo" - }, - { - "codeunitId": 139865, - "codeunitName": "APIV2 - Purch. Cr. Memos E2E", - "method": "TestEmptyModifyCreditMemos" - }, - { - "codeunitId": 139865, - "codeunitName": "APIV2 - Purch. Cr. Memos E2E", - "method": "TestGetCreditMemos" - }, - { - "codeunitId": 139865, - "codeunitName": "APIV2 - Purch. Cr. Memos E2E", - "method": "TestModifyCreditMemos" - }, - { - "codeunitId": 139865, - "codeunitName": "APIV2 - Purch. Cr. Memos E2E", - "method": "TestModifyCreditMemoSetManualDiscount" - }, - { - "codeunitId": 139865, - "codeunitName": "APIV2 - Purch. Cr. Memos E2E", - "method": "TestPartialModifyCreditMemos" - }, - { - "codeunitId": 139865, - "codeunitName": "APIV2 - Purch. Cr. Memos E2E", - "method": "TestPostCreditMemos" - }, - { - "codeunitId": 139865, - "codeunitName": "APIV2 - Purch. Cr. Memos E2E", - "method": "TestPostCreditMemoWithCurrency" - }, - { - "codeunitId": 139865, - "codeunitName": "APIV2 - Purch. Cr. Memos E2E", - "method": "TestPostCreditMemoWithVendorCreditMemoNo" - }, - { - "codeunitId": 139866, - "codeunitName": "APIV2 - Contacts E2E", - "method": "TestDeleteContact" - }, - { - "codeunitId": 139866, - "codeunitName": "APIV2 - Contacts E2E", - "method": "TestGetContactWithAddressAndSpecialCharacters" - }, - { - "codeunitId": 139866, - "codeunitName": "APIV2 - Contacts E2E", - "method": "TestGetSimpleContact" - }, - { - "codeunitId": 139866, - "codeunitName": "APIV2 - Contacts E2E", - "method": "TestModifyContactWithAddress" - }, - { - "codeunitId": 139867, - "codeunitName": "APIV2 - Apply Vendor Ent. E2E", - "method": "TestApplyVendorEntryAppliesPayment" - }, - { - "codeunitId": 139867, - "codeunitName": "APIV2 - Apply Vendor Ent. E2E", - "method": "TestGetApplyVendorEntriesFailsWhenNoVendor" - }, - { - "codeunitId": 139867, - "codeunitName": "APIV2 - Apply Vendor Ent. E2E", - "method": "TestGetApplyVendorEntriesReturnsOpenEntries" - }, - { - "codeunitId": 139868, - "codeunitName": "APIV2 - Locations E2E", - "method": "TestCreateLocation" - }, - { - "codeunitId": 139868, - "codeunitName": "APIV2 - Locations E2E", - "method": "TestCreateSalesOrderLineWithLocation" - }, - { - "codeunitId": 139868, - "codeunitName": "APIV2 - Locations E2E", - "method": "TestDeleteLocation" - }, - { - "codeunitId": 139868, - "codeunitName": "APIV2 - Locations E2E", - "method": "TestGetLocation" - }, - { - "codeunitId": 139868, - "codeunitName": "APIV2 - Locations E2E", - "method": "TestModifyLocationWithAddress" - }, - { - "codeunitId": 139869, - "codeunitName": "APIV2 - Cust. Ret. Reasons E2E", - "method": "TestCreateReasonCode" - }, - { - "codeunitId": 139869, - "codeunitName": "APIV2 - Cust. Ret. Reasons E2E", - "method": "TestDeleteReasonCode" - }, - { - "codeunitId": 139869, - "codeunitName": "APIV2 - Cust. Ret. Reasons E2E", - "method": "TestGetReasonCode" - }, - { - "codeunitId": 139869, - "codeunitName": "APIV2 - Cust. Ret. Reasons E2E", - "method": "TestModifyReasonCode" - }, - { - "codeunitId": 139874, - "codeunitName": "APIV2 - Purch. Cr.M. Lines E2E", - "method": "TestCreateLineThroughPageAndAPI" - }, - { - "codeunitId": 139874, - "codeunitName": "APIV2 - Purch. Cr.M. Lines E2E", - "method": "TestDeleteCreditMemoLine" - }, - { - "codeunitId": 139874, - "codeunitName": "APIV2 - Purch. Cr.M. Lines E2E", - "method": "TestDeletePostedCreditMemoLine" - }, - { - "codeunitId": 139874, - "codeunitName": "APIV2 - Purch. Cr.M. Lines E2E", - "method": "TestGetCreditMemoLineDirectly" - }, - { - "codeunitId": 139874, - "codeunitName": "APIV2 - Purch. Cr.M. Lines E2E", - "method": "TestGetCreditMemoLines" - }, - { - "codeunitId": 139874, - "codeunitName": "APIV2 - Purch. Cr.M. Lines E2E", - "method": "TestGetCreditMemoLinesDirectlyWithDocumentIdFilter" - }, - { - "codeunitId": 139874, - "codeunitName": "APIV2 - Purch. Cr.M. Lines E2E", - "method": "TestGetPostedCreditMemoLines" - }, - { - "codeunitId": 139874, - "codeunitName": "APIV2 - Purch. Cr.M. Lines E2E", - "method": "TestGettingLinesWithDifferentTypes" - }, - { - "codeunitId": 139874, - "codeunitName": "APIV2 - Purch. Cr.M. Lines E2E", - "method": "TestModifyCreditMemoLines" - }, - { - "codeunitId": 139874, - "codeunitName": "APIV2 - Purch. Cr.M. Lines E2E", - "method": "TestPatchingTheIdToAccountChangesLineType" - }, - { - "codeunitId": 139874, - "codeunitName": "APIV2 - Purch. Cr.M. Lines E2E", - "method": "TestPatchingTheIdToItemChangesLineType" - }, - { - "codeunitId": 139874, - "codeunitName": "APIV2 - Purch. Cr.M. Lines E2E", - "method": "TestPatchingTheTypeBlanksIds" - }, - { - "codeunitId": 139874, - "codeunitName": "APIV2 - Purch. Cr.M. Lines E2E", - "method": "TestPostCreditMemoLines" - }, - { - "codeunitId": 139874, - "codeunitName": "APIV2 - Purch. Cr.M. Lines E2E", - "method": "TestPostCreditMemoLinesWithItemVariant" - }, - { - "codeunitId": 139874, - "codeunitName": "APIV2 - Purch. Cr.M. Lines E2E", - "method": "TestPostCreditMemoLineWithSequence" - }, - { - "codeunitId": 139874, - "codeunitName": "APIV2 - Purch. Cr.M. Lines E2E", - "method": "TestPostingBlankLineDefaultsToCommentType" - }, - { - "codeunitId": 139874, - "codeunitName": "APIV2 - Purch. Cr.M. Lines E2E", - "method": "TestPostingCommentLine" - }, - { - "codeunitId": 139882, - "codeunitName": "APIV2 - Salesperson/Purch E2E", - "method": "CreateSalespersonPurchaser" - }, - { - "codeunitId": 139882, - "codeunitName": "APIV2 - Salesperson/Purch E2E", - "method": "DeleteSalespersonPurchaser" - }, - { - "codeunitId": 139882, - "codeunitName": "APIV2 - Salesperson/Purch E2E", - "method": "GetSalespersonPurchaser" - }, - { - "codeunitId": 139882, - "codeunitName": "APIV2 - Salesperson/Purch E2E", - "method": "ModifySalespersonPurchaserJobTitle" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestCreateCustomerAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestCreateDraftInvoiceAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestCreateDraftOrderAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestCreateDraftPurchaseCreditMemoAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestCreateDraftPurchaseInvoiceAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestCreateDraftPurchaseOrderAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestCreatePostedInvoiceAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestCreatePostedPurchaseCreditMemoAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestCreatePostedPurchaseInvoiceAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestCreateQuoteAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestCreateVendorAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestDeleteDraftInvoiceAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestDeleteDraftPurchaseCreditMemoAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestDeleteDraftPurchaseInvoiceAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestDeleteEmployeeAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestDeleteJobAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestDeletePostedInvoiceAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestDeletePostedPurchaseCreditMemoAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestDeletePostedPurchaseInvoiceAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestDeleteQuoteAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestDeleteVendorAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestGetCustomerAttachments" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestGetDraftInvoiceAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestGetDraftInvoiceAttachments" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestGetDraftOrderAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestGetDraftPurchaseCreditMemoAttachments" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestGetDraftPurchaseInvoiceAttachments" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestGetDraftPurchaseOrderAttachments" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestGetEmployeeAttachments" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestGetItemAttachments" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestGetJobAttachments" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestGetPostedInvoiceAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestGetPostedInvoiceAttachments" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestGetPostedPurchaseCreditMemoAttachments" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestGetPostedPurchaseInvoiceAttachments" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestGetQuoteAttachment" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestGetQuoteAttachments" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestGetVendorAttachments" - }, - { - "codeunitId": 139899, - "codeunitName": "APIV2 - Document Attach. E2E", - "method": "TestUpdateCustomerAttachmentBinaryContent" - }, - { - "codeunitId": 139906, - "codeunitName": "APIV2 - FA Locations E2E", - "method": "TestCreateFALocation" - }, - { - "codeunitId": 139906, - "codeunitName": "APIV2 - FA Locations E2E", - "method": "TestDeleteFALocation" - }, - { - "codeunitId": 139906, - "codeunitName": "APIV2 - FA Locations E2E", - "method": "TestGetFALocation" - }, - { - "codeunitId": 139906, - "codeunitName": "APIV2 - FA Locations E2E", - "method": "TestModifyFALocation" - }, - { - "codeunitId": 139907, - "codeunitName": "APIV2 - Fixed Assets E2E", - "method": "TestCreateFixedAsset" - }, - { - "codeunitId": 139907, - "codeunitName": "APIV2 - Fixed Assets E2E", - "method": "TestDeleteFixedAsset" - }, - { - "codeunitId": 139907, - "codeunitName": "APIV2 - Fixed Assets E2E", - "method": "TestGetFixedAsset" - }, - { - "codeunitId": 139907, - "codeunitName": "APIV2 - Fixed Assets E2E", - "method": "TestModifyFixedAsset" - }, - { - "codeunitId": 139908, - "method": "TestGetBlanketPurchaseOrders", - "codeunitName": "APIV2 - Bl. Purch. Orders E2E" - }, - { - "codeunitId": 139908, - "method": "TestGetBlanketPurchaseOrderById", - "codeunitName": "APIV2 - Bl. Purch. Orders E2E" - }, - { - "codeunitId": 139908, - "method": "TestExpandDimensionSetLines", - "codeunitName": "APIV2 - Bl. Purch. Orders E2E" - }, - { - "codeunitId": 139908, - "method": "TestExpandAttachments", - "codeunitName": "APIV2 - Bl. Purch. Orders E2E" - }, - { - "codeunitId": 139908, - "method": "TestExpandDocumentAttachments", - "codeunitName": "APIV2 - Bl. Purch. Orders E2E" - }, - { - "codeunitId": 139908, - "method": "TestExpandPdfDocument", - "codeunitName": "APIV2 - Bl. Purch. Orders E2E" - }, - { - "codeunitId": 139908, - "method": "TestExpandLines", - "codeunitName": "APIV2 - Bl. Purch. Orders E2E" - }, - { - "codeunitId": 139909, - "method": "TestGetBlanketSalesOrders", - "codeunitName": "APIV2 - Bl. Sales Orders E2E" - }, - { - "codeunitId": 139909, - "method": "TestGetBlanketSalesOrderById", - "codeunitName": "APIV2 - Bl. Sales Orders E2E" - }, - { - "codeunitId": 139909, - "method": "TestExpandDimensionSetLines", - "codeunitName": "APIV2 - Bl. Sales Orders E2E" - }, - { - "codeunitId": 139909, - "method": "TestExpandAttachments", - "codeunitName": "APIV2 - Bl. Sales Orders E2E" - }, - { - "codeunitId": 139909, - "method": "TestExpandDocumentAttachments", - "codeunitName": "APIV2 - Bl. Sales Orders E2E" - }, - { - "codeunitId": 139909, - "method": "TestExpandPdfDocument", - "codeunitName": "APIV2 - Bl. Sales Orders E2E" - }, - { - "codeunitId": 139909, - "method": "TestExpandLines", - "codeunitName": "APIV2 - Bl. Sales Orders E2E" - }, - { - "codeunitId": 139917, - "method": "TestGetApprovalEntries", - "codeunitName": "APIV2 - Approval Entries E2E" - }, - { - "codeunitId": 139918, - "method": "TestGetApprovalUserSetup", - "codeunitName": "APIV2 - Approval UserSetup E2E" - }, - { - "codeunitId": 139919, - "method": "TestGetPostedApprovalEntries", - "codeunitName": "APIV2 PstdApprovalEntries E2E" - }, - { - "codeunitId": 139920, - "method": "TestGetApprovalEntries", - "codeunitName": "APIV2 - Workflow Approvers E2E" - }, - { - "codeunitId": 139921, - "method": "TestGetApprovalEntries", - "codeunitName": "APIV2 - Workflows E2E" - }, - { - "codeunitId": 139922, - "method": "TestGetPurchaseQuotes", - "codeunitName": "APIV2 - Purch. Quotes E2E" - }, - { - "codeunitId": 139922, - "method": "TestGetPurchaseQuoteById", - "codeunitName": "APIV2 - Purch. Quotes E2E" - }, - { - "codeunitId": 139922, - "method": "TestExpandDimensionSetLines", - "codeunitName": "APIV2 - Purch. Quotes E2E" - }, - { - "codeunitId": 139922, - "method": "TestExpandAttachments", - "codeunitName": "APIV2 - Purch. Quotes E2E" - }, - { - "codeunitId": 139922, - "method": "TestExpandDocumentAttachments", - "codeunitName": "APIV2 - Purch. Quotes E2E" - }, - { - "codeunitId": 139922, - "method": "TestExpandPdfDocument", - "codeunitName": "APIV2 - Purch. Quotes E2E" - }, - { - "codeunitId": 139922, - "method": "TestExpandLines", - "codeunitName": "APIV2 - Purch. Quotes E2E" - }, - { - "codeunitId": 139923, - "method": "TestGetPurchaseReturnOrders", - "codeunitName": "APIV2 - Purch. Ret. Orders E2E" - }, - { - "codeunitId": 139923, - "method": "TestGetPurchaseReturnOrderById", - "codeunitName": "APIV2 - Purch. Ret. Orders E2E" - }, - { - "codeunitId": 139923, - "method": "TestExpandDimensionSetLines", - "codeunitName": "APIV2 - Purch. Ret. Orders E2E" - }, - { - "codeunitId": 139923, - "method": "TestExpandAttachments", - "codeunitName": "APIV2 - Purch. Ret. Orders E2E" - }, - { - "codeunitId": 139923, - "method": "TestExpandDocumentAttachments", - "codeunitName": "APIV2 - Purch. Ret. Orders E2E" - }, - { - "codeunitId": 139923, - "method": "TestExpandPdfDocument", - "codeunitName": "APIV2 - Purch. Ret. Orders E2E" - }, - { - "codeunitId": 139923, - "method": "TestExpandLines", - "codeunitName": "APIV2 - Purch. Ret. Orders E2E" - }, - { - "codeunitId": 139924, - "method": "TestGetSalesReturnOrders", - "codeunitName": "APIV2 - Sales Ret. Orders E2E" - }, - { - "codeunitId": 139924, - "method": "TestGetSalesReturnOrderById", - "codeunitName": "APIV2 - Sales Ret. Orders E2E" - }, - { - "codeunitId": 139924, - "method": "TestExpandDimensionSetLines", - "codeunitName": "APIV2 - Sales Ret. Orders E2E" - }, - { - "codeunitId": 139924, - "method": "TestExpandAttachments", - "codeunitName": "APIV2 - Sales Ret. Orders E2E" - }, - { - "codeunitId": 139924, - "method": "TestExpandDocumentAttachments", - "codeunitName": "APIV2 - Sales Ret. Orders E2E" - }, - { - "codeunitId": 139924, - "method": "TestExpandPdfDocument", - "codeunitName": "APIV2 - Sales Ret. Orders E2E" - }, - { - "codeunitId": 139924, - "method": "TestExpandLines", - "codeunitName": "APIV2 - Sales Ret. Orders E2E" - }, { "codeunitId": 139925, - "method": "TestGetAssemblyOrders", - "codeunitName": "APIV2 - Assembly Orders E2E" - }, - { - "codeunitId": 139925, - "method": "TestGetAssemblyOrderById", - "codeunitName": "APIV2 - Assembly Orders E2E" - }, - { - "codeunitId": 139925, - "method": "TestExpandDimensionSetLines", - "codeunitName": "APIV2 - Assembly Orders E2E" - }, - { - "codeunitId": 139925, - "method": "TestExpandAttachments", - "codeunitName": "APIV2 - Assembly Orders E2E" - }, - { - "codeunitId": 139925, - "method": "TestExpandDocumentAttachments", - "codeunitName": "APIV2 - Assembly Orders E2E" - }, - { - "codeunitId": 139925, - "method": "TestExpandPdfDocument", - "codeunitName": "APIV2 - Assembly Orders E2E" - }, - { - "codeunitId": 139925, - "method": "TestExpandLines", - "codeunitName": "APIV2 - Assembly Orders E2E" - }, - { - "codeunitId": 139926, - "method": "TestGetTransferOrders", - "codeunitName": "APIV2 - Transfer Orders E2E" - }, - { - "codeunitId": 139926, - "method": "TestGetTransferOrderById", - "codeunitName": "APIV2 - Transfer Orders E2E" - }, - { - "codeunitId": 139926, - "method": "TestExpandDimensionSetLines", - "codeunitName": "APIV2 - Transfer Orders E2E" - }, - { - "codeunitId": 139926, - "method": "TestExpandAttachments", - "codeunitName": "APIV2 - Transfer Orders E2E" - }, - { - "codeunitId": 139926, - "method": "TestExpandDocumentAttachments", - "codeunitName": "APIV2 - Transfer Orders E2E" - }, - { - "codeunitId": 139926, - "method": "TestExpandPdfDocument", - "codeunitName": "APIV2 - Transfer Orders E2E" - }, - { - "codeunitId": 139926, - "method": "TestExpandLines", - "codeunitName": "APIV2 - Transfer Orders E2E" - }, - { - "codeunitId": 139927, - "method": "TestGetSalesOrderArchives", - "codeunitName": "APIV2 - Sales Ord. Arch. E2E" - }, - { - "codeunitId": 139927, - "method": "TestExpandDimensionSetLines", - "codeunitName": "APIV2 - Sales Ord. Arch. E2E" - }, - { - "codeunitId": 139927, - "method": "TestExpandAttachments", - "codeunitName": "APIV2 - Sales Ord. Arch. E2E" - }, - { - "codeunitId": 139927, - "method": "TestExpandDocumentAttachments", - "codeunitName": "APIV2 - Sales Ord. Arch. E2E" - }, - { - "codeunitId": 139928, - "method": "TestGetPurchaseReturnShipments", - "codeunitName": "APIV2 - Purch. Ret. Shpts. E2E" - }, - { - "codeunitId": 139928, - "method": "TestExpandAttachments", - "codeunitName": "APIV2 - Purch. Ret. Shpts. E2E" - }, - { - "codeunitId": 139928, - "method": "TestExpandDocumentAttachments", - "codeunitName": "APIV2 - Purch. Ret. Shpts. E2E" - }, - { - "codeunitId": 139928, - "method": "TestExpandPdfDocument", - "codeunitName": "APIV2 - Purch. Ret. Shpts. E2E" - }, - { - "codeunitId": 139908, - "method": "TestGetBlanketPurchaseOrders", - "codeunitName": "APIV2 - Bl. Purch. Orders E2E" - }, - { - "codeunitId": 139908, - "method": "TestGetBlanketPurchaseOrderById", - "codeunitName": "APIV2 - Bl. Purch. Orders E2E" - }, - { - "codeunitId": 139908, - "method": "TestExpandDimensionSetLines", - "codeunitName": "APIV2 - Bl. Purch. Orders E2E" - }, - { - "codeunitId": 139908, - "method": "TestExpandAttachments", - "codeunitName": "APIV2 - Bl. Purch. Orders E2E" - }, - { - "codeunitId": 139908, - "method": "TestExpandDocumentAttachments", - "codeunitName": "APIV2 - Bl. Purch. Orders E2E" - }, - { - "codeunitId": 139908, - "method": "TestExpandPdfDocument", - "codeunitName": "APIV2 - Bl. Purch. Orders E2E" + "codeunitName": "APIV2 - Assembly Orders E2E", + "method": "*" }, { "codeunitId": 139908, - "method": "TestExpandLines", - "codeunitName": "APIV2 - Bl. Purch. Orders E2E" - }, - { - "codeunitId": 139909, - "method": "TestGetBlanketSalesOrders", - "codeunitName": "APIV2 - Bl. Sales Orders E2E" - }, - { - "codeunitId": 139909, - "method": "TestGetBlanketSalesOrderById", - "codeunitName": "APIV2 - Bl. Sales Orders E2E" - }, - { - "codeunitId": 139909, - "method": "TestExpandDimensionSetLines", - "codeunitName": "APIV2 - Bl. Sales Orders E2E" - }, - { - "codeunitId": 139909, - "method": "TestExpandAttachments", - "codeunitName": "APIV2 - Bl. Sales Orders E2E" - }, - { - "codeunitId": 139909, - "method": "TestExpandDocumentAttachments", - "codeunitName": "APIV2 - Bl. Sales Orders E2E" + "codeunitName": "APIV2 - Bl. Purch. Orders E2E", + "method": "*" }, { "codeunitId": 139909, - "method": "TestExpandPdfDocument", - "codeunitName": "APIV2 - Bl. Sales Orders E2E" - }, - { - "codeunitId": 139909, - "method": "TestExpandLines", - "codeunitName": "APIV2 - Bl. Sales Orders E2E" - }, - { - "codeunitId": 139917, - "method": "TestGetApprovalEntries", - "codeunitName": "APIV2 - Approval Entries E2E" - }, - { - "codeunitId": 139918, - "method": "TestGetApprovalUserSetup", - "codeunitName": "APIV2 - Approval UserSetup E2E" - }, - { - "codeunitId": 139919, - "method": "TestGetPostedApprovalEntries", - "codeunitName": "APIV2 PstdApprovalEntries E2E" - }, - { - "codeunitId": 139920, - "method": "TestGetApprovalEntries", - "codeunitName": "APIV2 - Workflow Approvers E2E" - }, - { - "codeunitId": 139921, - "method": "TestGetApprovalEntries", - "codeunitName": "APIV2 - Workflows E2E" - }, - { - "codeunitId": 139922, - "method": "TestGetPurchaseQuotes", - "codeunitName": "APIV2 - Purch. Quotes E2E" + "codeunitName": "APIV2 - Bl. Sales Orders E2E", + "method": "*" }, { "codeunitId": 139922, - "method": "TestGetPurchaseQuoteById", - "codeunitName": "APIV2 - Purch. Quotes E2E" - }, - { - "codeunitId": 139922, - "method": "TestExpandDimensionSetLines", - "codeunitName": "APIV2 - Purch. Quotes E2E" - }, - { - "codeunitId": 139922, - "method": "TestExpandAttachments", - "codeunitName": "APIV2 - Purch. Quotes E2E" - }, - { - "codeunitId": 139922, - "method": "TestExpandDocumentAttachments", - "codeunitName": "APIV2 - Purch. Quotes E2E" - }, - { - "codeunitId": 139922, - "method": "TestExpandPdfDocument", - "codeunitName": "APIV2 - Purch. Quotes E2E" - }, - { - "codeunitId": 139922, - "method": "TestExpandLines", - "codeunitName": "APIV2 - Purch. Quotes E2E" - }, - { - "codeunitId": 139923, - "method": "TestGetPurchaseReturnOrders", - "codeunitName": "APIV2 - Purch. Ret. Orders E2E" - }, - { - "codeunitId": 139923, - "method": "TestGetPurchaseReturnOrderById", - "codeunitName": "APIV2 - Purch. Ret. Orders E2E" - }, - { - "codeunitId": 139923, - "method": "TestExpandDimensionSetLines", - "codeunitName": "APIV2 - Purch. Ret. Orders E2E" - }, - { - "codeunitId": 139923, - "method": "TestExpandAttachments", - "codeunitName": "APIV2 - Purch. Ret. Orders E2E" - }, - { - "codeunitId": 139923, - "method": "TestExpandDocumentAttachments", - "codeunitName": "APIV2 - Purch. Ret. Orders E2E" - }, - { - "codeunitId": 139923, - "method": "TestExpandPdfDocument", - "codeunitName": "APIV2 - Purch. Ret. Orders E2E" + "codeunitName": "APIV2 - Purch. Quotes E2E", + "method": "*" }, { "codeunitId": 139923, - "method": "TestExpandLines", - "codeunitName": "APIV2 - Purch. Ret. Orders E2E" - }, - { - "codeunitId": 139924, - "method": "TestGetSalesReturnOrders", - "codeunitName": "APIV2 - Sales Ret. Orders E2E" - }, - { - "codeunitId": 139924, - "method": "TestGetSalesReturnOrderById", - "codeunitName": "APIV2 - Sales Ret. Orders E2E" - }, - { - "codeunitId": 139924, - "method": "TestExpandDimensionSetLines", - "codeunitName": "APIV2 - Sales Ret. Orders E2E" - }, - { - "codeunitId": 139924, - "method": "TestExpandAttachments", - "codeunitName": "APIV2 - Sales Ret. Orders E2E" + "codeunitName": "APIV2 - Purch. Ret. Orders E2E", + "method": "*" }, { - "codeunitId": 139924, - "method": "TestExpandDocumentAttachments", - "codeunitName": "APIV2 - Sales Ret. Orders E2E" + "codeunitId": 139928, + "codeunitName": "APIV2 - Purch. Ret. Shpts. E2E", + "method": "*" }, { - "codeunitId": 139924, - "method": "TestExpandPdfDocument", - "codeunitName": "APIV2 - Sales Ret. Orders E2E" + "codeunitId": 139927, + "codeunitName": "APIV2 - Sales Ord. Arch. E2E", + "method": "*" }, { "codeunitId": 139924, - "method": "TestExpandLines", - "codeunitName": "APIV2 - Sales Ret. Orders E2E" - }, - { - "codeunitId": 139925, - "method": "TestGetAssemblyOrders", - "codeunitName": "APIV2 - Assembly Orders E2E" - }, - { - "codeunitId": 139925, - "method": "TestGetAssemblyOrderById", - "codeunitName": "APIV2 - Assembly Orders E2E" - }, - { - "codeunitId": 139925, - "method": "TestExpandDimensionSetLines", - "codeunitName": "APIV2 - Assembly Orders E2E" - }, - { - "codeunitId": 139925, - "method": "TestExpandAttachments", - "codeunitName": "APIV2 - Assembly Orders E2E" - }, - { - "codeunitId": 139925, - "method": "TestExpandDocumentAttachments", - "codeunitName": "APIV2 - Assembly Orders E2E" - }, - { - "codeunitId": 139925, - "method": "TestExpandPdfDocument", - "codeunitName": "APIV2 - Assembly Orders E2E" - }, - { - "codeunitId": 139925, - "method": "TestExpandLines", - "codeunitName": "APIV2 - Assembly Orders E2E" - }, - { - "codeunitId": 139926, - "method": "TestGetTransferOrders", - "codeunitName": "APIV2 - Transfer Orders E2E" - }, - { - "codeunitId": 139926, - "method": "TestGetTransferOrderById", - "codeunitName": "APIV2 - Transfer Orders E2E" - }, - { - "codeunitId": 139926, - "method": "TestExpandDimensionSetLines", - "codeunitName": "APIV2 - Transfer Orders E2E" - }, - { - "codeunitId": 139926, - "method": "TestExpandAttachments", - "codeunitName": "APIV2 - Transfer Orders E2E" - }, - { - "codeunitId": 139926, - "method": "TestExpandDocumentAttachments", - "codeunitName": "APIV2 - Transfer Orders E2E" - }, - { - "codeunitId": 139926, - "method": "TestExpandPdfDocument", - "codeunitName": "APIV2 - Transfer Orders E2E" + "codeunitName": "APIV2 - Sales Ret. Orders E2E", + "method": "*" }, { "codeunitId": 139926, - "method": "TestExpandLines", - "codeunitName": "APIV2 - Transfer Orders E2E" - }, - { - "codeunitId": 139927, - "method": "TestGetSalesOrderArchives", - "codeunitName": "APIV2 - Sales Ord. Arch. E2E" - }, - { - "codeunitId": 139927, - "method": "TestExpandDimensionSetLines", - "codeunitName": "APIV2 - Sales Ord. Arch. E2E" - }, - { - "codeunitId": 139927, - "method": "TestExpandAttachments", - "codeunitName": "APIV2 - Sales Ord. Arch. E2E" - }, - { - "codeunitId": 139927, - "method": "TestExpandDocumentAttachments", - "codeunitName": "APIV2 - Sales Ord. Arch. E2E" - }, - { - "codeunitId": 139928, - "method": "TestGetPurchaseReturnShipments", - "codeunitName": "APIV2 - Purch. Ret. Shpts. E2E" - }, - { - "codeunitId": 139928, - "method": "TestExpandAttachments", - "codeunitName": "APIV2 - Purch. Ret. Shpts. E2E" - }, - { - "codeunitId": 139928, - "method": "TestExpandDocumentAttachments", - "codeunitName": "APIV2 - Purch. Ret. Shpts. E2E" - }, - { - "codeunitId": 139928, - "method": "TestExpandPdfDocument", - "codeunitName": "APIV2 - Purch. Ret. Shpts. E2E" + "codeunitName": "APIV2 - Transfer Orders E2E", + "method": "*" } ] diff --git a/src/Layers/APAC/Tests/Prepayment/ERMPrepaymentII.Codeunit.al b/src/Layers/APAC/Tests/Prepayment/ERMPrepaymentII.Codeunit.al index be7ad2bb239..514e712534e 100644 --- a/src/Layers/APAC/Tests/Prepayment/ERMPrepaymentII.Codeunit.al +++ b/src/Layers/APAC/Tests/Prepayment/ERMPrepaymentII.Codeunit.al @@ -2694,7 +2694,6 @@ codeunit 134101 "ERM Prepayment II" GenJournalLine.Modify(true); LibraryERM.PostGeneralJnlLine(GenJournalLine); end; - local procedure SelectGenJournalBatch(var GenJournalBatch: Record "Gen. Journal Batch") begin // Select General Journal Batch and clear General Journal Lines to make sure that no line exist before creating diff --git a/src/Layers/NA/Tests/Prepayment/ERMPrepaymentII.Codeunit.al b/src/Layers/NA/Tests/Prepayment/ERMPrepaymentII.Codeunit.al index e514b0407b0..6cc9605ec93 100644 --- a/src/Layers/NA/Tests/Prepayment/ERMPrepaymentII.Codeunit.al +++ b/src/Layers/NA/Tests/Prepayment/ERMPrepaymentII.Codeunit.al @@ -2632,7 +2632,6 @@ codeunit 134101 "ERM Prepayment II" GenJournalLine.Modify(true); LibraryERM.PostGeneralJnlLine(GenJournalLine); end; - local procedure SelectGenJournalBatch(var GenJournalBatch: Record "Gen. Journal Batch") begin // Select General Journal Batch and clear General Journal Lines to make sure that no line exist before creating diff --git a/src/Layers/W1/BaseApp/Purchases/eServices/EDocument/ReturnShptPDFDocHandler.Codeunit.al b/src/Layers/W1/BaseApp/Purchases/eServices/EDocument/ReturnShptPDFDocHandler.Codeunit.al index 22cc094eec4..d9a2ed5f429 100644 --- a/src/Layers/W1/BaseApp/Purchases/eServices/EDocument/ReturnShptPDFDocHandler.Codeunit.al +++ b/src/Layers/W1/BaseApp/Purchases/eServices/EDocument/ReturnShptPDFDocHandler.Codeunit.al @@ -36,7 +36,7 @@ codeunit 4999 "Return Shpt. PDF Doc.Handler" implements IPdfDocumentHandler exit(false); ReturnShipment.SetRange("No.", ReturnShipment."No."); - ReportUsage := "Report Selection Usage"::"P.Return"; + ReportUsage := "Report Selection Usage"::"P.Ret.Shpt."; ReportSelections.GetPdfReportForVend(TempBlob, ReportUsage, ReturnShipment, ReturnShipment."Buy-from Vendor No."); DocumentMailing.GetAttachmentFileName(Name, ReturnShipment."No.", ReturnShipmentLbl, ReportUsage.AsInteger()); exit(PDFDocumentManagement.AddToTempAttachmentEntityBuffer(DocumentId, DocumentType, TempBlob, Name, TempAttachmentEntityBuffer)); diff --git a/src/Layers/W1/Tests/Graph/IRS1099CodeEntityE2ETest.Codeunit.al b/src/Layers/W1/Tests/Graph/IRS1099CodeEntityE2ETest.Codeunit.al index 80c99fa6f1c..277a2410582 100644 --- a/src/Layers/W1/Tests/Graph/IRS1099CodeEntityE2ETest.Codeunit.al +++ b/src/Layers/W1/Tests/Graph/IRS1099CodeEntityE2ETest.Codeunit.al @@ -5,6 +5,7 @@ codeunit 135519 "IRS 1099 Code Entity E2E Test" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); // [FEATURE] [Graph] [IRS 1099 Form-Box] end; diff --git a/src/Layers/W1/Tests/Graph/WFWHSubscriptionE2ETests.Codeunit.al b/src/Layers/W1/Tests/Graph/WFWHSubscriptionE2ETests.Codeunit.al index f5b8e0f9859..2c92a572e94 100644 --- a/src/Layers/W1/Tests/Graph/WFWHSubscriptionE2ETests.Codeunit.al +++ b/src/Layers/W1/Tests/Graph/WFWHSubscriptionE2ETests.Codeunit.al @@ -5,6 +5,7 @@ codeunit 135528 "WFWH Subscription E2E Tests" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); // [FEATURE] [Graph] [Workflow] [Webhook] [Subscription] end; diff --git a/src/Layers/W1/Tests/Integration/ApiRoutesE2E.Codeunit.al b/src/Layers/W1/Tests/Integration/ApiRoutesE2E.Codeunit.al index 6744a7e1cb5..9dda4bef438 100644 --- a/src/Layers/W1/Tests/Integration/ApiRoutesE2E.Codeunit.al +++ b/src/Layers/W1/Tests/Integration/ApiRoutesE2E.Codeunit.al @@ -5,6 +5,7 @@ codeunit 135548 "API Routes E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); // [FEATURE] [API] [Route] end; diff --git a/src/Layers/W1/Tests/Integration/WebhookLogsE2E.Codeunit.al b/src/Layers/W1/Tests/Integration/WebhookLogsE2E.Codeunit.al index a5aad9c9707..d2dc7f88760 100644 --- a/src/Layers/W1/Tests/Integration/WebhookLogsE2E.Codeunit.al +++ b/src/Layers/W1/Tests/Integration/WebhookLogsE2E.Codeunit.al @@ -5,6 +5,7 @@ codeunit 135547 "Webhook Logs E2E" trigger OnRun() begin + LibraryGraphMgt.EnsureAuthenticationAvailable(); // [FEATURE] [API] [Webhook] end; diff --git a/src/Layers/W1/Tests/Prepayment/ERMPrepaymentII.Codeunit.al b/src/Layers/W1/Tests/Prepayment/ERMPrepaymentII.Codeunit.al index 27e8b022b74..ac9aa24db4e 100644 --- a/src/Layers/W1/Tests/Prepayment/ERMPrepaymentII.Codeunit.al +++ b/src/Layers/W1/Tests/Prepayment/ERMPrepaymentII.Codeunit.al @@ -2575,7 +2575,6 @@ codeunit 134101 "ERM Prepayment II" GenJournalLine.Modify(true); LibraryERM.PostGeneralJnlLine(GenJournalLine); end; - local procedure SelectGenJournalBatch(var GenJournalBatch: Record "Gen. Journal Batch") begin // Select General Journal Batch and clear General Journal Lines to make sure that no line exist before creating @@ -3145,4 +3144,3 @@ codeunit 134101 "ERM Prepayment II" PurchaseHeader.TestField(Status, ExpectedStatus); end; } - diff --git a/src/Layers/W1/Tests/TestLibraries/LibraryGraphAuthMgt.Codeunit.al b/src/Layers/W1/Tests/TestLibraries/LibraryGraphAuthMgt.Codeunit.al new file mode 100644 index 00000000000..f9a16e0e525 --- /dev/null +++ b/src/Layers/W1/Tests/TestLibraries/LibraryGraphAuthMgt.Codeunit.al @@ -0,0 +1,142 @@ +// ------------------------------------------------------------------------------------------------ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. +// ------------------------------------------------------------------------------------------------ + +namespace Microsoft.TestLibraries.ERP; + +using System; +using System.Azure.KeyVault; +using System.Environment; +using System.Integration; +using System.Security.AccessControl; +using System.Utilities; + +codeunit 131022 "Library - Graph Auth Mgt." +{ + Access = Internal; + + var + ApiTestPasswordFileTok: Label 'C:\Run\my\ApiTestPassword', Locked = true; + NavServerUserPasswordKeyTok: Label 'NavServerUserPassword', Locked = true; + CachedAuthenticationPassword: SecretText; + AuthenticationResolved: Boolean; + AuthenticationRequired: Boolean; + ContainerPasswordReadErr: Label 'The API test password could not be read from %1.', Comment = '%1 - Password file path'; + KeyVaultPasswordReadErr: Label 'The API test password could not be retrieved from the %1 secret.', Comment = '%1 - Azure Key Vault secret name'; + PasswordRetrievalFailedErr: Label 'The API test password could not be retrieved.'; + + [NonDebuggable] + internal procedure AddAuthentication(var HttpWebRequestMgt: Codeunit "Http Web Request Mgt."; TargetURL: Text) + var + Password: SecretText; + begin + if not IsCurrentTestServiceURL(TargetURL) then + exit; + if not GetAuthenticationPassword(Password) then + exit; + + AddUserPasswordAuthentication(HttpWebRequestMgt, Password); + end; + + [NonDebuggable] + internal procedure EnsureAuthenticationAvailable() + var + Password: SecretText; + begin + GetAuthenticationPassword(Password); + end; + + [NonDebuggable] + local procedure GetAuthenticationPassword(var Password: SecretText): Boolean + var + User: Record User; + EnvironmentInfo: Codeunit "Environment Information"; + begin + if AuthenticationResolved then begin + if AuthenticationRequired then + Password := CachedAuthenticationPassword; + exit(AuthenticationRequired); + end; + + if EnvironmentInfo.IsSaaSInfrastructure() then + exit(CacheAuthenticationResult(Password, false)); + if ContainerPasswordFileExists() then begin + if not TryGetContainerPassword(Password) then + Error(ContainerPasswordReadErr, ApiTestPasswordFileTok); + exit(CacheAuthenticationResult(Password, true)); + end; + + if not User.Get(UserSecurityId()) then + exit(CacheAuthenticationResult(Password, false)); + if User."Windows Security ID" <> '' then + exit(CacheAuthenticationResult(Password, false)); + + if not TryGetNavEnlistmentPassword(Password) then + Error(KeyVaultPasswordReadErr, NavServerUserPasswordKeyTok); + + exit(CacheAuthenticationResult(Password, true)); + end; + + [NonDebuggable] + local procedure CacheAuthenticationResult(Password: SecretText; IsRequired: Boolean): Boolean + begin + AuthenticationRequired := IsRequired; + AuthenticationResolved := true; + if IsRequired then + CachedAuthenticationPassword := Password; + exit(IsRequired); + end; + + [NonDebuggable] + local procedure AddUserPasswordAuthentication(var HttpWebRequestMgt: Codeunit "Http Web Request Mgt."; Password: SecretText) + begin + HttpWebRequestMgt.AddBasicAuthentication(UserId(), Password); + end; + + local procedure IsCurrentTestServiceURL(TargetURL: Text): Boolean + var + CurrentServiceUri: Codeunit Uri; + TargetUri: Codeunit Uri; + begin + CurrentServiceUri.Init(GetUrl(ClientType::Api)); + TargetUri.Init(TargetURL); + exit(LowerCase(TargetUri.GetAuthority()) = LowerCase(CurrentServiceUri.GetAuthority())); + end; + + [Scope('OnPrem')] + local procedure ContainerPasswordFileExists(): Boolean + var + File: DotNet File; + begin + exit(File.Exists(ApiTestPasswordFileTok)); + end; + + [NonDebuggable] + [TryFunction] + local procedure TryGetContainerPassword(var Password: SecretText) + var + AzureKeyVault: Codeunit "Azure Key Vault"; + LibraryAzureKVMockMgmt: Codeunit "Library - Azure KV Mock Mgmt."; + begin + LibraryAzureKVMockMgmt.InitMockAzureKeyvaultSecretProvider(); + LibraryAzureKVMockMgmt.AddMockAzureKeyvaultSecretProviderMappingFromFile(NavServerUserPasswordKeyTok, ApiTestPasswordFileTok); + LibraryAzureKVMockMgmt.UseAzureKeyvaultSecretProvider(); + if not AzureKeyVault.GetAzureKeyVaultSecret(NavServerUserPasswordKeyTok, Password) then + Error(PasswordRetrievalFailedErr); + if Password.IsEmpty() then + Error(PasswordRetrievalFailedErr); + end; + + [NonDebuggable] + [TryFunction] + local procedure TryGetNavEnlistmentPassword(var Password: SecretText) + var + AzureKeyVault: Codeunit "Azure Key Vault"; + begin + if not AzureKeyVault.GetAzureKeyVaultSecret(NavServerUserPasswordKeyTok, Password) then + Error(PasswordRetrievalFailedErr); + if Password.IsEmpty() then + Error(PasswordRetrievalFailedErr); + end; +} diff --git a/src/Layers/W1/Tests/TestLibraries/LibraryGraphDocumentTools.Codeunit.al b/src/Layers/W1/Tests/TestLibraries/LibraryGraphDocumentTools.Codeunit.al index cc281f04818..7c52e935343 100644 --- a/src/Layers/W1/Tests/TestLibraries/LibraryGraphDocumentTools.Codeunit.al +++ b/src/Layers/W1/Tests/TestLibraries/LibraryGraphDocumentTools.Codeunit.al @@ -582,17 +582,16 @@ codeunit 130619 "Library - Graph Document Tools" VATBusinessPostingGroup: Record "VAT Business Posting Group"; FixedAsset: Record "Fixed Asset"; GLAccount: Record "G/L Account"; - VATPostingSetup: Record "VAT Posting Setup"; begin LibraryInventory.CreateItemCharge(ItemCharge); + EnsureVATPostingSetupExists( + SalesHeader."VAT Bus. Posting Group", ItemCharge."VAT Prod. Posting Group"); LibrarySales.CreateSalesLine(SalesLineCharge, SalesHeader, SalesLineCharge.Type::"Charge (Item)", ItemCharge."No.", 1); LibraryERM.FindVATBusinessPostingGroup(VATBusinessPostingGroup); LibraryResource.CreateResource(Resource, VATBusinessPostingGroup.Code); - VATPostingSetup.SetRange("VAT Bus. Posting Group", SalesHeader."VAT Bus. Posting Group"); - VATPostingSetup.SetRange("VAT Prod. Posting Group", Resource."VAT Prod. Posting Group"); - if not VATPostingSetup.FINDFIRST() then - LibraryERM.CreateVATPostingSetup(VATPostingSetup, SalesHeader."VAT Bus. Posting Group", Resource."VAT Prod. Posting Group"); + EnsureVATPostingSetupExists( + SalesHeader."VAT Bus. Posting Group", Resource."VAT Prod. Posting Group"); LibrarySales.CreateSalesLine(SalesLineResource, SalesHeader, SalesLineResource.Type::Resource, Resource."No.", 1); LibraryFixedAsset.CreateFixedAsset(FixedAsset); @@ -619,6 +618,8 @@ codeunit 130619 "Library - Graph Document Tools" GLAccount: Record "G/L Account"; begin LibraryInventory.CreateItemCharge(ItemCharge); + EnsureVATPostingSetupExists( + PurchaseHeader."VAT Bus. Posting Group", ItemCharge."VAT Prod. Posting Group"); LibraryPurchase.CreatePurchaseLine( PurchaseLineCharge, PurchaseHeader, PurchaseLineCharge.Type::"Charge (Item)", ItemCharge."No.", 1); @@ -636,10 +637,27 @@ codeunit 130619 "Library - Graph Document Tools" GLAccount.SetRange("Direct Posting", true); #pragma warning restore AA0210 GLAccount.FindFirst(); + EnsureVATPostingSetupExists( + PurchaseHeader."VAT Bus. Posting Group", GLAccount."VAT Prod. Posting Group"); LibraryPurchase.CreatePurchaseLine( PurchaseLineGLAccount, PurchaseHeader, PurchaseLineGLAccount.Type::"G/L Account", GLAccount."No.", 1); end; + /// Creates VAT posting setup when the specified posting-group combination does not exist. + /// VAT business posting group. + /// VAT product posting group. + procedure EnsureVATPostingSetupExists(VATBusPostingGroup: Code[20]; VATProdPostingGroup: Code[20]) + var + VATPostingSetup: Record "VAT Posting Setup"; + begin + if (VATBusPostingGroup = '') and (VATProdPostingGroup = '') then + exit; + if VATPostingSetup.Get(VATBusPostingGroup, VATProdPostingGroup) then + exit; + + LibraryERM.CreateVATPostingSetup(VATPostingSetup, VATBusPostingGroup, VATProdPostingGroup); + end; + [Scope('OnPrem')] procedure VerifySalesObjectTxtDescription(SalesLine: Record "Sales Line"; JObjectTxt: Text) var @@ -895,4 +913,3 @@ codeunit 130619 "Library - Graph Document Tools" Assert.AreEqual(ExpectedDiscountAmount, ActualInvoiceDiscountAmount, 'Invoice discount amount was not set'); end; } - diff --git a/src/Layers/W1/Tests/TestLibraries/LibraryGraphJournalLines.Codeunit.al b/src/Layers/W1/Tests/TestLibraries/LibraryGraphJournalLines.Codeunit.al index ea303197684..32ecc3d62b2 100644 --- a/src/Layers/W1/Tests/TestLibraries/LibraryGraphJournalLines.Codeunit.al +++ b/src/Layers/W1/Tests/TestLibraries/LibraryGraphJournalLines.Codeunit.al @@ -235,6 +235,11 @@ codeunit 130622 "Library - Graph Journal Lines" begin JournalName := LibraryUtility.GenerateRandomCode(GenJournalBatch.FieldNo(Name), DATABASE::"Gen. Journal Batch"); LibraryAPIGeneralJournal.EnsureGenJnlBatchExists(GraphMgtJournal.GetDefaultVendorPaymentsTemplateName(), JournalName); + GenJournalBatch.Get(GraphMgtJournal.GetDefaultVendorPaymentsTemplateName(), JournalName); + if GenJournalBatch."No. Series" = '' then begin + GenJournalBatch.Validate("No. Series", LibraryERM.CreateNoSeriesCode()); + GenJournalBatch.Modify(true); + end; exit(JournalName); end; @@ -321,4 +326,3 @@ codeunit 130622 "Library - Graph Journal Lines" Assert.AreEqual(NewDate, GenJournalLine."Posting Date", 'Journal Line ' + PostingDateNameTxt + ' should be changed'); end; } - diff --git a/src/Layers/W1/Tests/TestLibraries/LibraryGraphMgt.Codeunit.al b/src/Layers/W1/Tests/TestLibraries/LibraryGraphMgt.Codeunit.al index b82c12f9943..9b06fc41945 100644 --- a/src/Layers/W1/Tests/TestLibraries/LibraryGraphMgt.Codeunit.al +++ b/src/Layers/W1/Tests/TestLibraries/LibraryGraphMgt.Codeunit.al @@ -7,12 +7,40 @@ codeunit 130618 "Library - Graph Mgt" var Assert: Codeunit Assert; + LibraryGraphAuthMgt: Codeunit Microsoft.TestLibraries.ERP."Library - Graph Auth Mgt."; IncorrectValueErr: Label 'Incorrect value found in JSON for %1 property.', Comment = '%1 - Name of property'; GraphCollectionMgtItem: Codeunit "Graph Collection Mgt - Item"; UnexpectedResponseCodeErr: Label 'Response code %1 (%2) differs from the expected %3.', Comment = '%1 - Actual response code number, %2 - Actual response code, %3 - Expected response code number'; FailedRequestErr: Label '%1 request failed. Response code is %2 (%3). %4', Comment = '%1 - request method, %2 - response code number, %3 - response code, %4 - error message'; FailedRequestWithUnexpectedResponseCodeErr: Label '%1 request failed. Response code is %2 (%3), expected code is %4. %5', Comment = '%1 - request method, %2 - response code number, %3 - response code, %4 - expected response code, %5 - error message'; + /// Verifies that authentication is available for local API test requests. + procedure EnsureAuthenticationAvailable() + begin + LibraryGraphAuthMgt.EnsureAuthenticationAvailable(); + end; + + /// Sets the work date to November 15 in the current year to stay within test-license date limits. + procedure SetLicenseSafeWorkDate() + begin + WorkDate := DMY2Date(15, 11, Date2DMY(Today, 3)); + end; + + /// Adds a field to the ignored-field buffer when the field exists in the source table. + /// Temporary ignored-field buffer. + /// Source table number. + /// Source field name. + procedure AddFieldToIgnoreIfExists(var TempIgnoredFields: Record 2000000041 temporary; SourceTableNo: Integer; SourceFieldName: Text) + var + RecordField: Record Field; + LibraryUtility: Codeunit "Library - Utility"; + begin + RecordField.SetRange(TableNo, SourceTableNo); + RecordField.SetRange(FieldName, SourceFieldName); + if RecordField.FindFirst() then + LibraryUtility.AddTempField(TempIgnoredFields, RecordField."No.", SourceTableNo); + end; + procedure EnsureWebServiceExist(ServiceNameTxt: Text[240]; PageNumber: Integer) var WebService: Record "Web Service"; @@ -136,6 +164,7 @@ codeunit 130618 "Library - Graph Mgt" begin HttpWebRequestMgt.Initialize(TargetURL); OnAfterInitializeWebRequestWithURL(HttpWebRequestMgt); + LibraryGraphAuthMgt.AddAuthentication(HttpWebRequestMgt, TargetURL); end; procedure PatchToWebServiceAndCheckResponseCode(TargetURL: Text; JSONBody: Text; var ResponseText: Text; ExpectedResponseCode: Integer) @@ -285,6 +314,33 @@ codeunit 130618 "Library - Graph Mgt" exit(TargetURL); end; + /// Appends a path before any query string in an API target URL. + /// API target URL. + /// Path to append. + /// The URL with the appended path. + procedure AppendPathToTargetURL(TargetURL: Text; Path: Text): Text + var + QueryPosition: Integer; + begin + QueryPosition := StrPos(TargetURL, '?'); + if QueryPosition = 0 then + exit(TargetURL + Path); + + exit(CopyStr(TargetURL, 1, QueryPosition - 1) + Path + CopyStr(TargetURL, QueryPosition)); + end; + + /// Appends a query parameter using the appropriate query separator. + /// API target URL. + /// Query parameter to append. + /// The URL with the appended query parameter. + procedure AppendQueryParameterToTargetURL(TargetURL: Text; QueryParameter: Text): Text + begin + if StrPos(TargetURL, '?') = 0 then + exit(TargetURL + '?' + QueryParameter); + + exit(TargetURL + '&' + QueryParameter); + end; + [Normal] procedure STRREPLACE(String: Text; ReplaceWhat: Text; ReplaceWith: Text): Text var @@ -818,9 +874,14 @@ codeunit 130618 "Library - Graph Mgt" var TargetURL: Text; begin - TargetURL := GetODataTargetURL(ObjectType::Page, PageNumber); - TargetURL := AppendSubpageToTargetURL(ID, TargetURL, ServiceNameTxt, ServiceSubPageTxt); - exit(AppendSubpageToTargetURL(SubPageID, TargetURL, ServiceSubPageTxt, ServiceSubSubPageTxt)); + TargetURL := CreateTargetURL(ID, PageNumber, ServiceNameTxt); + TargetURL := AppendPathToTargetURL(TargetURL, '/' + ServiceSubPageTxt); + if SubPageID <> '' then + TargetURL := AppendPathToTargetURL( + TargetURL, '(' + StripBrackets(SubPageID) + ')'); + if ServiceSubSubPageTxt <> '' then + TargetURL := AppendPathToTargetURL(TargetURL, '/' + ServiceSubSubPageTxt); + exit(TargetURL); end; [IntegrationEvent(false, false)] @@ -833,4 +894,3 @@ codeunit 130618 "Library - Graph Mgt" begin end; } -