@@ -51,6 +51,11 @@ vi.mock('@/providers/utils', () => ({
5151 } ) ,
5252} ) )
5353
54+ const mockCheckKnowledgeBaseAccess = vi . fn ( )
55+ vi . mock ( '@/app/api/knowledge/utils' , ( ) => ( {
56+ checkKnowledgeBaseAccess : mockCheckKnowledgeBaseAccess ,
57+ } ) )
58+
5459mockConsoleLogger ( )
5560
5661describe ( 'Knowledge Search API Route' , ( ) => {
@@ -132,7 +137,11 @@ describe('Knowledge Search API Route', () => {
132137 it ( 'should perform search successfully with single knowledge base' , async ( ) => {
133138 mockGetUserId . mockResolvedValue ( 'user-123' )
134139
135- mockDbChain . where . mockResolvedValueOnce ( mockKnowledgeBases )
140+ // Mock knowledge base access check to return success
141+ mockCheckKnowledgeBaseAccess . mockResolvedValue ( {
142+ hasAccess : true ,
143+ knowledgeBase : mockKnowledgeBases [ 0 ] ,
144+ } )
136145
137146 mockDbChain . limit . mockResolvedValueOnce ( mockSearchResults )
138147
@@ -149,6 +158,10 @@ describe('Knowledge Search API Route', () => {
149158 const response = await POST ( req )
150159 const data = await response . json ( )
151160
161+ if ( response . status !== 200 ) {
162+ console . log ( 'Test failed with response:' , data )
163+ }
164+
152165 expect ( response . status ) . toBe ( 200 )
153166 expect ( data . success ) . toBe ( true )
154167 expect ( data . data . results ) . toHaveLength ( 2 )
@@ -171,7 +184,10 @@ describe('Knowledge Search API Route', () => {
171184
172185 mockGetUserId . mockResolvedValue ( 'user-123' )
173186
174- mockDbChain . where . mockResolvedValueOnce ( multiKbs )
187+ // Mock knowledge base access check to return success for both KBs
188+ mockCheckKnowledgeBaseAccess
189+ . mockResolvedValueOnce ( { hasAccess : true , knowledgeBase : multiKbs [ 0 ] } )
190+ . mockResolvedValueOnce ( { hasAccess : true , knowledgeBase : multiKbs [ 1 ] } )
175191
176192 mockDbChain . limit . mockResolvedValueOnce ( mockSearchResults )
177193
@@ -201,9 +217,13 @@ describe('Knowledge Search API Route', () => {
201217
202218 mockGetUserId . mockResolvedValue ( 'user-123' )
203219
204- mockDbChain . where . mockResolvedValueOnce ( mockKnowledgeBases ) // First call: get knowledge bases
220+ // Mock knowledge base access check to return success
221+ mockCheckKnowledgeBaseAccess . mockResolvedValue ( {
222+ hasAccess : true ,
223+ knowledgeBase : mockKnowledgeBases [ 0 ] ,
224+ } )
205225
206- mockDbChain . limit . mockResolvedValueOnce ( mockSearchResults ) // Second call: search results
226+ mockDbChain . limit . mockResolvedValueOnce ( mockSearchResults ) // Search results
207227
208228 mockFetch . mockResolvedValue ( {
209229 ok : true ,
@@ -255,7 +275,11 @@ describe('Knowledge Search API Route', () => {
255275 it ( 'should return not found for non-existent knowledge base' , async ( ) => {
256276 mockGetUserId . mockResolvedValue ( 'user-123' )
257277
258- mockDbChain . where . mockResolvedValueOnce ( [ ] ) // No knowledge bases found
278+ // Mock knowledge base access check to return no access
279+ mockCheckKnowledgeBaseAccess . mockResolvedValue ( {
280+ hasAccess : false ,
281+ notFound : true ,
282+ } )
259283
260284 const req = createMockRequest ( 'POST' , validSearchData )
261285 const { POST } = await import ( './route' )
@@ -274,15 +298,18 @@ describe('Knowledge Search API Route', () => {
274298
275299 mockGetUserId . mockResolvedValue ( 'user-123' )
276300
277- mockDbChain . where . mockResolvedValueOnce ( mockKnowledgeBases ) // Only kb-123 found
301+ // Mock access check: first KB has access, second doesn't
302+ mockCheckKnowledgeBaseAccess
303+ . mockResolvedValueOnce ( { hasAccess : true , knowledgeBase : mockKnowledgeBases [ 0 ] } )
304+ . mockResolvedValueOnce ( { hasAccess : false , notFound : true } )
278305
279306 const req = createMockRequest ( 'POST' , multiKbData )
280307 const { POST } = await import ( './route' )
281308 const response = await POST ( req )
282309 const data = await response . json ( )
283310
284311 expect ( response . status ) . toBe ( 404 )
285- expect ( data . error ) . toBe ( 'Knowledge bases not found: kb-missing' )
312+ expect ( data . error ) . toBe ( 'Knowledge bases not found or access denied : kb-missing' )
286313 } )
287314
288315 it . concurrent ( 'should validate search parameters' , async ( ) => {
@@ -310,9 +337,13 @@ describe('Knowledge Search API Route', () => {
310337
311338 mockGetUserId . mockResolvedValue ( 'user-123' )
312339
313- mockDbChain . where . mockResolvedValueOnce ( mockKnowledgeBases ) // First call: get knowledge bases
340+ // Mock knowledge base access check to return success
341+ mockCheckKnowledgeBaseAccess . mockResolvedValue ( {
342+ hasAccess : true ,
343+ knowledgeBase : mockKnowledgeBases [ 0 ] ,
344+ } )
314345
315- mockDbChain . limit . mockResolvedValueOnce ( mockSearchResults ) // Second call: search results
346+ mockDbChain . limit . mockResolvedValueOnce ( mockSearchResults ) // Search results
316347
317348 mockFetch . mockResolvedValue ( {
318349 ok : true ,
@@ -416,7 +447,13 @@ describe('Knowledge Search API Route', () => {
416447 describe ( 'Cost tracking' , ( ) => {
417448 it . concurrent ( 'should include cost information in successful search response' , async ( ) => {
418449 mockGetUserId . mockResolvedValue ( 'user-123' )
419- mockDbChain . where . mockResolvedValueOnce ( mockKnowledgeBases )
450+
451+ // Mock knowledge base access check to return success
452+ mockCheckKnowledgeBaseAccess . mockResolvedValue ( {
453+ hasAccess : true ,
454+ knowledgeBase : mockKnowledgeBases [ 0 ] ,
455+ } )
456+
420457 mockDbChain . limit . mockResolvedValueOnce ( mockSearchResults )
421458
422459 mockFetch . mockResolvedValue ( {
@@ -458,7 +495,13 @@ describe('Knowledge Search API Route', () => {
458495 const { calculateCost } = await import ( '@/providers/utils' )
459496
460497 mockGetUserId . mockResolvedValue ( 'user-123' )
461- mockDbChain . where . mockResolvedValueOnce ( mockKnowledgeBases )
498+
499+ // Mock knowledge base access check to return success
500+ mockCheckKnowledgeBaseAccess . mockResolvedValue ( {
501+ hasAccess : true ,
502+ knowledgeBase : mockKnowledgeBases [ 0 ] ,
503+ } )
504+
462505 mockDbChain . limit . mockResolvedValueOnce ( mockSearchResults )
463506
464507 mockFetch . mockResolvedValue ( {
@@ -509,7 +552,13 @@ describe('Knowledge Search API Route', () => {
509552 }
510553
511554 mockGetUserId . mockResolvedValue ( 'user-123' )
512- mockDbChain . where . mockResolvedValueOnce ( mockKnowledgeBases )
555+
556+ // Mock knowledge base access check to return success
557+ mockCheckKnowledgeBaseAccess . mockResolvedValue ( {
558+ hasAccess : true ,
559+ knowledgeBase : mockKnowledgeBases [ 0 ] ,
560+ } )
561+
513562 mockDbChain . limit . mockResolvedValueOnce ( mockSearchResults )
514563
515564 mockFetch . mockResolvedValue ( {
0 commit comments