From 5fbabcfdd73bd8baa279573972ea965a2c7cdf7e Mon Sep 17 00:00:00 2001 From: harpsealjs Date: Mon, 20 May 2024 17:22:30 +0800 Subject: [PATCH] test: pass expect in test env (#6579) * test: pass expect in test env * test: pass expect in test env * test: pass expect in test env --- packages/rspack-test-tools/etc/api.md | 14 +++++++------- packages/rspack-test-tools/src/case/defaults.ts | 2 +- packages/rspack-test-tools/src/case/error.ts | 2 +- packages/rspack-test-tools/src/case/stats-api.ts | 2 +- .../src/helper/legacy/createFakeWorker.js | 8 ++++---- .../src/helper/legacy/createLazyTestEnv.js | 1 + .../rspack-test-tools/src/processor/defaults.ts | 10 +++++----- .../rspack-test-tools/src/processor/diagnostic.ts | 2 +- packages/rspack-test-tools/src/processor/error.ts | 14 +++++++------- packages/rspack-test-tools/src/processor/hash.ts | 6 +++--- packages/rspack-test-tools/src/processor/hook.ts | 13 ++++++------- .../rspack-test-tools/src/processor/hot-step.ts | 10 ++++++---- .../rspack-test-tools/src/processor/snapshot.ts | 2 +- .../rspack-test-tools/src/processor/stats-api.ts | 6 +++--- packages/rspack-test-tools/src/processor/stats.ts | 10 +++++----- .../rspack-test-tools/src/runner/runner/cjs.ts | 7 ++++--- .../src/runner/runner/web/fake.ts | 8 ++++---- .../src/runner/runner/web/jsdom.ts | 4 ++-- packages/rspack-test-tools/src/runner/type.ts | 1 - packages/rspack-test-tools/src/test/creator.ts | 4 +++- packages/rspack-test-tools/src/test/simple.ts | 3 ++- packages/rspack-test-tools/src/type.ts | 1 + packages/rspack-test-tools/tests/Defaults.test.js | 2 +- 23 files changed, 69 insertions(+), 63 deletions(-) diff --git a/packages/rspack-test-tools/etc/api.md b/packages/rspack-test-tools/etc/api.md index 362cb398e5a..b3972dfce08 100644 --- a/packages/rspack-test-tools/etc/api.md +++ b/packages/rspack-test-tools/etc/api.md @@ -126,7 +126,7 @@ export function createWatchCase(name: string, src: string, dist: string, temp: s export class DefaultsConfigTaskProcessor extends SimpleTaskProcessor { constructor(_defaultsConfigOptions: IDefaultsConfigProcessorOptions); // (undocumented) - static addSnapshotSerializer(): void; + static addSnapshotSerializer(expectImpl: jest.Expect): void; // (undocumented) after(context: ITestContext): Promise; // (undocumented) @@ -249,7 +249,7 @@ export enum EEsmMode { export class ErrorTaskProcessor extends SimpleTaskProcessor { constructor(_errorOptions: IErrorTaskProcessorOptions); // (undocumented) - static addSnapshotSerializer(): void; + static addSnapshotSerializer(expectImpl: jest.Expect): void; // (undocumented) check(env: ITestEnv, context: ITestContext): Promise; // (undocumented) @@ -281,7 +281,7 @@ export class HookCasesContext extends TestContext { // @internal (undocumented) _addSnapshot(content: unknown, name: string, group: string | number): void; // @internal (undocumented) - collectSnapshots(options?: { + collectSnapshots(env: ITestEnv, options?: { diff: {}; }): Promise; // (undocumented) @@ -335,8 +335,6 @@ export interface IBasicGlobalContext { // (undocumented) console: Console; // (undocumented) - expect: jest.Expect; - // (undocumented) setTimeout: typeof setTimeout; } @@ -716,6 +714,8 @@ export interface ITestEnv { // (undocumented) beforeEach: (...args: any[]) => void; // (undocumented) + expect: jest.Expect; + // (undocumented) it: (...args: any[]) => void; } @@ -932,7 +932,7 @@ export class RspackHotStepProcessor extends RspackHotProcessor { // (undocumented) protected _hotOptions: IRspackHotProcessorOptions; // (undocumented) - protected matchStepSnapshot(context: ITestContext, step: number, stats: StatsCompilation, runtime?: THotStepRuntimeData): void; + protected matchStepSnapshot(env: ITestEnv, context: ITestContext, step: number, stats: StatsCompilation, runtime?: THotStepRuntimeData): void; // (undocumented) run(env: ITestEnv, context: ITestContext): Promise; } @@ -1026,7 +1026,7 @@ export class SnapshotProcessor extends BasicTaskProcess export class StatsAPITaskProcessor extends SimpleTaskProcessor { constructor(_statsAPIOptions: IStatsAPITaskProcessorOptions); // (undocumented) - static addSnapshotSerializer(): void; + static addSnapshotSerializer(expectImpl: jest.Expect): void; // (undocumented) check(env: ITestEnv, context: ITestContext): Promise; // (undocumented) diff --git a/packages/rspack-test-tools/src/case/defaults.ts b/packages/rspack-test-tools/src/case/defaults.ts index 6920e40eaf6..32bbfc8d964 100644 --- a/packages/rspack-test-tools/src/case/defaults.ts +++ b/packages/rspack-test-tools/src/case/defaults.ts @@ -29,7 +29,7 @@ async function run(name: string, processor: ITestProcessor) { } catch (e: unknown) { context.emitError(name, e as Error); } finally { - await processor.check?.(null as unknown as ITestEnv, context); + await processor.check?.({ expect, it, beforeEach, afterEach }, context); await processor.after?.(context); } } diff --git a/packages/rspack-test-tools/src/case/error.ts b/packages/rspack-test-tools/src/case/error.ts index f4f11bb3742..2ba08493ed4 100644 --- a/packages/rspack-test-tools/src/case/error.ts +++ b/packages/rspack-test-tools/src/case/error.ts @@ -18,7 +18,7 @@ export function createErrorCase( testConfig: string ) { if (!addedSerializer) { - ErrorTaskProcessor.addSnapshotSerializer(); + ErrorTaskProcessor.addSnapshotSerializer(expect); addedSerializer = true; } const caseConfig = require(testConfig); diff --git a/packages/rspack-test-tools/src/case/stats-api.ts b/packages/rspack-test-tools/src/case/stats-api.ts index 83ef28f4aec..81dc40a799d 100644 --- a/packages/rspack-test-tools/src/case/stats-api.ts +++ b/packages/rspack-test-tools/src/case/stats-api.ts @@ -21,7 +21,7 @@ export function createStatsAPICase( testConfig: string ) { if (!addedSerializer) { - StatsAPITaskProcessor.addSnapshotSerializer(); + StatsAPITaskProcessor.addSnapshotSerializer(expect); addedSerializer = true; } const caseConfig: TStatsAPICaseConfig = require(testConfig); diff --git a/packages/rspack-test-tools/src/helper/legacy/createFakeWorker.js b/packages/rspack-test-tools/src/helper/legacy/createFakeWorker.js index 17c4507d7d9..43e640dbb54 100644 --- a/packages/rspack-test-tools/src/helper/legacy/createFakeWorker.js +++ b/packages/rspack-test-tools/src/helper/legacy/createFakeWorker.js @@ -2,12 +2,12 @@ const path = require("path"); -module.exports = ({ outputDirectory }) => +module.exports = (env, { outputDirectory }) => class Worker { constructor(url, options = {}) { - expect(url).toBeInstanceOf(URL); - expect(url.origin).toBe("https://test.cases"); - expect(url.pathname.startsWith("/path/")).toBe(true); + env.expect(url).toBeInstanceOf(URL); + env.expect(url.origin).toBe("https://test.cases"); + env.expect(url.pathname.startsWith("/path/")).toBe(true); this.url = url; const file = url.pathname.slice(6); const workerBootstrap = ` diff --git a/packages/rspack-test-tools/src/helper/legacy/createLazyTestEnv.js b/packages/rspack-test-tools/src/helper/legacy/createLazyTestEnv.js index 0f2c9099681..1068631ff63 100644 --- a/packages/rspack-test-tools/src/helper/legacy/createLazyTestEnv.js +++ b/packages/rspack-test-tools/src/helper/legacy/createLazyTestEnv.js @@ -85,6 +85,7 @@ module.exports = (globalTimeout = 2000, nameSuffix = "") => { getNumberOfTests() { return numberOfTests; }, + expect, it(...args) { numberOfTests++; if (runTests >= numberOfTests) throw new Error("it called too late"); diff --git a/packages/rspack-test-tools/src/processor/defaults.ts b/packages/rspack-test-tools/src/processor/defaults.ts index 85d2d39916e..3c83d580f88 100644 --- a/packages/rspack-test-tools/src/processor/defaults.ts +++ b/packages/rspack-test-tools/src/processor/defaults.ts @@ -93,8 +93,8 @@ export class DefaultsConfigTaskProcessor extends SimpleTaskProcessor 0); + env.expect((statsJson.errors || []).length > 0); } else { - expect((statsJson.errors || []).length === 0); + env.expect((statsJson.errors || []).length === 0); } if (typeof testConfig.validate === "function") { diff --git a/packages/rspack-test-tools/src/processor/hook.ts b/packages/rspack-test-tools/src/processor/hook.ts index 1870c2c307a..d6bce35dadb 100644 --- a/packages/rspack-test-tools/src/processor/hook.ts +++ b/packages/rspack-test-tools/src/processor/hook.ts @@ -147,6 +147,7 @@ export class HookCasesContext extends TestContext { * @internal */ async collectSnapshots( + env: ITestEnv, options = { diff: {} } @@ -167,12 +168,10 @@ export class HookCasesContext extends TestContext { group = `# ${group}\n\n`; return (acc += group + block); }, ""); - - // @ts-ignore - expect(snapshots).toMatchFileSnapshot( - path.join(this.src, "hooks.snap.txt"), - options - ); + env + .expect(snapshots) + // @ts-ignore + .toMatchFileSnapshot(path.join(this.src, "hooks.snap.txt"), options); } } @@ -230,7 +229,7 @@ export class HookTaskProcessor extends SnapshotProcessor { } async check(env: ITestEnv, context: HookCasesContext) { - await (context as any).collectSnapshots(); + await (context as any).collectSnapshots(env); await super.check(env, context); if (typeof this._hookOptions.check === "function") { await this._hookOptions.check(context); diff --git a/packages/rspack-test-tools/src/processor/hot-step.ts b/packages/rspack-test-tools/src/processor/hot-step.ts index 7b5e481779c..7d76f814737 100644 --- a/packages/rspack-test-tools/src/processor/hot-step.ts +++ b/packages/rspack-test-tools/src/processor/hot-step.ts @@ -88,6 +88,7 @@ export class RspackHotStepProcessor extends RspackHotProcessor { } } this.matchStepSnapshot( + env, context, hotUpdateContext.updateIndex, statsJson, @@ -114,7 +115,7 @@ export class RspackHotStepProcessor extends RspackHotProcessor { const compiler = this.getCompiler(context); const stats = compiler.getStats(); if (!stats || !stats.hash) { - expect(false); + env.expect(false); return; } const statsJson = stats.toJson({ assets: true, chunks: true }); @@ -125,7 +126,7 @@ export class RspackHotStepProcessor extends RspackHotProcessor { } let matchFailed: Error | null = null; try { - this.matchStepSnapshot(context, 0, statsJson); + this.matchStepSnapshot(env, context, 0, statsJson); } catch (e) { matchFailed = e as Error; } @@ -136,6 +137,7 @@ export class RspackHotStepProcessor extends RspackHotProcessor { } protected matchStepSnapshot( + env: ITestEnv, context: ITestContext, step: number, stats: StatsCompilation, @@ -145,7 +147,7 @@ export class RspackHotStepProcessor extends RspackHotProcessor { const compilerOptions = compiler.getOptions(); const getModuleHandler = GET_MODULE_HANDLER[compilerOptions.target as TSupportTarget]; - expect(typeof getModuleHandler).toBe("function"); + env.expect(typeof getModuleHandler).toBe("function"); const lastHash = this.hashes[this.hashes.length - 1]; const snapshotPath = context.getSource( @@ -359,6 +361,6 @@ ${runtime.javascript.disposedModules.map(i => `- ${i}`).join("\n")} return; } const snapshotContent = escapeEOL(fs.readFileSync(snapshotPath, "utf-8")); - expect(content).toBe(snapshotContent); + env.expect(content).toBe(snapshotContent); } } diff --git a/packages/rspack-test-tools/src/processor/snapshot.ts b/packages/rspack-test-tools/src/processor/snapshot.ts index a4702541669..65b672d44f6 100644 --- a/packages/rspack-test-tools/src/processor/snapshot.ts +++ b/packages/rspack-test-tools/src/processor/snapshot.ts @@ -80,6 +80,6 @@ export class SnapshotProcessor< return; } const snapshotContent = escapeEOL(fs.readFileSync(snapshotPath, "utf-8")); - expect(content).toBe(snapshotContent); + env.expect(content).toBe(snapshotContent); } } diff --git a/packages/rspack-test-tools/src/processor/stats-api.ts b/packages/rspack-test-tools/src/processor/stats-api.ts index eff1096b468..576f203f8b2 100644 --- a/packages/rspack-test-tools/src/processor/stats-api.ts +++ b/packages/rspack-test-tools/src/processor/stats-api.ts @@ -50,11 +50,11 @@ export class StatsAPITaskProcessor< async check(env: ITestEnv, context: ITestContext) { const compiler = this.getCompiler(context); const stats = compiler.getStats(); - expect(typeof stats).toBe("object"); + env.expect(typeof stats).toBe("object"); await this._statsAPIOptions.check?.(stats!, compiler.getCompiler()!); } - static addSnapshotSerializer() { - expect.addSnapshotSerializer(serializer); + static addSnapshotSerializer(expectImpl: jest.Expect) { + expectImpl.addSnapshotSerializer(serializer); } } diff --git a/packages/rspack-test-tools/src/processor/stats.ts b/packages/rspack-test-tools/src/processor/stats.ts index 6ea5e96c5c8..11e492ef810 100644 --- a/packages/rspack-test-tools/src/processor/stats.ts +++ b/packages/rspack-test-tools/src/processor/stats.ts @@ -98,7 +98,7 @@ export class RspackStatsProcessor extends MultiTaskProcessor void, ms: number | undefined, @@ -39,12 +38,12 @@ export class CommonJsRunner< protected createBaseModuleScope(): IBasicModuleScope { const baseModuleScope: IBasicModuleScope = { console: this.globalContext!.console, - expect: this.globalContext!.expect, setTimeout: this.globalContext!.setTimeout, clearTimeout: this.globalContext!.clearTimeout, it: this._options.env.it, beforeEach: this._options.env.beforeEach, afterEach: this._options.env.afterEach, + expect: this._options.env.expect, jest, nsObj: (m: Object) => { Object.defineProperty(m, Symbol.toStringTag, { @@ -71,7 +70,9 @@ export class CommonJsRunner< exports: m.exports, __dirname: path.dirname(file.path), __filename: file.path, - _globalAssign: { expect }, + _globalAssign: { + expect: this._options.env.expect + }, define }; } diff --git a/packages/rspack-test-tools/src/runner/runner/web/fake.ts b/packages/rspack-test-tools/src/runner/runner/web/fake.ts index 6b7f6011d1f..a30bb40a814 100644 --- a/packages/rspack-test-tools/src/runner/runner/web/fake.ts +++ b/packages/rspack-test-tools/src/runner/runner/web/fake.ts @@ -73,11 +73,11 @@ export class FakeDocumentWebRunner< } }; globalContext["importScripts"] = (url: string) => { - expect(url).toMatch(/^https:\/\/test\.cases\/path\//); + this._options.env.expect(url).toMatch(/^https:\/\/test\.cases\/path\//); this.requirers.get("entry")!(this._options.dist, urlToRelativePath(url)); }; globalContext["document"] = this.document; - globalContext["Worker"] = createFakeWorker({ + globalContext["Worker"] = createFakeWorker(this._options.env, { outputDirectory: this._options.dist }); globalContext["EventSource"] = EventSource; @@ -98,7 +98,7 @@ export class FakeDocumentWebRunner< ) { const subModuleScope = super.createModuleScope(requireFn, m, file); subModuleScope["importScripts"] = (url: string) => { - expect(url).toMatch(/^https:\/\/test\.cases\/path\//); + this._options.env.expect(url).toMatch(/^https:\/\/test\.cases\/path\//); this.getRequire()( this._options.dist, `.${url.slice("https://test.cases/path".length)}` @@ -118,7 +118,7 @@ export class FakeDocumentWebRunner< moduleScope["Worker"] = this.globalContext!["Worker"]; moduleScope["EventSource"] = this.globalContext!["EventSource"]; moduleScope["URL"] = URL; - moduleScope["Worker"] = createFakeWorker({ + moduleScope["Worker"] = createFakeWorker(this._options.env, { outputDirectory: this._options.dist }); moduleScope["__dirname"] = this._options.dist; diff --git a/packages/rspack-test-tools/src/runner/runner/web/jsdom.ts b/packages/rspack-test-tools/src/runner/runner/web/jsdom.ts index f26c45a7e54..fffdfaa17c0 100644 --- a/packages/rspack-test-tools/src/runner/runner/web/jsdom.ts +++ b/packages/rspack-test-tools/src/runner/runner/web/jsdom.ts @@ -103,7 +103,7 @@ export class JSDOMWebRunner< protected createBaseModuleScope() { const moduleScope = super.createBaseModuleScope(); moduleScope["EventSource"] = EventSource; - moduleScope["Worker"] = createFakeWorker({ + moduleScope["Worker"] = createFakeWorker(this._options.env, { outputDirectory: this._options.dist }); const urlToPath = (url: string) => { @@ -134,7 +134,7 @@ export class JSDOMWebRunner< }; moduleScope["URL"] = URL; moduleScope["importScripts"] = (url: string) => { - expect(url).toMatch(/^https:\/\/test\.cases\/path\//); + this._options.env.expect(url).toMatch(/^https:\/\/test\.cases\/path\//); this.requirers.get("entry")!(this._options.dist, urlToRelativePath(url)); }; moduleScope["STATS"] = moduleScope.__STATS__; diff --git a/packages/rspack-test-tools/src/runner/type.ts b/packages/rspack-test-tools/src/runner/type.ts index 1f464583dd9..61994bbe7e6 100644 --- a/packages/rspack-test-tools/src/runner/type.ts +++ b/packages/rspack-test-tools/src/runner/type.ts @@ -30,7 +30,6 @@ export interface IBasicModuleScope extends ITestEnv { export interface IBasicGlobalContext { console: Console; - expect: jest.Expect; setTimeout: typeof setTimeout; clearTimeout: typeof clearTimeout; [key: string]: any; diff --git a/packages/rspack-test-tools/src/test/creator.ts b/packages/rspack-test-tools/src/test/creator.ts index 3d2ed325319..e07434c1bfe 100644 --- a/packages/rspack-test-tools/src/test/creator.ts +++ b/packages/rspack-test-tools/src/test/creator.ts @@ -6,6 +6,7 @@ import createLazyTestEnv from "../helper/legacy/createLazyTestEnv"; import { ECompilerType, ITestContext, + ITestEnv, ITester, ITestProcessor, TRunnerFactory, @@ -88,11 +89,12 @@ export class BasicCaseCreator { }); } - protected createEnv(testConfig: TTestConfig) { + protected createEnv(testConfig: TTestConfig): ITestEnv { if (typeof this._options.runner === "function" && !testConfig.noTest) { return createLazyTestEnv(10000); } else { return { + expect, it, beforeEach, afterEach diff --git a/packages/rspack-test-tools/src/test/simple.ts b/packages/rspack-test-tools/src/test/simple.ts index b3e4c40590e..ae9f4a58a11 100644 --- a/packages/rspack-test-tools/src/test/simple.ts +++ b/packages/rspack-test-tools/src/test/simple.ts @@ -14,7 +14,8 @@ export function getSimpleProcessorRunner( context?: (src: string, dist: string) => ITestContext; } = {} ) { - const createEnv = options.env || (() => ({ it, beforeEach, afterEach })); + const createEnv = + options.env || (() => ({ expect, it, beforeEach, afterEach })); const createContext = options.context || ((src: string, dist: string) => new TestContext({ src, dist })); diff --git a/packages/rspack-test-tools/src/type.ts b/packages/rspack-test-tools/src/type.ts index 0938e9f17cc..096cf06e39f 100644 --- a/packages/rspack-test-tools/src/type.ts +++ b/packages/rspack-test-tools/src/type.ts @@ -168,6 +168,7 @@ export type TDiffStats = { }; export interface ITestEnv { + expect: jest.Expect; it: (...args: any[]) => void; beforeEach: (...args: any[]) => void; afterEach: (...args: any[]) => void; diff --git a/packages/rspack-test-tools/tests/Defaults.test.js b/packages/rspack-test-tools/tests/Defaults.test.js index 9cb95be9031..781179c5123 100644 --- a/packages/rspack-test-tools/tests/Defaults.test.js +++ b/packages/rspack-test-tools/tests/Defaults.test.js @@ -5,7 +5,7 @@ const { describeByWalk } = require(".."); -DefaultsConfigTaskProcessor.addSnapshotSerializer(); +DefaultsConfigTaskProcessor.addSnapshotSerializer(expect); describe("Base Defaults Snapshot", () => { const baseConfig = DefaultsConfigTaskProcessor.getDefaultConfig(