magnitude-test
Version:
A TypeScript client for running automated UI tests through the Magnitude testing platform
195 lines (171 loc) • 5.71 kB
text/typescript
import { BrowserAgent, LLMClient, GroundingClient, BrowserOptions } from 'magnitude-core';
import EventEmitter$1 from 'node:events';
/**
* Minimal `EventEmitter` interface that is molded against the Node.js
* `EventEmitter` interface.
*/
declare class EventEmitter<
EventTypes extends EventEmitter.ValidEventTypes = string | symbol,
Context extends any = any
> {
static prefixed: string | boolean;
/**
* Return an array listing the events for which the emitter has registered
* listeners.
*/
eventNames(): Array<EventEmitter.EventNames<EventTypes>>;
/**
* Return the listeners registered for a given event.
*/
listeners<T extends EventEmitter.EventNames<EventTypes>>(
event: T
): Array<EventEmitter.EventListener<EventTypes, T>>;
/**
* Return the number of listeners listening to a given event.
*/
listenerCount(event: EventEmitter.EventNames<EventTypes>): number;
/**
* Calls each of the listeners registered for a given event.
*/
emit<T extends EventEmitter.EventNames<EventTypes>>(
event: T,
...args: EventEmitter.EventArgs<EventTypes, T>
): boolean;
/**
* Add a listener for a given event.
*/
on<T extends EventEmitter.EventNames<EventTypes>>(
event: T,
fn: EventEmitter.EventListener<EventTypes, T>,
context?: Context
): this;
addListener<T extends EventEmitter.EventNames<EventTypes>>(
event: T,
fn: EventEmitter.EventListener<EventTypes, T>,
context?: Context
): this;
/**
* Add a one-time listener for a given event.
*/
once<T extends EventEmitter.EventNames<EventTypes>>(
event: T,
fn: EventEmitter.EventListener<EventTypes, T>,
context?: Context
): this;
/**
* Remove the listeners of a given event.
*/
removeListener<T extends EventEmitter.EventNames<EventTypes>>(
event: T,
fn?: EventEmitter.EventListener<EventTypes, T>,
context?: Context,
once?: boolean
): this;
off<T extends EventEmitter.EventNames<EventTypes>>(
event: T,
fn?: EventEmitter.EventListener<EventTypes, T>,
context?: Context,
once?: boolean
): this;
/**
* Remove all listeners, or those of the specified event.
*/
removeAllListeners(event?: EventEmitter.EventNames<EventTypes>): this;
}
declare namespace EventEmitter {
export interface ListenerFn<Args extends any[] = any[]> {
(...args: Args): void;
}
export interface EventEmitterStatic {
new <
EventTypes extends ValidEventTypes = string | symbol,
Context = any
>(): EventEmitter<EventTypes, Context>;
}
/**
* `object` should be in either of the following forms:
* ```
* interface EventTypes {
* 'event-with-parameters': any[]
* 'event-with-example-handler': (...args: any[]) => void
* }
* ```
*/
export type ValidEventTypes = string | symbol | object;
export type EventNames<T extends ValidEventTypes> = T extends string | symbol
? T
: keyof T;
export type ArgumentMap<T extends object> = {
[K in keyof T]: T[K] extends (...args: any[]) => void
? Parameters<T[K]>
: T[K] extends any[]
? T[K]
: any[];
};
export type EventListener<
T extends ValidEventTypes,
K extends EventNames<T>
> = T extends string | symbol
? (...args: any[]) => void
: (
...args: ArgumentMap<Exclude<T, string | symbol>>[Extract<K, keyof T>]
) => void;
export type EventArgs<
T extends ValidEventTypes,
K extends EventNames<T>
> = Parameters<EventListener<T, K>>;
export const EventEmitter: EventEmitterStatic;
}
interface CheckEvents {
'checkStarted': (check: string) => void;
'checkDone': (check: string, passed: boolean) => void;
}
declare class TestCaseAgent extends BrowserAgent {
readonly checkEvents: EventEmitter<CheckEvents>;
check(description: string): Promise<void>;
}
interface TestOptions {
url?: string;
prompt?: string;
}
interface WebServerConfig {
command: string;
url: string;
timeout?: number;
reuseExistingServer?: boolean;
}
type MagnitudeConfig = {
url: string;
llm?: LLMClient;
grounding?: GroundingClient;
webServer?: WebServerConfig | WebServerConfig[];
browser?: BrowserOptions;
telemetry?: boolean;
continueAfterFailure?: boolean;
display?: {
showActions?: boolean;
};
};
type TestFunction = (agent: TestCaseAgent) => Promise<void>;
type TestGroupFunction = () => void;
interface TestGroupDeclaration {
(id: string, options: TestOptions, groupFn: TestGroupFunction): void;
(id: string, groupFn: TestGroupFunction): void;
}
interface TestDeclaration {
(title: string, options: TestOptions, testFn: TestFunction): void;
(title: string, testFn: TestFunction): void;
group: TestGroupDeclaration;
}
declare global {
var __magnitudeTestFunctions: Map<string, TestFunction> | undefined;
var __magnitudeMessageEmitter: EventEmitter$1 | undefined;
var __magnitudeTestHooks: TestHooks | undefined;
}
type TestHooks = Record<'beforeAll' | 'afterAll' | 'beforeEach' | 'afterEach', (() => void | Promise<void>)[]>;
declare const test: TestDeclaration;
declare const beforeAll: (fn: TestHooks["beforeAll" | "afterAll" | "beforeEach" | "afterEach"][number]) => void;
declare const afterAll: (fn: TestHooks["beforeAll" | "afterAll" | "beforeEach" | "afterEach"][number]) => void;
declare const beforeEach: (fn: TestHooks["beforeAll" | "afterAll" | "beforeEach" | "afterEach"][number]) => void;
declare const afterEach: (fn: TestHooks["beforeAll" | "afterAll" | "beforeEach" | "afterEach"][number]) => void;
export { type MagnitudeConfig, type WebServerConfig, afterAll, afterEach, beforeAll, beforeEach, test };