|
| 1 | +import { |
| 2 | + requestContext, |
| 3 | + asyncLocalStorage, |
| 4 | + fastifyRequestContext, |
| 5 | + FastifyRequestContextOptions, |
| 6 | + RequestContext, |
| 7 | + RequestContextDataFactory, |
| 8 | +} from '..' |
| 9 | +import { expect } from 'tstyche' |
| 10 | +import { fastify, FastifyBaseLogger, FastifyInstance, RouteHandlerMethod, FastifyRequest } from 'fastify' |
| 11 | +import { AsyncLocalStorage } from 'node:async_hooks' |
| 12 | + |
| 13 | +const app: FastifyInstance = fastify() |
| 14 | +app.register(fastifyRequestContext) |
| 15 | + |
| 16 | +declare module '..' { |
| 17 | + interface RequestContextData { |
| 18 | + a?: string |
| 19 | + log?: FastifyBaseLogger |
| 20 | + } |
| 21 | +} |
| 22 | + |
| 23 | +expect<FastifyRequestContextOptions>().type.toBeAssignableFrom({}) |
| 24 | + |
| 25 | +expect<FastifyRequestContextOptions>().type.toBeAssignableFrom({ |
| 26 | + defaultStoreValues: { a: 'dummy' }, |
| 27 | +}) |
| 28 | + |
| 29 | +expect<FastifyRequestContextOptions>().type.toBeAssignableFrom({ |
| 30 | + hook: 'preValidation' as const, |
| 31 | + defaultStoreValues: { a: 'dummy' }, |
| 32 | +}) |
| 33 | + |
| 34 | +expect<FastifyRequestContextOptions>().type.toBeAssignableFrom({ |
| 35 | + defaultStoreValues: () => ({ |
| 36 | + a: 'dummy', |
| 37 | + }), |
| 38 | +}) |
| 39 | + |
| 40 | +expect<FastifyRequestContextOptions>().type.not.toBeAssignableFrom({ |
| 41 | + defaultStoreValues: { bar: 'dummy' }, |
| 42 | +}) |
| 43 | + |
| 44 | +expect<FastifyRequestContextOptions>().type.not.toBeAssignableFrom({ |
| 45 | + defaultStoreValues: { log: 'dummy' }, |
| 46 | +}) |
| 47 | + |
| 48 | +expect<RequestContextDataFactory>().type.toBeAssignableFrom(() => ({ |
| 49 | + a: 'dummy', |
| 50 | +})) |
| 51 | + |
| 52 | +expect<FastifyRequestContextOptions>().type.toBeAssignableFrom({ |
| 53 | + defaultStoreValues: (req: FastifyRequest) => ({ |
| 54 | + log: req.log.child({ childLog: true }), |
| 55 | + }), |
| 56 | +}) |
| 57 | + |
| 58 | +expect<RequestContextDataFactory>().type.toBeAssignableFrom((req: FastifyRequest) => ({ |
| 59 | + log: req.log.child({ childLog: true }), |
| 60 | +})) |
| 61 | + |
| 62 | +expect<RequestContextDataFactory>().type.not.toBeAssignableFrom(() => ({ bar: 'dummy' })) |
| 63 | + |
| 64 | +expect<RequestContextDataFactory>().type.not.toBeAssignableFrom(() => ({ log: 'dummy' })) |
| 65 | + |
| 66 | +expect(app.requestContext).type.toBe<RequestContext>() |
| 67 | +expect(requestContext).type.toBe<RequestContext>() |
| 68 | +expect(asyncLocalStorage).type.toBe<AsyncLocalStorage<RequestContext>>() |
| 69 | + |
| 70 | +const getHandler: RouteHandlerMethod = function (request, _reply) { |
| 71 | + expect(request.requestContext).type.toBe<RequestContext>() |
| 72 | +} |
| 73 | +expect(getHandler).type.toBe<RouteHandlerMethod>() |
| 74 | + |
| 75 | +expect(requestContext.get('a')).type.toBe<string | undefined>() |
| 76 | +expect(requestContext.get('log')).type.toBe<FastifyBaseLogger | undefined>() |
| 77 | + |
| 78 | +// @ts-expect-error: Argument of type '"bar"' is not assignable |
| 79 | +requestContext.get('bar') |
| 80 | + |
| 81 | +requestContext.set('a', undefined) |
| 82 | + |
| 83 | +// @ts-expect-error: Argument of type 'number' is not assignable |
| 84 | +requestContext.set('a', 123) |
| 85 | + |
| 86 | +expect<FastifyRequestContextOptions>().type.not.toBeAssignableFrom({ |
| 87 | + defaultStoreValues: { a: undefined }, |
| 88 | +}) |
0 commit comments