Skip to main content
Glama
simple-test-runner.cjsโ€ข5.15 kB
#!/usr/bin/env node /** * Simple Test Runner - Works with existing database structure * Used as singleton test when FTS is not available */ const fs = require('fs'); const path = require('path'); const { SimpleEGWDatabase } = require('./database-utils.js'); const STATUS_FILE = path.join(__dirname, 'test-process-status.json'); // Create status file to indicate we're running function createStatusFile(pid, message = 'Starting...', progress = 0) { const status = { isRunning: true, pid: pid, startedAt: new Date().toISOString(), lastUpdate: new Date().toISOString(), message: message, progress: progress }; fs.writeFileSync(STATUS_FILE, JSON.stringify(status, null, 2)); return status; } // Update status file function updateStatus(message, progress) { try { if (!fs.existsSync(STATUS_FILE)) return; const status = JSON.parse(fs.readFileSync(STATUS_FILE, 'utf8')); status.lastUpdate = new Date().toISOString(); status.message = message; status.progress = progress; fs.writeFileSync(STATUS_FILE, JSON.stringify(status, null, 2)); } catch (error) { // Ignore status file errors during test execution } } // Clean up status file function cleanupStatusFile() { try { if (fs.existsSync(STATUS_FILE)) { fs.unlinkSync(STATUS_FILE); } } catch (error) { // Ignore cleanup errors } } // Main test function async function runSimpleTest() { const pid = process.pid; console.log(`๐Ÿงช Simple EGW Test Runner (PID: ${pid})`); console.log('๐Ÿ”„ Testing basic database functionality without FTS'); try { createStatusFile(pid, 'Initializing test...', 0); // Step 1: Register heartbeat console.log('\n๐Ÿ’“ Step 1: Registering heartbeat...'); updateStatus('Registering heartbeat...', 10); SimpleEGWDatabase.registerHeartbeat({ started: new Date() }); console.log('โœ… Heartbeat registered'); // Step 2: Initialize database (no warming to avoid FTS issues) console.log('\n๐Ÿ“Š Step 2: Initializing database...'); updateStatus('Initializing database...', 20); const db = new SimpleEGWDatabase('./data/egw-writings.db', false); // No warming console.log('โœ… Database initialized'); // Step 3: Test basic operations console.log('\n๐Ÿงช Step 3: Testing basic database operations...'); updateStatus('Testing database operations...', 30); // Test 3.1: Get stats SimpleEGWDatabase.updateHeartbeatTime(); updateStatus('Getting database statistics...', 40); const stats = await db.getStats(); console.log(`โœ… Database stats: ${stats.books} books, ${stats.paragraphs} paragraphs`); // Test 3.2: List books SimpleEGWDatabase.updateHeartbeatTime(); updateStatus('Listing books...', 60); const books = await db.getBooks(5); console.log(`โœ… Found ${books.length} books`); // Test 3.3: Get book details if (books.length > 0) { SimpleEGWDatabase.updateHeartbeatTime(); updateStatus('Getting book details...', 70); const paragraphs = await db.getParagraphs(books[0].book_id, 2); console.log(`โœ… Found ${paragraphs.length} paragraphs from "${books[0].title}"`); } // Step 4: Test search (basic LIKE search) console.log('\n๐Ÿ” Step 4: Testing basic search...'); updateStatus('Testing search functionality...', 80); SimpleEGWDatabase.updateHeartbeatTime(); try { const searchResults = await db.search('faith', 3); console.log(`โœ… Search found ${searchResults.length} results`); } catch (searchError) { console.log('โš ๏ธ Search had issues, but continuing...'); } // Step 5: Final status check console.log('\n๐Ÿ“Š Step 5: Final system status...'); updateStatus('Final status check...', 90); const heartbeatStatus = SimpleEGWDatabase.getHeartbeatStatus(); console.log(`๐Ÿ’“ Heartbeat: ${heartbeatStatus.isActive ? 'ACTIVE' : 'INACTIVE'}`); // Step 6: Success updateStatus('Test completed successfully!', 100); console.log('\n๐ŸŽ‰ Simple test completed successfully!'); console.log('โœ… Basic database operations working'); console.log('โœ… Heartbeat enforcement working'); console.log('โœ… Singleton process management working'); // Keep running for a moment to show final status setTimeout(() => { cleanupStatusFile(); console.log('\nโœ… Test runner finished and cleaned up'); process.exit(0); }, 2000); } catch (error) { updateStatus(`Test failed: ${error.message}`, 0); console.error('\nโŒ Simple test failed:', error.message); setTimeout(() => { cleanupStatusFile(); process.exit(1); }, 2000); } } // Handle graceful shutdown process.on('SIGINT', () => { console.log('\n๐Ÿ›‘ Received SIGINT, cleaning up...'); cleanupStatusFile(); process.exit(0); }); process.on('SIGTERM', () => { console.log('\n๐Ÿ›‘ Received SIGTERM, cleaning up...'); cleanupStatusFile(); process.exit(0); }); // Run the test if (require.main === module) { runSimpleTest(); } module.exports = { runSimpleTest };

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/pythondev-pro/egw_writings_mcp_server'

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