Skip to content

Commit

Permalink
cherry-pick(#30312): fix(ui-mode): do not loose run information after…
Browse files Browse the repository at this point in the history
… writing into testDir (#30328)

Partially reverts #30008
that started to reset all test results upon listing tests, including the
test that did just run and triggered re-listing.

#30300.
  • Loading branch information
mxschmitt committed Apr 11, 2024
1 parent 35468cf commit 3ab466e
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 7 deletions.
29 changes: 23 additions & 6 deletions packages/playwright/src/isomorphic/teleReceiver.ts
Expand Up @@ -130,6 +130,7 @@ type TeleReporterReceiverOptions = {
};

export class TeleReporterReceiver {
public isListing = false;
private _rootSuite: TeleSuite;
private _options: TeleReporterReceiverOptions;
private _reporter: Partial<ReporterV2>;
Expand All @@ -143,12 +144,6 @@ export class TeleReporterReceiver {
this._reporter = reporter;
}

reset() {
this._rootSuite.suites = [];
this._rootSuite.tests = [];
this._tests.clear();
}

dispatch(message: JsonEvent): Promise<void> | void {
const { method, params } = message;
if (method === 'onConfigure') {
Expand Down Expand Up @@ -209,6 +204,28 @@ export class TeleReporterReceiver {
// Always update project in watch mode.
projectSuite._project = this._parseProject(project);
this._mergeSuitesInto(project.suites, projectSuite);

// Remove deleted tests when listing. Empty suites will be auto-filtered
// in the UI layer.
if (this.isListing) {
const testIds = new Set<string>();
const collectIds = (suite: JsonSuite) => {
suite.tests.map(t => t.testId).forEach(testId => testIds.add(testId));
suite.suites.forEach(collectIds);
};
project.suites.forEach(collectIds);

const filterTests = (suite: TeleSuite) => {
suite.tests = suite.tests.filter(t => {
if (testIds.has(t.id))
return true;
this._tests.delete(t.id);
return false;
});
suite.suites.forEach(filterTests);
};
filterTests(projectSuite);
}
}

private _onBegin() {
Expand Down
3 changes: 2 additions & 1 deletion packages/trace-viewer/src/ui/teleSuiteUpdater.ts
Expand Up @@ -123,9 +123,10 @@ export class TeleSuiteUpdater {
}

processListReport(report: any[]) {
this._receiver.reset();
this._receiver.isListing = true;
for (const message of report)
this._receiver.dispatch(message);
this._receiver.isListing = false;
}

processTestReportEvent(message: any) {
Expand Down
30 changes: 30 additions & 0 deletions tests/playwright-test/ui-mode-test-update.spec.ts
Expand Up @@ -129,6 +129,36 @@ test('should pick new / deleted tests', async ({ runUITest, writeFiles, deleteFi
`);
});

test('should not loose run information after execution if test wrote into testDir', async ({ runUITest, writeFiles, deleteFile }) => {
test.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/30300' });
const { page } = await runUITest({
'a.test.ts': `
import fs from 'fs';
import path from 'path';
import { test, expect } from '@playwright/test';
test('passes', () => {
fs.writeFileSync(path.join(test.info().project.testDir, 'something.txt'), 'hi');
});
`,
});
await expect.poll(dumpTestTree(page)).toBe(`
▼ ◯ a.test.ts
◯ passes
`);
await page.getByTitle('passes').click();
await page.getByTitle('Run all').click();
await page.waitForTimeout(5_000);
await expect(page.getByText('Did not run')).toBeHidden();
const listItem = page.getByTestId('actions-tree').getByRole('listitem');
await expect(
listItem,
'action list'
).toHaveText([
/Before Hooks[\d.]+m?s/,
/After Hooks[\d.]+m?s/,
]);
});

test('should pick new / deleted nested tests', async ({ runUITest, writeFiles, deleteFile }) => {
const { page } = await runUITest(basicTestTree);
await expect.poll(dumpTestTree(page)).toContain(`
Expand Down

0 comments on commit 3ab466e

Please sign in to comment.