import assert from "node:assert/strict"; import fs from "node:fs"; import vm from "node:vm"; const source = fs.readFileSync(new URL("../web/js/o1keyRestart.js", import.meta.url), "utf8") .replace(/^export /gm, ""); const requests = []; const responses = []; const reloads = []; const attributes = new Map(); const icon = { className: "pi pi-refresh side-bar-button-icon" }; const label = { textContent: "重启" }; const button = { disabled: false, setAttribute(name, value) { attributes.set(name, value); }, querySelector(selector) { return selector === ".side-bar-button-icon" ? icon : label; }, }; const document = { querySelector(selector) { assert.equal(selector, "#o1key-restart-button"); return button; }, }; const window = { location: { href: "http://127.0.0.1:8188/?workflow=test", replace(url) { reloads.push(url); }, }, setTimeout() { return 1; }, clearTimeout() {}, }; const reply = (data, status = 200) => ({ ok: status < 400, status, async json() { return data; }, }); async function fetch(url, options) { requests.push({ url, options }); const next = responses.shift(); assert.ok(next, `Unexpected request: ${url}`); return next; } const context = vm.createContext({ document, window, fetch, AbortController, URL, Date }); vm.runInContext(source, context); responses.push( reply({ ready: true, boot_id: "old" }), reply({ error: "restart rejected" }, 500), ); await assert.rejects(context.startComfyUIRestart(), /restart rejected/); assert.equal(reloads.length, 0); assert.equal(button.disabled, false); assert.equal(attributes.get("aria-busy"), "false"); assert.equal(label.textContent, "重启"); assert.match(icon.className, /pi-refresh/); requests.length = 0; responses.push( reply({ ready: true, boot_id: "old" }), reply({ success: true, boot_id: "old" }), reply({ ready: true, boot_id: "new" }), reply({}), ); await context.startComfyUIRestart(); assert.equal(requests.length, 4); assert.match(requests[0].url, /^\/o1key\/restart\/status\?/); assert.equal(requests[1].url, "/o1key/restart"); assert.equal(requests[1].options.method, "POST"); assert.equal(requests[1].options.body, "{}"); assert.match(requests[2].url, /^\/o1key\/restart\/status\?/); assert.match(requests[3].url, /^\/api\/system_stats\?/); assert.equal(reloads.length, 1); const reloadedUrl = new URL(reloads[0]); assert.equal(reloadedUrl.searchParams.get("workflow"), "test"); assert.ok(reloadedUrl.searchParams.has("o1key_restart")); assert.equal(button.disabled, true); assert.equal(attributes.get("aria-busy"), "true"); assert.equal(label.textContent, "重启中"); await assert.rejects(context.startComfyUIRestart(), /正在重启/); assert.equal(requests.length, 4); assert.equal(reloads.length, 1);