@itwin/certa
Version:
A mocha-based integration test runner
221 lines • 14.9 kB
TypeScript
type MochaObj = Mocha.Runnable | Mocha.Suite;
/**
* Helper for marshalling certain mocha objects between frontend and backend processes.
*
* Normally, playwright automatically uses JSON to serialize and deserialize arguments to backend functions exposed via `page.exposeFunction()`.
* However, we face two problems when trying to pass `Mocha.Runnable` and `Mocha.Suite` instances to the backend:
* - These objects have circular references
* - JSON round-tripping won't preserve these objects' prototypes, and thus will be missing methods that reporters rely on.
*
* This class attempts to solve this by replacing all instances of these classes with "handles" that simply refer to their
* index in a central "registry" array. Because we serialize and deserialize in the same order, we can re-create this "registry"
* on the backend as we deserialize.
*/
declare class MochaSerializer {
private static _registry;
static createHandle(raw: MochaObj, isPrimary: boolean): {
ctx: Mocha.Context;
suites: Mocha.Suite[];
tests: Mocha.Test[];
pending: boolean;
file?: string | undefined;
root: boolean;
delayed: boolean;
parent: Mocha.Suite | undefined;
title: string;
on(event: "beforeAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
on(event: "afterAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
on(event: "beforeEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
on(event: "afterEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
on(event: "suite", listener: (suite: Mocha.Suite) => void): Mocha.Suite;
on(event: "test", listener: (test: Mocha.Test) => void): Mocha.Suite;
on(event: "run", listener: () => void): Mocha.Suite;
on(event: "pre-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
on(event: "require", listener: (module: any, file: string, mocha: Mocha) => void): Mocha.Suite;
on(event: "post-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
on(event: string, listener: (...args: any[]) => void): Mocha.Suite;
once(event: "beforeAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
once(event: "afterAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
once(event: "beforeEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
once(event: "afterEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
once(event: "suite", listener: (suite: Mocha.Suite) => void): Mocha.Suite;
once(event: "test", listener: (test: Mocha.Test) => void): Mocha.Suite;
once(event: "run", listener: () => void): Mocha.Suite;
once(event: "pre-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
once(event: "require", listener: (module: any, file: string, mocha: Mocha) => void): Mocha.Suite;
once(event: "post-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
once(event: string, listener: (...args: any[]) => void): Mocha.Suite;
addListener(event: "beforeAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
addListener(event: "afterAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
addListener(event: "beforeEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
addListener(event: "afterEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
addListener(event: "suite", listener: (suite: Mocha.Suite) => void): Mocha.Suite;
addListener(event: "test", listener: (test: Mocha.Test) => void): Mocha.Suite;
addListener(event: "run", listener: () => void): Mocha.Suite;
addListener(event: "pre-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
addListener(event: "require", listener: (module: any, file: string, mocha: Mocha) => void): Mocha.Suite;
addListener(event: "post-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
addListener(event: string, listener: (...args: any[]) => void): Mocha.Suite;
removeListener(event: "beforeAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
removeListener(event: "afterAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
removeListener(event: "beforeEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
removeListener(event: "afterEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
removeListener(event: "suite", listener: (suite: Mocha.Suite) => void): Mocha.Suite;
removeListener(event: "test", listener: (test: Mocha.Test) => void): Mocha.Suite;
removeListener(event: "run", listener: () => void): Mocha.Suite;
removeListener(event: "pre-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
removeListener(event: "require", listener: (module: any, file: string, mocha: Mocha) => void): Mocha.Suite;
removeListener(event: "post-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
removeListener(event: string, listener: (...args: any[]) => void): Mocha.Suite;
prependListener(event: "beforeAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
prependListener(event: "afterAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
prependListener(event: "beforeEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
prependListener(event: "afterEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
prependListener(event: "suite", listener: (suite: Mocha.Suite) => void): Mocha.Suite;
prependListener(event: "test", listener: (test: Mocha.Test) => void): Mocha.Suite;
prependListener(event: "run", listener: () => void): Mocha.Suite;
prependListener(event: "pre-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
prependListener(event: "require", listener: (module: any, file: string, mocha: Mocha) => void): Mocha.Suite;
prependListener(event: "post-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
prependListener(event: string, listener: (...args: any[]) => void): Mocha.Suite;
prependOnceListener(event: "beforeAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
prependOnceListener(event: "afterAll", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
prependOnceListener(event: "beforeEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
prependOnceListener(event: "afterEach", listener: (hook: Mocha.Hook) => void): Mocha.Suite;
prependOnceListener(event: "suite", listener: (suite: Mocha.Suite) => void): Mocha.Suite;
prependOnceListener(event: "test", listener: (test: Mocha.Test) => void): Mocha.Suite;
prependOnceListener(event: "run", listener: () => void): Mocha.Suite;
prependOnceListener(event: "pre-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
prependOnceListener(event: "require", listener: (module: any, file: string, mocha: Mocha) => void): Mocha.Suite;
prependOnceListener(event: "post-require", listener: (context: Mocha.MochaGlobals, file: string, mocha: Mocha) => void): Mocha.Suite;
prependOnceListener(event: string, listener: (...args: any[]) => void): Mocha.Suite;
emit(name: "beforeAll", hook: Mocha.Hook): boolean;
emit(name: "afterAll", hook: Mocha.Hook): boolean;
emit(name: "beforeEach", hook: Mocha.Hook): boolean;
emit(name: "afterEach", hook: Mocha.Hook): boolean;
emit(name: "suite", suite: Mocha.Suite): boolean;
emit(name: "test", test: Mocha.Test): boolean;
emit(name: "run"): boolean;
emit(name: "pre-require", context: Mocha.MochaGlobals, file: string, mocha: Mocha): boolean;
emit(name: "require", module: any, file: string, mocha: Mocha): boolean;
emit(name: "post-require", context: Mocha.MochaGlobals, file: string, mocha: Mocha): boolean;
emit(name: string, ...args: any[]): boolean;
off<K>(eventName: string | symbol, listener: (...args: any[]) => void): Mocha.Suite;
removeAllListeners(eventName?: string | symbol | undefined): Mocha.Suite;
setMaxListeners(n: number): Mocha.Suite;
getMaxListeners(): number;
listeners<K>(eventName: string | symbol): Function[];
rawListeners<K>(eventName: string | symbol): Function[];
listenerCount<K>(eventName: string | symbol, listener?: Function | undefined): number;
eventNames(): (string | symbol)[];
[EventEmitter.captureRejectionSymbol]?<K>(error: Error, event: string | symbol, ...args: any[]): void;
$$index: number;
$$typeName: string;
} | {
type: "test";
speed?: "slow" | "medium" | "fast" | undefined;
err?: Error | undefined;
id: string;
title: string;
fn: Mocha.Func | Mocha.AsyncFunc | undefined;
body: string;
async: boolean;
sync: boolean;
timedOut: boolean;
pending: boolean;
duration?: number | undefined;
parent?: Mocha.Suite | undefined;
state?: "failed" | "passed" | "pending" | undefined;
timer?: any;
ctx?: Mocha.Context | undefined;
callback?: Mocha.Done | undefined;
allowUncaught?: boolean | undefined;
file?: string | undefined;
on(event: "error", listener: (error: any) => void): Mocha.Test;
on(event: string, listener: (...args: any[]) => void): Mocha.Test;
once(event: "error", listener: (error: any) => void): Mocha.Test;
once(event: string, listener: (...args: any[]) => void): Mocha.Test;
addListener(event: "error", listener: (error: any) => void): Mocha.Test;
addListener(event: string, listener: (...args: any[]) => void): Mocha.Test;
removeListener(event: "error", listener: (error: any) => void): Mocha.Test;
removeListener(event: string, listener: (...args: any[]) => void): Mocha.Test;
prependListener(event: "error", listener: (error: any) => void): Mocha.Test;
prependListener(event: string, listener: (...args: any[]) => void): Mocha.Test;
prependOnceListener(event: "error", listener: (error: any) => void): Mocha.Test;
prependOnceListener(event: string, listener: (...args: any[]) => void): Mocha.Test;
emit(name: "error", error: any): boolean;
emit(name: string, ...args: any[]): boolean;
off<K>(eventName: string | symbol, listener: (...args: any[]) => void): Mocha.Test;
removeAllListeners(eventName?: string | symbol | undefined): Mocha.Test;
setMaxListeners(n: number): Mocha.Test;
getMaxListeners(): number;
listeners<K>(eventName: string | symbol): Function[];
rawListeners<K>(eventName: string | symbol): Function[];
listenerCount<K>(eventName: string | symbol, listener?: Function | undefined): number;
eventNames(): (string | symbol)[];
[EventEmitter.captureRejectionSymbol]?<K>(error: Error, event: string | symbol, ...args: any[]): void;
$$index: number;
$$typeName: string;
} | {
type: "hook";
originalTitle?: string | undefined;
id: string;
title: string;
fn: Mocha.Func | Mocha.AsyncFunc | undefined;
body: string;
async: boolean;
sync: boolean;
timedOut: boolean;
pending: boolean;
duration?: number | undefined;
parent?: Mocha.Suite | undefined;
state?: "failed" | "passed" | "pending" | undefined;
timer?: any;
ctx?: Mocha.Context | undefined;
callback?: Mocha.Done | undefined;
allowUncaught?: boolean | undefined;
file?: string | undefined;
on(event: "error", listener: (error: any) => void): Mocha.Hook;
on(event: string, listener: (...args: any[]) => void): Mocha.Hook;
once(event: "error", listener: (error: any) => void): Mocha.Hook;
once(event: string, listener: (...args: any[]) => void): Mocha.Hook;
addListener(event: "error", listener: (error: any) => void): Mocha.Hook;
addListener(event: string, listener: (...args: any[]) => void): Mocha.Hook;
removeListener(event: "error", listener: (error: any) => void): Mocha.Hook;
removeListener(event: string, listener: (...args: any[]) => void): Mocha.Hook;
prependListener(event: "error", listener: (error: any) => void): Mocha.Hook;
prependListener(event: string, listener: (...args: any[]) => void): Mocha.Hook;
prependOnceListener(event: "error", listener: (error: any) => void): Mocha.Hook;
prependOnceListener(event: string, listener: (...args: any[]) => void): Mocha.Hook;
emit(name: "error", error: any): boolean;
emit(name: string, ...args: any[]): boolean;
off<K>(eventName: string | symbol, listener: (...args: any[]) => void): Mocha.Hook;
removeAllListeners(eventName?: string | symbol | undefined): Mocha.Hook;
setMaxListeners(n: number): Mocha.Hook;
getMaxListeners(): number;
listeners<K>(eventName: string | symbol): Function[];
rawListeners<K>(eventName: string | symbol): Function[];
listenerCount<K>(eventName: string | symbol, listener?: Function | undefined): number;
eventNames(): (string | symbol)[];
[EventEmitter.captureRejectionSymbol]?<K>(error: Error, event: string | symbol, ...args: any[]): void;
$$index: number;
$$typeName: string;
} | {
$$index: number;
$$typeName: string;
};
/**
* (On the frontend) Serializes a value to JSON string, recursively replacing any MochaObjs with appropriate handles
* TODO: There are ***surely*** more performant ways to do this...
*
* @param root The root object to serialize. If this is a MochaObj, it will always include all
* properties (even if it should already exist in the backend's registry).
*/
static serialize(root: any): string;
/**
* (On the backend) Deserializes a JSON string, replacing any MochaObj handles with their corresponding instances.
* The first time we encounter a given instance's handle, we'll transform that handle object to serve as the actual instance on the backend.
*/
static deserialize(txt: string): any;
}
//# sourceMappingURL=MochaSerializer.d.ts.map