@@ -1116,5 +1116,49 @@ describe('MCP Tool Execution', () => {
11161116 expect ( global . fetch ) . toHaveBeenCalledTimes ( 2 )
11171117 expect ( result . success ) . toBe ( true )
11181118 } )
1119+
1120+ it ( 'skips retry when Retry-After header exceeds maxDelayMs' , async ( ) => {
1121+ global . fetch = Object . assign (
1122+ vi
1123+ . fn ( )
1124+ . mockResolvedValueOnce (
1125+ makeJsonResponse ( 429 , { error : 'rate limited' } , { 'retry-after' : '60' } )
1126+ )
1127+ . mockResolvedValueOnce ( makeJsonResponse ( 200 , { ok : true } ) ) ,
1128+ { preconnect : vi . fn ( ) }
1129+ ) as typeof fetch
1130+
1131+ const result = await executeTool ( 'http_request' , {
1132+ url : '/api/test' ,
1133+ method : 'GET' ,
1134+ retries : 3 ,
1135+ retryMaxDelayMs : 5000 ,
1136+ } )
1137+
1138+ expect ( global . fetch ) . toHaveBeenCalledTimes ( 1 )
1139+ expect ( result . success ) . toBe ( false )
1140+ } )
1141+
1142+ it ( 'retries when Retry-After header is within maxDelayMs' , async ( ) => {
1143+ global . fetch = Object . assign (
1144+ vi
1145+ . fn ( )
1146+ . mockResolvedValueOnce (
1147+ makeJsonResponse ( 429 , { error : 'rate limited' } , { 'retry-after' : '1' } )
1148+ )
1149+ . mockResolvedValueOnce ( makeJsonResponse ( 200 , { ok : true } ) ) ,
1150+ { preconnect : vi . fn ( ) }
1151+ ) as typeof fetch
1152+
1153+ const result = await executeTool ( 'http_request' , {
1154+ url : '/api/test' ,
1155+ method : 'GET' ,
1156+ retries : 2 ,
1157+ retryMaxDelayMs : 5000 ,
1158+ } )
1159+
1160+ expect ( global . fetch ) . toHaveBeenCalledTimes ( 2 )
1161+ expect ( result . success ) . toBe ( true )
1162+ } )
11191163 } )
11201164} )
0 commit comments