@@ -6,6 +6,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'
66
77const mocks = vi . hoisted ( ( ) => ( {
88 getKnowledgeBase : vi . fn ( ) ,
9+ getKnowledgeBaseWithCounts : vi . fn ( ) ,
910 getDocument : vi . fn ( ) ,
1011 getDocumentById : vi . fn ( ) ,
1112 getTag : vi . fn ( ) ,
@@ -22,7 +23,8 @@ vi.mock('@/lib/knowledge/access/scope', () => ({
2223} ) )
2324
2425vi . mock ( '@/lib/knowledge/service' , ( ) => ( {
25- getKnowledgeBaseById : mocks . getKnowledgeBase ,
26+ getActiveKnowledgeBaseReference : mocks . getKnowledgeBase ,
27+ getKnowledgeBaseById : mocks . getKnowledgeBaseWithCounts ,
2628} ) )
2729
2830vi . mock ( '@/lib/knowledge/documents/service' , ( ) => ( {
@@ -66,10 +68,76 @@ describe('knowledge application contexts', () => {
6668 beforeEach ( ( ) => {
6769 vi . clearAllMocks ( )
6870 mocks . getKnowledgeBase . mockResolvedValue ( knowledgeBase )
71+ mocks . getKnowledgeBaseWithCounts . mockResolvedValue ( {
72+ ...knowledgeBase ,
73+ docCount : 3 ,
74+ tokenCount : 1536 ,
75+ } )
6976 mocks . loadWorkspace . mockResolvedValue ( workspace )
7077 mocks . loadWorkspaceIncludingArchived . mockResolvedValue ( workspace )
7178 } )
7279
80+ it ( 'resolves child-resource context without loading display counts' , async ( ) => {
81+ const context = await resolveActiveKnowledgeResourceContext (
82+ { knowledgeBaseId : 'knowledge-1' , assertedWorkspaceId : 'workspace-1' } ,
83+ principal
84+ )
85+
86+ expect ( context . knowledgeBase ) . toEqual ( knowledgeBase )
87+ expect ( mocks . getKnowledgeBaseWithCounts ) . not . toHaveBeenCalled ( )
88+ expect ( mocks . createAccessProvider ) . toHaveBeenCalledWith ( principal , {
89+ workspaceId : 'workspace-1' ,
90+ } )
91+ } )
92+
93+ it ( 'retains display counts in workspace knowledge-base detail context' , async ( ) => {
94+ const context = await resolveActiveKnowledgeBaseContext (
95+ { knowledgeBaseId : 'knowledge-1' } ,
96+ principal
97+ )
98+
99+ expect ( context . knowledgeBase ) . toMatchObject ( { docCount : 3 , tokenCount : 1536 } )
100+ expect ( mocks . getKnowledgeBase ) . not . toHaveBeenCalled ( )
101+ } )
102+
103+ it ( 'conceals a missing or archived knowledge-base reference before loading its owner' , async ( ) => {
104+ mocks . getKnowledgeBase . mockResolvedValueOnce ( null )
105+
106+ await expect (
107+ resolveActiveKnowledgeResourceContext ( { knowledgeBaseId : 'archived' } , principal )
108+ ) . rejects . toMatchObject ( { code : 'not_found' } )
109+ expect ( mocks . loadWorkspace ) . not . toHaveBeenCalled ( )
110+ expect ( mocks . createAccessProvider ) . not . toHaveBeenCalled ( )
111+ } )
112+
113+ it ( 'conceals an organization reference outside the asserted organization' , async ( ) => {
114+ mocks . getKnowledgeBase . mockResolvedValueOnce ( {
115+ id : 'org-index' ,
116+ workspaceId : null ,
117+ organizationId : 'org-canonical' ,
118+ } )
119+
120+ await expect (
121+ resolveActiveKnowledgeResourceContext (
122+ { knowledgeBaseId : 'org-index' , assertedOrganizationId : 'org-other' } ,
123+ principal
124+ )
125+ ) . rejects . toMatchObject ( { code : 'not_found' } )
126+ expect ( mocks . createAccessProvider ) . not . toHaveBeenCalled ( )
127+ } )
128+
129+ it ( 'conceals a reference with conflicting owners' , async ( ) => {
130+ mocks . getKnowledgeBase . mockResolvedValueOnce ( {
131+ ...knowledgeBase ,
132+ organizationId : 'org-canonical' ,
133+ } )
134+
135+ await expect (
136+ resolveActiveKnowledgeResourceContext ( { knowledgeBaseId : 'knowledge-1' } , principal )
137+ ) . rejects . toMatchObject ( { code : 'not_found' } )
138+ expect ( mocks . createAccessProvider ) . not . toHaveBeenCalled ( )
139+ } )
140+
73141 it ( 'uses the canonical active-workspace loader' , async ( ) => {
74142 await expect ( resolveKnowledgeWorkspaceContext ( { workspaceId : 'workspace-1' } ) ) . resolves . toBe (
75143 workspace
0 commit comments