Files

55 lines
1.7 KiB
JavaScript
Raw Permalink Normal View History

import test from 'node:test';
import assert from 'node:assert/strict';
import {
mergeConversationSnapshot,
mergeSessionMessagesAfterFinish,
} from './chat-finish-sync.mjs';
const msg = (id, role, text) => ({
id,
role,
metadata: { userVisible: true },
content: [{ type: 'text', text }],
});
test('mergeConversationSnapshot keeps local-only messages when server snapshot is shorter', () => {
const local = [
msg('u1', 'user', '生成一个页面'),
msg('a1', 'assistant', '正在写入 public/demo.html…'),
msg('a2', 'assistant', '页面已生成'),
];
const server = [msg('u1', 'user', '生成一个页面')];
const merged = mergeConversationSnapshot(local, server);
assert.equal(merged.length, 3);
assert.deepEqual(
merged.map((message) => message.id),
['u1', 'a1', 'a2'],
);
});
test('mergeConversationSnapshot prefers server content for shared message ids', () => {
const local = [msg('u1', 'user', '旧文案')];
const server = [msg('u1', 'user', '新文案')];
const merged = mergeConversationSnapshot(local, server);
assert.equal(merged.length, 1);
assert.equal(merged[0].content[0].text, '新文案');
});
test('mergeConversationSnapshot returns current when incoming is empty', () => {
const local = [msg('u1', 'user', 'hello')];
assert.deepEqual(mergeConversationSnapshot(local, []), local);
});
test('mergeSessionMessagesAfterFinish matches Finish sync merge semantics', () => {
const local = [
msg('u1', 'user', '根据图片做主题页'),
msg('a1', 'assistant', '已完成'),
];
const server = [msg('u1', 'user', '根据图片做主题页')];
assert.deepEqual(
mergeSessionMessagesAfterFinish(local, server).map((message) => message.id),
['u1', 'a1'],
);
});