Skip to content

Commit d2abbad

Browse files
committed
test: add integration test for sendQueuedImmediately option
Tests that interrupting with sendQueuedImmediately:true sends the queued message instead of restoring it to the input box.
1 parent 5168b46 commit d2abbad

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

tests/ipcMain/queuedMessages.test.ts

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,74 @@ describeIntegration("IpcMain queuedMessages integration tests", () => {
182182
20000
183183
);
184184

185+
test.concurrent(
186+
"should send queued message immediately when sendQueuedImmediately is true",
187+
async () => {
188+
const { env, workspaceId, cleanup } = await setupWorkspace("anthropic");
189+
try {
190+
// Start a stream
191+
void sendMessageWithModel(
192+
env.mockIpcRenderer,
193+
workspaceId,
194+
"Count to 10 slowly",
195+
modelString("anthropic", "claude-haiku-4-5")
196+
);
197+
198+
const collector = createEventCollector(env.sentEvents, workspaceId);
199+
await collector.waitForEvent("stream-start", 5000);
200+
201+
// Queue a message
202+
await sendMessageWithModel(
203+
env.mockIpcRenderer,
204+
workspaceId,
205+
"This message should be sent immediately",
206+
modelString("anthropic", "claude-haiku-4-5")
207+
);
208+
209+
// Verify message was queued
210+
const queued = await getQueuedMessages(collector);
211+
expect(queued).toEqual(["This message should be sent immediately"]);
212+
213+
// Interrupt the stream with sendQueuedImmediately flag
214+
const interruptResult = await env.mockIpcRenderer.invoke(
215+
IPC_CHANNELS.WORKSPACE_INTERRUPT_STREAM,
216+
workspaceId,
217+
{ sendQueuedImmediately: true }
218+
);
219+
expect(interruptResult.success).toBe(true);
220+
221+
// Wait for stream abort
222+
await collector.waitForEvent("stream-abort", 5000);
223+
224+
// Should NOT get restore-to-input event (message is sent, not restored)
225+
// Instead, we should see the queued message being sent as a new user message
226+
const autoSendHappened = await waitFor(() => {
227+
collector.collect();
228+
const userMessages = collector
229+
.getEvents()
230+
.filter((e) => "role" in e && e.role === "user");
231+
return userMessages.length === 2; // First + immediately sent
232+
}, 5000);
233+
expect(autoSendHappened).toBe(true);
234+
235+
// Verify queue was cleared
236+
const queuedAfter = await getQueuedMessages(collector);
237+
expect(queuedAfter).toEqual([]);
238+
239+
// Clear events to track second stream separately
240+
env.sentEvents.length = 0;
241+
242+
// Wait for the immediately-sent message's stream
243+
const collector2 = createEventCollector(env.sentEvents, workspaceId);
244+
await collector2.waitForEvent("stream-start", 5000);
245+
await collector2.waitForEvent("stream-end", 15000);
246+
} finally {
247+
await cleanup();
248+
}
249+
},
250+
30000
251+
);
252+
185253
test.concurrent(
186254
"should combine multiple queued messages with newline separator",
187255
async () => {

0 commit comments

Comments
 (0)