this repo has no description
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);