@@ -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