lightningimg
Version:
A blazing fast, transparent, and safe image converter powered by WebAssembly. Convert PNG, JPG, TIFF, and GIF images to optimized WebP format with high performance and cross-platform compatibility.
192 lines (162 loc) ⢠5.31 kB
JavaScript
/**
* Puppeteer-based browser test for LightningImg WASM module
* Adapts the browser example as an automated test similar to example-simple.js
*/
import puppeteer from "puppeteer";
import { createServer } from "node:http";
import { readFileSync } from "node:fs";
import { fileURLToPath } from "node:url";
import { dirname, join, extname } from "node:path";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
// Simple HTTP server to serve files with proper MIME types
function createTestServer(port = 3000) {
const server = createServer((req, res) => {
const filePath = join(
__dirname,
req.url === "/" ? "browser-test-simple.html" : req.url,
);
try {
const content = readFileSync(filePath);
const ext = extname(filePath);
// Set proper MIME types
const mimeTypes = {
".html": "text/html",
".js": "application/javascript",
".wasm": "application/wasm",
".json": "application/json",
};
const mimeType = mimeTypes[ext] || "text/plain";
res.writeHead(200, {
"Content-Type": mimeType,
"Cross-Origin-Embedder-Policy": "require-corp",
"Cross-Origin-Opener-Policy": "same-origin",
});
res.end(content);
} catch (error) {
res.writeHead(404);
res.end("File not found");
}
});
return new Promise((resolve) => {
server.listen(port, () => {
console.log(`š” Test server running on http://localhost:${port}`);
resolve({ server, port });
});
});
}
async function runBrowserTest() {
console.log("š Starting LightningImg WASM Browser Test with Puppeteer\n");
let browser;
let serverInfo;
try {
// Start HTTP server
console.log("š” Starting test server...");
serverInfo = await createTestServer(3000);
// Launch browser
console.log("š Launching browser...");
browser = await puppeteer.launch({
headless: true, // Set to false to see the browser
args: [
"--no-sandbox",
"--disable-setuid-sandbox",
"--disable-dev-shm-usage",
"--disable-web-security",
"--allow-file-access-from-files",
"--enable-local-file-accesses",
],
});
const page = await browser.newPage();
// Enable console logging from the page
page.on("console", (msg) => {
const type = msg.type();
const text = msg.text();
if (type === "error") {
console.log(`š“ Browser Error: ${text}`);
} else if (type === "warn") {
console.log(`š” Browser Warning: ${text}`);
} else {
console.log(`šµ Browser Log: ${text}`);
}
});
// Handle page errors
page.on("pageerror", (error) => {
console.error("ā Page Error:", error.message);
});
// Navigate to the test page
const testPageUrl = `http://localhost:${serverInfo.port}/`;
console.log(`š Loading test page: ${testPageUrl}`);
await page.goto(testPageUrl, { waitUntil: "networkidle0" });
// Wait for test completion (with timeout)
console.log("ā³ Waiting for tests to complete...\n");
await page.waitForFunction(
() => window.testResults?.completed,
{ timeout: 30000 }, // 30 second timeout
);
// Get test results
const testResults = await page.evaluate(() => window.testResults);
// Display results
console.log("š Test Results:");
console.log("================\n");
if (testResults.success) {
console.log("ā
Status: SUCCESS");
console.log(`š Test logs:\n${testResults.log.join("\n")}`);
if (testResults.stats) {
console.log("\nš Performance Stats:");
console.log(` Original PNG: ${testResults.stats.originalSize} bytes`);
console.log(` WebP (default): ${testResults.stats.webpSize} bytes`);
console.log(
` Default compression: ${testResults.stats.defaultCompression}%`,
);
console.log(
` Image info: ${JSON.stringify(testResults.stats.imageInfo)}`,
);
console.log(` Format supported: ${testResults.stats.isSupported}`);
}
} else {
console.log("ā Status: FAILED");
console.log(`š„ Error: ${testResults.error}`);
console.log(`š Test logs:\n${testResults.log.join("\n")}`);
}
// Take a screenshot for debugging
const screenshotPath = join(__dirname, "test-browser-screenshot.png");
await page.screenshot({ path: screenshotPath, fullPage: true });
console.log(`\nšø Screenshot saved: ${screenshotPath}`);
// Return success status
return testResults.success;
} catch (error) {
console.error(
"š„ Puppeteer test failed:",
error?.message || "Unknown error",
);
return false;
} finally {
if (browser) {
await browser.close();
console.log("\nš Browser closed");
}
if (serverInfo?.server) {
serverInfo.server.close();
console.log("š Test server closed");
}
}
}
async function main() {
console.log("š¼ļø LightningImg WASM Browser Test (Puppeteer Edition)");
console.log("====================================================\n");
const success = await runBrowserTest();
if (success) {
console.log("\nš All browser tests passed successfully!");
console.log(
"ā
ESM WASM-only LightningImg works perfectly in browser environment!",
);
process.exit(0);
} else {
console.log("\nā Browser tests failed!");
process.exit(1);
}
}
main().catch((error) => {
console.error("š„ Unexpected error:", error?.message || "Unknown error");
process.exit(1);
});