Add 14 tests covering key routing and dispatch flows that previously had zero direct coverage: dispatchResultText: - bare text produces no outbound (scratchpad only) - unknown destination dropped, valid destination sent - multiple <message> blocks each produce correct outbound - internal tags stripped from scratchpad originAttr / from= metadata: - chat/task/webhook/system messages include from= when destination matches - fallback to raw unknown:channel:platform when no match - from= omitted when routing is null resolveDestinationThread: - null thread_id when no prior inbound from destination - most recent thread_id wins with multiple inbound messages Also fix merge issue: restore getAllDestinations import removed by our PR but still needed by #2327's compaction reminder. Fix stale destinations test assertion from #2328 ("no special wrapping needed" → "Every response must be wrapped"). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
64 lines
2.2 KiB
TypeScript
64 lines
2.2 KiB
TypeScript
import { afterEach, beforeEach, describe, expect, it } from 'bun:test';
|
|
|
|
import { closeSessionDb, getInboundDb, initTestSessionDb } from './db/connection.js';
|
|
import { buildSystemPromptAddendum } from './destinations.js';
|
|
|
|
beforeEach(() => {
|
|
initTestSessionDb();
|
|
});
|
|
|
|
afterEach(() => {
|
|
closeSessionDb();
|
|
});
|
|
|
|
function seedDestination(name: string, displayName: string, channelType: string, platformId: string): void {
|
|
getInboundDb()
|
|
.prepare(
|
|
`INSERT INTO destinations (name, display_name, type, channel_type, platform_id, agent_group_id)
|
|
VALUES (?, ?, 'channel', ?, ?, NULL)`,
|
|
)
|
|
.run(name, displayName, channelType, platformId);
|
|
}
|
|
|
|
describe('buildSystemPromptAddendum — multi-destination routing guidance', () => {
|
|
it('includes default-routing nudge when there are >1 destinations', () => {
|
|
seedDestination('casa', 'Casa', 'whatsapp', 'group-1@g.us');
|
|
seedDestination('whatsapp-mg-17780', 'whatsapp-mg-17780', 'whatsapp', 'phone-2@s.whatsapp.net');
|
|
|
|
const prompt = buildSystemPromptAddendum('Casa');
|
|
|
|
expect(prompt).toContain('Default routing');
|
|
expect(prompt).toContain('from="name"');
|
|
expect(prompt).toContain('`casa`');
|
|
expect(prompt).toContain('`whatsapp-mg-17780`');
|
|
});
|
|
|
|
it('requires explicit wrapping even for a single destination', () => {
|
|
seedDestination('casa', 'Casa', 'whatsapp', 'group-1@g.us');
|
|
|
|
const prompt = buildSystemPromptAddendum('Casa');
|
|
|
|
expect(prompt).toContain('Every response must be wrapped');
|
|
expect(prompt).toContain('<message to="name">');
|
|
expect(prompt).toContain('`casa`');
|
|
});
|
|
|
|
it('handles the no-destination case without crashing', () => {
|
|
const prompt = buildSystemPromptAddendum('Casa');
|
|
|
|
expect(prompt).toContain('no configured destinations');
|
|
expect(prompt).not.toContain('Default routing');
|
|
});
|
|
|
|
it('includes default-routing and wrapping instructions for single destination', () => {
|
|
seedDestination('casa', 'Casa', 'whatsapp', 'group-1@g.us');
|
|
|
|
const prompt = buildSystemPromptAddendum('Casa');
|
|
|
|
expect(prompt).toContain('Every response must be wrapped');
|
|
expect(prompt).toContain('<message to="name">');
|
|
expect(prompt).toContain('Default routing');
|
|
expect(prompt).toContain('`casa`');
|
|
});
|
|
});
|