Files
comfyui_o1key/tests/test_o1key_restart_frontend.mjs
T

84 lines
2.8 KiB
JavaScript

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);