UNPKG

@alvinveroy/codecompass

Version:

AI-powered MCP server for codebase navigation and LLM prompt optimization

142 lines (141 loc) 9.42 kB
"use strict"; /// <reference types="vitest/globals" /> Object.defineProperty(exports, "__esModule", { value: true }); const vitest_1 = require("vitest"); // Explicitly import MockedFunction // Mock external dependencies (these are fine as they are) vitest_1.vi.mock('../../lib/config-service', () => ({ configService: { COLLECTION_NAME: 'test_refine_collection', QDRANT_SEARCH_LIMIT_DEFAULT: 5, MAX_REFINEMENT_ITERATIONS: 2, }, logger: { info: vitest_1.vi.fn(), warn: vitest_1.vi.fn(), error: vitest_1.vi.fn(), debug: vitest_1.vi.fn() }, })); vitest_1.vi.mock('../../lib/ollama', () => ({ generateEmbedding: vitest_1.vi.fn().mockResolvedValue([0.1, 0.2, 0.3]), })); vitest_1.vi.mock('../../../utils/text-utils', () => ({ preprocessText: vitest_1.vi.fn((text) => text), })); // Import SUT and its helpers (now exported) const query_refinement_1 = require("../../lib/query-refinement"); // Import mocked dependencies const ollama_1 = require("../../lib/ollama"); const config_service_1 = require("../../lib/config-service"); // configService itself is not used directly in tests // Define mockSearchFn once const mockSearchFn = vitest_1.vi.fn(); const mockQdrantClientInstance = { search: mockSearchFn }; // Remove the VitestMockedFunction utility type if it was causing issues. // We will use the imported `Mock` type directly. (0, vitest_1.describe)('Query Refinement Tests', () => { (0, vitest_1.beforeEach)(() => { vitest_1.vi.clearAllMocks(); vitest_1.vi.mocked(ollama_1.generateEmbedding).mockResolvedValue([0.1, 0.2, 0.3]); mockSearchFn.mockClear(); // Clear the standalone mock vitest_1.vi.mocked(config_service_1.logger.info).mockClear(); vitest_1.vi.mocked(config_service_1.logger.debug).mockClear(); }); (0, vitest_1.describe)('searchWithRefinement', () => { // Use vi.MockedFunction<TheFunctionType> let mockRefineQuery_Injected; // Use imported MockedFunction (0, vitest_1.beforeEach)(() => { mockRefineQuery_Injected = vitest_1.vi.fn((query, _results, relevance) => { if (relevance < 0.3) return `${query} broadened by INJECTED mockRefineQuery`; if (relevance < 0.7) return `${query} focused by INJECTED mockRefineQuery`; return `${query} tweaked by INJECTED mockRefineQuery`; }); }); // Use Schemas['ScoredPoint'] const dummySearchResults = (score, count = 1) => Array(count).fill(null).map((_, i) => ({ id: `id-${score}-${i}`, version: 1, score, payload: { content: `content ${score}`, filepath: `file${i}.ts` }, // This payload is simpler than DetailedQdrantSearchResult vector: [0.1 * i, 0.2 * i, 0.3 * i], })); (0, vitest_1.it)('should return results without refinement if threshold met (using injected mock)', async () => { mockSearchFn.mockResolvedValue(dummySearchResults(0.8)); const { results, refinedQuery, relevanceScore } = await (0, query_refinement_1.searchWithRefinement)(mockQdrantClientInstance, 'initial query', [], undefined, 2, 0.75, mockRefineQuery_Injected); (0, vitest_1.expect)(mockSearchFn).toHaveBeenCalledTimes(1); // Ensure results are cast or match DetailedQdrantSearchResult for this assertion (0, vitest_1.expect)(results[0].score).toBe(0.8); (0, vitest_1.expect)(refinedQuery).toBe('initial query'); (0, vitest_1.expect)(relevanceScore).toBe(0.8); (0, vitest_1.expect)(mockRefineQuery_Injected).not.toHaveBeenCalled(); }); (0, vitest_1.it)('should refine query up to maxRefinements (using injected mock)', async () => { mockSearchFn .mockResolvedValueOnce(dummySearchResults(0.2)) .mockResolvedValueOnce(dummySearchResults(0.5)) .mockResolvedValueOnce(dummySearchResults(0.8)); const { results, relevanceScore, refinedQuery } = await (0, query_refinement_1.searchWithRefinement)(mockQdrantClientInstance, 'original query', [], undefined, 2, 0.75, mockRefineQuery_Injected); (0, vitest_1.expect)(mockSearchFn).toHaveBeenCalledTimes(3); (0, vitest_1.expect)(results[0].score).toBe(0.8); (0, vitest_1.expect)(relevanceScore).toBe(0.8); (0, vitest_1.expect)(refinedQuery).toBe('original query broadened by INJECTED mockRefineQuery focused by INJECTED mockRefineQuery'); (0, vitest_1.expect)(mockRefineQuery_Injected).toHaveBeenCalledTimes(2); // Ensure the results passed to the mock match DetailedQdrantSearchResult[] if that's what RefineQueryFunc expects // The dummySearchResults creates Schemas['ScoredPoint'][], which might be compatible or need casting/adjusting // For the mock call assertion, if RefineQueryFunc expects DetailedQdrantSearchResult[], you might need to cast: (0, vitest_1.expect)(mockRefineQuery_Injected).toHaveBeenNthCalledWith(1, 'original query', vitest_1.expect.any(Array), 0.2); (0, vitest_1.expect)(mockRefineQuery_Injected).toHaveBeenNthCalledWith(2, 'original query broadened by INJECTED mockRefineQuery', vitest_1.expect.any(Array), 0.5); }); (0, vitest_1.it)('should handle empty search results gracefully (using injected mock)', async () => { mockSearchFn .mockResolvedValueOnce([]) .mockResolvedValueOnce([]) .mockResolvedValueOnce([]); const { results, relevanceScore, refinedQuery } = await (0, query_refinement_1.searchWithRefinement)(mockQdrantClientInstance, 'query for no results', [], undefined, 2, 0.7, mockRefineQuery_Injected // Pass the mock ); (0, vitest_1.expect)(mockSearchFn).toHaveBeenCalledTimes(3); (0, vitest_1.expect)(results).toEqual([]); (0, vitest_1.expect)(relevanceScore).toBe(0); (0, vitest_1.expect)(refinedQuery).toBe('query for no results broadened by INJECTED mockRefineQuery broadened by INJECTED mockRefineQuery'); (0, vitest_1.expect)(config_service_1.logger.info).toHaveBeenCalledWith(vitest_1.expect.stringContaining(`Completed search with 2 refinements`)); (0, vitest_1.expect)(mockRefineQuery_Injected).toHaveBeenCalledTimes(2); }); }); (0, vitest_1.describe)('refineQuery (original logic with injected helpers)', () => { // Use vi.MockedFunction for these as well let mockBroaden_Injected; let mockFocus_Injected; let mockTweak_Injected; (0, vitest_1.beforeEach)(() => { mockBroaden_Injected = vitest_1.vi.fn().mockReturnValue('mock_broadened_by_INJECTED_helper'); mockFocus_Injected = vitest_1.vi.fn().mockReturnValue('mock_focused_by_INJECTED_helper'); mockTweak_Injected = vitest_1.vi.fn().mockReturnValue('mock_tweaked_by_INJECTED_helper'); }); const dummyResultsArray = (score) => ([ { id: 'res1', score, payload: { dataType: 'file_chunk', filepath: 'file.ts', file_content_chunk: 'some content', chunk_index: 0, total_chunks: 1, last_modified: '2023-01-01' }, vector: [], version: 0 } ]); (0, vitest_1.it)('should call broadenQuery (injected) for very low relevance (<0.3)', () => { const result = (0, query_refinement_1.refineQuery)("original", [], 0.1, { broaden: mockBroaden_Injected, focus: mockFocus_Injected, tweak: mockTweak_Injected }); (0, vitest_1.expect)(mockBroaden_Injected).toHaveBeenCalledWith("original"); (0, vitest_1.expect)(result).toBe('mock_broadened_by_INJECTED_helper'); (0, vitest_1.expect)(mockFocus_Injected).not.toHaveBeenCalled(); (0, vitest_1.expect)(mockTweak_Injected).not.toHaveBeenCalled(); }); (0, vitest_1.it)('should call focusQueryBasedOnResults (injected) for mediocre relevance (0.3 <= relevance < 0.7)', () => { const results = dummyResultsArray(0.5); const result = (0, query_refinement_1.refineQuery)("original", results, 0.5, { broaden: mockBroaden_Injected, focus: mockFocus_Injected, tweak: mockTweak_Injected }); (0, vitest_1.expect)(mockFocus_Injected).toHaveBeenCalledWith("original", results); (0, vitest_1.expect)(result).toBe('mock_focused_by_INJECTED_helper'); (0, vitest_1.expect)(mockBroaden_Injected).not.toHaveBeenCalled(); (0, vitest_1.expect)(mockTweak_Injected).not.toHaveBeenCalled(); }); (0, vitest_1.it)('should call tweakQuery (injected) for decent relevance (>=0.7)', () => { const results = dummyResultsArray(0.75); const result = (0, query_refinement_1.refineQuery)("original", results, 0.75, { broaden: mockBroaden_Injected, focus: mockFocus_Injected, tweak: mockTweak_Injected }); (0, vitest_1.expect)(mockTweak_Injected).toHaveBeenCalledWith("original", results); (0, vitest_1.expect)(result).toBe('mock_tweaked_by_INJECTED_helper'); (0, vitest_1.expect)(mockBroaden_Injected).not.toHaveBeenCalled(); (0, vitest_1.expect)(mockFocus_Injected).not.toHaveBeenCalled(); }); }); });