serverless-spy
Version:
CDK-based library for writing elegant integration tests on AWS serverless architecture and an additional web console to monitor events in real time.
159 lines (158 loc) • 8.6 kB
TypeScript
import { PrettifyForDisplay } from './PrettifyForDisplay';
import { RecursivePartial } from './RecursivePartial';
import { DynamoDBSpyEvent } from '../common/spyEvents/DynamoDBSpyEvent';
import { EventBridgeRuleSpyEvent } from '../common/spyEvents/EventBridgeRuleSpyEvent';
import { EventBridgeSpyEvent } from '../common/spyEvents/EventBridgeSpyEvent';
import { FunctionConsole } from '../common/spyEvents/FunctionConsole';
import { FunctionConsoleSpyEvent } from '../common/spyEvents/FunctionConsoleSpyEvent';
import { FunctionContext } from '../common/spyEvents/FunctionContext';
import { FunctionErrorSpyEvent } from '../common/spyEvents/FunctionErrorSpyEvent';
import { FunctionRequestSpyEvent } from '../common/spyEvents/FunctionRequestSpyEvent';
import { FunctionResponseSpyEvent } from '../common/spyEvents/FunctionResponseSpyEvent';
import { S3SpyEvent } from '../common/spyEvents/S3SpyEvent';
import { SnsSubscriptionSpyEvent } from '../common/spyEvents/SnsSubscriptionSpyEvent';
import { SnsTopicSpyEvent } from '../common/spyEvents/SnsTopicSpyEvent';
import { SqsSpyEvent } from '../common/spyEvents/SqsSpyEvent';
type MyJestMatchers = ReturnType<typeof expect>;
type MyJestMatchersWitOnlyFunctions = Pick<MyJestMatchers, {
[P in keyof MyJestMatchers]: MyJestMatchers[P] extends (...args: any) => any ? P : never;
}[keyof MyJestMatchers]>;
type JestExpectWithSpyMethods<TSpyEvent, TSpyHandler> = Omit<{
[K in keyof MyJestMatchersWitOnlyFunctions]: (...args: Parameters<MyJestMatchersWitOnlyFunctions[K]>) => TSpyHandler;
}, 'toContainEqual' | 'toEqual' | 'toMatchObject' | 'toStrictEqual'> & {
/**
* Used when you want to check that an item is in a list.
* For testing the items in the list, this matcher recursively checks the
* equality of all fields, rather than checking for object identity.
*
* Optionally, you can provide a type for the expected value via a generic.
* This is particularly useful for ensuring expected objects have the right structure.
*/
toContainEqual(expected: TSpyEvent): TSpyHandler;
/**
* Used when you want to check that two objects have the same value.
* This matcher recursively checks the equality of all fields, rather than checking for object identity.
*
* Optionally, you can provide a type for the expected value via a generic.
* This is particularly useful for ensuring expected objects have the right structure.
*/
toEqual(expected: TSpyEvent): TSpyHandler;
/**
* Used to check that a JavaScript object matches a subset of the properties of an object
*
* Optionally, you can provide an object to use as Generic type for the expected value.
* This ensures that the matching object matches the structure of the provided object-like type.
*
* @example
*
* type House = {
* bath: boolean;
* bedrooms: number;
* kitchen: {
* amenities: string[];
* area: number;
* wallColor: string;
* }
* };
*
* expect(desiredHouse).toMatchObject<House>({...standardHouse, kitchen: {area: 20}}) // wherein standardHouse is some base object of type House
*/
toMatchObject(expected: PrettifyForDisplay<RecursivePartial<TSpyEvent>>): TSpyHandler;
/**
* Use to test that objects have the same types as well as structure.
*
* Optionally, you can provide a type for the expected value via a generic.
* This is particularly useful for ensuring expected objects have the right structure.
*/
toStrictEqual(expected: TSpyEvent): TSpyHandler;
};
export interface DynamoDBSpyHandler<TData = any> extends JestExpectWithSpyMethods<DynamoDBSpyEvent<TData>, DynamoDBSpyHandler<TData>> {
getData: () => PrettifyForDisplay<DynamoDBSpyEvent<TData>>;
}
export interface EventBridgeRuleSpyHandler<TData = any> extends JestExpectWithSpyMethods<EventBridgeRuleSpyEvent<TData>, EventBridgeRuleSpyHandler<TData>> {
getData: () => PrettifyForDisplay<EventBridgeRuleSpyEvent<TData>>;
}
export interface EventBridgeSpyHandler<TData = any> extends JestExpectWithSpyMethods<EventBridgeSpyEvent<TData>, EventBridgeSpyHandler<TData>> {
getData: () => PrettifyForDisplay<EventBridgeSpyEvent<TData>>;
}
export interface FunctionBaseSpyHandler<TData = any> extends JestExpectWithSpyMethods<FunctionRequestSpyEvent<TData>, FunctionRequestSpyHandler<TData>> {
followedByError: (param?: {
condition?: (event: {
spyEventType: 'FunctionError';
request: TData;
context: FunctionContext;
error: any;
}) => boolean;
timoutMs?: number;
}) => Promise<FunctionBaseSpyHandler<TData> & FunctionErrorSpyHandler<TData> & JestExpectWithSpyMethods<FunctionErrorSpyEvent<TData>, FunctionRequestSpyHandler<TData>>>;
followedByConsole: (param?: {
condition?: (event: {
spyEventType: 'FunctionConsole';
request: TData;
context: FunctionContext;
console: FunctionConsole;
}) => boolean;
timoutMs?: number;
}) => Promise<FunctionBaseSpyHandler<TData> & FunctionConsoleSpyHandler<TData> & JestExpectWithSpyMethods<FunctionConsoleSpyEvent<TData>, FunctionRequestSpyHandler<TData>>>;
followedByResponse: <TDataResponse = any>(param?: {
condition?: (event: {
spyEventType: 'FunctionResponse';
request: TData;
context: FunctionContext;
response: TDataResponse;
}) => boolean;
timoutMs?: number;
}) => Promise<FunctionResponseSpyHandler<TData> & JestExpectWithSpyMethods<FunctionRequestSpyEvent<TData>, FunctionRequestSpyHandler<TData>>>;
}
export interface FunctionRequestSpyHandler<TData = any> extends FunctionBaseSpyHandler<TData> {
getData: () => PrettifyForDisplay<FunctionRequestSpyEvent<TData>>;
}
export interface FunctionConsoleSpyHandler<TData = any> extends JestExpectWithSpyMethods<FunctionConsoleSpyEvent<TData>, FunctionConsoleSpyHandler<TData>> {
getData: () => PrettifyForDisplay<FunctionConsoleSpyEvent<TData>>;
followedByError: (param?: {
condition?: (event: {
spyEventType: 'FunctionError';
request: TData;
context: FunctionContext;
error: any;
}) => boolean;
timoutMs?: number;
}) => Promise<FunctionBaseSpyHandler<TData> & FunctionErrorSpyHandler<TData> & JestExpectWithSpyMethods<FunctionErrorSpyEvent<TData>, FunctionRequestSpyHandler<TData>>>;
followedByConsole: (param?: {
condition?: (event: {
spyEventType: 'FunctionConsole';
request: TData;
context: FunctionContext;
console: FunctionConsole;
}) => boolean;
timoutMs?: number;
}) => Promise<FunctionBaseSpyHandler<TData> & FunctionConsoleSpyHandler<TData> & JestExpectWithSpyMethods<FunctionConsoleSpyEvent<TData>, FunctionRequestSpyHandler<TData>>>;
followedByResponse: <TDataResponse = any>(param?: {
condition?: (event: {
spyEventType: 'FunctionResponse';
request: TData;
context: FunctionContext;
response: TDataResponse;
}) => boolean;
timoutMs?: number;
}) => Promise<FunctionResponseSpyHandler<TData> & JestExpectWithSpyMethods<FunctionRequestSpyEvent<TData>, FunctionRequestSpyHandler<TData>>>;
}
export interface FunctionErrorSpyHandler<TData = any> extends JestExpectWithSpyMethods<FunctionErrorSpyEvent<TData>, FunctionErrorSpyHandler<TData>> {
getData: () => PrettifyForDisplay<FunctionErrorSpyEvent<TData>>;
}
export interface FunctionResponseSpyHandler<TData = any> extends JestExpectWithSpyMethods<FunctionResponseSpyEvent<TData>, FunctionResponseSpyHandler<TData>> {
getData: () => PrettifyForDisplay<FunctionResponseSpyEvent<TData>>;
}
export interface S3SpyHandler extends JestExpectWithSpyMethods<S3SpyEvent, S3SpyHandler> {
getData: () => S3SpyEvent;
}
export interface SnsSubscriptionSpyHandler<TData = any> extends JestExpectWithSpyMethods<SnsSubscriptionSpyEvent<TData>, SnsSubscriptionSpyHandler<TData>> {
getData: () => PrettifyForDisplay<SnsSubscriptionSpyEvent<TData>>;
}
export interface SnsTopicSpyHandler<TData = any> extends JestExpectWithSpyMethods<SnsTopicSpyEvent<TData>, SnsTopicSpyHandler<TData>> {
getData: () => PrettifyForDisplay<SnsTopicSpyEvent<TData>>;
}
export interface SqsSpyHandler<TData = any> extends JestExpectWithSpyMethods<SqsSpyEvent<TData>, SqsSpyHandler<TData>> {
getData: () => PrettifyForDisplay<SqsSpyEvent<TData>>;
}
export {};