deerflow2/frontend/src/core/threads/hooks.test.ts

126 lines
3.3 KiB
TypeScript

import assert from "node:assert/strict";
import test from "node:test";
const { buildFilesForSubmit } = await import(
new URL("./submit-files.ts", import.meta.url).href
);
const { buildPriorityHintText, composeSubmitText } = await import(
new URL("./priority-hint.ts", import.meta.url).href
);
void test("buildFilesForSubmit keeps uploads and appends valid references", () => {
const result = buildFilesForSubmit(
[
{
filename: "uploaded.md",
size: 12,
virtual_path: "/mnt/user-data/uploads/uploaded.md",
},
],
[
{
filename: "artifact.md",
path: "/mnt/user-data/artifacts/artifact.md",
ref_kind: "mention",
ref_source: "artifact",
},
],
);
assert.equal(result.staleCount, 0);
assert.equal(result.files.length, 2);
assert.equal(result.files[0]?.filename, "uploaded.md");
assert.equal(result.files[1]?.ref_kind, "mention");
assert.equal(result.files[1]?.ref_source, "artifact");
});
void test("buildFilesForSubmit drops stale references without blocking submit", () => {
const result = buildFilesForSubmit(
[],
[
{
filename: "stale.md",
path: "/stale.md",
ref_kind: "mention",
ref_source: "upload",
stale: true,
},
],
);
assert.equal(result.staleCount, 1);
assert.equal(result.files.length, 0);
});
void test("buildFilesForSubmit keeps artifact mention path without re-upload", () => {
const result = buildFilesForSubmit(
[],
[
{
filename: "image.png",
path: "/mnt/user-data/artifacts/image.png",
ref_kind: "mention",
ref_source: "artifact",
},
],
);
assert.equal(result.staleCount, 0);
assert.equal(result.files.length, 1);
assert.equal(result.files[0]?.path, "/mnt/user-data/artifacts/image.png");
assert.equal(result.files[0]?.ref_source, "artifact");
});
void test("buildPriorityHintText keeps attachments first and skills second", () => {
const result = buildPriorityHintText({
attachmentNames: ["spec.md"],
skillIds: ["skill.docs.generate"],
});
assert.equal(result, "XClaw优先使用【spec.md】和【skill.docs.generate】");
});
void test("buildPriorityHintText outputs single category when the other is empty", () => {
assert.equal(
buildPriorityHintText({
attachmentNames: ["spec.md"],
skillIds: [],
}),
"XClaw优先使用【spec.md】",
);
assert.equal(
buildPriorityHintText({
attachmentNames: [],
skillIds: ["skill.docs.generate"],
}),
"XClaw优先使用【skill.docs.generate】",
);
});
void test("buildPriorityHintText deduplicates case-insensitively", () => {
const result = buildPriorityHintText({
attachmentNames: ["Spec.md", "spec.md", " SPEC.md "],
skillIds: ["skill.excel", "SKILL.EXCEL"],
});
assert.equal(result, "XClaw优先使用【Spec.md】和【skill.excel】");
});
void test("composeSubmitText appends hint only when needed", () => {
assert.equal(
composeSubmitText({
baseText: "请总结",
attachmentNames: ["spec.md"],
skillIds: [],
}),
"请总结\nXClaw优先使用【spec.md】",
);
assert.equal(
composeSubmitText({
baseText: "请总结",
attachmentNames: [],
skillIds: [],
}),
"请总结",
);
});