Skip to main content
Glama
coverage-boost.test.ts9.92 kB
/** * Specific tests to boost coverage for under-tested files */ import { registerGetAnalyticsTool } from "../tools/contact-analytics"; import { registerGitHubActivityResource } from "../resources/github-activity"; // Don't mock the github-activity resource, use actual implementation // Mock Octokit const mockListPublicEventsForUser = jest.fn(); jest.mock("@octokit/rest", () => ({ Octokit: jest.fn().mockImplementation(() => ({ rest: { activity: { listPublicEventsForUser: mockListPublicEventsForUser, }, }, })), })); // Mock fetch global.fetch = jest.fn(); // Mock database with working methods const mockDb = { select: jest.fn().mockReturnThis(), from: jest.fn().mockReturnThis(), where: jest.fn().mockReturnThis(), insert: jest.fn().mockReturnThis(), values: jest.fn().mockReturnThis(), returning: jest.fn().mockReturnThis(), groupBy: jest.fn().mockReturnThis(), orderBy: jest.fn().mockReturnThis(), limit: jest.fn().mockReturnThis(), offset: jest.fn().mockReturnThis(), execute: jest.fn(), }; jest.mock("../database", () => ({ getDb: jest.fn(() => mockDb), })); const createMockServer = () => ({ registerTool: jest.fn(), registerResource: jest.fn(), }) as any; beforeEach(() => { jest.clearAllMocks(); mockDb.execute.mockResolvedValue([]); (global.fetch as jest.Mock).mockClear(); }); describe("Coverage Boost Tests", () => { describe("Contact Analytics - All Branch Coverage", () => { test("should handle summary report with data", async () => { const mockServer = createMockServer(); const mockEnv = { DB: {} as D1Database, MCP_OBJECT: {} as DurableObjectNamespace, ANALYTICS: {} as AnalyticsEngineDataset, } as unknown as Env; // Mock multiple return values for different queries mockDb.execute .mockResolvedValueOnce([ { purpose: "collaboration", count: 5 }, { purpose: "job_opportunity", count: 3 }, ]) .mockResolvedValueOnce([{ count: 10 }]); let toolHandler: any; (mockServer.registerTool as jest.Mock).mockImplementation((name, _schema, handler) => { if (name === "get_analytics") toolHandler = handler; }); registerGetAnalyticsTool(mockServer as any, mockEnv as Env); const result = await toolHandler({ report_type: "summary" }); expect(result.content[0].text).toBeDefined(); }); test("should handle purpose_breakdown report", async () => { const mockServer = createMockServer(); const mockEnv = { DB: {} as D1Database, MCP_OBJECT: {} as DurableObjectNamespace, ANALYTICS: {} as AnalyticsEngineDataset, } as unknown as Env; mockDb.execute.mockResolvedValueOnce([ { purpose: "collaboration", count: 8 }, { purpose: "job_opportunity", count: 5 }, { purpose: "consulting", count: 2 }, { purpose: "general_inquiry", count: 1 }, ]); let toolHandler: any; (mockServer.registerTool as jest.Mock).mockImplementation((name, _schema, handler) => { if (name === "get_analytics") toolHandler = handler; }); registerGetAnalyticsTool(mockServer as any, mockEnv as Env); const result = await toolHandler({ report_type: "purpose_breakdown" }); expect(result.content[0].text).toBeDefined(); }); test("should handle daily_trends report", async () => { const mockServer = createMockServer(); const mockEnv = { DB: {} as D1Database, MCP_OBJECT: {} as DurableObjectNamespace, ANALYTICS: {} as AnalyticsEngineDataset, } as unknown as Env; mockDb.execute.mockResolvedValueOnce([ { date: "2024-01-01", daily_total: 3 }, { date: "2024-01-02", daily_total: 5 }, { date: "2024-01-03", daily_total: 2 }, ]); let toolHandler: any; (mockServer.registerTool as jest.Mock).mockImplementation((name, _schema, handler) => { if (name === "get_analytics") toolHandler = handler; }); registerGetAnalyticsTool(mockServer as any, mockEnv as Env); const result = await toolHandler({ report_type: "daily_trends" }); expect(result.content[0].text).toBeDefined(); }); test("should handle recent_activity report", async () => { const mockServer = createMockServer(); const mockEnv = { DB: {} as D1Database, MCP_OBJECT: {} as DurableObjectNamespace, ANALYTICS: {} as AnalyticsEngineDataset, } as unknown as Env; mockDb.execute.mockResolvedValueOnce([ { purpose: "collaboration", total: 3, last_submission: "1704067200" }, { purpose: "job_opportunity", total: 2, last_submission: "1704153600" }, ]); let toolHandler: any; (mockServer.registerTool as jest.Mock).mockImplementation((name, _schema, handler) => { if (name === "get_analytics") toolHandler = handler; }); registerGetAnalyticsTool(mockServer as any, mockEnv as Env); const result = await toolHandler({ report_type: "recent_activity" }); expect(result.content[0].text).toBeDefined(); }); test("should handle custom_period with valid dates", async () => { const mockServer = createMockServer(); const mockEnv = { DB: {} as D1Database, MCP_OBJECT: {} as DurableObjectNamespace, ANALYTICS: {} as AnalyticsEngineDataset, } as unknown as Env; mockDb.execute.mockResolvedValueOnce([ { purpose: "collaboration", count: 4 }, { purpose: "consulting", count: 1 }, ]); let toolHandler: any; (mockServer.registerTool as jest.Mock).mockImplementation((name, _schema, handler) => { if (name === "get_analytics") toolHandler = handler; }); registerGetAnalyticsTool(mockServer as any, mockEnv as Env); const result = await toolHandler({ report_type: "custom_period", date_from: "2024-01-01", date_to: "2024-01-31", }); expect(result.content[0].text).toBeDefined(); }); test("should handle custom_period with invalid dates", async () => { const mockServer = createMockServer(); const mockEnv = { DB: {} as D1Database, MCP_OBJECT: {} as DurableObjectNamespace, ANALYTICS: {} as AnalyticsEngineDataset, } as unknown as Env; let toolHandler: any; (mockServer.registerTool as jest.Mock).mockImplementation((name, _schema, handler) => { if (name === "get_analytics") toolHandler = handler; }); registerGetAnalyticsTool(mockServer as any, mockEnv as Env); const result = await toolHandler({ report_type: "custom_period", date_from: "invalid-date", date_to: "2024-01-31", }); expect(result.content[0].text).toContain("Invalid date format"); }); }); describe("GitHub Activity - Success Paths", () => { beforeEach(() => { mockListPublicEventsForUser.mockReset(); }); test("should handle successful GitHub response with commits", async () => { const mockServer = createMockServer(); // Mock Octokit response mockListPublicEventsForUser.mockResolvedValue({ data: [ { type: "PushEvent", created_at: "2024-01-01T12:00:00Z", repo: { name: "duyet/test-repo" }, payload: { commits: [{ message: "Add new feature" }, { message: "Fix bug" }], }, }, { type: "IssuesEvent", created_at: "2024-01-02T14:00:00Z", repo: { name: "duyet/another-repo" }, payload: { action: "opened" }, }, ], }); let resourceHandler: any; (mockServer.registerResource as jest.Mock).mockImplementation( (name, _template, _metadata, handler) => { if (name === "github-activity") { resourceHandler = handler; } }, ); registerGitHubActivityResource(mockServer); const result = await resourceHandler(new URL("duyet://github/activity/10/true"), { limit: "10", include_details: "true", }); expect(result.contents[0].text).toContain("Recent GitHub Activity"); expect(result.contents[0].text).toContain("Pushed 2 commits"); expect(result.contents[0].text).toContain("Add new feature"); }); test("should handle GitHub response without details", async () => { const mockServer = createMockServer(); // Mock Octokit response mockListPublicEventsForUser.mockResolvedValue({ data: [ { type: "CreateEvent", created_at: "2024-01-03T16:00:00Z", repo: { name: "duyet/new-project" }, payload: { ref_type: "branch" }, }, ], }); let resourceHandler: any; (mockServer.registerResource as jest.Mock).mockImplementation( (name, _template, _metadata, handler) => { if (name === "github-activity") { resourceHandler = handler; } }, ); registerGitHubActivityResource(mockServer); const result = await resourceHandler(new URL("duyet://github/activity/5/false"), { limit: "5", include_details: "false", }); expect(result.contents[0].text).toContain("Recent GitHub Activity"); expect(result.contents[0].text).toContain("Created branch"); }); test("should handle different event types", async () => { const mockServer = createMockServer(); // Mock Octokit response mockListPublicEventsForUser.mockResolvedValue({ data: [ { type: "WatchEvent", created_at: "2024-01-04T18:00:00Z", repo: { name: "duyet/starred-repo" }, payload: { action: "started" }, }, { type: "ForkEvent", created_at: "2024-01-05T20:00:00Z", repo: { name: "duyet/forked-repo" }, payload: {}, }, ], }); let resourceHandler: any; (mockServer.registerResource as jest.Mock).mockImplementation( (name, _template, _metadata, handler) => { if (name === "github-activity") { resourceHandler = handler; } }, ); registerGitHubActivityResource(mockServer); const result = await resourceHandler(new URL("duyet://github/activity/2/true"), { limit: "2", include_details: "true", }); expect(result.contents[0].text).toContain("Recent GitHub Activity"); expect(result.contents[0].text).toContain("Starred repository"); expect(result.contents[0].text).toContain("Forked repository"); }); }); });

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

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