@@ -8,10 +8,7 @@ import {
88 isFreebuffDeploymentHours ,
99} from '@codebuff/common/constants/freebuff-models'
1010import { formatQuotaResetCountdown , postChatCompletions } from '../_post'
11- import {
12- checkFreeModeRateLimit ,
13- resetFreeModeRateLimits ,
14- } from '../free-mode-rate-limiter'
11+ import { resetFreeModeRateLimits } from '../free-mode-rate-limiter'
1512
1613import type { TrackEventFn } from '@codebuff/common/types/contracts/analytics'
1714import type { InsertMessageBigqueryFn } from '@codebuff/common/types/contracts/bigquery'
@@ -49,6 +46,10 @@ describe('/api/v1/chat/completions POST endpoint', () => {
4946 id : 'user-new-free-gemini' ,
5047 banned : false ,
5148 } ,
49+ 'test-api-key-reviewer-rate-limit' : {
50+ id : 'user-reviewer-rate-limit' ,
51+ banned : false ,
52+ } ,
5253 }
5354
5455 const mockGetUserInfoFromApiKey : GetUserInfoFromApiKeyFn = async ( {
@@ -1006,36 +1007,49 @@ describe('/api/v1/chat/completions POST endpoint', () => {
10061007 expect ( body . error ) . toBe ( 'free_mode_invalid_agent_hierarchy' )
10071008 } )
10081009
1009- it ( 'counts child reviewer Gemini requests toward the free-mode request limit' , async ( ) => {
1010- const response = await postChatCompletions ( {
1011- req : new NextRequest ( 'http://localhost:3000/api/v1/chat/completions' , {
1012- method : 'POST' ,
1013- headers : allowedFreeModeHeaders ( 'test-api-key-new-free-gemini' ) ,
1014- body : JSON . stringify ( {
1015- model : FREEBUFF_GEMINI_PRO_MODEL_ID ,
1016- stream : false ,
1017- codebuff_metadata : {
1018- run_id : 'run-reviewer-child' ,
1019- client_id : 'test-client-id-123' ,
1020- cost_mode : 'free' ,
1021- } ,
1022- } ) ,
1023- } ) ,
1024- getUserInfoFromApiKey : mockGetUserInfoFromApiKey ,
1025- logger : mockLogger ,
1026- trackEvent : mockTrackEvent ,
1027- getUserUsageData : mockGetUserUsageData ,
1028- getAgentRunFromId : mockGetAgentRunFromId ,
1029- fetch : mockFetch ,
1030- insertMessageBigquery : mockInsertMessageBigquery ,
1031- loggerWithContext : mockLoggerWithContext ,
1032- checkSessionAdmissible : mockCheckSessionAdmissibleAllow ,
1033- } )
1010+ it (
1011+ 'counts child reviewer Gemini requests toward the free-mode request limit' ,
1012+ async ( ) => {
1013+ const createRequest = ( ) =>
1014+ new NextRequest ( 'http://localhost:3000/api/v1/chat/completions' , {
1015+ method : 'POST' ,
1016+ headers : allowedFreeModeHeaders ( 'test-api-key-reviewer-rate-limit' ) ,
1017+ body : JSON . stringify ( {
1018+ model : FREEBUFF_GEMINI_PRO_MODEL_ID ,
1019+ stream : false ,
1020+ codebuff_metadata : {
1021+ run_id : 'run-reviewer-child' ,
1022+ client_id : 'test-client-id-123' ,
1023+ cost_mode : 'free' ,
1024+ } ,
1025+ } ) ,
1026+ } )
10341027
1035- expect ( response . status ) . toBe ( 200 )
1036- expect ( checkFreeModeRateLimit ( 'user-new-free-gemini' ) . limited ) . toBe ( false )
1037- expect ( checkFreeModeRateLimit ( 'user-new-free-gemini' ) . limited ) . toBe ( true )
1038- } )
1028+ const createPostParams = ( ) => ( {
1029+ req : createRequest ( ) ,
1030+ getUserInfoFromApiKey : mockGetUserInfoFromApiKey ,
1031+ logger : mockLogger ,
1032+ trackEvent : mockTrackEvent ,
1033+ getUserUsageData : mockGetUserUsageData ,
1034+ getAgentRunFromId : mockGetAgentRunFromId ,
1035+ fetch : mockFetch ,
1036+ insertMessageBigquery : mockInsertMessageBigquery ,
1037+ loggerWithContext : mockLoggerWithContext ,
1038+ checkSessionAdmissible : mockCheckSessionAdmissibleAllow ,
1039+ } )
1040+
1041+ const firstResponse = await postChatCompletions ( createPostParams ( ) )
1042+ const secondResponse = await postChatCompletions ( createPostParams ( ) )
1043+ const limitedResponse = await postChatCompletions ( createPostParams ( ) )
1044+
1045+ expect ( firstResponse . status ) . toBe ( 200 )
1046+ expect ( secondResponse . status ) . toBe ( 200 )
1047+ expect ( limitedResponse . status ) . toBe ( 429 )
1048+ const body = await limitedResponse . json ( )
1049+ expect ( body . error ) . toBe ( 'free_mode_rate_limited' )
1050+ } ,
1051+ FETCH_PATH_TEST_TIMEOUT_MS ,
1052+ )
10391053
10401054 it (
10411055 'skips credit check when in FREE mode even with 0 credits' ,
0 commit comments