fix(test runner): always show all projects in selection (#32450)

Follow-up to
https://github.com/microsoft/playwright/pull/32156#discussion_r1741628770,
alternative solution to
https://github.com/microsoft/playwright/pull/32425.

Ensures we always show all projects in the watch mode project selector
by performing the initial `listTests` without any filters, and using its
result for the project selector.
This commit is contained in:
Simon Knott 2024-09-06 11:35:20 +02:00 committed by GitHub
parent a8f67a42b8
commit 0e3f4736cc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 18 additions and 6 deletions

View file

@ -125,9 +125,11 @@ export async function runWatchModeLoop(configLocation: ConfigLocation, initialOp
await testServerConnection.initialize({ interceptStdio: false, watchTestDirs: true });
await testServerConnection.runGlobalSetup({});
const { report } = await testServerConnection.listTests({ locations: options.files, projects: options.projects, grep: options.grep });
const { report } = await testServerConnection.listTests({});
teleSuiteUpdater.processListReport(report);
const projectNames = teleSuiteUpdater.rootSuite!.suites.map(s => s.title);
let lastRun: { type: 'changed' | 'regular' | 'failed', failedTestIds?: string[], dirtyTestIds?: string[] } = { type: 'regular' };
let result: FullResult['status'] = 'passed';
@ -167,7 +169,7 @@ export async function runWatchModeLoop(configLocation: ConfigLocation, initialOp
type: 'multiselect',
name: 'selectedProjects',
message: 'Select projects',
choices: teleSuiteUpdater.rootSuite!.suites.map(s => s.title),
choices: projectNames,
}).catch(() => ({ selectedProjects: null }));
if (!selectedProjects)
continue;

View file

@ -282,8 +282,8 @@ test('should respect file filter P', async ({ runWatchTest }) => {
await testProcess.waitForOutput('Waiting for file changes.');
});
test('should respect project filter C', async ({ runWatchTest }) => {
const testProcess = await runWatchTest({
test('should respect project filter C', async ({ runWatchTest, writeFiles }) => {
const files = {
'playwright.config.ts': `
import { defineConfig } from '@playwright/test';
export default defineConfig({ projects: [{name: 'foo'}, {name: 'bar'}] });
@ -292,9 +292,9 @@ test('should respect project filter C', async ({ runWatchTest }) => {
import { test, expect } from '@playwright/test';
test('passes', () => {});
`,
});
};
const testProcess = await runWatchTest(files, { project: 'foo' });
await testProcess.waitForOutput('[foo] a.test.ts:3:11 passes');
await testProcess.waitForOutput('[bar] a.test.ts:3:11 passes');
await testProcess.waitForOutput('Waiting for file changes.');
testProcess.clearOutput();
testProcess.write('c');
@ -306,6 +306,16 @@ test('should respect project filter C', async ({ runWatchTest }) => {
await testProcess.waitForOutput('npx playwright test --project foo #1');
await testProcess.waitForOutput('[foo] a.test.ts:3:11 passes');
expect(testProcess.output).not.toContain('[bar] a.test.ts:3:11 passes');
testProcess.clearOutput();
await writeFiles(files); // file change triggers listTests with project filter
await testProcess.waitForOutput('[foo] a.test.ts:3:11 passes');
testProcess.write('c');
await testProcess.waitForOutput('Select projects');
await testProcess.waitForOutput('foo');
await testProcess.waitForOutput('bar'); // second selection should still show all
});
test('should respect file filter P and split files', async ({ runWatchTest }) => {