test(workbench): 增加 DOCX/XLSX 导出与会话隔离单元测试
- 验证 DOCX 二进制 Buffer 生成、TextRun 解析与 Blob 输出 - 验证 XLSX 多表提取、自适应列宽与工作簿 Sheet 命名规范 - 验证 sess-001 与 sess-002 对话隔离及动态追加互不串线 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { DEFAULT_MESSAGES, DEFAULT_SESSIONS } from './storage';
|
||||
import { ChatMessage } from '../types/workbench';
|
||||
|
||||
test('多项目会话消息隔离测试 (Multi-project Session Messages Strict Isolation)', () => {
|
||||
// 1. 验证预设会话消息按 sessionId 严格分离
|
||||
const sess1Msgs = DEFAULT_MESSAGES.filter((m) => m.sessionId === 'sess-001');
|
||||
const sess2Msgs = DEFAULT_MESSAGES.filter((m) => m.sessionId === 'sess-002');
|
||||
|
||||
assert.ok(sess1Msgs.length >= 2, 'sess-001 应当包含其专属消息');
|
||||
assert.ok(sess2Msgs.length >= 2, 'sess-002 应当包含其专属消息');
|
||||
|
||||
// 验证 sess-001 包含内窥镜关键字,不包含超声探头
|
||||
const sess1Combined = sess1Msgs.map((m) => m.content).join(' ');
|
||||
assert.ok(sess1Combined.includes('荧光内窥镜'));
|
||||
assert.ok(!sess1Combined.includes('超声声输出安全标准'));
|
||||
|
||||
// 验证 sess-002 包含超声探头关键字,不包含腹腔镜初稿
|
||||
const sess2Combined = sess2Msgs.map((m) => m.content).join(' ');
|
||||
assert.ok(sess2Combined.includes('便携式掌上无线超声诊断仪'));
|
||||
assert.ok(!sess2Combined.includes('4K超高清荧光内窥镜系统立项与可行性报告'));
|
||||
|
||||
// 2. 模拟向 sess-001 追加一条新消息
|
||||
const allMessages: ChatMessage[] = [...DEFAULT_MESSAGES];
|
||||
const newMsgSess1: ChatMessage = {
|
||||
id: 'm-new-1',
|
||||
sessionId: 'sess-001',
|
||||
role: 'user',
|
||||
content: '请测算一下双棱镜分光成本',
|
||||
timestamp: '14:30',
|
||||
};
|
||||
allMessages.push(newMsgSess1);
|
||||
|
||||
// 3. 验证此时切到 sess-002 时,绝不出现新消息
|
||||
const filteredSess2 = allMessages.filter((m) => m.sessionId === 'sess-002');
|
||||
assert.equal(filteredSess2.length, sess2Msgs.length, 'sess-002 的消息条数应当完全不受 sess-001 变动的影响');
|
||||
assert.ok(!filteredSess2.some((m) => m.content.includes('双棱镜分光成本')));
|
||||
|
||||
// 4. 验证此时切到 sess-001 时,准确多了一条消息
|
||||
const filteredSess1 = allMessages.filter((m) => m.sessionId === 'sess-001');
|
||||
assert.equal(filteredSess1.length, sess1Msgs.length + 1);
|
||||
assert.ok(filteredSess1.some((m) => m.content.includes('双棱镜分光成本')));
|
||||
});
|
||||
|
||||
test('新建项目会话独立初始化隔离测试 (New Session Spawning & Isolation)', () => {
|
||||
const allSessions = [...DEFAULT_SESSIONS];
|
||||
const newSessId = 'sess-new-999';
|
||||
|
||||
const newSess = {
|
||||
sessionId: newSessId,
|
||||
projectId: 999,
|
||||
title: '神经外科双极电凝系统',
|
||||
deviceType: '高频手术设备',
|
||||
stage: 'V0.1' as const,
|
||||
stageLabel: 'V0.1 需求摸底',
|
||||
messageCount: 1,
|
||||
updatedAt: '刚刚',
|
||||
};
|
||||
allSessions.unshift(newSess);
|
||||
|
||||
const initialMsgs: ChatMessage[] = [
|
||||
...DEFAULT_MESSAGES,
|
||||
{
|
||||
id: 'm-init-999',
|
||||
sessionId: newSessId,
|
||||
role: 'system',
|
||||
content: '水木东方协同参谋小队已就位,当前项目【神经外科双极电凝系统】进入需求摸底阶段。',
|
||||
timestamp: '刚刚',
|
||||
},
|
||||
];
|
||||
|
||||
// 检查新项目消息隔离
|
||||
const sess999Msgs = initialMsgs.filter((m) => m.sessionId === newSessId);
|
||||
assert.equal(sess999Msgs.length, 1);
|
||||
assert.ok(sess999Msgs[0].content.includes('神经外科双极电凝系统'));
|
||||
|
||||
// 检查原项目消息数量未变
|
||||
assert.equal(initialMsgs.filter((m) => m.sessionId === 'sess-001').length, 2);
|
||||
assert.equal(initialMsgs.filter((m) => m.sessionId === 'sess-002').length, 2);
|
||||
});
|
||||
Reference in New Issue
Block a user