Skip to main content
Glama
semantic-search-tool.test.ts4.72 kB
import { searchHandler } from '../../../mcp/services/handlers/unified/search-handler'; import { ToolHandlerContext } from '../../../mcp/types/sdk-custom'; import { MemoryService } from '../../../services/memory.service'; // Define discriminated union type for search handler results type SearchResult = | { status: 'success'; results: Array<{ id: string; type: string; score: number; content?: string; metadata?: Record<string, any>; }>; query: string; message: string; totalResults?: number; } | { status: 'error'; message: string; query?: string; }; describe('Semantic Search Tool Tests', () => { let mockMemoryService: jest.Mocked<MemoryService>; let mockContext: jest.Mocked<ToolHandlerContext>; beforeEach(() => { // Set NODE_ENV to test to trigger simple fallback search process.env.NODE_ENV = 'test'; mockMemoryService = { getKuzuClient: jest.fn().mockResolvedValue({ executeQuery: jest.fn().mockResolvedValue([]), }), } as any; // Mock context with session mockContext = { logger: { info: jest.fn(), error: jest.fn(), warn: jest.fn(), debug: jest.fn(), }, session: { clientProjectRoot: '/test/project', }, sendProgress: jest.fn(), request: {} as any, meta: {} as any, signal: {} as any, } as any; }); describe('Placeholder Implementation', () => { it('should return placeholder results for semantic search', async () => { const result = (await searchHandler( { mode: 'semantic', query: 'find authentication components', repository: 'test-repo', branch: 'main', }, mockContext, mockMemoryService, )) as SearchResult; if (result.status === 'success') { expect(result.status).toBe('success'); expect(result.results).toHaveLength(1); expect(result.results[0].id).toBe('placeholder-result'); expect(result.results[0].type).toBe('component'); expect(result.results[0].score).toBe(0.99); expect(result.query).toBe('find authentication components'); expect(result.message).toContain('semantic search completed successfully'); } else { fail('Expected result status to be success'); } }); it('should accept optional parameters', async () => { const result = (await searchHandler( { mode: 'semantic', query: 'database connections', repository: 'test-repo', entityTypes: ['components', 'decisions'], limit: 20, threshold: 0.8, }, mockContext, mockMemoryService, )) as SearchResult; if (result.status === 'success') { expect(result.status).toBe('success'); } else { fail('Expected result status to be success'); } expect(mockContext.logger.info).toHaveBeenCalledWith( 'Executing search operation: semantic', expect.objectContaining({ repository: 'test-repo', branch: 'main', clientProjectRoot: '/test/project', }), ); }); }); describe('Session Validation', () => { it('should throw error if no active session', async () => { const contextNoSession = { logger: { info: jest.fn(), error: jest.fn(), warn: jest.fn(), debug: jest.fn(), }, session: {}, sendProgress: jest.fn(), request: {} as any, meta: {} as any, signal: {} as any, } as any; await expect( searchHandler( { query: 'test query', repository: 'test-repo', }, contextNoSession, mockMemoryService, ), ).rejects.toThrow('No active session for search tool'); }); }); describe('Progress Reporting', () => { it('should report progress for placeholder search', async () => { await searchHandler( { mode: 'semantic', query: 'test query', repository: 'test-repo', }, mockContext, mockMemoryService, ); expect(mockContext.sendProgress).toHaveBeenCalledWith({ status: 'in_progress', message: 'Semantic search is a future capability - returning placeholder results', percent: 50, }); expect(mockContext.sendProgress).toHaveBeenCalledWith({ status: 'complete', message: 'Search completed with 1 results', percent: 100, isFinal: true, }); }); }); });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Jakedismo/KuzuMem-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server