|
7 | 7 | * @vitest-environment node |
8 | 8 | */ |
9 | 9 |
|
10 | | -import { createMockRequest, knowledgeApiUtilsMock, knowledgeApiUtilsMockFns } from '@sim/testing' |
| 10 | +import { |
| 11 | + createMockRequest, |
| 12 | + knowledgeApiUtilsMock, |
| 13 | + knowledgeApiUtilsMockFns, |
| 14 | + resetEnvFlagsMock, |
| 15 | + setEnvFlags, |
| 16 | +} from '@sim/testing' |
11 | 17 | import { getErrorMessage } from '@sim/utils/errors' |
12 | 18 | import { beforeEach, describe, expect, it, vi } from 'vitest' |
13 | 19 |
|
@@ -118,6 +124,7 @@ const baseKb = (id: string, embeddingModel: string, embeddingDimension = 1536) = |
118 | 124 | describe('v1 knowledge search route — per-KB embedding model', () => { |
119 | 125 | beforeEach(() => { |
120 | 126 | vi.clearAllMocks() |
| 127 | + resetEnvFlagsMock() |
121 | 128 | mockResolveV1KnowledgeReadAccess.mockResolvedValue({ kind: 'workspace', tokens: ['pub', 'ws'] }) |
122 | 129 | mockAuthenticateRequest.mockResolvedValue({ |
123 | 130 | requestId: 'req-1', |
@@ -163,6 +170,38 @@ describe('v1 knowledge search route — per-KB embedding model', () => { |
163 | 170 | expect(response.status).toBe(500) |
164 | 171 | }) |
165 | 172 |
|
| 173 | + it('refuses a search index while indexed organization search is dormant, before any spend', async () => { |
| 174 | + setEnvFlags({ isLiveEnterpriseSearchEnabled: true }) |
| 175 | + mockCheckKnowledgeBaseAccess.mockResolvedValueOnce({ |
| 176 | + hasAccess: true, |
| 177 | + knowledgeBase: { ...baseKb('kb-1', 'text-embedding-3-small'), isSearchIndex: true }, |
| 178 | + }) |
| 179 | + const response = await POST( |
| 180 | + createMockRequest('POST', { workspaceId: 'ws-1', knowledgeBaseIds: 'kb-1', query: 'hello' }) |
| 181 | + ) |
| 182 | + expect(response.status).toBe(409) |
| 183 | + expect(await response.json()).toEqual({ |
| 184 | + error: 'This search index is inactive; use Sim Search.', |
| 185 | + }) |
| 186 | + expect(mockGenerateSearchEmbedding).not.toHaveBeenCalled() |
| 187 | + expect(mockExecuteKnowledgeSearch).not.toHaveBeenCalled() |
| 188 | + }) |
| 189 | + |
| 190 | + it('searches a workspace knowledge base while indexed organization search is dormant', async () => { |
| 191 | + setEnvFlags({ isLiveEnterpriseSearchEnabled: true }) |
| 192 | + mockCheckKnowledgeBaseAccess.mockResolvedValueOnce({ |
| 193 | + hasAccess: true, |
| 194 | + knowledgeBase: { ...baseKb('kb-1', 'text-embedding-3-small'), isSearchIndex: false }, |
| 195 | + }) |
| 196 | + const response = await POST( |
| 197 | + createMockRequest('POST', { workspaceId: 'ws-1', knowledgeBaseIds: 'kb-1', query: 'hello' }) |
| 198 | + ) |
| 199 | + expect(response.status).toBe(200) |
| 200 | + expect(mockExecuteKnowledgeSearch).toHaveBeenCalledWith( |
| 201 | + expect.objectContaining({ knowledgeBaseIds: ['kb-1'], searchIndexOnly: false }) |
| 202 | + ) |
| 203 | + }) |
| 204 | + |
166 | 205 | it('retains the reader provider for ranked results and returned document metadata', async () => { |
167 | 206 | const access = { kind: 'user' as const, userId: 'user-1', tokens: ['reader-token'] } |
168 | 207 | const provider = { |
|
0 commit comments