126 lines
3.3 KiB
TypeScript
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: [],
|
|
}),
|
|
"请总结",
|
|
);
|
|
});
|