fix(runner): display no projects error across all `test` modes (#34676)

This commit is contained in:
Adam Gastineau 2025-02-10 12:52:53 -08:00 committed by GitHub
parent 71c7f465a0
commit aeed1f5909
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 37 additions and 25 deletions

View File

@ -29,6 +29,7 @@ export { program } from 'playwright-core/lib/cli/program';
import { prepareErrorStack } from './reporters/base';
import { showHTMLReport } from './reporters/html';
import { createMergedReport } from './reporters/merge';
import { filterProjects } from './runner/projectUtils';
import { Runner } from './runner/runner';
import * as testServer from './runner/testServer';
import { runWatchModeLoop } from './runner/watchMode';
@ -161,6 +162,23 @@ async function runTests(args: string[], opts: { [key: string]: any }) {
await startProfiling();
const cliOverrides = overridesFromOptions(opts);
const config = await loadConfigFromFileRestartIfNeeded(opts.config, cliOverrides, opts.deps === false);
if (!config)
return;
config.cliArgs = args;
config.cliGrep = opts.grep as string | undefined;
config.cliOnlyChanged = opts.onlyChanged === true ? 'HEAD' : opts.onlyChanged;
config.cliGrepInvert = opts.grepInvert as string | undefined;
config.cliListOnly = !!opts.list;
config.cliProjectFilter = opts.project || undefined;
config.cliPassWithNoTests = !!opts.passWithNoTests;
config.cliFailOnFlakyTests = !!opts.failOnFlakyTests;
config.cliLastFailed = !!opts.lastFailed;
// Evaluate project filters against config before starting execution. This enables a consistent error message across run modes
filterProjects(config.projects, config.cliProjectFilter);
if (opts.ui || opts.uiHost || opts.uiPort) {
if (opts.onlyChanged)
throw new Error(`--only-changed is not supported in UI mode. If you'd like that to change, see https://github.com/microsoft/playwright/issues/15075 for more details.`);
@ -202,20 +220,6 @@ async function runTests(args: string[], opts: { [key: string]: any }) {
return;
}
const config = await loadConfigFromFileRestartIfNeeded(opts.config, cliOverrides, opts.deps === false);
if (!config)
return;
config.cliArgs = args;
config.cliGrep = opts.grep as string | undefined;
config.cliOnlyChanged = opts.onlyChanged === true ? 'HEAD' : opts.onlyChanged;
config.cliGrepInvert = opts.grepInvert as string | undefined;
config.cliListOnly = !!opts.list;
config.cliProjectFilter = opts.project || undefined;
config.cliPassWithNoTests = !!opts.passWithNoTests;
config.cliFailOnFlakyTests = !!opts.failOnFlakyTests;
config.cliLastFailed = !!opts.lastFailed;
const runner = new Runner(config);
const status = await runner.runAllTests();
await stopProfiling('runner');

View File

@ -327,6 +327,25 @@ test('should print nice error when project is unknown', async ({ runInlineTest }
expect(output).toContain('Project(s) "suite3" not found. Available projects: "suite1", "suite2"');
});
test('should print nice error when project is unknown and launching UI mode', async ({ runInlineTest }) => {
// Prevent UI mode from opening and the test never finishing
test.setTimeout(5000);
const { output, exitCode } = await runInlineTest({
'playwright.config.ts': `
module.exports = { projects: [
{ name: 'suite1' },
{ name: 'suite2' },
] };
`,
'a.test.ts': `
import { test, expect } from '@playwright/test';
test('pass', async ({}, testInfo) => {});
`
}, { project: 'suite3', ui: true });
expect(exitCode).toBe(1);
expect(output).toContain('Project(s) "suite3" not found. Available projects: "suite1", "suite2"');
});
test('should filter by project list, case-insensitive', async ({ runInlineTest }) => {
const { passed, failed, outputLines, skipped } = await runInlineTest({
'playwright.config.ts': `

View File

@ -95,17 +95,6 @@ test('should teardown on sigint', async ({ runUITest, nodeVersion }) => {
]);
});
test('should show errors in config', async ({ runUITest }) => {
const { page } = await runUITest({
'playwright.config.ts': `
import { defineConfig, devices } from '@playwright/test';
throw new Error("URL is empty")
`,
});
await page.getByText('playwright.config.ts').click();
await expect(page.getByText('Error: URL is empty')).toBeInViewport();
});
const testsWithSetup = {
'playwright.config.ts': `
import { defineConfig } from '@playwright/test';