From 30cde544832a1b070994ac507effda479da2c05d Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Thu, 6 Feb 2025 12:03:17 +0100 Subject: [PATCH] refactor: plumb gitcommitinfo with context --- packages/html-reporter/src/metadataView.tsx | 14 ++++++++------ packages/html-reporter/src/reportView.tsx | 10 ++++++++-- packages/html-reporter/src/testFilesView.tsx | 2 +- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/packages/html-reporter/src/metadataView.tsx b/packages/html-reporter/src/metadataView.tsx index 8cc66571ab..6ec3427827 100644 --- a/packages/html-reporter/src/metadataView.tsx +++ b/packages/html-reporter/src/metadataView.tsx @@ -23,12 +23,15 @@ 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): MetadataEntries { - // TODO: do not plumb actualWorkers through metadata. - return Object.entries(metadata).filter(([key]) => key !== 'actualWorkers'); +export function filterMetadata(metadata: Metadata): { gitCommitInfo?: GitCommitInfo, metadataEntries: MetadataEntries } { + return { + gitCommitInfo: metadata['git.commit.info'], + metadataEntries: Object.entries(metadata).filter(([key]) => key !== 'git.commit.info' && key !== 'actualWorkers') // TODO: do not plumb actualWorkers through metadata. + }; } class ErrorBoundary extends React.Component, { error: Error | null, errorInfo: React.ErrorInfo | null }> { @@ -61,9 +64,8 @@ export const MetadataView: React.FC<{ metadataEntries: MetadataEntries }> = ({ m return ; }; -const InnerMetadataView: React.FC<{ metadataEntries: MetadataEntries }> = ({ metadataEntries }) => { - const gitCommitInfo = metadataEntries.find(([key]) => key === 'git.commit.info')?.[1] as GitCommitInfo | undefined; - const entries = metadataEntries.filter(([key]) => key !== 'git.commit.info'); +const InnerMetadataView: React.FC<{ metadataEntries: MetadataEntries }> = ({ metadataEntries: entries }) => { + const gitCommitInfo = React.useContext(GitCommitInfoContext); if (!gitCommitInfo && !entries.length) return null; return
diff --git a/packages/html-reporter/src/reportView.tsx b/packages/html-reporter/src/reportView.tsx index e48064201c..ec8966a68c 100644 --- a/packages/html-reporter/src/reportView.tsx +++ b/packages/html-reporter/src/reportView.tsx @@ -26,6 +26,10 @@ import './reportView.css'; import { TestCaseView } from './testCaseView'; import { TestFilesHeader, TestFilesView } from './testFilesView'; import './theme.css'; +import { filterMetadata } from './metadataView'; +import type { GitCommitInfo } from '@playwright/isomorphic/types'; + +export const GitCommitInfoContext = React.createContext(undefined); declare global { interface Window { @@ -50,6 +54,8 @@ 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 || []) { @@ -72,7 +78,7 @@ export const ReportView: React.FC<{ return result; }, [report, filter]); - return
+ return
{report?.json() && } @@ -88,7 +94,7 @@ export const ReportView: React.FC<{ {!!report && }
-
; +
; }; const TestCaseViewLoader: React.FC<{ diff --git a/packages/html-reporter/src/testFilesView.tsx b/packages/html-reporter/src/testFilesView.tsx index bcb0696946..698f5ac86d 100644 --- a/packages/html-reporter/src/testFilesView.tsx +++ b/packages/html-reporter/src/testFilesView.tsx @@ -69,7 +69,7 @@ export const TestFilesHeader: React.FC<{ }> = ({ report, filteredStats, metadataVisible, toggleMetadataVisible }) => { if (!report) return; - const metadataEntries = filterMetadata(report.metadata || {}); + const { metadataEntries } = filterMetadata(report.metadata || {}); return <>
{metadataEntries.length > 0 &&