11/**
22 * @vitest -environment node
33 */
4+ import {
5+ V2_OPERATION_RATE_LIMIT_ALLOWED ,
6+ V2_PREAUTH_RATE_LIMIT_ALLOWED ,
7+ v2ApiKeyAuthModuleMock ,
8+ v2GateModuleMock ,
9+ v2RateLimiterModuleMock ,
10+ v2RouteMocks ,
11+ } from '@sim/testing'
412import { NextRequest } from 'next/server'
513import { beforeEach , describe , expect , it , vi } from 'vitest'
614
715const {
8- mockAuthenticate,
9- mockCheckPreAuth,
10- mockCheckRateLimit,
1116 mockAdmitUpload,
1217 mockUploadDocument,
1318 mockReadFormData,
@@ -17,9 +22,6 @@ const {
1722 mockCapture,
1823 mockIsPayloadSizeLimitError,
1924} = vi . hoisted ( ( ) => ( {
20- mockAuthenticate : vi . fn ( ) ,
21- mockCheckPreAuth : vi . fn ( ) ,
22- mockCheckRateLimit : vi . fn ( ) ,
2325 mockAdmitUpload : vi . fn ( ) ,
2426 mockUploadDocument : vi . fn ( ) ,
2527 mockReadFormData : vi . fn ( ) ,
@@ -30,25 +32,9 @@ const {
3032 mockIsPayloadSizeLimitError : vi . fn ( ) ,
3133} ) )
3234
33- vi . mock ( '@/lib/api/server/routes/v2-api-key-auth' , ( ) => ( {
34- authenticateV2ApiKey : mockAuthenticate ,
35- V2ApiKeyUnauthenticatedError : class V2ApiKeyUnauthenticatedError extends Error { } ,
36- } ) )
37-
38- vi . mock ( '@/lib/core/rate-limiter' , ( ) => ( {
39- getRateLimit : ( ) => ( { maxTokens : 100 , refillRate : 100 , refillIntervalMs : 60_000 } ) ,
40- RateLimiter : class RateLimiter {
41- checkRateLimitDirect ( ...args : unknown [ ] ) {
42- return mockCheckPreAuth ( ...args )
43- }
44-
45- checkRateLimitDirectOrThrow ( ...args : unknown [ ] ) {
46- return mockCheckRateLimit ( ...args )
47- }
48- } ,
49- } ) )
50-
51- vi . mock ( '@/app/api/v2/lib/gate' , ( ) => ( { v2ApiGateError : vi . fn ( ) . mockResolvedValue ( null ) } ) )
35+ vi . mock ( '@/lib/api/server/routes/v2-api-key-auth' , ( ) => v2ApiKeyAuthModuleMock )
36+ vi . mock ( '@/lib/core/rate-limiter' , ( ) => v2RateLimiterModuleMock )
37+ vi . mock ( '@/app/api/v2/lib/gate' , ( ) => v2GateModuleMock )
5238
5339vi . mock ( '@/lib/knowledge/application/documents' , ( ) => ( {
5440 listKnowledgeDocuments : {
@@ -89,12 +75,6 @@ import { validateFileType } from '@/lib/uploads/utils/validation'
8975import { POST } from '@/app/api/v2/knowledge/[id]/documents/route'
9076
9177const WORKSPACE_ID = 'workspace-1'
92- const RATE_LIMIT_OK = {
93- allowed : true ,
94- remaining : 99 ,
95- resetAt : new Date ( '2024-01-01T01:00:00Z' ) ,
96- retryAfterMs : 0 ,
97- }
9878const PRINCIPAL = { kind : 'personal_api_key' , userId : 'user-1' , keyId : 'key-1' } as const
9979
10080function buildRequest ( ) {
@@ -107,10 +87,11 @@ function buildRequest() {
10787describe ( 'POST /api/v2/knowledge/[id]/documents' , ( ) => {
10888 beforeEach ( ( ) => {
10989 vi . clearAllMocks ( )
110- mockCheckPreAuth . mockResolvedValue ( RATE_LIMIT_OK )
111- mockCheckRateLimit . mockResolvedValue ( RATE_LIMIT_OK )
90+ v2RouteMocks . preauthRate . mockResolvedValue ( V2_PREAUTH_RATE_LIMIT_ALLOWED )
91+ v2RouteMocks . operationRate . mockResolvedValue ( V2_OPERATION_RATE_LIMIT_ALLOWED )
92+ v2RouteMocks . gate . mockResolvedValue ( null )
11293 mockIsPayloadSizeLimitError . mockReturnValue ( false )
113- mockAuthenticate . mockResolvedValue ( {
94+ v2RouteMocks . authenticate . mockResolvedValue ( {
11495 principal : PRINCIPAL ,
11596 rolloutUserId : 'user-1' ,
11697 rateLimitSubjectIds : [ 'api-key:key-1' , 'user:user-1' ] ,
@@ -218,7 +199,7 @@ describe('POST /api/v2/knowledge/[id]/documents', () => {
218199 } )
219200
220201 it ( 'does not create human analytics for a workspace key' , async ( ) => {
221- mockAuthenticate . mockResolvedValue ( {
202+ v2RouteMocks . authenticate . mockResolvedValue ( {
222203 principal : { kind : 'workspace_api_key' , workspaceId : WORKSPACE_ID , keyId : 'key-2' } ,
223204 rolloutUserId : 'billing-owner' ,
224205 rateLimitSubjectIds : [ 'api-key:key-2' , `workspace:${ WORKSPACE_ID } ` ] ,
0 commit comments