From d7ad0a01800c78fbc0f040a8e3df08cb1c0c99c6 Mon Sep 17 00:00:00 2001 From: Playwright Service <89237858+playwrightmachine@users.noreply.github.com> Date: Wed, 1 Mar 2023 16:42:42 -0800 Subject: [PATCH] cherry-pick(#21318): chore: have pretty error if CT config has no defineConfig (#21321) --- packages/playwright-test/index.js | 2 +- packages/playwright-test/src/common/configLoader.ts | 8 ++++++++ packages/playwright-test/src/common/types.ts | 1 + packages/playwright-test/src/mount.ts | 6 ++++-- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/playwright-test/index.js b/packages/playwright-test/index.js index 035959561cad8..8ff9824af1a6e 100644 --- a/packages/playwright-test/index.js +++ b/packages/playwright-test/index.js @@ -15,8 +15,8 @@ */ const pwt = require('./lib/index'); +const { defineConfig } = require('./lib/common/configLoader'); const playwright = require('playwright-core'); -const defineConfig = config => config; const combinedExports = { ...playwright, ...pwt, diff --git a/packages/playwright-test/src/common/configLoader.ts b/packages/playwright-test/src/common/configLoader.ts index 797f70e480a49..5316ad6760f3e 100644 --- a/packages/playwright-test/src/common/configLoader.ts +++ b/packages/playwright-test/src/common/configLoader.ts @@ -25,6 +25,12 @@ import { errorWithFile, getPackageJsonPath, mergeObjects } from '../util'; export const defaultTimeout = 30000; +const kDefineConfigWasUsed = Symbol('defineConfigWasUsed'); +export const defineConfig = (config: any) => { + config[kDefineConfigWasUsed] = true; + return config; +}; + export class ConfigLoader { private _fullConfig: FullConfigInternal; @@ -122,6 +128,7 @@ export class ConfigLoader { this._fullConfig._internal.ignoreSnapshots = takeFirst(config.ignoreSnapshots, baseFullConfig._internal.ignoreSnapshots); this._fullConfig.updateSnapshots = takeFirst(config.updateSnapshots, baseFullConfig.updateSnapshots); this._fullConfig._internal.plugins = ((config as any)._plugins || []).map((p: any) => ({ factory: p })); + this._fullConfig._internal.defineConfigWasUsed = !!(config as any)[kDefineConfigWasUsed]; const workers = takeFirst(config.workers, '50%'); if (typeof workers === 'string') { @@ -454,6 +461,7 @@ export const baseFullConfig: FullConfigInternal = { cliGrep: undefined, cliGrepInvert: undefined, listOnly: false, + defineConfigWasUsed: false, } }; diff --git a/packages/playwright-test/src/common/types.ts b/packages/playwright-test/src/common/types.ts index 2c5f8e55d1ae3..1b045c1053719 100644 --- a/packages/playwright-test/src/common/types.ts +++ b/packages/playwright-test/src/common/types.ts @@ -45,6 +45,7 @@ type ConfigInternal = { cliProjectFilter?: string[]; testIdMatcher?: Matcher; passWithNoTests?: boolean; + defineConfigWasUsed: boolean; }; /** diff --git a/packages/playwright-test/src/mount.ts b/packages/playwright-test/src/mount.ts index 965a347f1ba9b..f4b9fc51210c5 100644 --- a/packages/playwright-test/src/mount.ts +++ b/packages/playwright-test/src/mount.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import type { Fixtures, Locator, Page, BrowserContextOptions, PlaywrightTestArgs, PlaywrightTestOptions, PlaywrightWorkerArgs, PlaywrightWorkerOptions, BrowserContext, ContextReuseMode } from './common/types'; +import type { Fixtures, Locator, Page, BrowserContextOptions, PlaywrightTestArgs, PlaywrightTestOptions, PlaywrightWorkerArgs, PlaywrightWorkerOptions, BrowserContext, ContextReuseMode, FullConfigInternal } from './common/types'; import type { Component, JsxComponent, MountOptions } from '../types/component'; let boundCallbacksForMount: Function[] = []; @@ -37,7 +37,9 @@ export const fixtures: Fixtures< _ctWorker: [{ context: undefined, hash: '' }, { scope: 'worker' }], - page: async ({ page }, use) => { + page: async ({ page }, use, info) => { + if (!(info.config as FullConfigInternal)._internal.defineConfigWasUsed) + throw new Error('Component testing requires the use of the defineConfig() in your playwright-ct.config.{ts,js}: https://aka.ms/playwright/ct-define-config'); await (page as any)._wrapApiCall(async () => { await page.exposeFunction('__ct_dispatch', (ordinal: number, args: any[]) => { boundCallbacksForMount[ordinal](...args);