From 3c62283ef6da98ba1dcd10a6d152715b9ee430a8 Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Tue, 3 Sep 2024 15:59:42 +0200 Subject: [PATCH] chore(test runner): include projects in teleReceiver's config --- .../playwright/src/isomorphic/teleReceiver.ts | 16 +++++++++++----- packages/playwright/src/reporters/merge.ts | 7 +++++++ .../playwright/src/reporters/teleEmitter.ts | 18 +++++++++++------- packages/playwright/src/runner/watchMode.ts | 2 +- 4 files changed, 30 insertions(+), 13 deletions(-) diff --git a/packages/playwright/src/isomorphic/teleReceiver.ts b/packages/playwright/src/isomorphic/teleReceiver.ts index 6391f8a64c..9ae5ab5525 100644 --- a/packages/playwright/src/isomorphic/teleReceiver.ts +++ b/packages/playwright/src/isomorphic/teleReceiver.ts @@ -26,14 +26,14 @@ export type JsonStackFrame = { file: string, line: number, column: number }; export type JsonStdIOType = 'stdout' | 'stderr'; -export type JsonConfig = Pick; +export type JsonConfig = Pick & { projects: JsonConfigProject[] }; export type JsonPattern = { s?: string; r?: { source: string, flags: string }; }; -export type JsonProject = { +export type JsonConfigProject = { grep: JsonPattern[]; grepInvert: JsonPattern[]; metadata: Metadata; @@ -45,7 +45,6 @@ export type JsonProject = { outputDir: string; repeatEach: number; retries: number; - suites: JsonSuite[]; teardown?: string; // This is relative to root dir. testDir: string; @@ -54,6 +53,10 @@ export type JsonProject = { timeout: number; }; +export type JsonProject = JsonConfigProject & { + suites: JsonSuite[]; +}; + export type JsonSuite = { title: string; location?: JsonLocation; @@ -304,10 +307,13 @@ export class TeleReporterReceiver { result.quiet = this._options.configOverrides.quiet; result.reporter = [...this._options.configOverrides.reporter]; } - return result; + return { + ...result, + projects: result.projects.map(p => this._parseProject(p)), + }; } - private _parseProject(project: JsonProject): TeleFullProject { + private _parseProject(project: JsonConfigProject): TeleFullProject { return { metadata: project.metadata, name: project.name, diff --git a/packages/playwright/src/reporters/merge.ts b/packages/playwright/src/reporters/merge.ts index 5eedcac136..b9be182d7c 100644 --- a/packages/playwright/src/reporters/merge.ts +++ b/packages/playwright/src/reporters/merge.ts @@ -255,6 +255,7 @@ function mergeConfigureEvents(configureEvents: JsonEvent[], rootDirOverride: str rootDir: '', version: '', workers: 0, + projects: [], }; for (const event of configureEvents) config = mergeConfigs(config, event.params.config); @@ -288,6 +289,11 @@ function mergeConfigureEvents(configureEvents: JsonEvent[], rootDirOverride: str }; } +function dedupByName(a: T[], b: T[]) { + const aNames = new Set(a.map(v => v.name)); + return a.concat(b.filter(b => !aNames.has(b.name))); +} + function mergeConfigs(to: JsonConfig, from: JsonConfig): JsonConfig { return { ...to, @@ -298,6 +304,7 @@ function mergeConfigs(to: JsonConfig, from: JsonConfig): JsonConfig { actualWorkers: (to.metadata.actualWorkers || 0) + (from.metadata.actualWorkers || 0), }, workers: to.workers + from.workers, + projects: dedupByName(to.projects, from.projects), }; } diff --git a/packages/playwright/src/reporters/teleEmitter.ts b/packages/playwright/src/reporters/teleEmitter.ts index 670a8c16c8..3ec05f20dd 100644 --- a/packages/playwright/src/reporters/teleEmitter.ts +++ b/packages/playwright/src/reporters/teleEmitter.ts @@ -161,12 +161,12 @@ export class TeleReporterEmitter implements ReporterV2 { rootDir: config.rootDir, version: config.version, workers: config.workers, + projects: config.projects.map(project => this._serializeConfigProject(project)), }; } - private _serializeProject(suite: reporterTypes.Suite): teleReceiver.JsonProject { - const project = suite.project()!; - const report: teleReceiver.JsonProject = { + private _serializeConfigProject(project: reporterTypes.FullProject): teleReceiver.JsonConfigProject { + return { metadata: project.metadata, name: project.name, outputDir: this._relativePath(project.outputDir), @@ -176,16 +176,20 @@ export class TeleReporterEmitter implements ReporterV2 { testIgnore: serializeRegexPatterns(project.testIgnore), testMatch: serializeRegexPatterns(project.testMatch), timeout: project.timeout, - suites: suite.suites.map(fileSuite => { - return this._serializeSuite(fileSuite); - }), grep: serializeRegexPatterns(project.grep), grepInvert: serializeRegexPatterns(project.grepInvert || []), dependencies: project.dependencies, snapshotDir: this._relativePath(project.snapshotDir), teardown: project.teardown, }; - return report; + } + + private _serializeProject(suite: reporterTypes.Suite): teleReceiver.JsonProject { + const project = suite.project()!; + return { + ...this._serializeConfigProject(project), + suites: suite.suites.map(fileSuite => this._serializeSuite(fileSuite)), + }; } private _serializeSuite(suite: reporterTypes.Suite): teleReceiver.JsonSuite { diff --git a/packages/playwright/src/runner/watchMode.ts b/packages/playwright/src/runner/watchMode.ts index 924449adce..73c5014f13 100644 --- a/packages/playwright/src/runner/watchMode.ts +++ b/packages/playwright/src/runner/watchMode.ts @@ -167,7 +167,7 @@ export async function runWatchModeLoop(configLocation: ConfigLocation, initialOp type: 'multiselect', name: 'selectedProjects', message: 'Select projects', - choices: teleSuiteUpdater.rootSuite!.suites.map(s => s.title), + choices: teleSuiteUpdater.config!.projects.map(p => p.name), }).catch(() => ({ selectedProjects: null })); if (!selectedProjects) continue;