|
9 | 9 |
|
10 | 10 | import 'reflect-metadata' |
11 | 11 | import supertest from 'supertest' |
| 12 | +import { Socket } from 'node:net' |
12 | 13 | import { test } from '@japa/runner' |
13 | | -import { createServer } from 'node:http' |
14 | 14 | import { Emitter } from '@adonisjs/events' |
15 | 15 | import type { NextFn } from '@poppinss/middleware/types' |
16 | 16 | import { AppFactory } from '@adonisjs/application/factories' |
| 17 | +import { createServer, IncomingMessage, ServerResponse } from 'node:http' |
17 | 18 |
|
18 | 19 | import { Router } from '../src/router/main.js' |
19 | 20 | import { HttpContext } from '../src/http_context/main.js' |
@@ -990,3 +991,128 @@ test.group('Server | force content negotiation', () => { |
990 | 991 | }) |
991 | 992 | }) |
992 | 993 | }) |
| 994 | + |
| 995 | +test.group('Server | Pipeline', () => { |
| 996 | + test('execute middleware pipeline', async ({ assert }) => { |
| 997 | + const stack: string[] = [] |
| 998 | + const app = new AppFactory().create(BASE_URL, () => {}) |
| 999 | + await app.init() |
| 1000 | + |
| 1001 | + const server = new ServerFactory().merge({ app }).create() |
| 1002 | + |
| 1003 | + class MiddlewareOne { |
| 1004 | + handle(_: any, next: NextFn) { |
| 1005 | + stack.push('middleware one') |
| 1006 | + return next() |
| 1007 | + } |
| 1008 | + } |
| 1009 | + |
| 1010 | + class MiddlewareTwo { |
| 1011 | + handle(_: any, next: NextFn) { |
| 1012 | + stack.push('middleware two') |
| 1013 | + return next() |
| 1014 | + } |
| 1015 | + } |
| 1016 | + |
| 1017 | + const req = new IncomingMessage(new Socket()) |
| 1018 | + const res = new ServerResponse(req) |
| 1019 | + |
| 1020 | + const ctx = server.createHttpContext( |
| 1021 | + server.createRequest(req, res), |
| 1022 | + server.createResponse(req, res), |
| 1023 | + app.container.createResolver() |
| 1024 | + ) |
| 1025 | + |
| 1026 | + await server.pipeline([MiddlewareOne, MiddlewareTwo]).run(ctx) |
| 1027 | + assert.deepEqual(stack, ['middleware one', 'middleware two']) |
| 1028 | + }) |
| 1029 | + |
| 1030 | + test('run final handler', async ({ assert }) => { |
| 1031 | + const stack: string[] = [] |
| 1032 | + const app = new AppFactory().create(BASE_URL, () => {}) |
| 1033 | + await app.init() |
| 1034 | + |
| 1035 | + const server = new ServerFactory().merge({ app }).create() |
| 1036 | + |
| 1037 | + class MiddlewareOne { |
| 1038 | + handle(_: any, next: NextFn) { |
| 1039 | + stack.push('middleware one') |
| 1040 | + return next() |
| 1041 | + } |
| 1042 | + } |
| 1043 | + |
| 1044 | + class MiddlewareTwo { |
| 1045 | + handle(_: any, next: NextFn) { |
| 1046 | + stack.push('middleware two') |
| 1047 | + return next() |
| 1048 | + } |
| 1049 | + } |
| 1050 | + |
| 1051 | + const req = new IncomingMessage(new Socket()) |
| 1052 | + const res = new ServerResponse(req) |
| 1053 | + |
| 1054 | + const ctx = server.createHttpContext( |
| 1055 | + server.createRequest(req, res), |
| 1056 | + server.createResponse(req, res), |
| 1057 | + app.container.createResolver() |
| 1058 | + ) |
| 1059 | + |
| 1060 | + await server |
| 1061 | + .pipeline([MiddlewareOne, MiddlewareTwo]) |
| 1062 | + .finalHandler(async () => { |
| 1063 | + stack.push('final handler') |
| 1064 | + }) |
| 1065 | + .run(ctx) |
| 1066 | + |
| 1067 | + assert.deepEqual(stack, ['middleware one', 'middleware two', 'final handler']) |
| 1068 | + }) |
| 1069 | + |
| 1070 | + test('run error handler when error is thrown', async ({ assert }) => { |
| 1071 | + const stack: string[] = [] |
| 1072 | + const app = new AppFactory().create(BASE_URL, () => {}) |
| 1073 | + await app.init() |
| 1074 | + |
| 1075 | + const server = new ServerFactory().merge({ app }).create() |
| 1076 | + |
| 1077 | + class MiddlewareOne { |
| 1078 | + async handle(_: any, next: NextFn) { |
| 1079 | + stack.push('middleware one') |
| 1080 | + await next() |
| 1081 | + stack.push('upstream middleware one') |
| 1082 | + } |
| 1083 | + } |
| 1084 | + |
| 1085 | + class MiddlewareTwo { |
| 1086 | + handle(_: any, __: NextFn) { |
| 1087 | + stack.push('middleware two') |
| 1088 | + throw new Error('Fail') |
| 1089 | + } |
| 1090 | + } |
| 1091 | + |
| 1092 | + const req = new IncomingMessage(new Socket()) |
| 1093 | + const res = new ServerResponse(req) |
| 1094 | + |
| 1095 | + const ctx = server.createHttpContext( |
| 1096 | + server.createRequest(req, res), |
| 1097 | + server.createResponse(req, res), |
| 1098 | + app.container.createResolver() |
| 1099 | + ) |
| 1100 | + |
| 1101 | + await server |
| 1102 | + .pipeline([MiddlewareOne, MiddlewareTwo]) |
| 1103 | + .finalHandler(async () => { |
| 1104 | + stack.push('final handler') |
| 1105 | + }) |
| 1106 | + .errorHandler(async () => { |
| 1107 | + stack.push('error handler') |
| 1108 | + }) |
| 1109 | + .run(ctx) |
| 1110 | + |
| 1111 | + assert.deepEqual(stack, [ |
| 1112 | + 'middleware one', |
| 1113 | + 'middleware two', |
| 1114 | + 'error handler', |
| 1115 | + 'upstream middleware one', |
| 1116 | + ]) |
| 1117 | + }) |
| 1118 | +}) |
0 commit comments