@@ -62,6 +62,44 @@ describe("cortex query (minimal)", () => {
6262 ( globalThis as any ) . IDBKeyRange = FakeIDBKeyRange ;
6363 } ) ;
6464
65+ it ( "returns empty results for an empty corpus" , async ( ) => {
66+ const metadataStore = await IndexedDbMetadataStore . open ( freshDbName ( ) ) ;
67+ const vectorStore = new MemoryVectorStore ( ) ;
68+
69+ const backend = new DeterministicDummyEmbeddingBackend ( { dimension : 4 } ) ;
70+ const vectorBackend = new TestVectorBackend ( ) ;
71+
72+ const runner = new EmbeddingRunner ( async ( ) => ( {
73+ backend,
74+ selectedKind : "dummy" as const ,
75+ reason : "forced" as const ,
76+ supportedKinds : [ "dummy" as const ] ,
77+ measurements : [ ] ,
78+ } ) ) ;
79+
80+ const profile : ModelProfile = {
81+ modelId : "test-model" ,
82+ embeddingDimension : 4 ,
83+ contextWindowTokens : 64 ,
84+ truncationTokens : 48 ,
85+ maxChunkTokens : 5 ,
86+ source : "metadata" ,
87+ } ;
88+
89+ const result = await query ( "anything" , {
90+ modelProfile : profile ,
91+ embeddingRunner : runner ,
92+ vectorStore,
93+ metadataStore,
94+ vectorBackend,
95+ topK : 5 ,
96+ } ) ;
97+
98+ expect ( result . pages ) . toHaveLength ( 0 ) ;
99+ expect ( result . scores ) . toHaveLength ( 0 ) ;
100+ expect ( result . metadata . returned ) . toBe ( 0 ) ;
101+ } ) ;
102+
65103 it ( "returns the most relevant page and updates activity" , async ( ) => {
66104 const metadataStore = await IndexedDbMetadataStore . open ( freshDbName ( ) ) ;
67105 const vectorStore = new MemoryVectorStore ( ) ;
@@ -121,4 +159,60 @@ describe("cortex query (minimal)", () => {
121159 expect ( activity ?. queryHitCount ) . toBe ( 1 ) ;
122160 expect ( activity ?. lastQueryAt ) . toBeDefined ( ) ;
123161 } ) ;
162+
163+ it ( "returns results in descending score order (relevance)" , async ( ) => {
164+ const metadataStore = await IndexedDbMetadataStore . open ( freshDbName ( ) ) ;
165+ const vectorStore = new MemoryVectorStore ( ) ;
166+ const keyPair = await generateKeyPair ( ) ;
167+
168+ const backend = new DeterministicDummyEmbeddingBackend ( { dimension : 4 } ) ;
169+ const vectorBackend = new TestVectorBackend ( ) ;
170+
171+ const runner = new EmbeddingRunner ( async ( ) => ( {
172+ backend,
173+ selectedKind : "dummy" as const ,
174+ reason : "forced" as const ,
175+ supportedKinds : [ "dummy" as const ] ,
176+ measurements : [ ] ,
177+ } ) ) ;
178+
179+ const profile : ModelProfile = {
180+ modelId : "test-model" ,
181+ embeddingDimension : 4 ,
182+ contextWindowTokens : 64 ,
183+ truncationTokens : 48 ,
184+ maxChunkTokens : 5 ,
185+ source : "metadata" ,
186+ } ;
187+
188+ const text = "One two three four five six seven eight nine ten." ;
189+ const ingestResult = await ingestText ( text , {
190+ modelProfile : profile ,
191+ embeddingRunner : runner ,
192+ vectorStore,
193+ metadataStore,
194+ keyPair,
195+ } ) ;
196+
197+ expect ( ingestResult . pages . length ) . toBeGreaterThanOrEqual ( 2 ) ;
198+
199+ const targetPage = ingestResult . pages [ 0 ] ;
200+
201+ const result = await query ( targetPage . content , {
202+ modelProfile : profile ,
203+ embeddingRunner : runner ,
204+ vectorStore,
205+ metadataStore,
206+ vectorBackend,
207+ topK : ingestResult . pages . length ,
208+ } ) ;
209+
210+ // Results must include the page whose content matches the query.
211+ expect ( result . pages . map ( ( p ) => p . pageId ) ) . toContain ( targetPage . pageId ) ;
212+
213+ // Scores must be in non-increasing order.
214+ for ( let i = 1 ; i < result . scores . length ; i ++ ) {
215+ expect ( result . scores [ i ] ) . toBeLessThanOrEqual ( result . scores [ i - 1 ] ) ;
216+ }
217+ } ) ;
124218} ) ;
0 commit comments