chore: remove private config usage from telereporter (#29771)
This commit is contained in:
parent
d0cc5871d8
commit
bbcc3c1238
|
|
@ -58,11 +58,6 @@ export class FullConfigInternal {
|
||||||
testIdMatcher?: Matcher;
|
testIdMatcher?: Matcher;
|
||||||
defineConfigWasUsed = false;
|
defineConfigWasUsed = false;
|
||||||
|
|
||||||
// TODO: when merging reports, there could be no internal config. This is very unfortunate.
|
|
||||||
static from(config: FullConfig): FullConfigInternal | undefined {
|
|
||||||
return (config as any)[configInternalSymbol];
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(location: ConfigLocation, userConfig: Config, configCLIOverrides: ConfigCLIOverrides) {
|
constructor(location: ConfigLocation, userConfig: Config, configCLIOverrides: ConfigCLIOverrides) {
|
||||||
if (configCLIOverrides.projects && userConfig.projects)
|
if (configCLIOverrides.projects && userConfig.projects)
|
||||||
throw new Error(`Cannot use --browser option when configuration file defines projects. Specify browserName in the projects instead.`);
|
throw new Error(`Cannot use --browser option when configuration file defines projects. Specify browserName in the projects instead.`);
|
||||||
|
|
|
||||||
|
|
@ -26,9 +26,7 @@ export type JsonStackFrame = { file: string, line: number, column: number };
|
||||||
|
|
||||||
export type JsonStdIOType = 'stdout' | 'stderr';
|
export type JsonStdIOType = 'stdout' | 'stderr';
|
||||||
|
|
||||||
export type JsonConfig = Pick<reporterTypes.FullConfig, 'configFile' | 'globalTimeout' | 'maxFailures' | 'metadata' | 'rootDir' | 'version' | 'workers'> & {
|
export type JsonConfig = Pick<reporterTypes.FullConfig, 'configFile' | 'globalTimeout' | 'maxFailures' | 'metadata' | 'rootDir' | 'version' | 'workers'>;
|
||||||
listOnly: boolean;
|
|
||||||
};
|
|
||||||
|
|
||||||
export type MergeReporterConfig = Pick<reporterTypes.FullConfig, 'configFile' | 'quiet' | 'reportSlowTests' | 'rootDir' | 'reporter' >;
|
export type MergeReporterConfig = Pick<reporterTypes.FullConfig, 'configFile' | 'quiet' | 'reportSlowTests' | 'rootDir' | 'reporter' >;
|
||||||
|
|
||||||
|
|
@ -147,10 +145,11 @@ export class TeleReporterReceiver {
|
||||||
this._reportConfig = reportConfig;
|
this._reportConfig = reportConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
dispatch(message: JsonEvent): Promise<void> | void {
|
dispatch(mode: 'list' | 'test', message: JsonEvent): Promise<void> | void {
|
||||||
const { method, params } = message;
|
const { method, params } = message;
|
||||||
if (method === 'onConfigure') {
|
if (method === 'onConfigure') {
|
||||||
this._onConfigure(params.config);
|
this._onConfigure(params.config);
|
||||||
|
this._listOnly = mode === 'list';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (method === 'onProject') {
|
if (method === 'onProject') {
|
||||||
|
|
@ -197,7 +196,6 @@ export class TeleReporterReceiver {
|
||||||
|
|
||||||
private _onConfigure(config: JsonConfig) {
|
private _onConfigure(config: JsonConfig) {
|
||||||
this._rootDir = config.rootDir;
|
this._rootDir = config.rootDir;
|
||||||
this._listOnly = config.listOnly;
|
|
||||||
this._config = this._parseConfig(config);
|
this._config = this._parseConfig(config);
|
||||||
this._reporter.onConfigure?.(this._config);
|
this._reporter.onConfigure?.(this._config);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,6 @@ import type { ZipFile } from 'playwright-core/lib/zipBundle';
|
||||||
import { yazl } from 'playwright-core/lib/zipBundle';
|
import { yazl } from 'playwright-core/lib/zipBundle';
|
||||||
import { mime } from 'playwright-core/lib/utilsBundle';
|
import { mime } from 'playwright-core/lib/utilsBundle';
|
||||||
import type { HTMLReport, Stats, TestAttachment, TestCase, TestCaseSummary, TestFile, TestFileSummary, TestResult, TestStep } from '@html-reporter/types';
|
import type { HTMLReport, Stats, TestAttachment, TestCase, TestCaseSummary, TestFile, TestFileSummary, TestResult, TestStep } from '@html-reporter/types';
|
||||||
import { FullConfigInternal } from '../common/config';
|
|
||||||
import EmptyReporter from './empty';
|
import EmptyReporter from './empty';
|
||||||
|
|
||||||
type TestEntry = {
|
type TestEntry = {
|
||||||
|
|
@ -52,6 +51,7 @@ type HtmlReporterOptions = {
|
||||||
host?: string,
|
host?: string,
|
||||||
port?: number,
|
port?: number,
|
||||||
attachmentsBaseURL?: string,
|
attachmentsBaseURL?: string,
|
||||||
|
_mode?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
class HtmlReporter extends EmptyReporter {
|
class HtmlReporter extends EmptyReporter {
|
||||||
|
|
@ -124,12 +124,11 @@ class HtmlReporter extends EmptyReporter {
|
||||||
override async onExit() {
|
override async onExit() {
|
||||||
if (process.env.CI || !this._buildResult)
|
if (process.env.CI || !this._buildResult)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const { ok, singleTestId } = this._buildResult;
|
const { ok, singleTestId } = this._buildResult;
|
||||||
const shouldOpen = this._open === 'always' || (!ok && this._open === 'on-failure');
|
const shouldOpen = this._open === 'always' || (!ok && this._open === 'on-failure');
|
||||||
if (shouldOpen) {
|
if (shouldOpen) {
|
||||||
await showHTMLReport(this._outputFolder, this._options.host, this._options.port, singleTestId);
|
await showHTMLReport(this._outputFolder, this._options.host, this._options.port, singleTestId);
|
||||||
} else if (!FullConfigInternal.from(this.config)?.cliListOnly) {
|
} else if (this._options._mode === 'run') {
|
||||||
const packageManagerCommand = getPackageManagerExecCommand();
|
const packageManagerCommand = getPackageManagerExecCommand();
|
||||||
const relativeReportPath = this._outputFolder === standaloneDefaultFolder() ? '' : ' ' + path.relative(process.cwd(), this._outputFolder);
|
const relativeReportPath = this._outputFolder === standaloneDefaultFolder() ? '' : ' ' + path.relative(process.cwd(), this._outputFolder);
|
||||||
const hostArg = this._options.host ? ` --host ${this._options.host}` : '';
|
const hostArg = this._options.host ? ` --host ${this._options.host}` : '';
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,7 @@ export async function createMergedReport(config: FullConfigInternal, dir: string
|
||||||
for (const event of events) {
|
for (const event of events) {
|
||||||
if (event.method === 'onEnd')
|
if (event.method === 'onEnd')
|
||||||
printStatus(`building final report`);
|
printStatus(`building final report`);
|
||||||
await receiver.dispatch(event);
|
await receiver.dispatch('test', event);
|
||||||
if (event.method === 'onEnd')
|
if (event.method === 'onEnd')
|
||||||
printStatus(`finished building report`);
|
printStatus(`finished building report`);
|
||||||
}
|
}
|
||||||
|
|
@ -248,7 +248,6 @@ function mergeConfigureEvents(configureEvents: JsonEvent[], rootDirOverride: str
|
||||||
rootDir: '',
|
rootDir: '',
|
||||||
version: '',
|
version: '',
|
||||||
workers: 0,
|
workers: 0,
|
||||||
listOnly: false
|
|
||||||
};
|
};
|
||||||
for (const event of configureEvents)
|
for (const event of configureEvents)
|
||||||
config = mergeConfigs(config, event.params.config);
|
config = mergeConfigs(config, event.params.config);
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import { createGuid } from 'playwright-core/lib/utils';
|
import { createGuid } from 'playwright-core/lib/utils';
|
||||||
import type { FullConfig, FullResult, Location, Suite, TestCase, TestError, TestResult, TestStep } from '../../types/testReporter';
|
import type { FullConfig, FullResult, Location, Suite, TestCase, TestError, TestResult, TestStep } from '../../types/testReporter';
|
||||||
import { FullConfigInternal, getProjectId } from '../common/config';
|
import { getProjectId } from '../common/config';
|
||||||
import type { JsonAttachment, JsonConfig, JsonEvent, JsonFullResult, JsonProject, JsonStdIOType, JsonSuite, JsonTestCase, JsonTestEnd, JsonTestResultEnd, JsonTestResultStart, JsonTestStepEnd, JsonTestStepStart } from '../isomorphic/teleReceiver';
|
import type { JsonAttachment, JsonConfig, JsonEvent, JsonFullResult, JsonProject, JsonStdIOType, JsonSuite, JsonTestCase, JsonTestEnd, JsonTestResultEnd, JsonTestResultStart, JsonTestStepEnd, JsonTestStepStart } from '../isomorphic/teleReceiver';
|
||||||
import { serializeRegexPatterns } from '../isomorphic/teleReceiver';
|
import { serializeRegexPatterns } from '../isomorphic/teleReceiver';
|
||||||
import type { ReporterV2 } from './reporterV2';
|
import type { ReporterV2 } from './reporterV2';
|
||||||
|
|
@ -152,7 +152,6 @@ export class TeleReporterEmitter implements ReporterV2 {
|
||||||
rootDir: config.rootDir,
|
rootDir: config.rootDir,
|
||||||
version: config.version,
|
version: config.version,
|
||||||
workers: config.workers,
|
workers: config.workers,
|
||||||
listOnly: !!FullConfigInternal.from(config)?.cliListOnly,
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -50,9 +50,10 @@ export async function createReporters(config: FullConfigInternal, mode: 'list' |
|
||||||
descriptions ??= config.config.reporter;
|
descriptions ??= config.config.reporter;
|
||||||
if (config.configCLIOverrides.additionalReporters)
|
if (config.configCLIOverrides.additionalReporters)
|
||||||
descriptions = [...descriptions, ...config.configCLIOverrides.additionalReporters];
|
descriptions = [...descriptions, ...config.configCLIOverrides.additionalReporters];
|
||||||
|
const runOptions = { configDir: config.configDir, _mode: mode };
|
||||||
for (const r of descriptions) {
|
for (const r of descriptions) {
|
||||||
const [name, arg] = r;
|
const [name, arg] = r;
|
||||||
const options = { ...arg, configDir: config.configDir };
|
const options = { ...runOptions, ...arg };
|
||||||
if (name in defaultReporters) {
|
if (name in defaultReporters) {
|
||||||
reporters.push(new defaultReporters[name as keyof typeof defaultReporters](options));
|
reporters.push(new defaultReporters[name as keyof typeof defaultReporters](options));
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -62,7 +63,7 @@ export async function createReporters(config: FullConfigInternal, mode: 'list' |
|
||||||
}
|
}
|
||||||
if (process.env.PW_TEST_REPORTER) {
|
if (process.env.PW_TEST_REPORTER) {
|
||||||
const reporterConstructor = await loadReporter(config, process.env.PW_TEST_REPORTER);
|
const reporterConstructor = await loadReporter(config, process.env.PW_TEST_REPORTER);
|
||||||
reporters.push(wrapReporterAsV2(new reporterConstructor()));
|
reporters.push(wrapReporterAsV2(new reporterConstructor(runOptions)));
|
||||||
}
|
}
|
||||||
|
|
||||||
const someReporterPrintsToStdio = reporters.some(r => r.printsToStdio());
|
const someReporterPrintsToStdio = reporters.some(r => r.printsToStdio());
|
||||||
|
|
|
||||||
|
|
@ -167,7 +167,7 @@ class UIMode {
|
||||||
}
|
}
|
||||||
|
|
||||||
private async _listTests() {
|
private async _listTests() {
|
||||||
const reporter = new InternalReporter(new TeleReporterEmitter(e => this._dispatchEvent(e.method, e.params), true));
|
const reporter = new InternalReporter(new TeleReporterEmitter(e => this._dispatchEvent('listReport', e), true));
|
||||||
this._config.cliListOnly = true;
|
this._config.cliListOnly = true;
|
||||||
this._config.testIdMatcher = undefined;
|
this._config.testIdMatcher = undefined;
|
||||||
const taskRunner = createTaskRunnerForList(this._config, reporter, 'out-of-process', { failOnLoadErrors: false });
|
const taskRunner = createTaskRunnerForList(this._config, reporter, 'out-of-process', { failOnLoadErrors: false });
|
||||||
|
|
@ -195,7 +195,7 @@ class UIMode {
|
||||||
this._config.testIdMatcher = id => !testIdSet || testIdSet.has(id);
|
this._config.testIdMatcher = id => !testIdSet || testIdSet.has(id);
|
||||||
|
|
||||||
const reporters = await createReporters(this._config, 'ui');
|
const reporters = await createReporters(this._config, 'ui');
|
||||||
reporters.push(new TeleReporterEmitter(e => this._dispatchEvent(e.method, e.params), true));
|
reporters.push(new TeleReporterEmitter(e => this._dispatchEvent('testReport', e), true));
|
||||||
const reporter = new InternalReporter(new Multiplexer(reporters));
|
const reporter = new InternalReporter(new Multiplexer(reporters));
|
||||||
const taskRunner = createTaskRunnerForWatch(this._config, reporter);
|
const taskRunner = createTaskRunnerForWatch(this._config, reporter);
|
||||||
const testRun = new TestRun(this._config, reporter);
|
const testRun = new TestRun(this._config, reporter);
|
||||||
|
|
|
||||||
|
|
@ -737,10 +737,15 @@ const dispatchEvent = (method: string, params?: any) => {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The order of receiver dispatches matters here, we want to assign `lastRunTestCount`
|
if (method === 'listReport')
|
||||||
// before we use it.
|
receiver?.dispatch('list', params)?.catch(() => {});
|
||||||
lastRunReceiver?.dispatch({ method, params })?.catch(() => {});
|
|
||||||
receiver?.dispatch({ method, params })?.catch(() => {});
|
if (method === 'testReport') {
|
||||||
|
// The order of receiver dispatches matters here, we want to assign `lastRunTestCount`
|
||||||
|
// before we use it.
|
||||||
|
lastRunReceiver?.dispatch('test', params)?.catch(() => {});
|
||||||
|
receiver?.dispatch('test', params)?.catch(() => {});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const outputDirForTestCase = (testCase: TestCase): string | undefined => {
|
const outputDirForTestCase = (testCase: TestCase): string | undefined => {
|
||||||
|
|
|
||||||
|
|
@ -212,7 +212,7 @@ test('should merge into html with dependencies', async ({ runInlineTest, mergeRe
|
||||||
const { exitCode, output } = await mergeReports(reportDir, { 'PW_TEST_HTML_REPORT_OPEN': 'never' }, { additionalArgs: ['--reporter', 'html'] });
|
const { exitCode, output } = await mergeReports(reportDir, { 'PW_TEST_HTML_REPORT_OPEN': 'never' }, { additionalArgs: ['--reporter', 'html'] });
|
||||||
expect(exitCode).toBe(0);
|
expect(exitCode).toBe(0);
|
||||||
|
|
||||||
expect(output).toContain('To open last HTML report run:');
|
expect(output).not.toContain('To open last HTML report run:');
|
||||||
|
|
||||||
await showReport();
|
await showReport();
|
||||||
|
|
||||||
|
|
@ -377,7 +377,7 @@ test('total time is from test run not from merge', async ({ runInlineTest, merge
|
||||||
const { exitCode, output } = await mergeReports(reportDir, { 'PW_TEST_HTML_REPORT_OPEN': 'never' }, { additionalArgs: ['--reporter', 'html'] });
|
const { exitCode, output } = await mergeReports(reportDir, { 'PW_TEST_HTML_REPORT_OPEN': 'never' }, { additionalArgs: ['--reporter', 'html'] });
|
||||||
expect(exitCode).toBe(0);
|
expect(exitCode).toBe(0);
|
||||||
|
|
||||||
expect(output).toContain('To open last HTML report run:');
|
expect(output).not.toContain('To open last HTML report run:');
|
||||||
|
|
||||||
await showReport();
|
await showReport();
|
||||||
|
|
||||||
|
|
@ -1152,7 +1152,7 @@ test('preserve steps in html report', async ({ runInlineTest, mergeReports, show
|
||||||
const { exitCode, output } = await mergeReports(reportDir, { 'PW_TEST_HTML_REPORT_OPEN': 'never' }, { additionalArgs: ['--reporter', 'html'], cwd: mergeCwd });
|
const { exitCode, output } = await mergeReports(reportDir, { 'PW_TEST_HTML_REPORT_OPEN': 'never' }, { additionalArgs: ['--reporter', 'html'], cwd: mergeCwd });
|
||||||
expect(exitCode).toBe(0);
|
expect(exitCode).toBe(0);
|
||||||
|
|
||||||
expect(output).toContain('To open last HTML report run:');
|
expect(output).not.toContain('To open last HTML report run:');
|
||||||
|
|
||||||
await showReport();
|
await showReport();
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue