npmplus-mcp-server
Version:
Production-ready MCP server for intelligent JavaScript package management. Works with Claude, Windsurf, Cursor, VS Code, and any MCP-compatible AI editor.
175 lines (145 loc) • 5.15 kB
text/typescript
import { describe, it, expect, beforeEach } from '@jest/globals';
// Mock external dependencies
import { jest } from '@jest/globals';
describe('MCP GET Endpoint Integration Tests', () => {
let mcpHandler: any;
beforeEach(async () => {
// Dynamically import the MCP handler
try {
const mcpModule = await import('../../netlify/functions/npmplus-mcp.cjs');
mcpHandler = mcpModule.handler;
} catch (error) {
mcpHandler = null;
}
});
describe('Service Discovery via GET', () => {
it('should return server capabilities for service discovery', async () => {
if (!mcpHandler) {
console.warn('MCP handler not available for testing');
return;
}
const event = {
httpMethod: 'GET',
headers: {
'User-Agent': 'Cursor/1.0'
}
};
const result = await mcpHandler(event, {});
// Validate response structure
expect(result.statusCode).toBe(200);
expect(result.headers['Content-Type']).toBe('application/json');
expect(result.headers['Access-Control-Allow-Origin']).toBe('*');
// Parse and validate response body
const responseBody = JSON.parse(result.body);
expect(responseBody).toMatchObject({
name: 'npmplus-mcp',
version: expect.stringMatching(/^\d+\.\d+\.\d+$/),
description: expect.stringContaining('JavaScript Package Manager'),
capabilities: {
tools: {},
server: {
name: 'npmplus-mcp',
version: expect.stringMatching(/^\d+\.\d+\.\d+$/)
}
},
endpoints: {
initialize: 'POST /',
'tools/list': 'POST /',
'tools/call': 'POST /'
}
});
});
it('should handle CORS properly for GET requests', async () => {
if (!mcpHandler) {
console.warn('MCP handler not available for testing');
return;
}
const event = {
httpMethod: 'GET',
headers: {
'Origin': 'https://example.com',
'User-Agent': 'Test/1.0'
}
};
const result = await mcpHandler(event, {});
expect(result.headers).toMatchObject({
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Content-Type, Authorization, User-Agent',
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS'
});
});
it('should return consistent version across all fields', async () => {
if (!mcpHandler) {
console.warn('MCP handler not available for testing');
return;
}
const event = {
httpMethod: 'GET',
headers: {}
};
const result = await mcpHandler(event, {});
const responseBody = JSON.parse(result.body);
// Version should be consistent across response
expect(responseBody.version).toBe(responseBody.capabilities.server.version);
expect(responseBody.version).toMatch(/^\d+\.\d+\.\d+$/);
});
it('should provide service information for HTTP transport clients', async () => {
if (!mcpHandler) {
console.warn('MCP handler not available for testing');
return;
}
const event = {
httpMethod: 'GET',
headers: {
'User-Agent': 'Cursor/1.86.1'
}
};
const result = await mcpHandler(event, {});
const responseBody = JSON.parse(result.body);
// Validate that it provides useful information for HTTP clients
expect(responseBody.endpoints).toBeDefined();
expect(responseBody.capabilities).toBeDefined();
expect(responseBody.description).toContain('MCP Server');
// Should list available MCP methods
expect(responseBody.endpoints).toHaveProperty('initialize');
expect(responseBody.endpoints).toHaveProperty('tools/list');
expect(responseBody.endpoints).toHaveProperty('tools/call');
});
});
describe('Error Handling for GET requests', () => {
it('should handle GET requests gracefully even with query parameters', async () => {
if (!mcpHandler) {
console.warn('MCP handler not available for testing');
return;
}
const event = {
httpMethod: 'GET',
queryStringParameters: {
test: 'value'
},
headers: {}
};
const result = await mcpHandler(event, {});
expect(result.statusCode).toBe(200);
expect(result.headers['Content-Type']).toBe('application/json');
// Should still return valid service discovery info
const responseBody = JSON.parse(result.body);
expect(responseBody.name).toBe('npmplus-mcp');
});
it('should return valid JSON even for malformed requests', async () => {
if (!mcpHandler) {
console.warn('MCP handler not available for testing');
return;
}
const event = {
httpMethod: 'GET',
headers: {
'Invalid-Header': 'test\x00null'
}
};
const result = await mcpHandler(event, {});
expect(result.statusCode).toBe(200);
expect(() => JSON.parse(result.body)).not.toThrow();
});
});
});