@@ -14,36 +14,66 @@ tag.id = Math.floor(Math.random() * 100000)
1414let pet : petstore . Pet ;
1515function overridePetIDMiddleware ( id : number ) : Middleware {
1616 return {
17- pre : ( c : RequestContext ) => {
18- return new Promise ( ( resolve ) => {
19- const segments = c . getUrl ( ) . split ( '/' )
20- segments [ segments . length - 1 ] = id . toString ( )
21- const newURL = segments . join ( '/' )
22- c . setUrl ( newURL )
23- resolve ( c )
24- } )
17+ pre : async ( c : RequestContext ) => {
18+ const segments = c . getUrl ( ) . split ( '/' )
19+ segments [ segments . length - 1 ] = id . toString ( )
20+ const newURL = segments . join ( '/' )
21+ c . setUrl ( newURL )
22+ return c
2523 } ,
26- post : ( c : ResponseContext ) => {
27- return new Promise < ResponseContext > ( ( resolve ) => {
28- resolve ( c )
29- } )
24+ post : async ( c : ResponseContext ) => {
25+ return c
3026 } ,
3127 }
3228}
3329
34- function NoopMiddleware ( onPre : ( ) => void , onPost : ( ) => void ) : Middleware {
30+ function noopMiddleware ( onPre : ( ) => void , onPost : ( ) => void ) : Middleware {
3531 return {
36- pre : ( c : RequestContext ) => {
37- return new Promise ( ( resolve ) => {
38- onPre ( )
39- resolve ( c )
40- } )
32+ pre : async ( c : RequestContext ) => {
33+ onPre ( )
34+ return c
35+ } ,
36+ post : async ( c : ResponseContext ) => {
37+ onPost ( )
38+ return c
4139 } ,
42- post : ( c : ResponseContext ) => {
40+ }
41+ }
42+
43+ /**
44+ * Middleware that adds an abort signal to the request context.
45+ * This can be used to abort requests using an AbortController.
46+ * @param signal AbortSignal to use for the request
47+ * @returns Middleware that sets the signal in the request context
48+ */
49+ function abortSignalMiddleware ( signal : AbortSignal ) : Middleware {
50+ return {
51+ pre : async ( c : RequestContext ) => {
52+ c . setSignal ( signal )
53+ return c
54+ } ,
55+ post : async ( c : ResponseContext ) => {
56+ return c
57+ } ,
58+ }
59+ }
60+
61+ /**
62+ * Middleware that delays the request/response by a specified amount of time.
63+ * @param delay in milliseconds
64+ * @returns Middleware that delays the request/response
65+ */
66+ function delayMiddleware ( delay : number ) : Middleware {
67+ return {
68+ pre : async ( c : RequestContext ) => {
69+ return new Promise < RequestContext > ( ( resolve ) => {
70+ setTimeout ( ( ) => resolve ( c ) , delay ) ;
71+ } ) ;
72+ } ,
73+ post : async ( c : ResponseContext ) => {
4374 return new Promise < ResponseContext > ( ( resolve ) => {
44- onPost ( )
45- resolve ( c )
46- } )
75+ setTimeout ( ( ) => resolve ( c ) , delay ) ;
76+ } ) ;
4777 } ,
4878 }
4979}
@@ -52,8 +82,8 @@ function MiddlewareCallTracker() {
5282 let CallOrder = [ ] as string [ ]
5383 return {
5484 CallOrder,
55- BaseMiddleware : NoopMiddleware ( ( ) => CallOrder . push ( 'base-pre' ) , ( ) => CallOrder . push ( 'base-post' ) ) ,
56- CalltimeMiddleware : NoopMiddleware ( ( ) => CallOrder . push ( 'call-pre' ) , ( ) => CallOrder . push ( 'call-post' ) )
85+ BaseMiddleware : noopMiddleware ( ( ) => CallOrder . push ( 'base-pre' ) , ( ) => CallOrder . push ( 'base-post' ) ) ,
86+ CalltimeMiddleware : noopMiddleware ( ( ) => CallOrder . push ( 'call-pre' ) , ( ) => CallOrder . push ( 'call-post' ) )
5787 }
5888}
5989
@@ -74,88 +104,127 @@ describe("PetApi", () => {
74104 expect ( createdPet ) . to . deep . equal ( pet ) ;
75105 } )
76106
77- it ( "addPetViaMiddleware" , async ( ) => {
78- const wrongId = pet . id + 1
79- const createdPet = await petApi . getPetById ( wrongId , { middleware : [ overridePetIDMiddleware ( pet . id ) ] } )
80- expect ( createdPet ) . to . deep . equal ( pet ) ;
81- } )
82-
83- it ( "appendMiddleware petid" , async ( ) => {
84- const wrongId = pet . id + 100
85- const configuration = petstore . createConfiguration ( { promiseMiddleware : [ overridePetIDMiddleware ( wrongId ) ] } )
86- const petApi = new petstore . PetApi ( configuration )
87- try {
88- void await petApi . getPetById ( pet . id )
89- } catch ( err ) {
90- expect ( err . code ) . to . equal ( 404 ) ;
91- expect ( err . message ) . to . include ( "Pet not found" ) ;
92- }
93- const callTimeAppendedRightPet = await petApi . getPetById ( wrongId , { middleware : [ overridePetIDMiddleware ( pet . id ) ] , middlewareMergeStrategy : 'append' } )
94- expect ( callTimeAppendedRightPet ) . to . deep . equal ( pet ) ;
95- } )
96-
97- it ( "should keep middleware when no options are given" , async ( ) => {
98- let { CallOrder, BaseMiddleware, CalltimeMiddleware } = MiddlewareCallTracker ( )
99- const configuration = petstore . createConfiguration ( { promiseMiddleware : [ BaseMiddleware ] } ) ;
100- const petApi = new petstore . PetApi ( configuration ) ;
101- const callTimeAppendedRightPet = await petApi . getPetById ( pet . id ) ;
102- expect ( callTimeAppendedRightPet ) . to . deep . equal ( pet ) ;
103- expect ( CallOrder ) . deep . equal ( [ 'base-pre' , 'base-post' ] )
104- } )
105-
106- it ( "should keep middleware when options are given without middleware" , async ( ) => {
107- let { CallOrder, BaseMiddleware, CalltimeMiddleware } = MiddlewareCallTracker ( )
108- const configuration = petstore . createConfiguration ( { promiseMiddleware : [ BaseMiddleware ] } ) ;
109- const petApi = new petstore . PetApi ( configuration ) ;
110- const callTimeAppendedRightPet = await petApi . getPetById ( pet . id , { } ) ;
111- expect ( callTimeAppendedRightPet ) . to . deep . equal ( pet ) ;
112- expect ( CallOrder ) . deep . equal ( [ 'base-pre' , 'base-post' ] )
113- } )
114-
115- it ( "should replace middleware when options contain an empty array of middlewares" , async ( ) => {
116- let { CallOrder, BaseMiddleware, CalltimeMiddleware } = MiddlewareCallTracker ( )
117- const configuration = petstore . createConfiguration ( { promiseMiddleware : [ BaseMiddleware ] } ) ;
118- const petApi = new petstore . PetApi ( configuration ) ;
119- const callTimeAppendedRightPet = await petApi . getPetById ( pet . id , { middleware : [ ] } ) ;
120- expect ( callTimeAppendedRightPet ) . to . deep . equal ( pet ) ;
121- expect ( CallOrder ) . deep . equal ( [ ] )
122- } )
123-
124- it ( "replace Middleware call order" , async ( ) => {
125- let { CallOrder, BaseMiddleware, CalltimeMiddleware } = MiddlewareCallTracker ( )
126- const configuration = petstore . createConfiguration ( { promiseMiddleware : [ BaseMiddleware ] } )
127- const petApi = new petstore . PetApi ( configuration )
128- const callTimeAppendedRightPet = await petApi . getPetById ( pet . id , { middleware : [ CalltimeMiddleware ] } )
129- expect ( callTimeAppendedRightPet ) . to . deep . equal ( pet ) ;
130- expect ( CallOrder ) . deep . equal ( [ 'call-pre' , 'call-post' ] )
131- } )
132-
133- it ( "prepend Middleware call order" , async ( ) => {
134- let { CallOrder, BaseMiddleware, CalltimeMiddleware } = MiddlewareCallTracker ( )
135- const configuration = petstore . createConfiguration ( { promiseMiddleware : [ BaseMiddleware ] } )
136- const petApi = new petstore . PetApi ( configuration )
137- const callTimeAppendedRightPet = await petApi . getPetById ( pet . id , { middleware : [ CalltimeMiddleware ] , middlewareMergeStrategy : 'prepend' } )
138- expect ( callTimeAppendedRightPet ) . to . deep . equal ( pet ) ;
139- expect ( CallOrder ) . deep . equal ( [ 'call-pre' , 'base-pre' , 'base-post' , 'call-post' ] )
140- } )
141-
142-
143- it ( "append Middleware call order" , async ( ) => {
144- let { CallOrder, BaseMiddleware, CalltimeMiddleware } = MiddlewareCallTracker ( )
145- const configuration = petstore . createConfiguration ( { promiseMiddleware : [ BaseMiddleware ] } )
146- const petApi = new petstore . PetApi ( configuration )
147- const callTimeAppendedRightPet = await petApi . getPetById ( pet . id , { middleware : [ CalltimeMiddleware ] , middlewareMergeStrategy : 'append' } )
148- expect ( callTimeAppendedRightPet ) . to . deep . equal ( pet ) ;
149- expect ( CallOrder ) . deep . equal ( [ 'base-pre' , 'call-pre' , 'call-post' , 'base-post' ] )
107+ describe ( "Middeware" , ( ) => {
108+
109+ it ( "addPetViaMiddleware" , async ( ) => {
110+ const wrongId = pet . id + 1
111+ const createdPet = await petApi . getPetById ( wrongId , { middleware : [ overridePetIDMiddleware ( pet . id ) ] } )
112+ expect ( createdPet ) . to . deep . equal ( pet ) ;
113+ } )
114+
115+ it ( "appendMiddleware petid" , async ( ) => {
116+ const wrongId = pet . id + 100
117+ const configuration = petstore . createConfiguration ( { promiseMiddleware : [ overridePetIDMiddleware ( wrongId ) ] } )
118+ const petApi = new petstore . PetApi ( configuration )
119+ try {
120+ void await petApi . getPetById ( pet . id )
121+ } catch ( err ) {
122+ expect ( err . code ) . to . equal ( 404 ) ;
123+ expect ( err . message ) . to . include ( "Pet not found" ) ;
124+ }
125+ const callTimeAppendedRightPet = await petApi . getPetById ( wrongId , { middleware : [ overridePetIDMiddleware ( pet . id ) ] , middlewareMergeStrategy : 'append' } )
126+ expect ( callTimeAppendedRightPet ) . to . deep . equal ( pet ) ;
127+ } )
128+
129+ it ( "should keep middleware when no options are given" , async ( ) => {
130+ let { CallOrder, BaseMiddleware, CalltimeMiddleware } = MiddlewareCallTracker ( )
131+ const configuration = petstore . createConfiguration ( { promiseMiddleware : [ BaseMiddleware ] } ) ;
132+ const petApi = new petstore . PetApi ( configuration ) ;
133+ const callTimeAppendedRightPet = await petApi . getPetById ( pet . id ) ;
134+ expect ( callTimeAppendedRightPet ) . to . deep . equal ( pet ) ;
135+ expect ( CallOrder ) . deep . equal ( [ 'base-pre' , 'base-post' ] )
136+ } )
137+
138+ it ( "should keep middleware when options are given without middleware" , async ( ) => {
139+ let { CallOrder, BaseMiddleware, CalltimeMiddleware } = MiddlewareCallTracker ( )
140+ const configuration = petstore . createConfiguration ( { promiseMiddleware : [ BaseMiddleware ] } ) ;
141+ const petApi = new petstore . PetApi ( configuration ) ;
142+ const callTimeAppendedRightPet = await petApi . getPetById ( pet . id , { } ) ;
143+ expect ( callTimeAppendedRightPet ) . to . deep . equal ( pet ) ;
144+ expect ( CallOrder ) . deep . equal ( [ 'base-pre' , 'base-post' ] )
145+ } )
146+
147+ it ( "should replace middleware when options contain an empty array of middlewares" , async ( ) => {
148+ let { CallOrder, BaseMiddleware, CalltimeMiddleware } = MiddlewareCallTracker ( )
149+ const configuration = petstore . createConfiguration ( { promiseMiddleware : [ BaseMiddleware ] } ) ;
150+ const petApi = new petstore . PetApi ( configuration ) ;
151+ const callTimeAppendedRightPet = await petApi . getPetById ( pet . id , { middleware : [ ] } ) ;
152+ expect ( callTimeAppendedRightPet ) . to . deep . equal ( pet ) ;
153+ expect ( CallOrder ) . deep . equal ( [ ] )
154+ } )
155+
156+ it ( "replace Middleware call order" , async ( ) => {
157+ let { CallOrder, BaseMiddleware, CalltimeMiddleware } = MiddlewareCallTracker ( )
158+ const configuration = petstore . createConfiguration ( { promiseMiddleware : [ BaseMiddleware ] } )
159+ const petApi = new petstore . PetApi ( configuration )
160+ const callTimeAppendedRightPet = await petApi . getPetById ( pet . id , { middleware : [ CalltimeMiddleware ] } )
161+ expect ( callTimeAppendedRightPet ) . to . deep . equal ( pet ) ;
162+ expect ( CallOrder ) . deep . equal ( [ 'call-pre' , 'call-post' ] )
163+ } )
164+
165+ it ( "prepend Middleware call order" , async ( ) => {
166+ let { CallOrder, BaseMiddleware, CalltimeMiddleware } = MiddlewareCallTracker ( )
167+ const configuration = petstore . createConfiguration ( { promiseMiddleware : [ BaseMiddleware ] } )
168+ const petApi = new petstore . PetApi ( configuration )
169+ const callTimeAppendedRightPet = await petApi . getPetById ( pet . id , { middleware : [ CalltimeMiddleware ] , middlewareMergeStrategy : 'prepend' } )
170+ expect ( callTimeAppendedRightPet ) . to . deep . equal ( pet ) ;
171+ expect ( CallOrder ) . deep . equal ( [ 'call-pre' , 'base-pre' , 'base-post' , 'call-post' ] )
172+ } )
173+
174+
175+ it ( "append Middleware call order" , async ( ) => {
176+ let { CallOrder, BaseMiddleware, CalltimeMiddleware } = MiddlewareCallTracker ( )
177+ const configuration = petstore . createConfiguration ( { promiseMiddleware : [ BaseMiddleware ] } )
178+ const petApi = new petstore . PetApi ( configuration )
179+ const callTimeAppendedRightPet = await petApi . getPetById ( pet . id , { middleware : [ CalltimeMiddleware ] , middlewareMergeStrategy : 'append' } )
180+ expect ( callTimeAppendedRightPet ) . to . deep . equal ( pet ) ;
181+ expect ( CallOrder ) . deep . equal ( [ 'base-pre' , 'call-pre' , 'call-post' , 'base-post' ] )
182+ } )
183+
184+
185+ it ( "prependMiddleware pet id" , async ( ) => {
186+ const wrongId = pet . id + 100
187+ const configuration = petstore . createConfiguration ( { promiseMiddleware : [ overridePetIDMiddleware ( pet . id ) ] } )
188+ const petApi = new petstore . PetApi ( configuration )
189+ const callTimeAppendedRightPet = await petApi . getPetById ( wrongId , { middleware : [ overridePetIDMiddleware ( wrongId ) ] , middlewareMergeStrategy : 'prepend' } )
190+ expect ( callTimeAppendedRightPet ) . to . deep . equal ( pet ) ;
191+ } )
150192 } )
151193
152-
153- it ( "prependMiddleware pet id" , async ( ) => {
154- const wrongId = pet . id + 100
155- const configuration = petstore . createConfiguration ( { promiseMiddleware : [ overridePetIDMiddleware ( pet . id ) ] } )
156- const petApi = new petstore . PetApi ( configuration )
157- const callTimeAppendedRightPet = await petApi . getPetById ( wrongId , { middleware : [ overridePetIDMiddleware ( wrongId ) ] , middlewareMergeStrategy : 'prepend' } )
158- expect ( callTimeAppendedRightPet ) . to . deep . equal ( pet ) ;
194+ describe ( "AbortController" , ( ) => {
195+ it ( "fails on invalid requests" , async ( ) => {
196+ const controller = new AbortController ( ) ;
197+ const abortMiddleware = abortSignalMiddleware ( controller . signal ) ;
198+ const wrongId = pet . id + 1
199+ try {
200+ await petApi . getPetById ( wrongId , { middleware : [ abortMiddleware ] } )
201+ } catch ( err ) {
202+ expect ( err . code ) . to . equal ( 404 ) ;
203+ }
204+ } )
205+ it ( "succeeds on valid requests" , async ( ) => {
206+ const controller = new AbortController ( ) ;
207+ const abortMiddleware = abortSignalMiddleware ( controller . signal ) ;
208+ const createdPet = await petApi . getPetById ( pet . id , { middleware : [ abortMiddleware ] } )
209+ expect ( createdPet ) . to . deep . equal ( pet ) ;
210+ } )
211+ it ( "aborts request" , async ( ) => {
212+ const signal = AbortSignal . timeout ( 10 ) ; // Set a timeout to ensure the request is aborted
213+ const abortMiddleware = abortSignalMiddleware ( signal ) ;
214+ try {
215+ await petApi . getPetById ( pet . id , { middleware : [ abortMiddleware , delayMiddleware ( 20 ) ] } )
216+ } catch ( err ) {
217+ expect ( err . name ) . to . equal ( "AbortError" ) ;
218+ return ;
219+ }
220+ throw new Error ( "Request was not aborted!" ) ;
221+ } )
222+ it ( "ignores abort after response" , async ( ) => {
223+ const signal = AbortSignal . timeout ( 20 ) ; // Set a timeout to ensure the request is aborted
224+ const abortMiddleware = abortSignalMiddleware ( signal ) ;
225+ const createdPet = await petApi . getPetById ( pet . id , { middleware : [ abortMiddleware , delayMiddleware ( 10 ) ] } )
226+ expect ( createdPet ) . to . deep . equal ( pet ) ;
227+ } )
159228 } )
160229
161230 it ( "should override http api from option" , async ( ) => {
0 commit comments