1- import {
2- afterEach ,
3- beforeEach ,
4- describe ,
5- expect ,
6- mock ,
7- it ,
8- spyOn ,
9- } from 'bun:test'
1+ import { afterEach , beforeEach , describe , expect , mock , it } from 'bun:test'
102import { NextRequest } from 'next/server'
113
124import {
@@ -15,8 +7,8 @@ import {
157} from '@codebuff/common/constants/freebuff-models'
168import { formatQuotaResetCountdown , postChatCompletions } from '../_post'
179import {
10+ checkFreeModeRateLimit ,
1811 resetFreeModeRateLimits ,
19- FREE_MODE_RATE_LIMITS ,
2012} from '../free-mode-rate-limiter'
2113
2214import type { TrackEventFn } from '@codebuff/common/types/contracts/analytics'
@@ -818,53 +810,34 @@ describe('/api/v1/chat/completions POST endpoint', () => {
818810 } )
819811
820812 it ( 'counts child reviewer Gemini requests toward the free-mode request limit' , async ( ) => {
821- const nowSpy = spyOn ( Date , 'now' ) . mockImplementation (
822- ( ) => 1_000_000_000_000 ,
823- )
824- try {
825- const postFreeRequest = ( runId : string ) =>
826- postChatCompletions ( {
827- req : new NextRequest (
828- 'http://localhost:3000/api/v1/chat/completions' ,
829- {
830- method : 'POST' ,
831- headers : allowedFreeModeHeaders ( 'test-api-key-new-free-gemini' ) ,
832- body : JSON . stringify ( {
833- model : FREEBUFF_GEMINI_PRO_MODEL_ID ,
834- stream : false ,
835- codebuff_metadata : {
836- run_id : runId ,
837- client_id : 'test-client-id-123' ,
838- cost_mode : 'free' ,
839- } ,
840- } ) ,
841- } ,
842- ) ,
843- getUserInfoFromApiKey : mockGetUserInfoFromApiKey ,
844- logger : mockLogger ,
845- trackEvent : mockTrackEvent ,
846- getUserUsageData : mockGetUserUsageData ,
847- getAgentRunFromId : mockGetAgentRunFromId ,
848- fetch : mockFetch ,
849- insertMessageBigquery : mockInsertMessageBigquery ,
850- loggerWithContext : mockLoggerWithContext ,
851- checkSessionAdmissible : mockCheckSessionAdmissibleAllow ,
852- } )
853-
854- for ( let i = 0 ; i < FREE_MODE_RATE_LIMITS . PER_SECOND ; i ++ ) {
855- const response = await postFreeRequest (
856- i === 0 ? 'run-reviewer-child' : 'run-free' ,
857- )
858- expect ( response . status ) . toBe ( 200 )
859- }
813+ const response = await postChatCompletions ( {
814+ req : new NextRequest ( 'http://localhost:3000/api/v1/chat/completions' , {
815+ method : 'POST' ,
816+ headers : allowedFreeModeHeaders ( 'test-api-key-new-free-gemini' ) ,
817+ body : JSON . stringify ( {
818+ model : FREEBUFF_GEMINI_PRO_MODEL_ID ,
819+ stream : false ,
820+ codebuff_metadata : {
821+ run_id : 'run-reviewer-child' ,
822+ client_id : 'test-client-id-123' ,
823+ cost_mode : 'free' ,
824+ } ,
825+ } ) ,
826+ } ) ,
827+ getUserInfoFromApiKey : mockGetUserInfoFromApiKey ,
828+ logger : mockLogger ,
829+ trackEvent : mockTrackEvent ,
830+ getUserUsageData : mockGetUserUsageData ,
831+ getAgentRunFromId : mockGetAgentRunFromId ,
832+ fetch : mockFetch ,
833+ insertMessageBigquery : mockInsertMessageBigquery ,
834+ loggerWithContext : mockLoggerWithContext ,
835+ checkSessionAdmissible : mockCheckSessionAdmissibleAllow ,
836+ } )
860837
861- const limited = await postFreeRequest ( 'run-free' )
862- expect ( limited . status ) . toBe ( 429 )
863- const body = await limited . json ( )
864- expect ( body . error ) . toBe ( 'free_mode_rate_limited' )
865- } finally {
866- nowSpy . mockRestore ( )
867- }
838+ expect ( response . status ) . toBe ( 200 )
839+ expect ( checkFreeModeRateLimit ( 'user-new-free-gemini' ) . limited ) . toBe ( false )
840+ expect ( checkFreeModeRateLimit ( 'user-new-free-gemini' ) . limited ) . toBe ( true )
868841 } )
869842
870843 it ( 'skips credit check when in FREE mode even with 0 credits' , async ( ) => {
0 commit comments