import { HookType, Context, Middleware, ObjectConstructor, Startup, } from "@ipare/core"; export type TestMiddlewareFn = ( md: T, ctx: Context ) => void | Promise; export type ExpectMiddlewareType = | HookType.BeforeInvoke | HookType.AfterInvoke | HookType.BeforeNext; declare module "@ipare/core" { interface Startup { expectMiddleware( mdCls: ObjectConstructor, fn: TestMiddlewareFn, type?: ExpectMiddlewareType ): this; } } Startup.prototype.expectMiddleware = function ( middleware: ObjectConstructor, expect: TestMiddlewareFn, type: ExpectMiddlewareType = HookType.BeforeInvoke ) { const key = ""; return this.use(async (ctx, next) => { await next(); if (!ctx.get(key)) { throw new Error("The middleware is not executed!"); } }).hook(type as any, async (ctx, md: T) => { if (md.constructor == middleware) { ctx.set(key, true); await expect(md, ctx); } }); };