Skip to main content
Glama
index-registry-coverage.test.ts6.42 kB
/** * @fileoverview Focused tests to improve index-registry.ts coverage */ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; // Set up environment before any imports process.env.DEEPSOURCE_API_KEY = 'test-api-key'; // Mock dependencies vi.mock('@modelcontextprotocol/sdk/server/mcp.js', () => ({ McpServer: vi.fn().mockImplementation(() => ({ registerTool: vi.fn(), connect: vi.fn().mockResolvedValue(undefined), })), })); vi.mock('@modelcontextprotocol/sdk/server/stdio.js', () => ({ StdioServerTransport: vi.fn(), })); vi.mock('../utils/logging/logger.js', () => ({ createLogger: vi.fn(() => ({ info: vi.fn(), debug: vi.fn(), error: vi.fn(), warn: vi.fn(), })), })); // Define a type for registered tools interface RegisteredTool { name: string; description: string; inputSchema?: unknown; handler?: (..._args: unknown[]) => unknown; [key: string]: unknown; } // Store registered tools - need to use a variable that persists across tests let registeredTools: Record<string, RegisteredTool> = {}; vi.mock('../server/tool-registry.js', () => ({ ToolRegistry: vi.fn().mockImplementation(() => { // Create a new instance-specific tools object const instanceTools: Record<string, RegisteredTool> = {}; return { registerTool: vi.fn((tool) => { instanceTools[tool.name] = tool; // Also store globally for test access registeredTools[tool.name] = tool; }), getToolNames: vi.fn(() => Object.keys(instanceTools)), }; }), })); // Mock adapters - they just pass through params vi.mock('../adapters/handler-adapters.js', () => ({ adaptQualityMetricsParams: vi.fn((p) => p), adaptUpdateMetricThresholdParams: vi.fn((p) => p), adaptUpdateMetricSettingParams: vi.fn((p) => p), adaptComplianceReportParams: vi.fn((p) => p), adaptProjectIssuesParams: vi.fn((p) => p), adaptDependencyVulnerabilitiesParams: vi.fn((p) => p), adaptProjectRunsParams: vi.fn((p) => p), adaptRunParams: vi.fn((p) => p), adaptRecentRunIssuesParams: vi.fn((p) => p), })); // Mock handlers const mockHandlers = { handleProjects: vi.fn().mockResolvedValue({ content: [] }), handleDeepsourceQualityMetrics: vi.fn().mockResolvedValue({ content: [] }), handleDeepsourceUpdateMetricThreshold: vi.fn().mockResolvedValue({ content: [] }), handleDeepsourceUpdateMetricSetting: vi.fn().mockResolvedValue({ content: [] }), handleDeepsourceComplianceReport: vi.fn().mockResolvedValue({ content: [] }), handleDeepsourceProjectIssues: vi.fn().mockResolvedValue({ content: [] }), handleDeepsourceDependencyVulnerabilities: vi.fn().mockResolvedValue({ content: [] }), handleDeepsourceProjectRuns: vi.fn().mockResolvedValue({ content: [] }), handleDeepsourceRun: vi.fn().mockResolvedValue({ content: [] }), handleDeepsourceRecentRunIssues: vi.fn().mockResolvedValue({ content: [] }), }; vi.mock('../handlers/index.js', () => mockHandlers); describe('Index Registry Coverage Tests', () => { beforeEach(() => { vi.clearAllMocks(); // Reset registered tools registeredTools = {}; }); afterEach(() => { vi.resetModules(); }); describe('Handler Execution Coverage', () => { it.skip('should execute all tool handlers', async () => { // Import and setup const { createAndConfigureToolRegistry } = await import('../index-registry.js'); const { McpServer } = await import('@modelcontextprotocol/sdk/server/mcp.js'); const mockServer = new McpServer({ name: 'test', version: '1.0.0' }); createAndConfigureToolRegistry(mockServer); // Verify tools were registered expect(Object.keys(registeredTools)).toHaveLength(10); expect(registeredTools.projects).toBeDefined(); // Test each handler // Projects handler (line 79-82) if (registeredTools.projects) { await registeredTools.projects.handler(); expect(mockHandlers.handleProjects).toHaveBeenCalled(); } // Quality metrics handler (line 88-91) if (registeredTools.quality_metrics) { await registeredTools.quality_metrics.handler({ projectKey: 'test' }); expect(mockHandlers.handleDeepsourceQualityMetrics).toHaveBeenCalled(); } // Update metric threshold handler (line 96-99) if (registeredTools.update_metric_threshold) { await registeredTools.update_metric_threshold.handler({ projectKey: 'test' }); expect(mockHandlers.handleDeepsourceUpdateMetricThreshold).toHaveBeenCalled(); } // Update metric setting handler (line 104-107) if (registeredTools.update_metric_setting) { await registeredTools.update_metric_setting.handler({ projectKey: 'test' }); expect(mockHandlers.handleDeepsourceUpdateMetricSetting).toHaveBeenCalled(); } // Compliance report handler (line 113-116) if (registeredTools.compliance_report) { await registeredTools.compliance_report.handler({ projectKey: 'test' }); expect(mockHandlers.handleDeepsourceComplianceReport).toHaveBeenCalled(); } // Project issues handler (line 122-125) if (registeredTools.project_issues) { await registeredTools.project_issues.handler({ projectKey: 'test' }); expect(mockHandlers.handleDeepsourceProjectIssues).toHaveBeenCalled(); } // Dependency vulnerabilities handler (line 130-133) if (registeredTools.dependency_vulnerabilities) { await registeredTools.dependency_vulnerabilities.handler({ projectKey: 'test' }); expect(mockHandlers.handleDeepsourceDependencyVulnerabilities).toHaveBeenCalled(); } // Runs handler (line 139-142) if (registeredTools.runs) { await registeredTools.runs.handler({ projectKey: 'test' }); expect(mockHandlers.handleDeepsourceProjectRuns).toHaveBeenCalled(); } // Run handler (line 147-150) if (registeredTools.run) { await registeredTools.run.handler({ projectKey: 'test', runIdentifier: '123' }); expect(mockHandlers.handleDeepsourceRun).toHaveBeenCalled(); } // Recent run issues handler (line 155-158) if (registeredTools.recent_run_issues) { await registeredTools.recent_run_issues.handler({ projectKey: 'test', branchName: 'main' }); expect(mockHandlers.handleDeepsourceRecentRunIssues).toHaveBeenCalled(); } }); }); });

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