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 };