this repo has no description
at main 133 lines 3.6 kB view raw
1#!/usr/bin/env node 2/** 3 * Playwright test runner for js_top_worker_client browser tests. 4 * 5 * Usage: 6 * node run_tests.js [--headed] 7 * 8 * Starts an HTTP server, runs tests in a browser, reports results. 9 */ 10 11const { chromium } = require('playwright'); 12const http = require('http'); 13const fs = require('fs'); 14const path = require('path'); 15 16const PORT = 8765; 17const TIMEOUT = 60000; // 60 seconds max test time 18 19// Determine the directory where test files are located 20const testDir = path.dirname(fs.realpathSync(__filename)); 21const buildDir = path.resolve(testDir, '../../_build/default/test/browser'); 22 23// MIME types for serving files 24const mimeTypes = { 25 '.html': 'text/html', 26 '.js': 'application/javascript', 27 '.css': 'text/css', 28}; 29 30function startServer() { 31 return new Promise((resolve, reject) => { 32 const server = http.createServer((req, res) => { 33 let filePath = req.url === '/' ? '/test.html' : req.url; 34 35 // Try build directory first, then test source directory 36 let fullPath = path.join(buildDir, filePath); 37 if (!fs.existsSync(fullPath)) { 38 fullPath = path.join(testDir, filePath); 39 } 40 41 if (!fs.existsSync(fullPath)) { 42 res.writeHead(404); 43 res.end('Not found: ' + filePath); 44 return; 45 } 46 47 const ext = path.extname(fullPath); 48 const contentType = mimeTypes[ext] || 'application/octet-stream'; 49 50 fs.readFile(fullPath, (err, content) => { 51 if (err) { 52 res.writeHead(500); 53 res.end('Error reading file'); 54 return; 55 } 56 res.writeHead(200, { 'Content-Type': contentType }); 57 res.end(content); 58 }); 59 }); 60 61 server.listen(PORT, () => { 62 console.log(`Test server running at http://localhost:${PORT}/`); 63 resolve(server); 64 }); 65 66 server.on('error', reject); 67 }); 68} 69 70async function runTests(headed = false) { 71 let server; 72 let browser; 73 let exitCode = 0; 74 75 try { 76 // Start the HTTP server 77 server = await startServer(); 78 79 // Launch browser 80 browser = await chromium.launch({ headless: !headed }); 81 const page = await browser.newPage(); 82 83 // Collect console messages 84 const logs = []; 85 page.on('console', msg => { 86 const text = msg.text(); 87 logs.push(text); 88 console.log(`[browser] ${text}`); 89 }); 90 91 // Navigate to test page 92 console.log('Loading test page...'); 93 await page.goto(`http://localhost:${PORT}/`); 94 95 // Wait for tests to complete 96 console.log('Waiting for tests to complete...'); 97 const results = await page.waitForFunction( 98 () => window.testResults && window.testResults.done, 99 { timeout: TIMEOUT } 100 ); 101 102 // Get final results 103 const testResults = await page.evaluate(() => ({ 104 total: window.testResults.total, 105 passed: window.testResults.passed, 106 failed: window.testResults.failed, 107 })); 108 109 console.log('\n========================================'); 110 console.log(`Test Results: ${testResults.passed}/${testResults.total} passed`); 111 console.log('========================================\n'); 112 113 if (testResults.failed > 0) { 114 console.log('FAILED: Some tests did not pass'); 115 exitCode = 1; 116 } else { 117 console.log('SUCCESS: All tests passed'); 118 } 119 120 } catch (err) { 121 console.error('Error running tests:', err.message); 122 exitCode = 1; 123 } finally { 124 if (browser) await browser.close(); 125 if (server) server.close(); 126 } 127 128 process.exit(exitCode); 129} 130 131// Parse command line args 132const headed = process.argv.includes('--headed'); 133runTests(headed);