ai-chatbot/tests/routes/flow-board-markers.test.ts

38 lines
2.6 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { expect, test } from "@playwright/test";
import JSZip from "jszip";
import { readFile } from "node:fs/promises";
import { exportXmind } from "@/lib/flow-board/xmind-export";
import { importXmind } from "@/lib/flow-board/xmind-import";
import { getTopicEntries } from "@/lib/flow-board/topic-details";
import { getXmindMarkerIds, toggleXmindMarker, XMIND_MARKER_GROUPS } from "@/lib/flow-board/xmind-markers";
test("all installed marker IDs and artwork exist and round-trip through XMind", async () => {
const markers = XMIND_MARKER_GROUPS.flatMap(group => group.markers);
expect(markers).toHaveLength(219);
expect(new Set(markers.map(marker => marker.id)).size).toBe(197);
expect(XMIND_MARKER_GROUPS.filter(group => !group.hidden).flatMap(group => group.markers.filter(marker => !marker.hidden))).toHaveLength(58);
for (const marker of markers) expect((await readFile(`public${marker.asset}`)).length).toBeGreaterThan(50);
const zip = new JSZip();
zip.file("content.json", JSON.stringify([{ title: "标记", rootTopic: {
id: "root", title: "全标记验证", children: { attached: markers.map(marker => ({ id: marker.id, title: marker.id, markers: [{ markerId: marker.id }] })) },
} }]));
const imported = await importXmind(new File([await zip.generateAsync({ type: "uint8array" })], "markers.xmind"), "标记");
const entries = getTopicEntries(imported.sheets[0].children).slice(1);
expect(entries.map(entry => getXmindMarkerIds(entry.element.data.emojis)[0])).toEqual(markers.map(marker => marker.id));
expect(imported.warnings).not.toContain("部分图标已保留为数据,暂不显示");
const exported = await exportXmind({ children: imported.sheets[0].children }, "标记");
const output = await JSZip.loadAsync(await exported.blob.arrayBuffer());
const sheets = JSON.parse(await output.file("content.json")!.async("string"));
expect(sheets[0].rootTopic.children.attached.map((topic: { markers: { markerId: string }[] }) => topic.markers[0].markerId)).toEqual(markers.map(marker => marker.id));
expect(exported.warnings).toEqual([]);
});
test("legacy emoji markers replace within their group and preserve other groups and custom emoji", () => {
const original = [{ name: "1️⃣" }, { name: "✅" }, { name: "🦄" }];
const replaced = toggleXmindMarker(original, "priority-2", false);
expect(getXmindMarkerIds(replaced)).toEqual(["task-done", "priority-2"]);
expect(replaced).toContainEqual({ name: "🦄" });
expect(getXmindMarkerIds(toggleXmindMarker(replaced, "priority-2", true))).toEqual(["task-done"]);
expect(original).toEqual([{ name: "1️⃣" }, { name: "✅" }, { name: "🦄" }]);
});