import { beforeEach, describe, expect, mock, test } from 'bun:test'; import type { Agent } from '@opencode-ai/sdk/v2'; import type { QueuedMessage } from '../stores/messageQueueStore'; let visibleAgents: Agent[] = []; const sendMessageCalls: unknown[][] = []; const getVisibleAgentsMock = mock(() => visibleAgents); mock.module('@/stores/useConfigStore', () => ({ useConfigStore: { getState: () => ({ getVisibleAgents: getVisibleAgentsMock, }), }, })); mock.module('@/sync/session-ui-store', () => ({ useSessionUIStore: { getState: () => ({ sendMessage: (...args: unknown[]) => { sendMessageCalls.push(args); return Promise.resolve(); }, sessionAbortFlags: new Map(), }), }, })); import { buildQueuedAutoSendPayload, sendQueuedAutoSendPayload } from './useQueuedMessageAutoSend'; describe('buildQueuedAutoSendPayload', () => { beforeEach(() => { visibleAgents = []; sendMessageCalls.length = 0; }); test('returns only the first queued message for auto-send', () => { const queue: QueuedMessage[] = [ { id: 'queued-1', content: 'first queued message', createdAt: 1, }, { id: 'queued-2', content: 'second queued message', createdAt: 2, }, ]; const payload = buildQueuedAutoSendPayload(queue); expect(payload).not.toBeNull(); expect(payload?.queuedMessageId).toBe('queued-1'); expect(payload?.primaryText).toBe('first queued message'); expect(payload?.primaryAttachments).toEqual([]); }); test('uses the configured visible agents when parsing queued mentions', () => { visibleAgents = [ { name: 'Builder', mode: 'subagent', permission: [], options: {}, } as Agent, ]; const queue: QueuedMessage[] = [ { id: 'queued-mention', content: '@Builder please take this', createdAt: 1, }, ]; const payload = buildQueuedAutoSendPayload(queue); expect(payload).not.toBeNull(); expect(payload?.agentMentionName).toBe('Builder'); expect(payload?.primaryText).toBe('@Builder please take this'); }); test('preserves attachment-only queued messages as sendable payloads', () => { const queue: QueuedMessage[] = [ { id: 'queued-attachments', content: '', createdAt: 1, attachments: [ { id: 'file-1', filename: 'notes.txt', mimeType: 'text/plain', size: 5, source: 'local', file: new File(['hello'], 'notes.txt', { type: 'text/plain' }), dataUrl: 'data:text/plain;base64,aGVsbG8=', }, ], }, { id: 'queued-2', content: 'later queued message', createdAt: 2, }, ]; const payload = buildQueuedAutoSendPayload(queue); expect(payload).not.toBeNull(); expect(payload?.queuedMessageId).toBe('queued-attachments'); expect(payload?.primaryText).toBe(''); expect(payload?.primaryAttachments).toHaveLength(1); expect(payload?.primaryAttachments[0]?.filename).toBe('notes.txt'); }); test('auto-send targets the queued session explicitly', async () => { const payload = buildQueuedAutoSendPayload([ { id: 'queued-1', content: 'queued message', createdAt: 1, }, ]); expect(payload).not.toBeNull(); await sendQueuedAutoSendPayload('session-original', payload!, { providerID: 'provider-1', modelID: 'model-1', agent: 'agent-1', variant: 'variant-1', }); expect(sendMessageCalls.length).toBe(1); expect(sendMessageCalls[0]).toEqual([ 'queued message', 'provider-1', 'model-1', 'agent-1', [], undefined, undefined, 'variant-1', 'normal', { sessionId: 'session-original' }, ]); }); });