import Koa from 'koa' import * as httpMocks from 'node-mocks-http' import { keysOf } from './object' import { ExtractedRequestParams } from './TypeUtils' export interface MockContext extends Koa.Context { request: Koa.Context['request'] & { body?: RequestBody } } export const mockContext = () => { const app = new Koa() const req = httpMocks.createRequest() const res = httpMocks.createResponse() const context = app.createContext(req, res) as Koa.ParameterizedContext res.statusCode = 404 return context } export const mockContextPath = ( ctx: Context, path: Path, params: Record ) => { const typedContext = ctx as Context & { params: any } & ExtractedRequestParams ctx.request.path = path typedContext.params = params return typedContext } export const mockContextQuery = ( ctx: Context, params: Record ) => { ctx.query = params return ctx } export const mockContextCookies = ( ctx: Context, params: Record ) => { const cookies = keysOf(params).map((name) => { const cookieData = params[name] return { name, value: typeof cookieData === 'string' ? cookieData : cookieData.value, expires: typeof cookieData === 'string' ? undefined : cookieData.expires, } }) ctx.cookies = { ...ctx.cookies, get: (name: string) => { return cookies.find((cookie) => cookie.name === name)?.value || undefined }, } return ctx } export const mockContextHeaders = ( ctx: Context, params: Record ) => { ctx.request.headers = params return ctx } export const mockContextBody = ( ctx: Context, params: Record ) => { ctx.request.body = params ctx.request.rawBody = JSON.stringify(params) return ctx } export const mockContextRawBody = ( ctx: Context, params: string ) => { ctx.request.rawBody = params return ctx }