|
|
@@ -0,0 +1,38 @@
|
|
|
+import { Task } from "../Task"
|
|
|
+
|
|
|
+// Keep this test focused: if a queued message arrives while Task.ask() is blocked,
|
|
|
+// it should be consumed and used to fulfill the ask.
|
|
|
+
|
|
|
+describe("Task.ask queued message drain", () => {
|
|
|
+ it("consumes queued message while blocked on followup ask", async () => {
|
|
|
+ const task = Object.create(Task.prototype) as Task
|
|
|
+ ;(task as any).abort = false
|
|
|
+ ;(task as any).clineMessages = []
|
|
|
+ ;(task as any).askResponse = undefined
|
|
|
+ ;(task as any).askResponseText = undefined
|
|
|
+ ;(task as any).askResponseImages = undefined
|
|
|
+ ;(task as any).lastMessageTs = undefined
|
|
|
+
|
|
|
+ // Message queue service exists in constructor; for unit test we can attach a real one.
|
|
|
+ const { MessageQueueService } = await import("../../message-queue/MessageQueueService")
|
|
|
+ ;(task as any).messageQueueService = new MessageQueueService()
|
|
|
+
|
|
|
+ // Minimal stubs used by ask()
|
|
|
+ ;(task as any).addToClineMessages = vi.fn(async () => {})
|
|
|
+ ;(task as any).saveClineMessages = vi.fn(async () => {})
|
|
|
+ ;(task as any).updateClineMessage = vi.fn(async () => {})
|
|
|
+ ;(task as any).cancelAutoApprovalTimeout = vi.fn(() => {})
|
|
|
+ ;(task as any).checkpointSave = vi.fn(async () => {})
|
|
|
+ ;(task as any).emit = vi.fn()
|
|
|
+ ;(task as any).providerRef = { deref: () => undefined }
|
|
|
+
|
|
|
+ const askPromise = task.ask("followup", "Q?", false)
|
|
|
+
|
|
|
+ // Simulate webview queuing the user's selection text while the ask is pending.
|
|
|
+ ;(task as any).messageQueueService.addMessage("picked answer")
|
|
|
+
|
|
|
+ const result = await askPromise
|
|
|
+ expect(result.response).toBe("messageResponse")
|
|
|
+ expect(result.text).toBe("picked answer")
|
|
|
+ })
|
|
|
+})
|