feat(canvas): Agent引用与局部重绘 - 完善附件预览多图展开并修复取消清理
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
40
web/test/canvas-connection-create-menu.test.ts
Normal file
40
web/test/canvas-connection-create-menu.test.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
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 [^\n]+/g) || [];
|
||||
expect(options).toHaveLength(7);
|
||||
for (const option of options) expect(option).toMatch(/description="[^"]+"/);
|
||||
});
|
||||
|
||||
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"');
|
||||
});
|
||||
Reference in New Issue
Block a user