@@ -5,11 +5,13 @@ import { describe, expect, it } from 'vitest'
55import { renderError } from '../../../src/dev/error'
66import { NuxtDevServer } from '../../../src/dev/utils'
77
8- interface FakeResponse extends ServerResponse {
8+ interface FakeResponse {
99body : string
1010statusCode : number
11+ headersSent : boolean
1112headers : Record < string , string >
1213finished : Promise < void >
14+ response : ServerResponse
1315}
1416
1517function createRequest ( accept ?: string , url = '/' ) : IncomingMessage {
@@ -42,13 +44,17 @@ function createResponse(): FakeResponse {
4244done ( )
4345} ,
4446}
45- return res as unknown as FakeResponse
47+ return new Proxy ( res , {
48+ get ( target , key ) {
49+ return key === 'response' ? target : Reflect . get ( target , key )
50+ } ,
51+ } ) as unknown as FakeResponse
4652}
4753
4854describe ( 'renderError' , ( ) => {
4955it ( 'should escape an error message in the html error page' , async ( ) => {
5056const res = createResponse ( )
51- await renderError ( createRequest ( 'text/html' ) , res , new Error ( '<script>alert(1)</script>' ) )
57+ await renderError ( createRequest ( 'text/html' ) , res . response , new Error ( '<script>alert(1)</script>' ) )
5258
5359expect ( res . statusCode ) . toBe ( 500 )
5460expect ( res . headers [ 'content-type' ] ) . toBe ( 'text/html' )
@@ -58,22 +64,22 @@ describe('renderError', () => {
5864
5965it ( 'should escape a reflected request url in the html error page' , async ( ) => {
6066const res = createResponse ( )
61- await renderError ( createRequest ( 'text/html' , '/</script><script>alert(1)</script>' ) , res , new Error ( 'boom' ) )
67+ await renderError ( createRequest ( 'text/html' , '/</script><script>alert(1)</script>' ) , res . response , new Error ( 'boom' ) )
6268
6369expect ( res . body ) . not . toContain ( '<script>alert(1)</script>' )
6470} )
6571
6672it ( 'should answer a non-html client with json' , async ( ) => {
6773const res = createResponse ( )
68- await renderError ( createRequest ( 'application/json' ) , res , new Error ( 'boom' ) )
74+ await renderError ( createRequest ( 'application/json' ) , res . response , new Error ( 'boom' ) )
6975
7076expect ( res . headers [ 'content-type' ] ) . toBe ( 'application/json' )
7177expect ( JSON . parse ( res . body ) ) . toMatchObject ( { error : true , status : 500 , message : 'boom' } )
7278} )
7379
7480it ( 'should send hardening headers with the error page' , async ( ) => {
7581const res = createResponse ( )
76- await renderError ( createRequest ( 'text/html' ) , res , new Error ( 'boom' ) )
82+ await renderError ( createRequest ( 'text/html' ) , res . response , new Error ( 'boom' ) )
7783
7884expect ( res . headers ) . toMatchObject ( {
7985'cache-control' : 'no-store' ,
@@ -86,14 +92,14 @@ describe('renderError', () => {
8692it ( 'should not write a body once headers have been sent' , async ( ) => {
8793const res = createResponse ( )
8894res . headersSent = true
89- await renderError ( createRequest ( 'text/html' ) , res , new Error ( 'boom' ) )
95+ await renderError ( createRequest ( 'text/html' ) , res . response , new Error ( 'boom' ) )
9096
9197expect ( res . body ) . toBe ( '' )
9298} )
9399
94100it ( 'should render a non-error rejection value' , async ( ) => {
95101const res = createResponse ( )
96- await renderError ( createRequest ( 'application/json' ) , res , 'just a string' )
102+ await renderError ( createRequest ( 'application/json' ) , res . response , 'just a string' )
97103
98104expect ( JSON . parse ( res . body ) ) . toMatchObject ( { status : 500 , message : 'Unknown error' } )
99105} )
@@ -108,7 +114,7 @@ describe('dev server loading screen', () => {
108114const server = createDevServer ( ( { loading } ) => `<p>${ loading } </p>` )
109115const res = createResponse ( )
110116
111- server . handler ( createRequest ( 'text/html' ) , res )
117+ server . handler ( createRequest ( 'text/html' ) , res as unknown as ServerResponse )
112118await res . finished
113119
114120expect ( res . statusCode ) . toBe ( 503 )
@@ -120,7 +126,7 @@ describe('dev server loading screen', () => {
120126const server = createDevServer ( ( ) => '<p>ignored</p>' )
121127const res = createResponse ( )
122128
123- server . handler ( createRequest ( 'application/json' ) , res )
129+ server . handler ( createRequest ( 'application/json' ) , res as unknown as ServerResponse )
124130await res . finished
125131
126132expect ( res . statusCode ) . toBe ( 503 )
@@ -131,7 +137,7 @@ describe('dev server loading screen', () => {
131137const server = createDevServer ( ( ) => 'loading' )
132138const res = createResponse ( )
133139
134- server . handler ( createRequest ( 'text/html' ) , res )
140+ server . handler ( createRequest ( 'text/html' ) , res as unknown as ServerResponse )
135141await res . finished
136142
137143expect ( res . headers ) . toMatchObject ( { 'cache-control' : 'no-store' , 'refresh' : '3' } )
0 commit comments