import { describe, expect, it } from "vitest"; import fs from "node:fs"; import path from "node:path"; const DOM_HOST_SOURCE = path.join(process.cwd(), "src/components/sidebar/tree-shell-dom-host.tsx"); const SIDEBAR_SOURCE = path.join(process.cwd(), "src/components/sidebar/sidebar.tsx"); const SSR_LAYOUT_SOURCE = path.join(process.cwd(), "..", "rust/crates/mnote-web/src/ssr/pages/layout.rs"); describe("sidebar filetree DnD modifier source", () => { it("copy modifier 应同时支持 Alt / Ctrl / Meta", () => { const domHost = fs.readFileSync(DOM_HOST_SOURCE, "utf8"); const ssrLayout = fs.readFileSync(SSR_LAYOUT_SOURCE, "utf8"); expect(domHost).toContain('event.altKey || event.ctrlKey || event.metaKey ? "copy" : "move"'); expect(domHost).toContain("const copy = Boolean(event.altKey || event.ctrlKey || event.metaKey)"); expect(ssrLayout).toContain("var copyModifier = event.altKey || event.ctrlKey || event.metaKey"); expect(ssrLayout).toContain("copy: event.altKey === true || event.ctrlKey === true || event.metaKey === true"); }); it("命名冲突 preflight 必须确认后才执行 drop", () => { const source = fs.readFileSync(SIDEBAR_SOURCE, "utf8"); expect(source).toContain("function confirmFileTreeDropConflicts"); expect(source).toContain("plan.requiresConfirmation"); expect(source).toContain("目标位置已有同名对象,是否继续移动/复制?"); expect(source).toContain("if (!confirmFileTreeDropConflicts(dropPlan))"); }); });