const assert = require('assert') const origin = process.argv[2] || 'http://localhost:5173' const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)) const run = async () => { const pages = await (await fetch('http://127.0.0.1:9222/json/list')).json() const page = pages.find((item) => item.type === 'page' && item.url.startsWith(`${origin}/`)) if (!page) throw new Error(`Chrome debugging has no ${origin} project page`) const socket = new WebSocket(page.webSocketDebuggerUrl) await new Promise((resolve, reject) => { socket.addEventListener('open', resolve, { once: true }) socket.addEventListener('error', reject, { once: true }) }) let id = 0 const pending = new Map() socket.addEventListener('message', (event) => { const message = JSON.parse(event.data) const request = pending.get(message.id) if (!request) return pending.delete(message.id) message.error ? request.reject(new Error(message.error.message)) : request.resolve(message.result) }) const send = (method, params = {}) => new Promise((resolve, reject) => { id += 1 pending.set(id, { resolve, reject }) socket.send(JSON.stringify({ id, method, params })) }) const valueOf = async (expression) => (await send('Runtime.evaluate', { expression, returnByValue: true })).result?.value try { await send('Page.enable') await send('Runtime.enable') await send('Emulation.setDeviceMetricsOverride', { width: 412, height: 915, deviceScaleFactor: 1, mobile: true, screenWidth: 412, screenHeight: 915 }) const url = `${origin}/?r02BackgroundAudit=1#/pages/records/r02-person-detail?genealogyId=1001&mode=create` await send('Page.navigate', { url }) for (let attempt = 0; attempt < 60; attempt += 1) { if (await valueOf("Boolean(document.querySelector('.person-detail-state--edit'))")) break await sleep(80) } await sleep(500) const layers = await valueOf(`Array.from(document.querySelectorAll('.person-identity-card,.person-field,.person-long-field')).map((node) => { return { className: node.className, backgroundImage: getComputedStyle(node).backgroundImage, position: getComputedStyle(node).position } })`) assert(layers.length >= 6, 'R02 edit cards were not rendered') for (const layer of layers) { const expectedAsset = layer.className.includes('person-identity-card') ? 'r01-person-name-card.png' : layer.className.includes('person-field') ? 'module-field-frame.png' : 'module-content-frame.png' assert(layer.backgroundImage.includes(expectedAsset), `${layer.className} does not use its real background asset`) assert.strictEqual(layer.position, 'static', `${layer.className} must remain in document flow`) } process.stdout.write(`${JSON.stringify(layers)}\nR02-BACKGROUND-RUNTIME-SMOKE PASS\n`) } finally { try { await send('Emulation.clearDeviceMetricsOverride') } catch (_) {} socket.close() } } run().catch((error) => { process.stderr.write(`${error.stack || error.message}\n`) process.exit(1) })