@@ -38,7 +38,9 @@ function createMockEvent(event: Partial<HandlerEvent> = {}): HandlerEvent {
3838 rawQuery : "" ,
3939 path : "/" ,
4040 httpMethod : "GET" ,
41- headers : { } ,
41+ headers : {
42+ host : "localhost:3000" ,
43+ } ,
4244 multiValueHeaders : { } ,
4345 queryStringParameters : null ,
4446 multiValueQueryStringParameters : null ,
@@ -74,6 +76,80 @@ describe("netlify createRequestHandler", () => {
7476 } ) ;
7577 } ) ;
7678
79+ it ( "handles root // requests" , async ( ) => {
80+ mockedCreateRequestHandler . mockImplementation ( ( ) => async ( req ) => {
81+ return new Response ( `URL: ${ new URL ( req . url ) . pathname } ` ) ;
82+ } ) ;
83+
84+ // We don't have a real app to test, but it doesn't matter. We won't ever
85+ // call through to the real createRequestHandler
86+ // @ts -expect-error
87+ await lambdaTester ( createRequestHandler ( { build : undefined } ) )
88+ . event ( createMockEvent ( { rawUrl : "http://localhost:3000//" } ) )
89+ . expectResolve ( ( res ) => {
90+ expect ( res . statusCode ) . toBe ( 200 ) ;
91+ expect ( res . body ) . toBe ( "URL: //" ) ;
92+ } ) ;
93+ } ) ;
94+
95+ it ( "handles nested // requests" , async ( ) => {
96+ mockedCreateRequestHandler . mockImplementation ( ( ) => async ( req ) => {
97+ return new Response ( `URL: ${ new URL ( req . url ) . pathname } ` ) ;
98+ } ) ;
99+
100+ // We don't have a real app to test, but it doesn't matter. We won't ever
101+ // call through to the real createRequestHandler
102+ // @ts -expect-error
103+ await lambdaTester ( createRequestHandler ( { build : undefined } ) )
104+ . event ( createMockEvent ( { rawUrl : "http://localhost:3000//foo//bar" } ) )
105+ . expectResolve ( ( res ) => {
106+ expect ( res . statusCode ) . toBe ( 200 ) ;
107+ expect ( res . body ) . toBe ( "URL: //foo//bar" ) ;
108+ } ) ;
109+ } ) ;
110+
111+ it ( "handles root // requests (development)" , async ( ) => {
112+ let oldEnv = process . env . NODE_ENV ;
113+ process . env . NODE_ENV = "development" ;
114+
115+ mockedCreateRequestHandler . mockImplementation ( ( ) => async ( req ) => {
116+ return new Response ( `URL: ${ new URL ( req . url ) . pathname } ` ) ;
117+ } ) ;
118+
119+ // We don't have a real app to test, but it doesn't matter. We won't ever
120+ // call through to the real createRequestHandler
121+ // @ts -expect-error
122+ await lambdaTester ( createRequestHandler ( { build : undefined } ) )
123+ . event ( createMockEvent ( { path : "//" } ) )
124+ . expectResolve ( ( res ) => {
125+ expect ( res . statusCode ) . toBe ( 200 ) ;
126+ expect ( res . body ) . toBe ( "URL: //" ) ;
127+ } ) ;
128+
129+ process . env . NODE_ENV = oldEnv ;
130+ } ) ;
131+
132+ it ( "handles nested // requests (development)" , async ( ) => {
133+ let oldEnv = process . env . NODE_ENV ;
134+ process . env . NODE_ENV = "development" ;
135+
136+ mockedCreateRequestHandler . mockImplementation ( ( ) => async ( req ) => {
137+ return new Response ( `URL: ${ new URL ( req . url ) . pathname } ` ) ;
138+ } ) ;
139+
140+ // We don't have a real app to test, but it doesn't matter. We won't ever
141+ // call through to the real createRequestHandler
142+ // @ts -expect-error
143+ await lambdaTester ( createRequestHandler ( { build : undefined } ) )
144+ . event ( createMockEvent ( { path : "//foo//bar" } ) )
145+ . expectResolve ( ( res ) => {
146+ expect ( res . statusCode ) . toBe ( 200 ) ;
147+ expect ( res . body ) . toBe ( "URL: //foo//bar" ) ;
148+ } ) ;
149+
150+ process . env . NODE_ENV = oldEnv ;
151+ } ) ;
152+
77153 it ( "handles null body" , async ( ) => {
78154 mockedCreateRequestHandler . mockImplementation ( ( ) => async ( ) => {
79155 return new Response ( null , { status : 200 } ) ;
0 commit comments