zcbot/tests/frontend_attachments.test.mjs

37 lines
1.5 KiB
JavaScript

import assert from "node:assert/strict";
import test from "node:test";
import { readFileSync } from "node:fs";
import { parseUserAttachments } from "../web/static/js/attachments.js";
const chatJs = readFileSync("web/static/js/chat.js", "utf8");
test("user attachment protocol lines are separated from visible message text", () => {
const parsed = parseUserAttachments(
"请比较这张图\n\n[用户上传的参考图] 项目/显微照片.png\n[用户上传的文件] 项目/数据表.xlsx",
);
assert.equal(parsed.content, "请比较这张图");
assert.deepEqual(parsed.attachments, [
{ path: "项目/显微照片.png", kind: "image" },
{ path: "项目/数据表.xlsx", kind: "file" },
]);
});
test("attachment-only messages have an empty visible body", () => {
const parsed = parseUserAttachments("[用户上传的参考图] 项目/照片 01.png");
assert.equal(parsed.content, "");
assert.deepEqual(parsed.attachments, [{ path: "项目/照片 01.png", kind: "image" }]);
});
test("ordinary bracketed text remains visible", () => {
const content = "[备注] 这不是附件\n继续处理";
assert.deepEqual(parseUserAttachments(content), { content, attachments: [] });
});
test("new sends use structured attachments and history keeps a legacy fallback", () => {
assert.match(chatJs, /attachments:\s*pendingAttachments\.map/);
assert.match(chatJs, /Array\.isArray\(m\.attachment_refs\)/);
assert.match(chatJs, /structuredAttachments === null/);
assert.doesNotMatch(chatJs, /content = content \? `\$\{content\}\\n\\n\$\{lines\}`/);
});