From def401a825443769dea52689eab5793bbb4d7d38 Mon Sep 17 00:00:00 2001 From: IEvangelist <7679720+IEvangelist@users.noreply.github.com> Date: Tue, 27 Oct 2026 13:00:28 +0000 Subject: [PATCH] Fix Integration Data Updater apiReference filter Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/tools-tests.yml | 4 + .../generate-package-json.ps1 | 5 +- .../generate-package-json.Tests.ps1 | 74 +++++++++++++++++++ 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 tests/PackageJsonGenerator.Tests/generate-package-json.Tests.ps1 diff --git a/.github/workflows/tools-tests.yml b/.github/workflows/tools-tests.yml index 142f552ee..58b9b0cf3 100644 --- a/.github/workflows/tools-tests.yml +++ b/.github/workflows/tools-tests.yml @@ -44,6 +44,10 @@ jobs: dotnet build tests/PackageJsonGenerator.Tests/PackageJsonGenerator.Tests.csproj --configuration Release --no-restore dotnet build tests/AtsJsonGenerator.Tests/AtsJsonGenerator.Tests.csproj --configuration Release --no-restore + - name: Test PackageJsonGenerator script + shell: pwsh + run: ./tests/PackageJsonGenerator.Tests/generate-package-json.Tests.ps1 + - name: Run PackageJsonGenerator tests run: > dotnet test tests/PackageJsonGenerator.Tests/PackageJsonGenerator.Tests.csproj diff --git a/src/tools/PackageJsonGenerator/generate-package-json.ps1 b/src/tools/PackageJsonGenerator/generate-package-json.ps1 index 91a3e67f5..12fdcb908 100644 --- a/src/tools/PackageJsonGenerator/generate-package-json.ps1 +++ b/src/tools/PackageJsonGenerator/generate-package-json.ps1 @@ -109,7 +109,10 @@ $integrationsFile = [System.IO.Path]::Combine($RepoRoot, "src", "frontend", "src $integrations = if (Test-Path $integrationsFile) { # Entries marked `"apiReference": false` (third-party packages) are not documented here. @(Get-Content $integrationsFile -Raw | ConvertFrom-Json | - Where-Object { $_.apiReference -ne $false }) + Where-Object { + $_.PSObject.Properties.Name -notcontains "apiReference" -or + $_.apiReference -ne $false + }) } else { @() diff --git a/tests/PackageJsonGenerator.Tests/generate-package-json.Tests.ps1 b/tests/PackageJsonGenerator.Tests/generate-package-json.Tests.ps1 new file mode 100644 index 000000000..98705e3d1 --- /dev/null +++ b/tests/PackageJsonGenerator.Tests/generate-package-json.Tests.ps1 @@ -0,0 +1,74 @@ +#!/usr/bin/env pwsh + +Set-StrictMode -Version Latest +$ErrorActionPreference = "Stop" + +$repoRoot = (Resolve-Path (Join-Path $PSScriptRoot ".." "..")).Path +$scriptPath = Join-Path $repoRoot "src/tools/PackageJsonGenerator/generate-package-json.ps1" +$catalogPath = Join-Path $repoRoot "src/frontend/src/data/aspire-integrations.json" + +$tokens = $null +$parseErrors = $null +$ast = [System.Management.Automation.Language.Parser]::ParseFile( + $scriptPath, + [ref]$tokens, + [ref]$parseErrors) + +if ($parseErrors.Count -gt 0) { + throw "generate-package-json.ps1 has parse errors: $($parseErrors.Message -join '; ')" +} + +$filterAst = $ast.Find({ + param($node) + + $node -is [System.Management.Automation.Language.CommandAst] -and + $node.GetCommandName() -eq "Where-Object" -and + $node.Extent.Text -match "apiReference" +}, $true) + +if ($null -eq $filterAst) { + throw "Could not find the apiReference catalog filter." +} + +$predicateAst = $filterAst.CommandElements | + Where-Object { $_ -is [System.Management.Automation.Language.ScriptBlockExpressionAst] } | + Select-Object -First 1 + +if ($null -eq $predicateAst) { + throw "Could not find the apiReference filter predicate." +} + +$predicateText = $predicateAst.ScriptBlock.Extent.Text +$predicate = [scriptblock]::Create($predicateText.Substring(1, $predicateText.Length - 2)) + +$fixture = @' +[ + { "title": "Property.Omitted" }, + { "title": "Explicit.False", "apiReference": false }, + { "title": "Explicit.True", "apiReference": true } +] +'@ | ConvertFrom-Json + +$fixtureResult = @($fixture | Where-Object $predicate) +$expectedFixtureTitles = @("Property.Omitted", "Explicit.True") +$actualFixtureTitles = @($fixtureResult.title) +if (Compare-Object $expectedFixtureTitles $actualFixtureTitles) { + throw "Unexpected fixture result: $($actualFixtureTitles -join ', ')" +} + +$catalog = @(Get-Content $catalogPath -Raw | ConvertFrom-Json) +$catalogResult = @($catalog | Where-Object $predicate) +$excluded = @($catalog | Where-Object { + $_.PSObject.Properties.Name -contains "apiReference" -and + $_.apiReference -eq $false +}) + +if ($catalogResult.Count -ne $catalog.Count - $excluded.Count) { + throw "Catalog filter retained $($catalogResult.Count) of $($catalog.Count) entries; expected $($catalog.Count - $excluded.Count)." +} + +if ($catalogResult.title -contains "Particular.Aspire.Hosting.ServicePlatform") { + throw "Catalog filter retained Particular.Aspire.Hosting.ServicePlatform." +} + +Write-Host "apiReference filter passed fixture and catalog checks ($($catalogResult.Count) included, $($excluded.Count) excluded)."