import assert from "node:assert/strict"; import { recoveryView, renderRecoveryPanel } from "./recovery-panel.mjs"; class Node { constructor(tag) { this.tagName = tag; this.children = []; this.textContent = ""; this.className = ""; this.listeners = {}; } append(...nodes) { this.children.push(...nodes); } addEventListener(type, callback) { this.listeners[type] = callback; } } const document = { createElement: (tag) => new Node(tag) }; assert.deepEqual(recoveryView({ status: "blocked", blocked: [{ reason: "offline_resource_invalid" }] }).actions, ["retry", "abort"]); assert.deepEqual(recoveryView({ status: "network_required" }).actions, ["retry_online"]); let retry = 0; const panel = renderRecoveryPanel(document, { status: "blocked", blocked: [{ reason: "permission_denied" }] }, { retry: () => { retry += 1; }, abort: () => {} }); assert.equal(panel.children[1].textContent, "blocked: permission_denied"); assert.equal(panel.children[3].children.length, 2); panel.children[3].children[0].listeners.click(); assert.equal(retry, 1); console.log(`recovery_ux=passed actions=${panel.children[3].children.length} retry=${retry}`);