Skip to main content
Glama
tool-registration.test.ts6.9 kB
/** * @fileoverview Tests for tool registration module */ import { vi } from 'vitest'; import { registerDeepSourceTools, ToolCategory, getToolsByCategory, getToolsByTag, getPaginatedTools, TOOL_METADATA, } from '../../server/tool-registration.js'; import { ToolRegistry } from '../../server/tool-registry.js'; // Mock dependencies vi.mock('../../utils/logging/logger.js', () => ({ createLogger: vi.fn(() => ({ info: vi.fn(), debug: vi.fn(), warn: vi.fn(), error: vi.fn(), })), })); vi.mock('../../handlers/index.js', () => ({ handleProjects: vi.fn().mockResolvedValue({ content: [{ text: '[]' }] }), handleDeepsourceQualityMetrics: vi.fn().mockResolvedValue({ content: [{ text: '{}' }] }), handleDeepsourceUpdateMetricThreshold: vi.fn().mockResolvedValue({ content: [{ text: '{}' }] }), handleDeepsourceUpdateMetricSetting: vi.fn().mockResolvedValue({ content: [{ text: '{}' }] }), handleDeepsourceComplianceReport: vi.fn().mockResolvedValue({ content: [{ text: '{}' }] }), handleDeepsourceProjectIssues: vi.fn().mockResolvedValue({ content: [{ text: '{}' }] }), handleDeepsourceProjectRuns: vi.fn().mockResolvedValue({ content: [{ text: '{}' }] }), handleDeepsourceRun: vi.fn().mockResolvedValue({ content: [{ text: '{}' }] }), handleDeepsourceRecentRunIssues: vi.fn().mockResolvedValue({ content: [{ text: '{}' }] }), handleDeepsourceDependencyVulnerabilities: vi .fn() .mockResolvedValue({ content: [{ text: '{}' }] }), })); describe('Tool Registration', () => { describe('registerDeepSourceTools', () => { it('should register all DeepSource tools', () => { const mockRegistry = { registerTools: vi.fn(), } as unknown as ToolRegistry; registerDeepSourceTools(mockRegistry); expect(mockRegistry.registerTools).toHaveBeenCalledTimes(1); const mockRegisterTools = mockRegistry.registerTools as ReturnType<typeof vi.fn>; const registeredTools = mockRegisterTools.mock.calls[0][0]; expect(registeredTools).toHaveLength(10); // 10 DeepSource tools expect(registeredTools.map((t: { name: string }) => t.name)).toEqual([ 'projects', 'quality_metrics', 'update_metric_threshold', 'update_metric_setting', 'compliance_report', 'project_issues', 'runs', 'run', 'recent_run_issues', 'dependency_vulnerabilities', ]); }); it('should handle tools with parameter transformations', () => { const mockRegistry = { registerTools: vi.fn(), } as unknown as ToolRegistry; registerDeepSourceTools(mockRegistry); const mockRegisterTools = mockRegistry.registerTools as ReturnType<typeof vi.fn>; const registeredTools = mockRegisterTools.mock.calls[0][0]; // Find tools that need parameter transformations const updateMetricThresholdTool = registeredTools.find( (t: { name: string }) => t.name === 'update_metric_threshold' ); const runsTool = registeredTools.find((t: { name: string }) => t.name === 'runs'); expect(updateMetricThresholdTool).toBeDefined(); expect(runsTool).toBeDefined(); }); }); describe('Tool Metadata', () => { it('should have metadata for all tools', () => { const expectedTools = [ 'projects', 'quality_metrics', 'update_metric_threshold', 'update_metric_setting', 'compliance_report', 'project_issues', 'runs', 'run', 'recent_run_issues', 'dependency_vulnerabilities', ]; expectedTools.forEach((toolName) => { expect(TOOL_METADATA[toolName]).toBeDefined(); expect(TOOL_METADATA[toolName].category).toBeDefined(); expect(TOOL_METADATA[toolName].tags).toBeInstanceOf(Array); expect(TOOL_METADATA[toolName].requiresAuth).toBe(true); expect(typeof TOOL_METADATA[toolName].supportsFiltering).toBe('boolean'); expect(typeof TOOL_METADATA[toolName].supportsPagination).toBe('boolean'); }); }); }); describe('getToolsByCategory', () => { it('should return tools for project management category', () => { const tools = getToolsByCategory(ToolCategory.PROJECT_MANAGEMENT); expect(tools).toEqual(['projects']); }); it('should return tools for code quality category', () => { const tools = getToolsByCategory(ToolCategory.CODE_QUALITY); expect(tools).toContain('quality_metrics'); expect(tools).toContain('update_metric_threshold'); expect(tools).toContain('update_metric_setting'); expect(tools).toContain('project_issues'); }); it('should return tools for security category', () => { const tools = getToolsByCategory(ToolCategory.SECURITY); expect(tools).toEqual(['compliance_report']); }); it('should return tools for analysis category', () => { const tools = getToolsByCategory(ToolCategory.ANALYSIS); expect(tools).toContain('runs'); expect(tools).toContain('run'); expect(tools).toContain('recent_run_issues'); }); it('should return tools for dependencies category', () => { const tools = getToolsByCategory(ToolCategory.DEPENDENCIES); expect(tools).toEqual(['dependency_vulnerabilities']); }); }); describe('getToolsByTag', () => { it('should return tools with metrics tag', () => { const tools = getToolsByTag('metrics'); expect(tools).toContain('quality_metrics'); expect(tools).toContain('update_metric_threshold'); expect(tools).toContain('update_metric_setting'); }); it('should return tools with security tag', () => { const tools = getToolsByTag('security'); expect(tools).toContain('compliance_report'); expect(tools).toContain('dependency_vulnerabilities'); }); it('should return tools with list tag', () => { const tools = getToolsByTag('list'); expect(tools).toContain('projects'); expect(tools).toContain('project_issues'); expect(tools).toContain('runs'); expect(tools).toContain('dependency_vulnerabilities'); }); it('should return tools with mutation tag', () => { const tools = getToolsByTag('mutation'); expect(tools).toContain('update_metric_threshold'); expect(tools).toContain('update_metric_setting'); }); }); describe('getPaginatedTools', () => { it('should return tools that support pagination', () => { const tools = getPaginatedTools(); expect(tools).toContain('project_issues'); expect(tools).toContain('runs'); expect(tools).toContain('recent_run_issues'); expect(tools).toContain('dependency_vulnerabilities'); expect(tools).not.toContain('projects'); expect(tools).not.toContain('quality_metrics'); expect(tools).not.toContain('compliance_report'); }); }); });

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/sapientpants/deepsource-mcp-server'

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