@@ -19,6 +19,7 @@ import { ProfilerAction, ProfilerRow } from '@ioc:Adonis/Core/Profiler'
1919
2020import { Server } from '../src/Server'
2121import { serverConfig , fs , setupApp , encryption } from '../test-helpers'
22+ import { HttpContext } from '../src/HttpContext'
2223
2324test . group ( 'Server | Response handling' , ( group ) => {
2425 group . afterEach ( async ( ) => {
@@ -1257,4 +1258,74 @@ test.group('Server | all', (group) => {
12571258 const { body } = await supertest ( httpServer ) . get ( url ) . expect ( 200 )
12581259 assert . deepEqual ( body , { hasValidSignature : true } )
12591260 } )
1261+
1262+ if ( process . env . ASYNC_HOOKS ) {
1263+ test ( 'async HTTP context (enabled)' , async ( assert ) => {
1264+ const app = await setupApp ( )
1265+ const server = new Server ( app , encryption , serverConfig )
1266+
1267+ server . router . get ( '/' , async ( ctx ) => {
1268+ return {
1269+ enabled : HttpContext . asyncHttpContextEnabled ,
1270+ get : HttpContext . get ( ) === ctx ,
1271+ getOrFail : HttpContext . getOrFail ( ) === ctx ,
1272+ }
1273+ } )
1274+
1275+ server . optimize ( )
1276+
1277+ const httpServer = createServer ( server . handle . bind ( server ) )
1278+
1279+ assert . strictEqual ( HttpContext . asyncHttpContextEnabled , true )
1280+ assert . strictEqual ( HttpContext . get ( ) , null )
1281+ assert . throws (
1282+ ( ) => HttpContext . getOrFail ( ) ,
1283+ 'async HTTP context accessed outside of a request context'
1284+ )
1285+
1286+ const { body } = await supertest ( httpServer ) . get ( '/' ) . expect ( 200 )
1287+ assert . deepStrictEqual ( body , {
1288+ enabled : true ,
1289+ get : true ,
1290+ getOrFail : true ,
1291+ } )
1292+ } )
1293+ } else {
1294+ test ( 'async HTTP context (disabled)' , async ( assert ) => {
1295+ const app = await setupApp ( )
1296+ const server = new Server ( app , encryption , serverConfig )
1297+
1298+ server . errorHandler ( async ( error , { response } ) => {
1299+ response . status ( 200 ) . send ( error . message )
1300+ } )
1301+
1302+ server . router . get ( '/' , async ( ) => {
1303+ return {
1304+ enabled : HttpContext . asyncHttpContextEnabled ,
1305+ get : HttpContext . get ( ) === null ,
1306+ }
1307+ } )
1308+
1309+ server . router . get ( '/fail' , async ( ) => {
1310+ return HttpContext . getOrFail ( )
1311+ } )
1312+
1313+ server . optimize ( )
1314+
1315+ const httpServer = createServer ( server . handle . bind ( server ) )
1316+
1317+ assert . strictEqual ( HttpContext . asyncHttpContextEnabled , false )
1318+ assert . strictEqual ( HttpContext . get ( ) , null )
1319+ assert . throws ( ( ) => HttpContext . getOrFail ( ) , 'async HTTP context is disabled' )
1320+
1321+ const { body } = await supertest ( httpServer ) . get ( '/' ) . expect ( 200 )
1322+ assert . deepStrictEqual ( body , {
1323+ enabled : false ,
1324+ get : true ,
1325+ } )
1326+
1327+ const { text } = await supertest ( httpServer ) . get ( '/fail' ) . expect ( 200 )
1328+ assert . strictEqual ( text , 'async HTTP context is disabled' )
1329+ } )
1330+ }
12601331} )
0 commit comments