From 001efbb0ffc5b0ba55cfa571e875efaba0882ac5 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Wed, 4 Feb 2026 19:06:03 -0800 Subject: [PATCH] fix: update config.projects when merging projects in TeleReporterReceiver Fixes https://github.com/microsoft/playwright/issues/39142 --- .../playwright/src/isomorphic/teleReceiver.ts | 13 ++++++- tests/playwright-test/reporter-blob.spec.ts | 39 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/packages/playwright/src/isomorphic/teleReceiver.ts b/packages/playwright/src/isomorphic/teleReceiver.ts index fc28d70f9b496..6eba6073b0484 100644 --- a/packages/playwright/src/isomorphic/teleReceiver.ts +++ b/packages/playwright/src/isomorphic/teleReceiver.ts @@ -338,8 +338,19 @@ export class TeleReporterReceiver { projectSuite = new TeleSuite(project.name, 'project'); this._rootSuite._addSuite(projectSuite); } + + const parsed = this._parseProject(project); // Always update project in watch mode. - projectSuite._project = this._parseProject(project); + projectSuite._project = parsed; + + let index = -1; + if (this._options.mergeProjects) + index = this._config.projects.findIndex(p => p.name === project.name); + if (index === -1) + this._config.projects.push(parsed); + else + this._config.projects[index] = parsed; + for (const suite of project.suites) this._mergeSuiteInto(suite, projectSuite); } diff --git a/tests/playwright-test/reporter-blob.spec.ts b/tests/playwright-test/reporter-blob.spec.ts index 1ca22c1e4f217..a1d60d2d69040 100644 --- a/tests/playwright-test/reporter-blob.spec.ts +++ b/tests/playwright-test/reporter-blob.spec.ts @@ -2287,3 +2287,42 @@ test('shard chart', async ({ runInlineTest, writeFiles, showReport, page, mergeR - listitem /@mac/ `); }); + +test('should populate projects in config when merging reports', async ({ runInlineTest, mergeReports }) => { + const reportDir = test.info().outputPath('blob-report'); + class CustomReporter { + onBegin(config, suite) { + const projectNames = config.projects.map(p => p.name); + console.log('%%' + JSON.stringify(projectNames)); + } + } + const files = { + 'reporter.js': `module.exports = ${CustomReporter.toString()};`, + 'playwright.config.ts': ` + module.exports = { + reporter: [['blob', { outputDir: '${reportDir.replace(/\\/g, '/')}' }]], + projects: [ + { name: 'setup' }, + { name: 'p1', dependencies: ['setup'] }, + { name: 'p2', dependencies: ['setup'] }, + ] + }; + `, + 'a.test.js': ` + import { test } from '@playwright/test'; + test('test 1', async ({}) => {}); + `, + }; + + await runInlineTest(files, { shard: `1/2`, workers: 1 }); + await runInlineTest(files, { shard: `2/2`, workers: 1 }, { PWTEST_BLOB_DO_NOT_REMOVE: '1' }); + + const reportFiles = await fs.promises.readdir(reportDir); + expect(reportFiles).toHaveLength(2); + + const { exitCode, outputLines } = await mergeReports(reportDir, {}, { additionalArgs: ['--reporter', test.info().outputPath('reporter.js')] }); + expect(exitCode).toBe(0); + + const projectNames = JSON.parse(outputLines[0]); + expect(projectNames).toEqual(['setup', 'p1', 'setup', 'p2']); +});