ObsiViewer/test-phase3.mjs

197 lines
5.0 KiB
JavaScript

#!/usr/bin/env node
/**
* Phase 3 Testing Script
* Tests the server startup and performance endpoints
*/
import http from 'http';
import { spawn } from 'child_process';
import path from 'path';
import { fileURLToPath } from 'url';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const PORT = 3000;
const TIMEOUT = 15000; // 15 seconds
console.log('\n🧪 Phase 3 Testing Suite');
console.log('================================\n');
// Helper to make HTTP requests
function makeRequest(pathname, method = 'GET') {
return new Promise((resolve, reject) => {
const options = {
hostname: 'localhost',
port: PORT,
path: pathname,
method: method,
timeout: 5000
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
try {
resolve({
status: res.statusCode,
headers: res.headers,
body: data ? JSON.parse(data) : null
});
} catch (e) {
resolve({
status: res.statusCode,
headers: res.headers,
body: data
});
}
});
});
req.on('error', reject);
req.on('timeout', () => {
req.destroy();
reject(new Error('Request timeout'));
});
req.end();
});
}
// Start server
console.log('🚀 Starting server...\n');
const serverProcess = spawn('node', ['server/index.mjs'], {
cwd: __dirname,
stdio: ['ignore', 'pipe', 'pipe']
});
let serverOutput = '';
let serverReady = false;
let testsPassed = 0;
let testsFailed = 0;
// Capture server output
serverProcess.stdout.on('data', (data) => {
const output = data.toString();
serverOutput += output;
console.log('[SERVER]', output.trim());
if (output.includes('ObsiViewer server running')) {
serverReady = true;
}
});
serverProcess.stderr.on('data', (data) => {
const output = data.toString();
console.error('[SERVER ERROR]', output.trim());
});
// Wait for server to start
setTimeout(async () => {
if (!serverReady) {
console.error('\n❌ Server failed to start within timeout');
serverProcess.kill();
process.exit(1);
}
console.log('\n✅ Server started successfully\n');
console.log('🧪 Running tests...\n');
const tests = [
{
name: 'Health check',
path: '/api/health',
check: (res) => res.status === 200 && res.body?.status === 'ok'
},
{
name: 'Performance monitoring endpoint',
path: '/__perf',
check: (res) => res.status === 200 && res.body?.performance
},
{
name: 'Metadata endpoint',
path: '/api/vault/metadata',
check: (res) => res.status === 200 && Array.isArray(res.body?.items)
},
{
name: 'Paginated metadata endpoint',
path: '/api/vault/metadata/paginated?limit=10&cursor=0',
check: (res) => res.status === 200 && res.body?.items !== undefined
}
];
for (const test of tests) {
try {
console.log(`🧪 Testing: ${test.name}...`);
const res = await makeRequest(test.path);
if (test.check(res)) {
console.log(` ✅ PASS - Status ${res.status}\n`);
testsPassed++;
} else {
console.log(` ❌ FAIL - Unexpected response\n`);
console.log(' Response:', JSON.stringify(res, null, 2), '\n');
testsFailed++;
}
} catch (error) {
console.log(` ❌ FAIL - ${error.message}\n`);
testsFailed++;
}
}
// Test cache behavior
console.log('🧪 Testing cache behavior...');
try {
// First request (cache miss)
console.log(' Request 1 (cache miss)...');
const res1 = await makeRequest('/api/vault/metadata');
const cached1 = res1.body?.cached;
// Second request (cache hit)
console.log(' Request 2 (cache hit)...');
const res2 = await makeRequest('/api/vault/metadata');
const cached2 = res2.body?.cached;
if (cached1 === false && cached2 === true) {
console.log(' ✅ PASS - Cache working correctly\n');
testsPassed++;
} else {
console.log(` ⚠️ Cache behavior: first=${cached1}, second=${cached2}\n`);
}
} catch (error) {
console.log(` ❌ FAIL - ${error.message}\n`);
testsFailed++;
}
// Print results
console.log('================================');
console.log(`📊 Test Results: ${testsPassed} passed, ${testsFailed} failed\n`);
if (testsFailed === 0) {
console.log('✅ All tests passed! Phase 3 is working correctly.\n');
} else {
console.log('⚠️ Some tests failed. Check the output above.\n');
}
// Cleanup
console.log('🛑 Shutting down server...');
serverProcess.kill();
process.exit(testsFailed > 0 ? 1 : 0);
}, 3000);
// Handle server process exit
serverProcess.on('exit', (code) => {
if (code !== 0 && code !== null) {
console.error(`\n❌ Server process exited with code ${code}`);
}
});
// Timeout for entire test suite
setTimeout(() => {
console.error('\n❌ Test suite timeout');
serverProcess.kill();
process.exit(1);
}, TIMEOUT);