@alvinveroy/codecompass
Version:
AI-powered MCP server for codebase navigation and LLM prompt optimization
142 lines (141 loc) • 9.42 kB
JavaScript
;
/// <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();
});
});
});