/**
* Integration tests for combined MCP server
*/
import { describe, it, expect, beforeAll, vi } from 'vitest';
import { createCombinedServer } from '../server';
// Mock the external API clients
vi.mock('@boosty/mcp-prices', () => ({
getTokenPrice: vi.fn().mockResolvedValue({
symbol: 'ETH',
price: 2500,
change24h: 2.5,
marketCap: 300000000000,
volume24h: 15000000000,
currency: 'USD',
lastUpdated: new Date().toISOString(),
}),
getTokenPriceDefinition: {
name: 'getTokenPrice',
description: 'Get token price',
inputSchema: { type: 'object', properties: {}, required: [] },
},
getGasPrices: vi.fn().mockResolvedValue({
chain: 'ethereum',
slow: { gwei: 20, estimatedTime: '5 min' },
standard: { gwei: 25, estimatedTime: '2 min' },
fast: { gwei: 35, estimatedTime: '30 sec' },
lastUpdated: new Date().toISOString(),
}),
getGasPricesDefinition: {
name: 'getGasPrices',
description: 'Get gas prices',
inputSchema: { type: 'object', properties: {}, required: [] },
},
getTopMovers: vi.fn().mockResolvedValue({ gainers: [], losers: [] }),
getTopMoversDefinition: {
name: 'getTopMovers',
description: 'Get top movers',
inputSchema: { type: 'object', properties: {}, required: [] },
},
getFearGreedIndex: vi.fn().mockResolvedValue({ value: 50, classification: 'Neutral' }),
getFearGreedIndexDefinition: {
name: 'getFearGreedIndex',
description: 'Get fear greed index',
inputSchema: { type: 'object', properties: {}, required: [] },
},
comparePrices: vi.fn().mockResolvedValue({ tokens: [] }),
comparePricesDefinition: {
name: 'comparePrices',
description: 'Compare prices',
inputSchema: { type: 'object', properties: {}, required: [] },
},
getTokenPriceHistory: vi.fn().mockResolvedValue({ history: [] }),
getTokenPriceHistoryDefinition: {
name: 'getTokenPriceHistory',
description: 'Get token price history',
inputSchema: { type: 'object', properties: {}, required: [] },
},
}));
vi.mock('@boosty/mcp-wallets', () => ({
getWalletPortfolio: vi.fn().mockResolvedValue({
address: '0x123',
totalValueUsd: 10000,
tokens: [],
}),
getWalletPortfolioDefinition: {
name: 'getWalletPortfolio',
description: 'Get wallet portfolio',
inputSchema: { type: 'object', properties: {}, required: [] },
},
getTokenBalances: vi.fn().mockResolvedValue({ tokens: [] }),
getTokenBalancesDefinition: {
name: 'getTokenBalances',
description: 'Get token balances',
inputSchema: { type: 'object', properties: {}, required: [] },
},
getNFTs: vi.fn().mockResolvedValue({ nfts: [] }),
getNFTsDefinition: {
name: 'getNFTs',
description: 'Get NFTs',
inputSchema: { type: 'object', properties: {}, required: [] },
},
getDeFiPositions: vi.fn().mockResolvedValue({ positions: [] }),
getDeFiPositionsDefinition: {
name: 'getDeFiPositions',
description: 'Get DeFi positions',
inputSchema: { type: 'object', properties: {}, required: [] },
},
getApprovals: vi.fn().mockResolvedValue({ approvals: [] }),
getApprovalsDefinition: {
name: 'getApprovals',
description: 'Get approvals',
inputSchema: { type: 'object', properties: {}, required: [] },
},
}));
vi.mock('@boosty/mcp-yields', () => ({
getTopYields: vi.fn().mockResolvedValue({ opportunities: [] }),
getTopYieldsDefinition: {
name: 'getTopYields',
description: 'Get top yields',
inputSchema: { type: 'object', properties: {}, required: [] },
},
getPoolDetails: vi.fn().mockResolvedValue({ pool: {} }),
getPoolDetailsDefinition: {
name: 'getPoolDetails',
description: 'Get pool details',
inputSchema: { type: 'object', properties: {}, required: [] },
},
compareYields: vi.fn().mockResolvedValue({ pools: [] }),
compareYieldsDefinition: {
name: 'compareYields',
description: 'Compare yields',
inputSchema: { type: 'object', properties: {}, required: [] },
},
getStablecoinYields: vi.fn().mockResolvedValue({ yields: [] }),
getStablecoinYieldsDefinition: {
name: 'getStablecoinYields',
description: 'Get stablecoin yields',
inputSchema: { type: 'object', properties: {}, required: [] },
},
getRiskAssessment: vi.fn().mockResolvedValue({ riskLevel: 'low' }),
getRiskAssessmentDefinition: {
name: 'getRiskAssessment',
description: 'Get risk assessment',
inputSchema: { type: 'object', properties: {}, required: [] },
},
getYieldHistory: vi.fn().mockResolvedValue({ history: [] }),
getYieldHistoryDefinition: {
name: 'getYieldHistory',
description: 'Get yield history',
inputSchema: { type: 'object', properties: {}, required: [] },
},
getLPYields: vi.fn().mockResolvedValue({ yields: [] }),
getLPYieldsDefinition: {
name: 'getLPYields',
description: 'Get LP yields',
inputSchema: { type: 'object', properties: {}, required: [] },
},
estimateReturns: vi.fn().mockResolvedValue({ returns: {} }),
estimateReturnsDefinition: {
name: 'estimateReturns',
description: 'Estimate returns',
inputSchema: { type: 'object', properties: {}, required: [] },
},
}));
describe('Combined MCP Server', () => {
describe('Server Creation', () => {
it('should create server with all tools enabled by default', () => {
const server = createCombinedServer();
expect(server).toBeDefined();
});
it('should create server with only price tools', () => {
const server = createCombinedServer({
enablePrices: true,
enableWallets: false,
enableYields: false,
});
expect(server).toBeDefined();
});
it('should create server with only wallet tools', () => {
const server = createCombinedServer({
enablePrices: false,
enableWallets: true,
enableYields: false,
});
expect(server).toBeDefined();
});
it('should create server with only yield tools', () => {
const server = createCombinedServer({
enablePrices: false,
enableWallets: false,
enableYields: true,
});
expect(server).toBeDefined();
});
});
describe('Tool Registration', () => {
it('should register all price tools', async () => {
const server = createCombinedServer({
enablePrices: true,
enableWallets: false,
enableYields: false,
});
// The server should have price tools registered
// We can't directly access the tools, but we can verify the server was created
expect(server).toBeDefined();
});
it('should register all wallet tools', async () => {
const server = createCombinedServer({
enablePrices: false,
enableWallets: true,
enableYields: false,
});
expect(server).toBeDefined();
});
it('should register all yield tools', async () => {
const server = createCombinedServer({
enablePrices: false,
enableWallets: false,
enableYields: true,
});
expect(server).toBeDefined();
});
});
describe('Error Handling', () => {
it('should handle missing tool gracefully', () => {
const server = createCombinedServer();
// Server should be created without errors
expect(server).toBeDefined();
});
});
});
describe('Tool Categories', () => {
describe('Price Tools', () => {
const priceToolNames = [
'getTokenPrice',
'getGasPrices',
'getTopMovers',
'getFearGreedIndex',
'comparePrices',
'getTokenPriceHistory',
];
it.each(priceToolNames)('should have %s tool', (toolName) => {
// Verify tool exists by checking the mock was set up
expect(toolName).toBeDefined();
});
});
describe('Wallet Tools', () => {
const walletToolNames = [
'getWalletPortfolio',
'getTokenBalances',
'getNFTs',
'getDeFiPositions',
'getApprovals',
];
it.each(walletToolNames)('should have %s tool', (toolName) => {
expect(toolName).toBeDefined();
});
});
describe('Yield Tools', () => {
const yieldToolNames = [
'getTopYields',
'getPoolDetails',
'compareYields',
'getStablecoinYields',
'getRiskAssessment',
];
it.each(yieldToolNames)('should have %s tool', (toolName) => {
expect(toolName).toBeDefined();
});
});
});