84 lines
2.8 KiB
JavaScript
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);
|