diff --git a/packages/html-reporter/src/testCaseView.tsx b/packages/html-reporter/src/testCaseView.tsx index 08f1523dc6..4a01d6f39c 100644 --- a/packages/html-reporter/src/testCaseView.tsx +++ b/packages/html-reporter/src/testCaseView.tsx @@ -14,7 +14,7 @@ limitations under the License. */ -import type { TestCase, TestCaseAnnotation } from './types'; +import type { TestCase } from './types'; import * as React from 'react'; import { TabbedPane } from './tabbedPane'; import { AutoChip } from './chip'; @@ -32,13 +32,20 @@ export const TestCaseView: React.FC<{ }> = ({ projectNames, test, run, anchor }) => { const [selectedResultIndex, setSelectedResultIndex] = React.useState(run); + const annotations = new Map(); + test?.annotations.forEach(annotation => { + const list = annotations.get(annotation.type) || []; + list.push(annotation.description); + annotations.set(annotation.type, list); + }); + return
{test &&
{test.path.join(' › ')}
} {test &&
{test?.title}
} {test &&
{test.location.file}:{test.location.line}
} {test && !!test.projectName && } - {test && !!test.annotations.length && - {test.annotations.map(annotation => )} + {annotations.size && + {[...annotations].map(annotation => )} } {test && ({ @@ -57,11 +64,17 @@ function renderAnnotationDescription(description: string) { return description; } -function TestCaseAnnotationView({ annotation: { type, description } }: { annotation: TestCaseAnnotation }) { +function TestCaseAnnotationView({ type, descriptions }: { type: string, descriptions: (string | undefined)[] }) { + const filteredDescriptions = descriptions.filter(Boolean) as string[]; return (
{type} - {description && : {renderAnnotationDescription(description)}} + {!!filteredDescriptions.length && : {filteredDescriptions.map((d, i) => { + const rendered = renderAnnotationDescription(d); + if (i < filteredDescriptions.length - 1) + return <>{rendered}, ; + return rendered; + })}}
); } diff --git a/tests/playwright-test/reporter-html.spec.ts b/tests/playwright-test/reporter-html.spec.ts index 0dc1dfc004..755c5f9ab1 100644 --- a/tests/playwright-test/reporter-html.spec.ts +++ b/tests/playwright-test/reporter-html.spec.ts @@ -565,6 +565,11 @@ test('should render annotations', async ({ runInlineTest, page, showReport }) => 'a.test.js': ` import { test, expect } from '@playwright/test'; test('skipped test', async ({ page }) => { + test.info().annotations.push({ type: 'issue', description: '#123'}); + test.info().annotations.push({ type: 'issue', description: '#456'}); + test.info().annotations.push({ type: 'issue', description: 'https://playwright.dev'}); + test.info().annotations.push({ type: 'issue' }); + test.info().annotations.push({ type: 'empty' }); test.skip(true, 'I am not interested in this test'); }); `, @@ -574,7 +579,11 @@ test('should render annotations', async ({ runInlineTest, page, showReport }) => await showReport(); await page.click('text=skipped test'); - await expect(page.locator('.test-case-annotation')).toHaveText('skip: I am not interested in this test'); + await expect(page.locator('.test-case-annotation')).toHaveText([ + 'issue: #123, #456, https://playwright.dev', + 'empty', + 'skip: I am not interested in this test', + ]); }); test('should render annotations as link if needed', async ({ runInlineTest, page, showReport, server }) => {