From 7704dc8d1e53f6111964634aeb7d0ab8d7c559b2 Mon Sep 17 00:00:00 2001 From: Wei Hu Date: Tue, 18 Aug 2026 05:56:51 +0000 Subject: [PATCH 1/7] Fix overview grouping for management C# emitter --- packages/spec-dashboard/src/apis.test.ts | 52 +++++++++++++++++++ .../src/components/coverage-overview.tsx | 31 ++++++++--- 2 files changed, 76 insertions(+), 7 deletions(-) diff --git a/packages/spec-dashboard/src/apis.test.ts b/packages/spec-dashboard/src/apis.test.ts index f46702a047e..5f027ef1efe 100644 --- a/packages/spec-dashboard/src/apis.test.ts +++ b/packages/spec-dashboard/src/apis.test.ts @@ -1,7 +1,10 @@ import type { ScenarioManifest } from "@typespec/spec-coverage-sdk"; +import { createElement } from "react"; +import { renderToStaticMarkup } from "react-dom/server"; import { expect, it } from "vitest"; import type { TableDefinition } from "./apis.js"; import { splitManifestByTables } from "./apis.js"; +import { CoverageOverview } from "./components/coverage-overview.js"; const createManifest = ( packageName: string, @@ -225,6 +228,55 @@ it("should not duplicate scenarios across tables", () => { expect(defaultTable!.manifest.scenarios[0].name).toBe("unique_scenario"); }); +it("should group overview coverage by logical display name across emitter packages", () => { + const coverageSummaries = [ + { + manifest: { + packageName: "azure-test", + displayName: "Azure Test", + commit: "abc123", + version: "1.0.0", + scenarios: [ + { + name: "scenario_1", + scenarioDoc: "Doc", + location: { + path: "x", + start: { line: 1, character: 1 }, + end: { line: 2, character: 1 }, + }, + }, + ], + }, + tableName: "Azure Test", + generatorReports: { + "@azure-typespec/http-client-csharp": { + generatorMetadata: { name: "C#", version: "1.0.0" }, + results: { scenario_1: "pass" }, + }, + "@azure-typespec/http-client-csharp-mgmt": { + generatorMetadata: { name: "C#", version: "1.0.0" }, + results: { scenario_1: "pass" }, + }, + }, + }, + ] as any; + + const html = renderToStaticMarkup( + createElement(CoverageOverview, { + coverageSummaries, + emitterDisplayNames: { + "@azure-typespec/http-client-csharp": "C#", + "@azure-typespec/http-client-csharp-mgmt": "C#", + }, + }), + ); + + const cSharpMatches = html.match(/C#/g) ?? []; + expect(cSharpMatches.length).toBeGreaterThanOrEqual(1); + expect(html).not.toContain("@azure-typespec/http-client-csharp-mgmt"); +}); + it("should include emitterNames from table definition", () => { const manifest = createManifest("test-package", "Display Name", ["scenario1"]); const tables: TableDefinition[] = [ diff --git a/packages/spec-dashboard/src/components/coverage-overview.tsx b/packages/spec-dashboard/src/components/coverage-overview.tsx index 7e8d8d54506..5bf9ce2668a 100644 --- a/packages/spec-dashboard/src/components/coverage-overview.tsx +++ b/packages/spec-dashboard/src/components/coverage-overview.tsx @@ -39,6 +39,14 @@ function getEmitterDisplayName( return emitterName; } +function getEmitterOverviewKey( + emitterName: string, + report: CoverageSummary["generatorReports"][string], + emitterDisplayNames?: Record, +): string { + return getEmitterDisplayName(emitterName, report, emitterDisplayNames); +} + /** * Gets the accent color for a coverage ratio using the same thresholds as the coverage tables. */ @@ -59,22 +67,31 @@ export const CoverageOverview: FunctionComponent = ({ emitterDisplayNames, }) => { const emitterOverviews = useMemo(() => { - // Aggregate scenarios per emitter across all summaries + // Aggregate scenarios per logical emitter language across all summaries. + // This keeps emitters that share the same display name (for example C# data-plane + // and management-plane emitters) grouped into a single overview card. const emitterMap = new Map< string, { totalScenarios: number; coveredScenarios: number; report: CoverageSummary["generatorReports"][string]; + displayName: string; } >(); for (const summary of coverageSummaries) { for (const [emitterName, report] of Object.entries(summary.generatorReports)) { - if (!emitterMap.has(emitterName)) { - emitterMap.set(emitterName, { totalScenarios: 0, coveredScenarios: 0, report }); + const groupKey = getEmitterOverviewKey(emitterName, report, emitterDisplayNames); + if (!emitterMap.has(groupKey)) { + emitterMap.set(groupKey, { + totalScenarios: 0, + coveredScenarios: 0, + report, + displayName: getEmitterDisplayName(emitterName, report, emitterDisplayNames), + }); } - const entry = emitterMap.get(emitterName)!; + const entry = emitterMap.get(groupKey)!; const scenarios = summary.manifest.scenarios; entry.totalScenarios += scenarios.length; if (report) { @@ -89,10 +106,10 @@ export const CoverageOverview: FunctionComponent = ({ } const overviews: EmitterOverview[] = []; - for (const [emitterName, data] of emitterMap) { + for (const [groupKey, data] of emitterMap) { overviews.push({ - name: emitterName, - displayName: getEmitterDisplayName(emitterName, data.report, emitterDisplayNames), + name: groupKey, + displayName: data.displayName, coverageRatio: data.totalScenarios > 0 ? data.coveredScenarios / data.totalScenarios : 0, }); } From 5102e2af2b031df80fe19cfe459cea2223439596 Mon Sep 17 00:00:00 2001 From: Wei Hu Date: Tue, 18 Aug 2026 06:05:55 +0000 Subject: [PATCH 2/7] Fix overview aggregation and tighten C# regression test --- packages/spec-dashboard/src/apis.test.ts | 2 +- .../src/components/coverage-overview.tsx | 58 +++++++++++++++---- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/packages/spec-dashboard/src/apis.test.ts b/packages/spec-dashboard/src/apis.test.ts index 5f027ef1efe..97d2ed9185d 100644 --- a/packages/spec-dashboard/src/apis.test.ts +++ b/packages/spec-dashboard/src/apis.test.ts @@ -273,7 +273,7 @@ it("should group overview coverage by logical display name across emitter packag ); const cSharpMatches = html.match(/C#/g) ?? []; - expect(cSharpMatches.length).toBeGreaterThanOrEqual(1); + expect(cSharpMatches).toHaveLength(1); expect(html).not.toContain("@azure-typespec/http-client-csharp-mgmt"); }); diff --git a/packages/spec-dashboard/src/components/coverage-overview.tsx b/packages/spec-dashboard/src/components/coverage-overview.tsx index 5bf9ce2668a..59565081538 100644 --- a/packages/spec-dashboard/src/components/coverage-overview.tsx +++ b/packages/spec-dashboard/src/components/coverage-overview.tsx @@ -81,27 +81,61 @@ export const CoverageOverview: FunctionComponent = ({ >(); for (const summary of coverageSummaries) { + const summaryGroupMap = new Map< + string, + { + scenarioNames: Set; + coveredScenarioNames: Set; + } + >(); + for (const [emitterName, report] of Object.entries(summary.generatorReports)) { const groupKey = getEmitterOverviewKey(emitterName, report, emitterDisplayNames); + if (!summaryGroupMap.has(groupKey)) { + summaryGroupMap.set(groupKey, { + scenarioNames: new Set(), + coveredScenarioNames: new Set(), + }); + } + + const entry = summaryGroupMap.get(groupKey)!; + for (const scenario of summary.manifest.scenarios) { + entry.scenarioNames.add(scenario.name); + const status = report?.results[scenario.name]; + if ( + report && + (status === "pass" || status === "not-applicable" || status === "not-supported") + ) { + entry.coveredScenarioNames.add(scenario.name); + } + } + } + + for (const [groupKey, data] of summaryGroupMap) { if (!emitterMap.has(groupKey)) { + const firstReport = Object.entries(summary.generatorReports).find( + ([emitterName, report]) => + getEmitterOverviewKey(emitterName, report, emitterDisplayNames) === groupKey, + )?.[1]; + emitterMap.set(groupKey, { totalScenarios: 0, coveredScenarios: 0, - report, - displayName: getEmitterDisplayName(emitterName, report, emitterDisplayNames), + report: firstReport, + displayName: getEmitterDisplayName( + Object.entries(summary.generatorReports).find( + ([emitterName, report]) => + getEmitterOverviewKey(emitterName, report, emitterDisplayNames) === groupKey, + )?.[0] ?? groupKey, + firstReport, + emitterDisplayNames, + ), }); } + const entry = emitterMap.get(groupKey)!; - const scenarios = summary.manifest.scenarios; - entry.totalScenarios += scenarios.length; - if (report) { - for (const scenario of scenarios) { - const status = report.results[scenario.name]; - if (status === "pass" || status === "not-applicable" || status === "not-supported") { - entry.coveredScenarios++; - } - } - } + entry.totalScenarios += data.scenarioNames.size; + entry.coveredScenarios += data.coveredScenarioNames.size; } } From 4fb1f154b9372ac4cff9162dc431aaa974c13b82 Mon Sep 17 00:00:00 2001 From: Wei Hu Date: Tue, 25 Aug 2026 01:39:07 +0000 Subject: [PATCH 3/7] Resolve management emitter display names --- packages/spec-dashboard/src/apis.test.ts | 10 +++++- .../src/components/coverage-overview.tsx | 24 +------------- .../src/components/dashboard-table.tsx | 3 +- .../src/utils/emitter-display-name.ts | 33 +++++++++++++++++++ 4 files changed, 45 insertions(+), 25 deletions(-) create mode 100644 packages/spec-dashboard/src/utils/emitter-display-name.ts diff --git a/packages/spec-dashboard/src/apis.test.ts b/packages/spec-dashboard/src/apis.test.ts index 97d2ed9185d..2846eedf1f4 100644 --- a/packages/spec-dashboard/src/apis.test.ts +++ b/packages/spec-dashboard/src/apis.test.ts @@ -5,6 +5,7 @@ import { expect, it } from "vitest"; import type { TableDefinition } from "./apis.js"; import { splitManifestByTables } from "./apis.js"; import { CoverageOverview } from "./components/coverage-overview.js"; +import { getEmitterDisplayName } from "./utils/emitter-display-name.js"; const createManifest = ( packageName: string, @@ -267,7 +268,6 @@ it("should group overview coverage by logical display name across emitter packag coverageSummaries, emitterDisplayNames: { "@azure-typespec/http-client-csharp": "C#", - "@azure-typespec/http-client-csharp-mgmt": "C#", }, }), ); @@ -277,6 +277,14 @@ it("should group overview coverage by logical display name across emitter packag expect(html).not.toContain("@azure-typespec/http-client-csharp-mgmt"); }); +it("should use the base emitter display name for a management-plane emitter", () => { + expect( + getEmitterDisplayName("@azure-typespec/http-client-csharp-mgmt", undefined, { + "@azure-typespec/http-client-csharp": "C#", + }), + ).toBe("C#"); +}); + it("should include emitterNames from table definition", () => { const manifest = createManifest("test-package", "Display Name", ["scenario1"]); const tables: TableDefinition[] = [ diff --git a/packages/spec-dashboard/src/components/coverage-overview.tsx b/packages/spec-dashboard/src/components/coverage-overview.tsx index 59565081538..f3039177112 100644 --- a/packages/spec-dashboard/src/components/coverage-overview.tsx +++ b/packages/spec-dashboard/src/components/coverage-overview.tsx @@ -3,6 +3,7 @@ import type { FunctionComponent } from "react"; import { useMemo } from "react"; import type { CoverageSummary } from "../apis.js"; import { GroupRatioColors, GroupRatios } from "../constants.js"; +import { getEmitterDisplayName } from "../utils/emitter-display-name.js"; import style from "./coverage-overview.module.css"; interface EmitterOverview { @@ -16,29 +17,6 @@ export interface CoverageOverviewProps { emitterDisplayNames?: Record; } -/** - * Extracts a display-friendly name from a full emitter package name. - * e.g. "@typespec/http-client-python" → "Python" - */ -function getEmitterDisplayName( - emitterName: string, - report: CoverageSummary["generatorReports"][string], - emitterDisplayNames?: Record, -): string { - if (emitterDisplayNames?.[emitterName]) { - return emitterDisplayNames[emitterName]; - } - if (report?.generatorMetadata?.name) { - return report.generatorMetadata.name; - } - // Strip common prefix patterns - const match = emitterName.match(/http-client-(\w+)$/); - if (match) { - return match[1].charAt(0).toUpperCase() + match[1].slice(1); - } - return emitterName; -} - function getEmitterOverviewKey( emitterName: string, report: CoverageSummary["generatorReports"][string], diff --git a/packages/spec-dashboard/src/components/dashboard-table.tsx b/packages/spec-dashboard/src/components/dashboard-table.tsx index fd5e0ab7f51..4331431ea53 100644 --- a/packages/spec-dashboard/src/components/dashboard-table.tsx +++ b/packages/spec-dashboard/src/components/dashboard-table.tsx @@ -5,6 +5,7 @@ import type { FunctionComponent } from "react"; import { useCallback, useMemo, useState } from "react"; import type { CoverageSummary, GeneratorCoverageSuiteReport } from "../apis.js"; import { getCompletedRatio } from "../utils/coverage-utils.js"; +import { getEmitterDisplayName } from "../utils/emitter-display-name.js"; import style from "./dashboard-table.module.css"; import { GeneratorInformation } from "./generator-information.js"; import { ScenarioGroupRatioStatusBox } from "./scenario-group-status.js"; @@ -175,7 +176,7 @@ const DashboardHeaderRow: FunctionComponent = ({ status={status} report={report} language={lang} - displayName={emitterDisplayNames?.[lang as string]} + displayName={getEmitterDisplayName(lang, report, emitterDisplayNames)} /> ))} diff --git a/packages/spec-dashboard/src/utils/emitter-display-name.ts b/packages/spec-dashboard/src/utils/emitter-display-name.ts new file mode 100644 index 00000000000..13d99f5c941 --- /dev/null +++ b/packages/spec-dashboard/src/utils/emitter-display-name.ts @@ -0,0 +1,33 @@ +import type { CoverageSummary } from "../apis.js"; + +/** + * Resolves the friendly display name for an emitter. + * + * Management-plane emitters are variants of their data-plane emitter package + * (for example, `http-client-csharp-mgmt`). Reuse the base emitter's configured + * display name so both variants are presented as the same language. + */ +export function getEmitterDisplayName( + emitterName: string, + report: CoverageSummary["generatorReports"][string], + emitterDisplayNames?: Record, +): string { + const configuredName = + emitterDisplayNames?.[emitterName] ?? + (emitterName.endsWith("-mgmt") + ? emitterDisplayNames?.[emitterName.slice(0, -"-mgmt".length)] + : undefined); + + if (configuredName) { + return configuredName; + } + if (report?.generatorMetadata?.name) { + return report.generatorMetadata.name; + } + + const match = emitterName.match(/http-client-(\w+?)(?:-mgmt)?$/); + if (match) { + return match[1].charAt(0).toUpperCase() + match[1].slice(1); + } + return emitterName; +} From c4c67b80d2b13a06e5d829dd8fffabb32eb6cf89 Mon Sep 17 00:00:00 2001 From: Wei Hu Date: Tue, 25 Aug 2026 01:46:24 +0000 Subject: [PATCH 4/7] Revert "Resolve management emitter display names" This reverts commit 4fb1f154b9372ac4cff9162dc431aaa974c13b82. --- packages/spec-dashboard/src/apis.test.ts | 10 +----- .../src/components/coverage-overview.tsx | 24 +++++++++++++- .../src/components/dashboard-table.tsx | 3 +- .../src/utils/emitter-display-name.ts | 33 ------------------- 4 files changed, 25 insertions(+), 45 deletions(-) delete mode 100644 packages/spec-dashboard/src/utils/emitter-display-name.ts diff --git a/packages/spec-dashboard/src/apis.test.ts b/packages/spec-dashboard/src/apis.test.ts index 2846eedf1f4..97d2ed9185d 100644 --- a/packages/spec-dashboard/src/apis.test.ts +++ b/packages/spec-dashboard/src/apis.test.ts @@ -5,7 +5,6 @@ import { expect, it } from "vitest"; import type { TableDefinition } from "./apis.js"; import { splitManifestByTables } from "./apis.js"; import { CoverageOverview } from "./components/coverage-overview.js"; -import { getEmitterDisplayName } from "./utils/emitter-display-name.js"; const createManifest = ( packageName: string, @@ -268,6 +267,7 @@ it("should group overview coverage by logical display name across emitter packag coverageSummaries, emitterDisplayNames: { "@azure-typespec/http-client-csharp": "C#", + "@azure-typespec/http-client-csharp-mgmt": "C#", }, }), ); @@ -277,14 +277,6 @@ it("should group overview coverage by logical display name across emitter packag expect(html).not.toContain("@azure-typespec/http-client-csharp-mgmt"); }); -it("should use the base emitter display name for a management-plane emitter", () => { - expect( - getEmitterDisplayName("@azure-typespec/http-client-csharp-mgmt", undefined, { - "@azure-typespec/http-client-csharp": "C#", - }), - ).toBe("C#"); -}); - it("should include emitterNames from table definition", () => { const manifest = createManifest("test-package", "Display Name", ["scenario1"]); const tables: TableDefinition[] = [ diff --git a/packages/spec-dashboard/src/components/coverage-overview.tsx b/packages/spec-dashboard/src/components/coverage-overview.tsx index f3039177112..59565081538 100644 --- a/packages/spec-dashboard/src/components/coverage-overview.tsx +++ b/packages/spec-dashboard/src/components/coverage-overview.tsx @@ -3,7 +3,6 @@ import type { FunctionComponent } from "react"; import { useMemo } from "react"; import type { CoverageSummary } from "../apis.js"; import { GroupRatioColors, GroupRatios } from "../constants.js"; -import { getEmitterDisplayName } from "../utils/emitter-display-name.js"; import style from "./coverage-overview.module.css"; interface EmitterOverview { @@ -17,6 +16,29 @@ export interface CoverageOverviewProps { emitterDisplayNames?: Record; } +/** + * Extracts a display-friendly name from a full emitter package name. + * e.g. "@typespec/http-client-python" → "Python" + */ +function getEmitterDisplayName( + emitterName: string, + report: CoverageSummary["generatorReports"][string], + emitterDisplayNames?: Record, +): string { + if (emitterDisplayNames?.[emitterName]) { + return emitterDisplayNames[emitterName]; + } + if (report?.generatorMetadata?.name) { + return report.generatorMetadata.name; + } + // Strip common prefix patterns + const match = emitterName.match(/http-client-(\w+)$/); + if (match) { + return match[1].charAt(0).toUpperCase() + match[1].slice(1); + } + return emitterName; +} + function getEmitterOverviewKey( emitterName: string, report: CoverageSummary["generatorReports"][string], diff --git a/packages/spec-dashboard/src/components/dashboard-table.tsx b/packages/spec-dashboard/src/components/dashboard-table.tsx index 4331431ea53..fd5e0ab7f51 100644 --- a/packages/spec-dashboard/src/components/dashboard-table.tsx +++ b/packages/spec-dashboard/src/components/dashboard-table.tsx @@ -5,7 +5,6 @@ import type { FunctionComponent } from "react"; import { useCallback, useMemo, useState } from "react"; import type { CoverageSummary, GeneratorCoverageSuiteReport } from "../apis.js"; import { getCompletedRatio } from "../utils/coverage-utils.js"; -import { getEmitterDisplayName } from "../utils/emitter-display-name.js"; import style from "./dashboard-table.module.css"; import { GeneratorInformation } from "./generator-information.js"; import { ScenarioGroupRatioStatusBox } from "./scenario-group-status.js"; @@ -176,7 +175,7 @@ const DashboardHeaderRow: FunctionComponent = ({ status={status} report={report} language={lang} - displayName={getEmitterDisplayName(lang, report, emitterDisplayNames)} + displayName={emitterDisplayNames?.[lang as string]} /> ))} diff --git a/packages/spec-dashboard/src/utils/emitter-display-name.ts b/packages/spec-dashboard/src/utils/emitter-display-name.ts deleted file mode 100644 index 13d99f5c941..00000000000 --- a/packages/spec-dashboard/src/utils/emitter-display-name.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { CoverageSummary } from "../apis.js"; - -/** - * Resolves the friendly display name for an emitter. - * - * Management-plane emitters are variants of their data-plane emitter package - * (for example, `http-client-csharp-mgmt`). Reuse the base emitter's configured - * display name so both variants are presented as the same language. - */ -export function getEmitterDisplayName( - emitterName: string, - report: CoverageSummary["generatorReports"][string], - emitterDisplayNames?: Record, -): string { - const configuredName = - emitterDisplayNames?.[emitterName] ?? - (emitterName.endsWith("-mgmt") - ? emitterDisplayNames?.[emitterName.slice(0, -"-mgmt".length)] - : undefined); - - if (configuredName) { - return configuredName; - } - if (report?.generatorMetadata?.name) { - return report.generatorMetadata.name; - } - - const match = emitterName.match(/http-client-(\w+?)(?:-mgmt)?$/); - if (match) { - return match[1].charAt(0).toUpperCase() + match[1].slice(1); - } - return emitterName; -} From 56bfa1f1507817d30571f3377ee9145e1e96d8db Mon Sep 17 00:00:00 2001 From: Wei Hu Date: Tue, 25 Aug 2026 01:58:02 +0000 Subject: [PATCH 5/7] Simplify overview group initialization --- .../src/components/coverage-overview.tsx | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/packages/spec-dashboard/src/components/coverage-overview.tsx b/packages/spec-dashboard/src/components/coverage-overview.tsx index 59565081538..32bb9ead4df 100644 --- a/packages/spec-dashboard/src/components/coverage-overview.tsx +++ b/packages/spec-dashboard/src/components/coverage-overview.tsx @@ -75,7 +75,6 @@ export const CoverageOverview: FunctionComponent = ({ { totalScenarios: number; coveredScenarios: number; - report: CoverageSummary["generatorReports"][string]; displayName: string; } >(); @@ -113,23 +112,10 @@ export const CoverageOverview: FunctionComponent = ({ for (const [groupKey, data] of summaryGroupMap) { if (!emitterMap.has(groupKey)) { - const firstReport = Object.entries(summary.generatorReports).find( - ([emitterName, report]) => - getEmitterOverviewKey(emitterName, report, emitterDisplayNames) === groupKey, - )?.[1]; - emitterMap.set(groupKey, { totalScenarios: 0, coveredScenarios: 0, - report: firstReport, - displayName: getEmitterDisplayName( - Object.entries(summary.generatorReports).find( - ([emitterName, report]) => - getEmitterOverviewKey(emitterName, report, emitterDisplayNames) === groupKey, - )?.[0] ?? groupKey, - firstReport, - emitterDisplayNames, - ), + displayName: groupKey, }); } From d12ec126e5711f48bc367b7660d7e2bb7dc707a8 Mon Sep 17 00:00:00 2001 From: Wei Hu Date: Tue, 25 Aug 2026 01:58:54 +0000 Subject: [PATCH 6/7] Cover grouped emitter coverage calculation --- packages/spec-dashboard/src/apis.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/spec-dashboard/src/apis.test.ts b/packages/spec-dashboard/src/apis.test.ts index 97d2ed9185d..f0ef78f656a 100644 --- a/packages/spec-dashboard/src/apis.test.ts +++ b/packages/spec-dashboard/src/apis.test.ts @@ -256,7 +256,7 @@ it("should group overview coverage by logical display name across emitter packag }, "@azure-typespec/http-client-csharp-mgmt": { generatorMetadata: { name: "C#", version: "1.0.0" }, - results: { scenario_1: "pass" }, + results: { scenario_1: "fail" }, }, }, }, @@ -274,6 +274,7 @@ it("should group overview coverage by logical display name across emitter packag const cSharpMatches = html.match(/C#/g) ?? []; expect(cSharpMatches).toHaveLength(1); + expect(html).toContain("100%"); expect(html).not.toContain("@azure-typespec/http-client-csharp-mgmt"); }); From 88d00107b0dc741f9171d450a12ce552d0c03eb1 Mon Sep 17 00:00:00 2001 From: Wei Hu Date: Fri, 28 Aug 2026 04:14:32 +0000 Subject: [PATCH 7/7] Improve C# overview aggregation test --- packages/spec-dashboard/src/apis.test.ts | 49 +++++++++++------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/packages/spec-dashboard/src/apis.test.ts b/packages/spec-dashboard/src/apis.test.ts index f0ef78f656a..44e7e7cfdb8 100644 --- a/packages/spec-dashboard/src/apis.test.ts +++ b/packages/spec-dashboard/src/apis.test.ts @@ -228,35 +228,31 @@ it("should not duplicate scenarios across tables", () => { expect(defaultTable!.manifest.scenarios[0].name).toBe("unique_scenario"); }); -it("should group overview coverage by logical display name across emitter packages", () => { +it("should combine data-plane and management-plane C# coverage in the overview", () => { const coverageSummaries = [ { - manifest: { - packageName: "azure-test", - displayName: "Azure Test", - commit: "abc123", - version: "1.0.0", - scenarios: [ - { - name: "scenario_1", - scenarioDoc: "Doc", - location: { - path: "x", - start: { line: 1, character: 1 }, - end: { line: 2, character: 1 }, - }, - }, - ], - }, - tableName: "Azure Test", + manifest: createManifest("azure-test", "Azure Test", ["data_plane_scenario"]), + tableName: "Azure Data Plane", generatorReports: { "@azure-typespec/http-client-csharp": { - generatorMetadata: { name: "C#", version: "1.0.0" }, - results: { scenario_1: "pass" }, + generatorMetadata: { + name: "@azure-typespec/http-client-csharp", + version: "1.0.0", + }, + results: { data_plane_scenario: "pass" }, }, + }, + }, + { + manifest: createManifest("azure-test", "Azure Test", ["management_plane_scenario"]), + tableName: "Azure Management Plane", + generatorReports: { "@azure-typespec/http-client-csharp-mgmt": { - generatorMetadata: { name: "C#", version: "1.0.0" }, - results: { scenario_1: "fail" }, + generatorMetadata: { + name: "@azure-typespec/http-client-csharp-mgmt", + version: "1.0.0", + }, + results: { management_plane_scenario: "fail" }, }, }, }, @@ -272,10 +268,9 @@ it("should group overview coverage by logical display name across emitter packag }), ); - const cSharpMatches = html.match(/C#/g) ?? []; - expect(cSharpMatches).toHaveLength(1); - expect(html).toContain("100%"); - expect(html).not.toContain("@azure-typespec/http-client-csharp-mgmt"); + expect(html.match(/C#/g)).toHaveLength(1); + expect(html).toContain("50%"); + expect(html).not.toContain("@azure-typespec/http-client-csharp"); }); it("should include emitterNames from table definition", () => {