/** * 邮件会话 → DSH 会话 id 的派生约定。 * * 这组函数存在的原因是一个具体的静默失效:插件重启后 `sessionMap` 为空, * 人在 WebUI 改档位的 `session_update` 找不到目标会话就被忽略, * 运行时仍按旧档位执行 —— 人以为自己收紧了权限。 */ import { test } from 'node:test'; import assert from 'node:assert/strict'; import { dshSessionIdForMail, matchesMailSession, pickMailSession, } from '../lib/mail-session-id.js'; test('首次尝试的 id 是 mail-<邮件会话 id>', () => { assert.equal(dshSessionIdForMail('abc-123'), 'mail-abc-123'); }); test('匹配首次尝试的 id', () => { assert.equal(matchesMailSession('mail-abc', 'abc'), true); }); test('匹配模型降级重试的 -r', () => { assert.equal(matchesMailSession('mail-abc-r1', 'abc'), true); assert.equal(matchesMailSession('mail-abc-r12', 'abc'), true); }); test('不匹配别的会话(前缀相同也不行)', () => { assert.equal(matchesMailSession('mail-abcdef', 'abc'), false, 'mail-abc 的前缀不能吃掉 mail-abcdef'); assert.equal(matchesMailSession('mail-abd', 'abc'), false); assert.equal(matchesMailSession('other-abc', 'abc'), false); assert.equal(matchesMailSession('', 'abc'), false); }); test('不匹配非数字后缀(避免误吞其它会话)', () => { assert.equal(matchesMailSession('mail-abc-rx', 'abc'), false); assert.equal(matchesMailSession('mail-abc-r', 'abc'), false); assert.equal(matchesMailSession('mail-abc-retry', 'abc'), false); }); test('pickMailSession 优先首次尝试,而不是数组顺序', () => { // 数组顺序可能来自 ctx.agents.list(),与尝试顺序无关 assert.equal(pickMailSession(['mail-abc-r2', 'mail-abc-r1', 'mail-abc'], 'abc'), 'mail-abc'); }); test('pickMailSession 没有首次尝试时取序号最小的重试', () => { assert.equal(pickMailSession(['mail-abc-r3', 'mail-abc-r1', 'mail-abc-r2'], 'abc'), 'mail-abc-r1'); }); test('pickMailSession 找不到时返回 undefined(调用方据此跳过)', () => { assert.equal(pickMailSession(['other-1', 'mail-def'], 'abc'), undefined); assert.equal(pickMailSession([], 'abc'), undefined); assert.equal(pickMailSession(undefined, 'abc'), undefined); }); test('接管的平台会话推不出 id:不能被误判成邮件会话', () => { // 平台自己生成的 id(如 DSH 界面里开的会话)与邮件会话无关, // 匹配函数必须说「不是」,否则会给错误的会话改档位。 assert.equal(matchesMailSession('session-7f3a91', 'abc'), false); assert.equal(pickMailSession(['session-7f3a91'], 'abc'), undefined); });