import { strict as assert } from "node:assert"; import { readFileSync } from "node:fs"; import { test } from "vitest"; test("tree-level context menu opens with the current row items atomically", () => { const connectionTree = readFileSync("apps/desktop/src/components/sidebar/ConnectionTree.vue", "utf8"); const contextMenu = readFileSync("apps/desktop/src/components/ui/CustomContextMenu.vue", "utf8"); assert.match(connectionTree, /openContextMenu\(event, items\)/); assert.match(connectionTree, /sidebarContextMenuRef\.value\?\.close\(\)/); assert.match(connectionTree, /sidebarContextMenuTarget\.value = createSidebarActionTarget\(node\)/); assert.match(connectionTree, /sidebarContextMenuTarget\.value = null/); assert.match(connectionTree, / { const treeItem = readFileSync("apps/desktop/src/components/sidebar/TreeItem.vue", "utf8"); const asyncDialogs = readFileSync("apps/desktop/src/components/sidebar/sidebarAsyncDialogs.ts", "utf8"); assert.doesNotMatch(treeItem, /defineAsyncComponent/); assert.match(asyncDialogs, /loadingComponent: SidebarAsyncDialogLoading/); assert.match(asyncDialogs, /errorComponent: SidebarAsyncDialogError/); assert.match(asyncDialogs, /timeout: 15_000/); }); test("tree host owns sidebar data-open generations", () => { const treeItem = readFileSync("apps/desktop/src/components/sidebar/TreeItem.vue", "utf8"); const connectionTree = readFileSync("apps/desktop/src/components/sidebar/ConnectionTree.vue", "utf8"); assert.doesNotMatch(treeItem, /runSidebarDataOpenImmediately/); assert.match(treeItem, /emit\("open-data", node, true, openData\)/); assert.match(connectionTree, /function openSidebarData/); assert.match(connectionTree, /runSidebarDataOpenImmediately/); assert.match(connectionTree, /createSidebarActionTarget\(node\)/); });