Files
ttstd-infinite-canvas/web/test/canvas-connection-create-menu.test.ts
ddCat 9148ceab66 feat(canvas): 画布工作区 - 整合侧栏与风格预设并修复提示词回填
选择性整合 #547,保留主分支节点与工具条设计。新增默认折叠的节点、资产、任务和历史面板,风格与预设保留在节点内,移除重复入口。

补齐工具权限、提示词解析、资源引用保护及数据库迁移,修复提示词清空和连续编辑后的生成配置同步。

验证:前端全量 1925 项测试、构建、类型检查及 lint 通过;后端 go test ./... 通过。真实模型、PostgreSQL 实库与登录态页面验收仍待进行。

Refs #547

Co-authored-by: bensharp <bensharp@qq.com>
2026-09-20 16:40:08 +08:00

43 lines
2.6 KiB
TypeScript

import { expect, test } from "bun:test";
import { readFileSync } from "node:fs";
const component = readFileSync(new URL("../src/components/canvas/canvas-workspace-overlays.tsx", import.meta.url), "utf8");
const css = readFileSync(new URL("../src/styles/globals.css", import.meta.url), "utf8");
test("connection menu omits the header and provides descriptions for every option", () => {
expect(component).not.toContain("引用当前节点");
expect(component).not.toContain(">创建下一步</span>");
expect(component).not.toContain("ChevronRight");
expect(component).not.toContain("absolute inset-x-8 top-0 h-px");
const options = component.match(/<ConnectionCreateOption\b[\s\S]*?\n\s*\/>/g) || [];
expect(options).toHaveLength(9);
for (const option of options) expect(option).toMatch(/description="[^"]+"/);
expect(component).toContain('title="批量创作表"');
expect(component).toContain("onCreate(CanvasNodeType.BatchTable)");
});
test("add-node submenu uses a four-column medium-size grid", () => {
const menu = readFileSync(new URL("../src/components/canvas/canvas-create-menu.tsx", import.meta.url), "utf8");
const context = readFileSync(new URL("../src/components/canvas/canvas-context-menu.tsx", import.meta.url), "utf8");
const styles = readFileSync(new URL("../src/styles/globals.css", import.meta.url), "utf8");
expect(menu).toContain('variant === "node" ? "grid-cols-4"');
expect(menu).toContain("size-6 shrink-0");
expect(context).toContain('w-[360px]');
expect(styles).toContain("--canvas-create-node-height: var(--space-16)");
});
test("only the active option expands; stationary pointer retargeting cannot switch rows", () => {
const descriptionRule = css.match(/\.canvas-connection-create-description \{([^}]+)\}/)?.[1] || "";
expect(descriptionRule).toContain("grid-template-rows: 0fr");
expect(descriptionRule).not.toContain("min-height");
const option = component.slice(component.indexOf("function ConnectionCreateOption("), component.indexOf("function clamp("));
expect(option).not.toContain("motion.button");
expect(css).toContain('.canvas-connection-create-option[data-expanded="true"]');
expect(component).toContain("previous?.x === event.clientX && previous.y === event.clientY");
expect(component).not.toContain("SpotlightSurface");
expect(css).toContain('.canvas-connection-create-option[data-motion="reduced"]');
expect(component).toContain('aria-disabled={Boolean(disabledReason)}');
expect(component).toContain("if (!disabledReason) onClick()");
expect(component).toContain('event.key === "Escape"');
});