38 lines
2.5 KiB
TypeScript
38 lines
2.5 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { readFileSync } from "node:fs";
|
|
import { dirname, resolve } from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
import { renderPluginPage } from "../examples/scum-server-plugin/page-bundle/index.js";
|
|
import { configurationCatalog, validateConfigPatch } from "../examples/scum-server-plugin/features/schemas.js";
|
|
|
|
const pageSource = readFileSync(resolve(dirname(fileURLToPath(import.meta.url)), "../examples/scum-server-plugin/features/page.ts"), "utf8");
|
|
|
|
describe("SCUM plugin feature module", () => {
|
|
it("owns runtime allowlists without a version gate", () => {
|
|
expect(configurationCatalog.map((field) => field.key)).toContain("welcome-message");
|
|
expect(validateConfigPatch({ reason: "adjust capacity", idempotencyKey: "cfg-1", changes: [{ key: "max-players", value: "129" }] })).toContain("超出允许范围");
|
|
});
|
|
|
|
it("keeps the five management pages free of legacy snapshot reads and fake controls", () => {
|
|
for (const pageKey of ["players", "squads", "live-map", "gifts", "workflows"]) {
|
|
const view = renderAndCollect(pageKey);
|
|
expect(view.texts.join("\n")).toContain("不会读取遗留快照");
|
|
}
|
|
for (const removed of ["listSCUM", "map-local-board", "Fame +100", "starter-pack", "855", "Workflow", "投影"]) expect(pageSource).not.toContain(removed);
|
|
});
|
|
|
|
it("falls legacy routes back to user management", () => {
|
|
const view = renderAndCollect("workflows");
|
|
expect(view.nodes).toContain("section:用户管理");
|
|
});
|
|
});
|
|
|
|
function renderAndCollect(pageKey: string) {
|
|
const nodes: string[] = []; const texts: string[] = [];
|
|
const collect = (value: unknown): void => { if (typeof value === "string") texts.push(value); else if (Array.isArray(value)) value.forEach(collect); else if (value && typeof value === "object" && "children" in value) collect((value as { children?: unknown }).children); };
|
|
const react = { createElement: (type: unknown, props: Record<string, unknown> | null, ...children: unknown[]) => { if (typeof type === "string") nodes.push(`${type}:${String(props?.["aria-label"] ?? "")}`); children.forEach(collect); return { type, props, children }; } };
|
|
renderPluginPage(react, { page: { key: pageKey, title: pageKey === "squads" ? "队伍管理" : pageKey === "live-map" ? "实时地图" : pageKey === "gifts" ? "礼包管理" : "用户管理" }, context: { serverInstanceId: "server-1", permissions: ["server.game-client.read"] }, availability: { available: false, reason: "等待当前服务器完成兼容性验证。" } });
|
|
return { nodes, texts };
|
|
}
|