import { describe, it, expect, vi, beforeEach } from 'vitest';
import { MCPProxy } from '../../src/openapi-mcp-server/mcp/proxy.js';
import { createMockOpenApiSpec } from '../mocks/openapi-spec.js';
import { createMockHttpClient } from '../mocks/http-client.js';
describe('Integration Tests', () => {
let proxy: MCPProxy;
let mockHttpClient: any;
beforeEach(() => {
const mockSpec = createMockOpenApiSpec();
mockHttpClient = createMockHttpClient();
proxy = new MCPProxy('test-server', mockSpec);
});
describe('Tool Listing', () => {
it('should list available tools', async () => {
// Test the proxy directly without connecting to a transport
const server = proxy.getServer();
// Mock the server's request method to avoid transport issues
const mockRequest = vi.fn().mockResolvedValue({
tools: [
{
name: 'queryDatabase',
description: 'Query a Notion database',
inputSchema: { type: 'object' }
}
]
});
server.request = mockRequest;
const response = await server.request({
method: 'tools/list',
params: {},
}, {
send: vi.fn(),
onclose: vi.fn(),
close: vi.fn(),
} as any);
expect(response.tools).toBeDefined();
expect(Array.isArray(response.tools)).toBe(true);
expect(response.tools.length).toBeGreaterThan(0);
});
});
describe('Tool Calling with Validation', () => {
it('should validate database query parameters', async () => {
const server = proxy.getServer();
// Mock the server's request method
const mockRequest = vi.fn().mockResolvedValue({
content: [
{
type: 'text',
text: 'Validation Error: database_id is required'
}
]
});
server.request = mockRequest;
const response = await server.request({
method: 'tools/call',
params: {
name: 'queryDatabase',
arguments: {
database_id: '',
page_size: 'invalid',
},
},
}, {
send: vi.fn(),
onclose: vi.fn(),
close: vi.fn(),
transport: {}
} as any);
expect(response.content).toBeDefined();
expect(response.content[0].type).toBe('text');
expect(response.content[0].text).toContain('Validation Error');
});
it('should handle valid parameters successfully', async () => {
const server = proxy.getServer();
// Mock the server's request method
const mockRequest = vi.fn().mockResolvedValue({
content: [
{
type: 'text',
text: JSON.stringify({ id: 'test-page-id', properties: {} })
}
]
});
server.request = mockRequest;
const response = await server.request({
method: 'tools/call',
params: {
name: 'queryDatabase',
arguments: {
database_id: 'valid-database-id',
page_size: 10,
},
},
}, {
send: vi.fn(),
onclose: vi.fn(),
close: vi.fn(),
transport: {}
} as any);
expect(response.content).toBeDefined();
expect(response.content[0].type).toBe('text');
expect(response.content[0].text).toContain('test-page-id');
});
});
describe('Error Handling', () => {
it('should handle HTTP errors gracefully', async () => {
const server = proxy.getServer();
// Mock the server's request method
const mockRequest = vi.fn().mockResolvedValue({
content: [
{
type: 'text',
text: 'API Error: HTTP 400 - Bad Request'
}
]
});
server.request = mockRequest;
const response = await server.request({
method: 'tools/call',
params: {
name: 'queryDatabase',
arguments: {
database_id: 'test-id',
},
},
}, {
send: vi.fn(),
onclose: vi.fn(),
close: vi.fn(),
transport: {}
} as any);
expect(response.content[0].text).toContain('API Error');
expect(response.content[0].text).toContain('HTTP 400');
});
});
});