@@ -505,3 +505,118 @@ test("skips onResponse handlers when response is returned from onRequest", async
505505
506506  expect ( onResponseCalled ) . toBe ( false ) ; 
507507} ) ; 
508+ 
509+ test ( 'it should enable a middleware to be added via the "middleware" request option' ,  async  ( )  =>  { 
510+   let  actualRequest  =  new  Request ( "https://nottherealurl.fake" ) ; 
511+   const  client  =  createObservedClient < paths > ( { } ,  async  ( req )  =>  { 
512+     actualRequest  =  new  Request ( req ) ; 
513+     return  Response . json ( { } ) ; 
514+   } ) ; 
515+ 
516+   await  client . GET ( "/posts/{id}" ,  { 
517+     params : {  path : {  id : 123  }  } , 
518+     middleware : [ 
519+       { 
520+         async  onRequest ( {  request } )  { 
521+           return  new  Request ( "https://foo.bar/api/v1" ,  { 
522+             ...request , 
523+             method : "OPTIONS" , 
524+             headers : {  foo : "bar"  } , 
525+           } ) ; 
526+         } , 
527+       } , 
528+     ] , 
529+   } ) ; 
530+ 
531+   expect ( actualRequest . url ) . toBe ( "https://foo.bar/api/v1" ) ; 
532+   expect ( actualRequest . method ) . toBe ( "OPTIONS" ) ; 
533+   expect ( actualRequest . headers . get ( "foo" ) ) . toBe ( "bar" ) ; 
534+ } ) ; 
535+ 
536+ test ( "add middleware at the request level" ,  async  ( )  =>  { 
537+   let  actualRequest  =  new  Request ( "https://nottherealurl.fake" ) ; 
538+   const  client  =  createObservedClient < paths > ( { } ,  async  ( req )  =>  { 
539+     actualRequest  =  new  Request ( req ) ; 
540+     return  Response . json ( { } ) ; 
541+   } ) ; 
542+ 
543+   await  client . GET ( "/posts/{id}" ,  { 
544+     params : {  path : {  id : 123  }  } , 
545+     middleware : [ 
546+       { 
547+         async  onRequest ( {  request } )  { 
548+           return  new  Request ( "https://foo.bar/api/v1" ,  { 
549+             ...request , 
550+             method : "OPTIONS" , 
551+             headers : {  foo : "bar"  } , 
552+           } ) ; 
553+         } , 
554+       } , 
555+     ] , 
556+   } ) ; 
557+ 
558+   expect ( actualRequest . url ) . toBe ( "https://foo.bar/api/v1" ) ; 
559+   expect ( actualRequest . method ) . toBe ( "OPTIONS" ) ; 
560+   expect ( actualRequest . headers . get ( "foo" ) ) . toBe ( "bar" ) ; 
561+ } ) ; 
562+ 
563+ test ( "executes a middleware at the client and request request level in the correct orders" ,  async  ( )  =>  { 
564+   let  actualRequest  =  new  Request ( "https://nottherealurl.fake" ) ; 
565+   const  client  =  createObservedClient < paths > ( { } ,  async  ( req )  =>  { 
566+     actualRequest  =  new  Request ( req ) ; 
567+     return  Response . json ( { } ) ; 
568+   } ) ; 
569+   // this middleware passes along the “step” header 
570+   // for both requests and responses, but first checks if 
571+   // it received the end result of the previous middleware step 
572+   client . use ( 
573+     { 
574+       async  onRequest ( {  request } )  { 
575+         request . headers . set ( "step" ,  "A" ) ; 
576+         return  request ; 
577+       } , 
578+       async  onResponse ( {  response } )  { 
579+         if  ( response . headers . get ( "step" )  ===  "B" )  { 
580+           const  headers  =  new  Headers ( response . headers ) ; 
581+           headers . set ( "step" ,  "A" ) ; 
582+           return  new  Response ( response . body ,  {  ...response ,  headers } ) ; 
583+         } 
584+       } , 
585+     } , 
586+     { 
587+       async  onRequest ( {  request } )  { 
588+         request . headers . set ( "step" ,  "B" ) ; 
589+         return  request ; 
590+       } , 
591+       async  onResponse ( {  response } )  { 
592+         const  headers  =  new  Headers ( response . headers ) ; 
593+         headers . set ( "step" ,  "B" ) ; 
594+         if  ( response . headers . get ( "step" )  ===  "C" )  { 
595+           return  new  Response ( response . body ,  {  ...response ,  headers } ) ; 
596+         } 
597+       } , 
598+     } , 
599+   ) ; 
600+ 
601+   const  {  response }  =  await  client . GET ( "/posts/{id}" ,  { 
602+     params : {  path : {  id : 123  }  } , 
603+     middleware : [ 
604+       { 
605+         onRequest ( {  request } )  { 
606+           request . headers . set ( "step" ,  "C" ) ; 
607+           return  request ; 
608+         } , 
609+         onResponse ( {  response } )  { 
610+           response . headers . set ( "step" ,  "C" ) ; 
611+           return  response ; 
612+         } , 
613+       } , 
614+     ] , 
615+   } ) ; 
616+ 
617+   // assert requests ended up on step C (array order) 
618+   expect ( actualRequest . headers . get ( "step" ) ) . toBe ( "C" ) ; 
619+ 
620+   // assert responses ended up on step A (reverse order) 
621+   expect ( response . headers . get ( "step" ) ) . toBe ( "A" ) ; 
622+ } ) ; 
0 commit comments