diff --git a/packages/html-reporter/src/metadataView.tsx b/packages/html-reporter/src/metadataView.tsx index cd66f85cf5..0cdf38b6c5 100644 --- a/packages/html-reporter/src/metadataView.tsx +++ b/packages/html-reporter/src/metadataView.tsx @@ -23,15 +23,28 @@ import type { Metadata } from '@playwright/test'; import type { GitCommitInfo } from '@testIsomorphic/types'; import { CopyToClipboardContainer } from './copyToClipboard'; import { linkifyText } from '@web/renderUtils'; -import { GitCommitInfoContext } from './reportView'; type MetadataEntries = [string, unknown][]; -export function filterMetadata(metadata: Metadata): { gitCommitInfo?: GitCommitInfo, metadataEntries: MetadataEntries } { - return { - gitCommitInfo: metadata['git.commit.info'], - metadataEntries: Object.entries(metadata).filter(([key]) => key !== 'actualWorkers') // TODO: do not plumb actualWorkers through metadata. - }; +export const MetadataContext = React.createContext([]); + +export function MetadataProvider({ metadata}: React.PropsWithChildren<{ metadata: Metadata }>) { + const entries = React.useMemo(() => { + // TODO: do not plumb actualWorkers through metadata. + + return Object.entries(metadata).filter(([key]) => key !== 'actualWorkers') + }, [metadata]); + + return ; +} + +export function useMetadata() { + return React.useContext(MetadataContext); +} + +export function useGitCommitInfo() { + const metadataEntries = useMetadata(); + return metadataEntries.find(([key]) => key === 'git.commit.info')?.[1] as GitCommitInfo | undefined; } class ErrorBoundary extends React.Component, { error: Error | null, errorInfo: React.ErrorInfo | null }> { @@ -60,12 +73,13 @@ class ErrorBoundary extends React.Component, { error } } -export const MetadataView: React.FC<{ metadataEntries: MetadataEntries }> = ({ metadataEntries }) => { - return ; +export const MetadataView = () => { + return ; }; -const InnerMetadataView: React.FC<{ metadataEntries: MetadataEntries }> = ({ metadataEntries }) => { - const gitCommitInfo = React.useContext(GitCommitInfoContext); +const InnerMetadataView = () => { + const metadataEntries = useMetadata(); + const gitCommitInfo = useGitCommitInfo(); const entries = metadataEntries.filter(([key]) => key !== 'git.commit.info'); if (!gitCommitInfo && !entries.length) return null; diff --git a/packages/html-reporter/src/reportView.tsx b/packages/html-reporter/src/reportView.tsx index a04853badd..abb197abc3 100644 --- a/packages/html-reporter/src/reportView.tsx +++ b/packages/html-reporter/src/reportView.tsx @@ -14,7 +14,7 @@ limitations under the License. */ -import type { FilteredStats, TestCase, TestCaseSummary, TestFile, TestFileSummary } from './types'; +import type { FilteredStats, HTMLReport, TestCase, TestCaseSummary, TestFile, TestFileSummary } from './types'; import * as React from 'react'; import './colors.css'; import './common.css'; @@ -26,10 +26,7 @@ import './reportView.css'; import { TestCaseView } from './testCaseView'; import { TestFilesHeader, TestFilesView } from './testFilesView'; import './theme.css'; -import { filterMetadata } from './metadataView'; -import type { GitCommitInfo } from '@testIsomorphic/types'; - -export const GitCommitInfoContext = React.createContext(undefined); +import { MetadataProvider } from './metadataView'; declare global { interface Window { @@ -54,8 +51,6 @@ export const ReportView: React.FC<{ const [filterText, setFilterText] = React.useState(searchParams.get('q') || ''); const [metadataVisible, setMetadataVisible] = React.useState(false); - const gitCommitInfo = React.useMemo(() => filterMetadata(report?.json().metadata || {}).gitCommitInfo, [report]); - const testIdToFileIdMap = React.useMemo(() => { const map = new Map(); for (const file of report?.json().files || []) { @@ -78,7 +73,7 @@ export const ReportView: React.FC<{ return result; }, [report, filter]); - return + return {report?.json() && } @@ -94,7 +89,7 @@ export const ReportView: React.FC<{ {!!report && } - ; + ; }; const TestCaseViewLoader: React.FC<{ diff --git a/packages/html-reporter/src/testErrorView.tsx b/packages/html-reporter/src/testErrorView.tsx index 2dcebbad9a..d7aab5211c 100644 --- a/packages/html-reporter/src/testErrorView.tsx +++ b/packages/html-reporter/src/testErrorView.tsx @@ -20,10 +20,10 @@ import './testErrorView.css'; import * as icons from './icons'; import type { ImageDiff } from '@web/shared/imageDiffView'; import { ImageDiffView } from '@web/shared/imageDiffView'; -import { GitCommitInfoContext } from './reportView'; import { TestResult } from './types'; import { CopyToClipboard } from './copyToClipboard'; import { fixTestPrompt } from '@web/components/prompts'; +import { useGitCommitInfo } from './metadataView'; export const TestErrorView: React.FC<{ error: string; testId?: string; result?: TestResult }> = ({ error, testId, result }) => { return ( @@ -49,7 +49,7 @@ const PromptButton: React.FC<{ error: string; result?: TestResult; }> = ({ error, result }) => { - const gitCommitInfo = React.useContext(GitCommitInfoContext); + const gitCommitInfo = useGitCommitInfo(); const prompt = React.useMemo(() => fixTestPrompt( error, gitCommitInfo?.['pull.diff'] ?? gitCommitInfo?.['revision.diff'], diff --git a/packages/html-reporter/src/testFilesView.tsx b/packages/html-reporter/src/testFilesView.tsx index 698f5ac86d..809e3b0748 100644 --- a/packages/html-reporter/src/testFilesView.tsx +++ b/packages/html-reporter/src/testFilesView.tsx @@ -22,7 +22,7 @@ import { msToString } from './utils'; import { AutoChip } from './chip'; import { TestErrorView } from './testErrorView'; import * as icons from './icons'; -import { filterMetadata, MetadataView } from './metadataView'; +import { MetadataView, useMetadata } from './metadataView'; export const TestFilesView: React.FC<{ tests: TestFileSummary[], @@ -69,7 +69,7 @@ export const TestFilesHeader: React.FC<{ }> = ({ report, filteredStats, metadataVisible, toggleMetadataVisible }) => { if (!report) return; - const { metadataEntries } = filterMetadata(report.metadata || {}); + const metadataEntries = useMetadata(); return <> {metadataEntries.length > 0 && @@ -81,7 +81,7 @@ export const TestFilesHeader: React.FC<{ {report ? new Date(report.startTime).toLocaleString() : ''} Total time: {msToString(report.duration ?? 0)} - {metadataVisible && } + {metadataVisible && } {!!report.errors.length && {report.errors.map((error, index) => )} }