Files
mnote/scripts/task495-filetree-copy-id-absolute-path-smoke.js
T

152 lines
3.8 KiB
JavaScript
Raw Normal View History

#!/usr/bin/env node
const assert = require("node:assert/strict");
const fs = require("node:fs");
const path = require("node:path");
const vm = require("node:vm");
const REPO_ROOT = path.resolve(__dirname, "..");
const RUNTIME_PATH = path.join(
REPO_ROOT,
"rust/crates/mnote-web/browser/sidebar-filetree-command-runtime.js",
);
function loadRuntimeFactory() {
const source = fs
.readFileSync(RUNTIME_PATH, "utf8")
.replace(
"export const createSidebarFileTreeCommandRuntime = (dependencies = {}) => {",
"const createSidebarFileTreeCommandRuntime = (dependencies = {}) => {",
);
const context = {
console,
CustomEvent: class CustomEvent {
constructor(type, init) {
this.type = type;
this.detail = init && init.detail;
}
},
HTMLElement: class HTMLElement {},
navigator: {
clipboard: {
writeText: async (text) => {
context.__clipboardText = text;
},
},
},
document: {
body: {},
documentElement: {
attrs: {},
setAttribute(name, value) {
this.attrs[name] = String(value);
},
},
createElement() {
return {};
},
querySelector() {
return null;
},
querySelectorAll() {
return [];
},
},
window: {
alert() {},
confirm() {
return true;
},
dispatchEvent() {},
},
URL,
setTimeout,
clearTimeout,
};
context.globalThis = context;
vm.createContext(context);
vm.runInContext(
`${source}\nglobalThis.__factory = createSidebarFileTreeCommandRuntime;`,
context,
{ filename: RUNTIME_PATH },
);
return context;
}
async function runCopyId(runtime, context, detail) {
context.__clipboardText = "";
runtime.handleTreeContextMenuAction("copy-id", detail, null);
await new Promise((resolve) => setImmediate(resolve));
return context.__clipboardText;
}
async function main() {
const context = loadRuntimeFactory();
const runtime = context.__factory({
currentRootUri: () => "file:///mnt/Data1T/mnote",
currentSourceKind: () => "local_folder",
cssEscape: (value) => String(value).replace(/"/g, '\\"'),
fileTreeRuntimeFunction: () => null,
localFilePathFromAssetId: (assetId) =>
String(assetId || "").replace(/^local-file:/, ""),
resolveWorkspaceId: () => "local-folder",
runtimeState: { activeTreeContextMenu: null },
selectedSidebarFileTreeSelection: { selectedRowIds: new Set(), focusedRowId: null },
});
assert.equal(
await runCopyId(runtime, context, {
contextKind: "filetree",
rowKind: "folder",
documentId: "local-dir:docs",
rowId: "local:folder:docs",
title: "docs",
}),
"/mnt/Data1T/mnote/docs",
"复制本地文件夹页面 ID 应得到绝对路径",
);
assert.equal(
await runCopyId(runtime, context, {
contextKind: "filetree",
rowKind: "markdown",
documentId: "local-md:docs~2FPage.md",
rowId: "local:markdown:docs~2FPage.md",
title: "Page",
}),
"/mnt/Data1T/mnote/docs/Page.md",
"复制本地 Markdown 页面 ID 应得到绝对路径",
);
assert.equal(
await runCopyId(runtime, context, {
contextKind: "filetree",
rowKind: "asset",
assetId: "local-file:assets~2Freport.pdf",
rowId: "local:asset:assets~2Freport.pdf",
title: "report.pdf",
}),
"/mnt/Data1T/mnote/assets/report.pdf",
"复制本地资源 ID 应得到绝对路径",
);
console.log(
JSON.stringify(
{
ok: true,
copied: [
"/mnt/Data1T/mnote/docs",
"/mnt/Data1T/mnote/docs/Page.md",
"/mnt/Data1T/mnote/assets/report.pdf",
],
},
null,
2,
),
);
}
main().catch((error) => {
console.error(error);
process.exit(1);
});