test-connection.jsโข7.78 kB
/**
* Test Connection Script
* Verifies all components are working correctly
*/
const WebSocket = require('ws');
const { Client } = require('@modelcontextprotocol/sdk/client/index.js');
const { StdioClientTransport } = require('@modelcontextprotocol/sdk/client/stdio.js');
const path = require('path');
const fs = require('fs').promises;
console.log('๐งช Voice Assistant Test Suite\n');
const tests = {
fileSystem: false,
database: false,
scsMcp: false,
elevenLabs: false,
browserMcp: false,
webSocket: false,
httpServer: false
};
async function testFileSystem() {
console.log('๐ Testing file system...');
try {
const dirs = ['media', 'data', 'logs'];
for (const dir of dirs) {
await fs.access(path.join(__dirname, dir));
}
tests.fileSystem = true;
console.log('โ
File system ready\n');
} catch (error) {
console.log('โ File system not initialized. Run: npm run setup\n');
}
}
async function testDatabase() {
console.log('๐พ Testing database...');
try {
const { initializeDatabase } = require('./db-init');
const db = await initializeDatabase();
// Test query
await new Promise((resolve, reject) => {
db.get('SELECT COUNT(*) as count FROM media_items', (err, row) => {
if (err) reject(err);
else resolve(row);
});
});
db.close();
tests.database = true;
console.log('โ
Database connected\n');
} catch (error) {
console.log(`โ Database error: ${error.message}\n`);
}
}
async function testScsMcp() {
console.log('๐ Testing SCS-MCP connection...');
try {
const transport = new StdioClientTransport({
command: 'node',
args: [path.join(__dirname, '../src/index.js')],
env: { ...process.env, PROJECT_ROOT: path.dirname(__dirname) }
});
const client = new Client({
name: 'test-client',
version: '1.0.0'
}, {
capabilities: {}
});
await client.connect(transport);
// Test tool listing
const tools = await client.listTools();
console.log(` Found ${tools.tools?.length || 0} tools`);
await client.close();
tests.scsMcp = true;
console.log('โ
SCS-MCP connected\n');
} catch (error) {
console.log(`โ SCS-MCP error: ${error.message}\n`);
}
}
async function testElevenLabs() {
console.log('๐ค Testing ElevenLabs MCP...');
if (!process.env.ELEVENLABS_API_KEY) {
console.log('โ ๏ธ ElevenLabs API key not configured (optional)\n');
return;
}
try {
const transport = new StdioClientTransport({
command: 'npx',
args: ['-y', '@modelcontextprotocol/server-elevenlabs'],
env: { ...process.env }
});
const client = new Client({
name: 'test-elevenlabs',
version: '1.0.0'
}, {
capabilities: {}
});
await client.connect(transport);
// Test tool listing
const tools = await client.listTools();
console.log(` Found ${tools.tools?.length || 0} voice tools`);
await client.close();
tests.elevenLabs = true;
console.log('โ
ElevenLabs connected\n');
} catch (error) {
console.log(`โ ๏ธ ElevenLabs not available: ${error.message}\n`);
}
}
async function testBrowserMcp() {
console.log('๐ Testing Browser MCP...');
try {
const { BrowserMCP } = require('./browser-mcp');
const browser = new BrowserMCP();
const connected = await browser.connect();
if (connected) {
console.log(` Capabilities: ${browser.capabilities?.tools?.length || 0} tools`);
await browser.disconnect();
tests.browserMcp = true;
console.log('โ
Browser MCP connected\n');
} else {
console.log('โ ๏ธ Browser MCP not available (optional)\n');
}
} catch (error) {
console.log(`โ ๏ธ Browser MCP error: ${error.message}\n`);
}
}
async function testWebSocket() {
console.log('๐ Testing WebSocket server...');
return new Promise((resolve) => {
const ws = new WebSocket('ws://localhost:3001');
ws.on('open', () => {
tests.webSocket = true;
console.log('โ
WebSocket server running\n');
ws.close();
resolve();
});
ws.on('error', (error) => {
console.log('โ WebSocket server not running. Start with: npm start\n');
resolve();
});
setTimeout(() => {
ws.close();
resolve();
}, 2000);
});
}
async function testHttpServer() {
console.log('๐ Testing HTTP server...');
try {
const http = require('http');
return new Promise((resolve) => {
http.get('http://localhost:3000/health', (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
try {
const health = JSON.parse(data);
console.log(` Status: ${health.status}`);
console.log(` Clients: ${health.wsClients || 0}`);
tests.httpServer = true;
console.log('โ
HTTP server running\n');
} catch (error) {
console.log('โ Invalid response from server\n');
}
resolve();
});
}).on('error', (error) => {
console.log('โ HTTP server not running. Start with: npm start\n');
resolve();
});
});
} catch (error) {
console.log(`โ HTTP test error: ${error.message}\n`);
}
}
async function runTests() {
console.log('Starting tests...\n');
console.log('=' .repeat(50) + '\n');
// Run tests in sequence
await testFileSystem();
await testDatabase();
await testScsMcp();
await testElevenLabs();
await testBrowserMcp();
await testWebSocket();
await testHttpServer();
// Summary
console.log('=' .repeat(50));
console.log('\n๐ Test Summary:\n');
const results = Object.entries(tests).map(([name, passed]) => {
const icon = passed ? 'โ
' : 'โ';
const status = passed ? 'PASS' : 'FAIL';
return ` ${icon} ${name.padEnd(15)} ${status}`;
});
console.log(results.join('\n'));
const passed = Object.values(tests).filter(t => t).length;
const total = Object.keys(tests).length;
const percentage = Math.round(passed / total * 100);
console.log(`\n๐ฏ Score: ${passed}/${total} (${percentage}%)\n`);
if (passed === total) {
console.log('๐ All tests passed! System ready.\n');
} else if (passed >= total - 2) {
console.log('โจ Core systems operational. Optional features may be unavailable.\n');
} else {
console.log('โ ๏ธ Some required components are not working. Please check setup.\n');
console.log('Run: npm run setup\n');
}
// Exit code based on critical tests
const criticalTests = tests.fileSystem && tests.database && tests.scsMcp;
process.exit(criticalTests ? 0 : 1);
}
// Run tests
runTests().catch(error => {
console.error('Test suite failed:', error);
process.exit(1);
});