@@ -23,6 +23,7 @@ import { HttpService } from '../http_service';
2323import { contextServiceMock } from '../../context/context_service.mock' ;
2424import { loggingSystemMock } from '../../logging/logging_system.mock' ;
2525import { createHttpServer } from '../test_utils' ;
26+ import { schema } from '@kbn/config-schema' ;
2627
2728let server : HttpService ;
2829
@@ -195,6 +196,96 @@ describe('KibanaRequest', () => {
195196 expect ( nextSpy ) . toHaveBeenCalledTimes ( 0 ) ;
196197 expect ( completeSpy ) . toHaveBeenCalledTimes ( 1 ) ;
197198 } ) ;
199+
200+ it ( 'does not complete before response has been sent' , async ( ) => {
201+ const { server : innerServer , createRouter, registerOnPreAuth } = await server . setup (
202+ setupDeps
203+ ) ;
204+ const router = createRouter ( '/' ) ;
205+
206+ const nextSpy = jest . fn ( ) ;
207+ const completeSpy = jest . fn ( ) ;
208+
209+ registerOnPreAuth ( ( req , res , toolkit ) => {
210+ req . events . aborted$ . subscribe ( {
211+ next : nextSpy ,
212+ complete : completeSpy ,
213+ } ) ;
214+ return toolkit . next ( ) ;
215+ } ) ;
216+
217+ router . post (
218+ { path : '/' , validate : { body : schema . any ( ) } } ,
219+ async ( context , request , res ) => {
220+ expect ( completeSpy ) . not . toHaveBeenCalled ( ) ;
221+ return res . ok ( { body : 'ok' } ) ;
222+ }
223+ ) ;
224+
225+ await server . start ( ) ;
226+
227+ await supertest ( innerServer . listener ) . post ( '/' ) . send ( { data : 'test' } ) . expect ( 200 ) ;
228+
229+ expect ( nextSpy ) . toHaveBeenCalledTimes ( 0 ) ;
230+ expect ( completeSpy ) . toHaveBeenCalledTimes ( 1 ) ;
231+ } ) ;
232+ } ) ;
233+
234+ describe ( 'completed$' , ( ) => {
235+ it ( 'emits once and completes when response is sent' , async ( ) => {
236+ const { server : innerServer , createRouter } = await server . setup ( setupDeps ) ;
237+ const router = createRouter ( '/' ) ;
238+
239+ const nextSpy = jest . fn ( ) ;
240+ const completeSpy = jest . fn ( ) ;
241+
242+ router . get ( { path : '/' , validate : false } , async ( context , req , res ) => {
243+ req . events . completed$ . subscribe ( {
244+ next : nextSpy ,
245+ complete : completeSpy ,
246+ } ) ;
247+
248+ expect ( nextSpy ) . not . toHaveBeenCalled ( ) ;
249+ expect ( completeSpy ) . not . toHaveBeenCalled ( ) ;
250+ return res . ok ( { body : 'ok' } ) ;
251+ } ) ;
252+
253+ await server . start ( ) ;
254+
255+ await supertest ( innerServer . listener ) . get ( '/' ) . expect ( 200 ) ;
256+ expect ( nextSpy ) . toHaveBeenCalledTimes ( 1 ) ;
257+ expect ( completeSpy ) . toHaveBeenCalledTimes ( 1 ) ;
258+ } ) ;
259+
260+ it ( 'emits once and completes when response is aborted' , async ( done ) => {
261+ expect . assertions ( 2 ) ;
262+ const { server : innerServer , createRouter } = await server . setup ( setupDeps ) ;
263+ const router = createRouter ( '/' ) ;
264+
265+ const nextSpy = jest . fn ( ) ;
266+
267+ router . get ( { path : '/' , validate : false } , async ( context , req , res ) => {
268+ req . events . completed$ . subscribe ( {
269+ next : nextSpy ,
270+ complete : ( ) => {
271+ expect ( nextSpy ) . toHaveBeenCalledTimes ( 1 ) ;
272+ done ( ) ;
273+ } ,
274+ } ) ;
275+
276+ expect ( nextSpy ) . not . toHaveBeenCalled ( ) ;
277+ await delay ( 30000 ) ;
278+ return res . ok ( { body : 'ok' } ) ;
279+ } ) ;
280+
281+ await server . start ( ) ;
282+
283+ const incomingRequest = supertest ( innerServer . listener )
284+ . get ( '/' )
285+ // end required to send request
286+ . end ( ) ;
287+ setTimeout ( ( ) => incomingRequest . abort ( ) , 50 ) ;
288+ } ) ;
198289 } ) ;
199290 } ) ;
200291} ) ;
0 commit comments