@@ -40,12 +40,15 @@ describe("AutoApprovalHandler", () => {
4040 mockState . allowedMaxCost = 10
4141 const messages : ClineMessage [ ] = [ ]
4242
43- // First call should be under limit
43+ // First call should be under limit (count = 1)
4444 const result1 = await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
4545 expect ( result1 . shouldProceed ) . toBe ( true )
4646 expect ( result1 . requiresApproval ) . toBe ( false )
4747
48- // Second call should trigger request limit
48+ // Add a message to simulate first request completed
49+ messages . push ( { type : "say" , say : "api_req_started" , text : "{}" , ts : 1000 } )
50+
51+ // Second call should trigger request limit (1 message + current = 2 > 1)
4952 mockAskForApproval . mockResolvedValue ( { response : "yesButtonClicked" } )
5053 const result2 = await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
5154
@@ -64,27 +67,35 @@ describe("AutoApprovalHandler", () => {
6467 mockState . allowedMaxRequests = 3
6568 } )
6669
67- it ( "should increment request count on each check " , async ( ) => {
70+ it ( "should calculate request count from messages " , async ( ) => {
6871 const messages : ClineMessage [ ] = [ ]
6972
70- // Check state after each call
71- for ( let i = 1 ; i <= 3 ; i ++ ) {
72- await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
73- const state = handler . getApprovalState ( )
74- expect ( state . requestCount ) . toBe ( i )
75- }
73+ // First check - no messages yet, count should be 1 (for current request)
74+ await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
75+ let state = handler . getApprovalState ( )
76+ expect ( state . requestCount ) . toBe ( 1 )
77+
78+ // Add API request messages
79+ messages . push ( { type : "say" , say : "api_req_started" , text : "{}" , ts : 1000 } )
80+ await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
81+ state = handler . getApprovalState ( )
82+ expect ( state . requestCount ) . toBe ( 2 ) // 1 message + current request
83+
84+ messages . push ( { type : "say" , say : "api_req_started" , text : "{}" , ts : 2000 } )
85+ await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
86+ state = handler . getApprovalState ( )
87+ expect ( state . requestCount ) . toBe ( 3 ) // 2 messages + current request
7688 } )
7789
7890 it ( "should ask for approval when limit is exceeded" , async ( ) => {
7991 const messages : ClineMessage [ ] = [ ]
8092
81- // Make 3 requests (within limit )
93+ // Add 3 API request messages (to simulate 3 requests made )
8294 for ( let i = 0 ; i < 3 ; i ++ ) {
83- await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
95+ messages . push ( { type : "say" , say : "api_req_started" , text : "{}" , ts : 1000 + i } )
8496 }
85- expect ( mockAskForApproval ) . not . toHaveBeenCalled ( )
8697
87- // 4th request should trigger approval
98+ // Next check should trigger approval (3 messages + current = 4 > 3)
8899 mockAskForApproval . mockResolvedValue ( { response : "yesButtonClicked" } )
89100 const result = await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
90101
@@ -99,29 +110,35 @@ describe("AutoApprovalHandler", () => {
99110 it ( "should reset count when user approves" , async ( ) => {
100111 const messages : ClineMessage [ ] = [ ]
101112
102- // Exceed limit
113+ // Add messages to exceed limit
103114 for ( let i = 0 ; i < 3 ; i ++ ) {
104- await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
115+ messages . push ( { type : "say" , say : "api_req_started" , text : "{}" , ts : 1000 + i } )
105116 }
106117
107- // 4th request should trigger approval and reset
118+ // Next request should trigger approval and reset
108119 mockAskForApproval . mockResolvedValue ( { response : "yesButtonClicked" } )
109120 await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
110121
111- // Count should be reset
122+ // Add more messages after reset
123+ messages . push ( { type : "say" , say : "api_req_started" , text : "{}" , ts : 4000 } )
124+
125+ // Next check should only count messages after reset
126+ const result = await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
127+ expect ( result . requiresApproval ) . toBe ( false ) // Should not require approval (1 message + current = 2 <= 3)
128+
112129 const state = handler . getApprovalState ( )
113- expect ( state . requestCount ) . toBe ( 0 )
130+ expect ( state . requestCount ) . toBe ( 2 ) // 1 message after reset + current request
114131 } )
115132
116133 it ( "should not proceed when user rejects" , async ( ) => {
117134 const messages : ClineMessage [ ] = [ ]
118135
119- // Exceed limit
136+ // Add messages to exceed limit
120137 for ( let i = 0 ; i < 3 ; i ++ ) {
121- await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
138+ messages . push ( { type : "say" , say : "api_req_started" , text : "{}" , ts : 1000 + i } )
122139 }
123140
124- // 4th request with rejection
141+ // Next request with rejection
125142 mockAskForApproval . mockResolvedValue ( { response : "noButtonClicked" } )
126143 const result = await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
127144
@@ -255,16 +272,21 @@ describe("AutoApprovalHandler", () => {
255272
256273 mockGetApiMetrics . mockReturnValue ( { totalCost : 3.0 } )
257274
258- // First two requests should pass
259- for ( let i = 0 ; i < 2 ; i ++ ) {
260- const result = await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
261- expect ( result . shouldProceed ) . toBe ( true )
262- expect ( result . requiresApproval ) . toBe ( false )
263- }
275+ // First request should pass (count = 1)
276+ let result = await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
277+ expect ( result . shouldProceed ) . toBe ( true )
278+ expect ( result . requiresApproval ) . toBe ( false )
279+
280+ // Add a message and check again (count = 2)
281+ messages . push ( { type : "say" , say : "api_req_started" , text : "{}" , ts : 1000 } )
282+ result = await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
283+ expect ( result . shouldProceed ) . toBe ( true )
284+ expect ( result . requiresApproval ) . toBe ( false )
264285
265- // Third request should trigger request limit (not cost limit)
286+ // Add another message - third request should trigger request limit (count = 3 > 2)
287+ messages . push ( { type : "say" , say : "api_req_started" , text : "{}" , ts : 2000 } )
266288 mockAskForApproval . mockResolvedValue ( { response : "yesButtonClicked" } )
267- const result = await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
289+ result = await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
268290
269291 expect ( mockAskForApproval ) . toHaveBeenCalledWith (
270292 "auto_approval_max_req_reached" ,
@@ -277,23 +299,38 @@ describe("AutoApprovalHandler", () => {
277299 } )
278300
279301 describe ( "resetRequestCount" , ( ) => {
280- it ( "should reset the request counter " , async ( ) => {
302+ it ( "should reset tracking " , async ( ) => {
281303 mockState . allowedMaxRequests = 5
304+ mockState . allowedMaxCost = 10.0
282305 const messages : ClineMessage [ ] = [ ]
283306
284- // Make some requests
307+ // Add some messages
285308 for ( let i = 0 ; i < 3 ; i ++ ) {
286- await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
309+ messages . push ( { type : "say" , say : "api_req_started" , text : "{}" , ts : 1000 + i } )
287310 }
288311
312+ mockGetApiMetrics . mockReturnValue ( { totalCost : 5.0 } )
313+ await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
314+
289315 let state = handler . getApprovalState ( )
290- expect ( state . requestCount ) . toBe ( 3 )
316+ expect ( state . requestCount ) . toBe ( 4 ) // 3 messages + current
317+ expect ( state . currentCost ) . toBe ( 5.0 )
291318
292319 // Reset
293320 handler . resetRequestCount ( )
294321
322+ // After reset, counts should be zero
295323 state = handler . getApprovalState ( )
296324 expect ( state . requestCount ) . toBe ( 0 )
325+ expect ( state . currentCost ) . toBe ( 0 )
326+
327+ // Next check should start fresh
328+ mockGetApiMetrics . mockReturnValue ( { totalCost : 8.0 } )
329+ await handler . checkAutoApprovalLimits ( mockState , messages , mockAskForApproval )
330+
331+ state = handler . getApprovalState ( )
332+ expect ( state . requestCount ) . toBe ( 4 ) // All messages counted again
333+ expect ( state . currentCost ) . toBe ( 8.0 )
297334 } )
298335 } )
299336} )
0 commit comments