@@ -114,4 +114,145 @@ describe(APIClient.name, () => {
114114 expect ( client . fetch ( "/path" ) ) . rejects . toThrow ( "Bad request" ) ;
115115 } ) ;
116116 } ) ;
117+
118+ describe ( "Instance Interceptor" , ( ) => {
119+ test ( "can attach before interceptor to instance" , async ( ) => {
120+ let randomValue = crypto . randomUUID ( ) ;
121+
122+ let client = new APIClient ( new URL ( "https://example.com" ) ) ;
123+
124+ client . on ( "before" , async ( request ) => {
125+ request . headers . set ( "X-Custom" , randomValue ) ;
126+ return request ;
127+ } ) ;
128+
129+ server . resetHandlers (
130+ http . all ( "https://example.com/path" , ( { request } ) => {
131+ return HttpResponse . text ( request . headers . get ( "X-Custom" ) ) ;
132+ } ) ,
133+ ) ;
134+
135+ let response = await client . get ( "/path" ) ;
136+ expect ( await response . text ( ) ) . toBe ( randomValue ) ;
137+ } ) ;
138+
139+ test ( "can attach after interceptor to instance" , async ( ) => {
140+ let client = new APIClient ( new URL ( "https://example.com" ) ) ;
141+
142+ client . on ( "after" , async ( _ , response ) => {
143+ if ( response . status === 400 ) throw new Error ( "Bad request" ) ;
144+ return response ;
145+ } ) ;
146+
147+ server . resetHandlers (
148+ http . all ( "https://example.com/path" , ( ) => {
149+ return HttpResponse . text ( "Bad request" , { status : 400 } ) ;
150+ } ) ,
151+ ) ;
152+
153+ expect ( client . fetch ( "/path" ) ) . rejects . toThrow ( "Bad request" ) ;
154+ } ) ;
155+
156+ test ( "can attach multiple before interceptors to instance" , async ( ) => {
157+ let client = new APIClient ( new URL ( "https://example.com" ) ) ;
158+
159+ client . on ( "before" , async ( request ) => {
160+ request . headers . set ( "X-Custom" , "First" ) ;
161+ return request ;
162+ } ) ;
163+
164+ client . on ( "before" , async ( request ) => {
165+ request . headers . set ( "X-Custom" , "Second" ) ;
166+ return request ;
167+ } ) ;
168+
169+ server . resetHandlers (
170+ http . all ( "https://example.com/path" , ( { request } ) => {
171+ return HttpResponse . text ( request . headers . get ( "X-Custom" ) ) ;
172+ } ) ,
173+ ) ;
174+
175+ let response = await client . get ( "/path" ) ;
176+ expect ( await response . text ( ) ) . toBe ( "Second" ) ;
177+ } ) ;
178+
179+ test ( "can attach multiple after interceptors to instance" , async ( ) => {
180+ let client = new APIClient ( new URL ( "https://example.com" ) ) ;
181+
182+ client . on ( "after" , async ( _ , response ) => {
183+ if ( response . status === 400 ) throw new Error ( "Bad request" ) ;
184+ return response ;
185+ } ) ;
186+
187+ client . on ( "after" , async ( _ , response ) => {
188+ if ( response . status === 401 ) throw new Error ( "Unauthorized" ) ;
189+ return response ;
190+ } ) ;
191+
192+ server . resetHandlers (
193+ http . all ( "https://example.com/path" , ( ) => {
194+ return HttpResponse . text ( "Unauthorized" , { status : 401 } ) ;
195+ } ) ,
196+ ) ;
197+
198+ expect ( client . fetch ( "/path" ) ) . rejects . toThrow ( "Unauthorized" ) ;
199+ } ) ;
200+
201+ test ( "sub-class before interceptos runs before instance interceptors" , async ( ) => {
202+ class CustomClient extends APIClient {
203+ constructor ( ) {
204+ super ( new URL ( "https://example.com" ) ) ;
205+ }
206+
207+ async before ( request : Request ) {
208+ request . headers . set ( "X-Custom" , "Sub-Class" ) ;
209+ return request ;
210+ }
211+ }
212+
213+ let client = new CustomClient ( ) ;
214+
215+ client . on ( "before" , async ( request ) => {
216+ request . headers . set ( "X-Custom" , "Instance" ) ;
217+ return request ;
218+ } ) ;
219+
220+ server . resetHandlers (
221+ http . all ( "https://example.com/path" , ( { request } ) => {
222+ return HttpResponse . text ( request . headers . get ( "X-Custom" ) ) ;
223+ } ) ,
224+ ) ;
225+
226+ let response = await client . get ( "/path" ) ;
227+ expect ( await response . text ( ) ) . toBe ( "Instance" ) ;
228+ } ) ;
229+
230+ test ( "sub-class after interceptos runs before instance interceptors" , async ( ) => {
231+ class CustomClient extends APIClient {
232+ constructor ( ) {
233+ super ( new URL ( "https://example.com" ) ) ;
234+ }
235+
236+ async after ( _ : Request , response : Response ) {
237+ if ( response . status === 400 ) throw new Error ( "Bad request" ) ;
238+ return response ;
239+ }
240+ }
241+
242+ let client = new CustomClient ( ) ;
243+
244+ client . on ( "after" , async ( _ , response ) => {
245+ if ( response . status === 400 ) throw new TypeError ( "Bad request" ) ;
246+ return response ;
247+ } ) ;
248+
249+ server . resetHandlers (
250+ http . all ( "https://example.com/path" , ( ) => {
251+ return HttpResponse . text ( "Bad request" , { status : 400 } ) ;
252+ } ) ,
253+ ) ;
254+
255+ expect ( client . fetch ( "/path" ) ) . rejects . toThrow ( Error ) ;
256+ } ) ;
257+ } ) ;
117258} ) ;
0 commit comments