MatchMaster/server/laf-cloud/tests/ab-config-ui.test.mjs

80 lines
3.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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