80 lines
3.1 KiB
JavaScript
80 lines
3.1 KiB
JavaScript
import test from "node:test";
|
||
import assert from "node:assert/strict";
|
||
import { readFile } from "node:fs/promises";
|
||
import { runInNewContext } from "node:vm";
|
||
|
||
const html = await readFile(new URL("../../xxwz.html", import.meta.url), "utf8");
|
||
const script = html.match(/<script>([\s\S]*?)<\/script>/)[1];
|
||
|
||
function loadPage(responseText) {
|
||
const elements = new Map();
|
||
const stored = new Map();
|
||
const requests = [];
|
||
function element() {
|
||
return { value: "", style: {}, appendChild() {}, querySelectorAll() { return []; } };
|
||
}
|
||
const document = {
|
||
getElementById(id) {
|
||
if (!elements.has(id)) elements.set(id, element());
|
||
return elements.get(id);
|
||
},
|
||
createElement: element,
|
||
};
|
||
runInNewContext(script, {
|
||
document,
|
||
localStorage: { getItem: key => stored.get(key), setItem: (key, value) => stored.set(key, value) },
|
||
async fetch(url, options) {
|
||
requests.push({ url, ...options });
|
||
return { text: async () => responseText };
|
||
},
|
||
});
|
||
return { elements, requests };
|
||
}
|
||
|
||
test("an empty admin token is rejected before sending a request", async () => {
|
||
const { elements, requests } = loadPage("");
|
||
|
||
await elements.get("readBtn").onclick();
|
||
|
||
assert.equal(requests.length, 0);
|
||
assert.equal(elements.get("status").textContent, "请填写 Admin Token");
|
||
});
|
||
|
||
test("unauthorized explains the environment token and preserves the current config", async () => {
|
||
const { elements, requests } = loadPage(JSON.stringify({ code: 0, data: null, msg: "unauthorized" }));
|
||
elements.get("adminToken").value = "abtest-admin-token";
|
||
const before = elements.get("configPreview").textContent;
|
||
|
||
await elements.get("readBtn").onclick();
|
||
|
||
assert.equal(requests.length, 1);
|
||
assert.match(elements.get("status").textContent, /unauthorized.*AB_ADMIN_TOKEN/);
|
||
assert.match(elements.get("status").textContent, /仅在服务器未设置/);
|
||
assert.equal(elements.get("configPreview").textContent, before);
|
||
});
|
||
|
||
test("reading config sends the entered token unchanged in a JSON POST", async () => {
|
||
const { elements, requests } = loadPage(JSON.stringify({ code: 1, data: [], msg: "ok" }));
|
||
elements.get("apiUrl").value = " https://example.com/abConfigAdmin ";
|
||
elements.get("adminToken").value = "configured-token";
|
||
|
||
await elements.get("readBtn").onclick();
|
||
|
||
assert.equal(requests.length, 1);
|
||
assert.equal(requests[0].url, "https://example.com/abConfigAdmin");
|
||
assert.equal(requests[0].method, "POST");
|
||
assert.equal(requests[0].headers["Content-Type"], "application/json");
|
||
assert.deepEqual(JSON.parse(requests[0].body), { action: "list", adminToken: "configured-token" });
|
||
assert.equal(elements.get("status").textContent, "已读取线上配置并覆盖当前页面");
|
||
assert.equal(elements.get("configPreview").textContent, "[]");
|
||
});
|
||
|
||
test("a non-JSON response still reports an invalid cloud function URL", async () => {
|
||
const { elements } = loadPage("<html>Not found</html>");
|
||
elements.get("adminToken").value = "configured-token";
|
||
|
||
await elements.get("readBtn").onclick();
|
||
|
||
assert.equal(elements.get("status").textContent, "云函数地址返回的不是 JSON,请检查 URL");
|
||
});
|