import { test } from 'node:test'; import assert from 'node:assert/strict'; import { createServer } from 'node:http'; import { browser } from './browser.mjs'; import { close } from './fixture.mjs'; import { startServer } from '../src/serve.mjs'; test('browser edge states: loading, empty, malformed, stale, hostile/long values, in-flight reply and appearance fallback', { timeout: 120000 }, async () => { let index = { sessions: [], counts: {}, generatedAt: 'fixture time' }, held = null, sends = 0, holdBoard = true, boardResponse; let resolveBoardRequest; const boardRequested = new Promise(resolve => { resolveBoardRequest = resolve; }); const server = createServer(async (req, res) => { for await (const chunk of req) { void chunk; } res.setHeader('content-type', 'application/json'); if (req.url === '/api/board') { if (holdBoard) { boardResponse = res; resolveBoardRequest(); return; } return res.end(JSON.stringify(index)); } sends++; held = res; }); await new Promise(r => server.listen(0, '127.0.0.1', r)); const web = await startServer({ port: 0, board: `http://127.0.0.1:${server.address().port}` }); const b = await browser(); const wait = expr => b.evaluate(`(async()=>{for(let i=0;i<100;i++){if(${expr})return true;await new Promise(r=>setTimeout(r,50))}throw new Error('Condition timed out')})()`); try { await b.call('Page.addScriptToEvaluateOnNewDocument', { source: 'Object.defineProperty(window,"localStorage",{get(){throw new Error("storage denied")}});window.errors=[];addEventListener("error",e=>errors.push(e.message));' }); await b.viewport(320); await b.navigate(`http://127.0.0.1:${web.address().port}`); assert.match(await b.evaluate('document.querySelector("#status").textContent'), /Loading/); await boardRequested; holdBoard = false; boardResponse.end(JSON.stringify(index)); await wait('document.querySelector("#sessions").textContent.includes("No sessions")'); assert.equal(await b.evaluate('document.querySelector("#waiting-count").textContent'), '0'); assert.equal(await b.evaluate('document.documentElement.dataset.palette'), 'harbor'); const agent = 'agent"[\\