62 lines
2.7 KiB
TypeScript
62 lines
2.7 KiB
TypeScript
import { describe, expect, test } from "bun:test";
|
||
|
||
import {
|
||
getEditorSlots,
|
||
registerEditorSlot,
|
||
unregisterEditorSlot,
|
||
} from "../src/lib/plugins/editor-slot-registry";
|
||
|
||
const render = () => null;
|
||
|
||
// 真实插件 editor-shell 会在被导入时占满全部 EditorSlotKind,而它是否已被导入取决于测试执行顺序。
|
||
// 这里只断言本文件自己注册的 pluginId,使结果不再受其它测试文件的副作用影响。
|
||
const ownSlots = (slot: Parameters<typeof getEditorSlots>[0]) =>
|
||
getEditorSlots(slot)
|
||
.filter((item) => ["editor-a", "a", "b", "c", "x", "p1", "p2"].includes(item.pluginId))
|
||
.map((item) => item.pluginId);
|
||
|
||
describe("editor slot registry", () => {
|
||
test("registers a slot and returns it", () => {
|
||
const unregister = registerEditorSlot({ pluginId: "editor-a", slot: "timeline-panel", render });
|
||
expect(ownSlots("timeline-panel")).toEqual(["editor-a"]);
|
||
unregister();
|
||
expect(ownSlots("timeline-panel")).toEqual([]);
|
||
});
|
||
|
||
test("sorts by priority desc, then registration order asc", () => {
|
||
const unregs = [
|
||
registerEditorSlot({ pluginId: "a", slot: "preview-renderer", priority: 1, render }),
|
||
registerEditorSlot({ pluginId: "b", slot: "preview-renderer", render }),
|
||
registerEditorSlot({ pluginId: "c", slot: "preview-renderer", priority: 5, render }),
|
||
];
|
||
expect(ownSlots("preview-renderer")).toEqual(["c", "a", "b"]);
|
||
unregs.forEach((u) => u());
|
||
});
|
||
|
||
test("re-registering same plugin+slot overrides (idempotent, HMR-safe)", () => {
|
||
const unreg1 = registerEditorSlot({ pluginId: "x", slot: "inspector", render });
|
||
const unreg2 = registerEditorSlot({ pluginId: "x", slot: "inspector", render });
|
||
expect(ownSlots("inspector")).toEqual(["x"]);
|
||
// 旧卸载函数不应误删新注册项
|
||
unreg1();
|
||
expect(ownSlots("inspector")).toEqual(["x"]);
|
||
unreg2();
|
||
expect(ownSlots("inspector")).toEqual([]);
|
||
});
|
||
|
||
test("different plugins coexist in the same slot", () => {
|
||
const unregs = [
|
||
registerEditorSlot({ pluginId: "p1", slot: "subtitle-tool", render }),
|
||
registerEditorSlot({ pluginId: "p2", slot: "subtitle-tool", render }),
|
||
];
|
||
expect(ownSlots("subtitle-tool")).toEqual(["p1", "p2"]);
|
||
unregisterEditorSlot("p1", "subtitle-tool");
|
||
expect(ownSlots("subtitle-tool")).toEqual(["p2"]);
|
||
unregs.forEach((u) => u());
|
||
});
|
||
|
||
test("slots this file never registered into stay untouched", () => {
|
||
// 真实插件会占用 export-renderer,因此断言「本文件没有向未注册的插槽留下贡献」。
|
||
expect(ownSlots("export-renderer")).toEqual([]);
|
||
});
|
||
}); |