197 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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);
 |