fix: execute tools against dispatch-time snapshot (#1018)
This commit is contained in:
90
src/tests/cli/queue-ordering-wiring.test.ts
Normal file
90
src/tests/cli/queue-ordering-wiring.test.ts
Normal file
@@ -0,0 +1,90 @@
|
||||
import { describe, expect, test } from "bun:test";
|
||||
import { readFileSync } from "node:fs";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
function readAppSource(): string {
|
||||
const appPath = fileURLToPath(new URL("../../cli/App.tsx", import.meta.url));
|
||||
return readFileSync(appPath, "utf-8");
|
||||
}
|
||||
|
||||
describe("queue ordering wiring", () => {
|
||||
test("dequeue effect keeps all sensitive safety gates", () => {
|
||||
const source = readAppSource();
|
||||
const start = source.indexOf(
|
||||
"// Process queued messages when streaming ends",
|
||||
);
|
||||
const end = source.indexOf(
|
||||
"// Helper to send all approval results when done",
|
||||
);
|
||||
|
||||
expect(start).toBeGreaterThan(-1);
|
||||
expect(end).toBeGreaterThan(start);
|
||||
|
||||
const segment = source.slice(start, end);
|
||||
expect(segment).toContain("pendingApprovals.length === 0");
|
||||
expect(segment).toContain("!commandRunning");
|
||||
expect(segment).toContain("!isExecutingTool");
|
||||
expect(segment).toContain("!anySelectorOpen");
|
||||
expect(segment).toContain("!queuedOverlayAction");
|
||||
expect(segment).toContain("!waitingForQueueCancelRef.current");
|
||||
expect(segment).toContain("!userCancelledRef.current");
|
||||
expect(segment).toContain("!abortControllerRef.current");
|
||||
expect(segment).toContain("queuedOverlayAction=");
|
||||
expect(segment).toContain("setMessageQueue([]);");
|
||||
expect(segment).toContain("onSubmitRef.current(concatenatedMessage);");
|
||||
expect(segment).toContain("queuedOverlayAction,");
|
||||
});
|
||||
|
||||
test("queued overlay effect only runs when idle and clears action before processing", () => {
|
||||
const source = readAppSource();
|
||||
const start = source.indexOf(
|
||||
"// Process queued overlay actions when streaming ends",
|
||||
);
|
||||
const end = source.indexOf(
|
||||
"// Handle escape when profile confirmation is pending",
|
||||
);
|
||||
|
||||
expect(start).toBeGreaterThan(-1);
|
||||
expect(end).toBeGreaterThan(start);
|
||||
|
||||
const segment = source.slice(start, end);
|
||||
expect(segment).toContain("!streaming");
|
||||
expect(segment).toContain("!commandRunning");
|
||||
expect(segment).toContain("!isExecutingTool");
|
||||
expect(segment).toContain("pendingApprovals.length === 0");
|
||||
expect(segment).toContain("queuedOverlayAction !== null");
|
||||
expect(segment).toContain("setQueuedOverlayAction(null)");
|
||||
expect(segment).toContain('action.type === "switch_model"');
|
||||
expect(segment).toContain("handleModelSelect(action.modelId");
|
||||
expect(segment).toContain('action.type === "switch_toolset"');
|
||||
expect(segment).toContain("handleToolsetSelect(action.toolsetId");
|
||||
});
|
||||
|
||||
test("busy model/toolset handlers enqueue overlay actions", () => {
|
||||
const source = readAppSource();
|
||||
|
||||
const modelAnchor = source.indexOf(
|
||||
"Model switch queued – will switch after current task completes",
|
||||
);
|
||||
expect(modelAnchor).toBeGreaterThan(-1);
|
||||
const modelWindow = source.slice(
|
||||
Math.max(0, modelAnchor - 700),
|
||||
modelAnchor + 700,
|
||||
);
|
||||
expect(modelWindow).toContain("if (isAgentBusy())");
|
||||
expect(modelWindow).toContain("setQueuedOverlayAction({");
|
||||
expect(modelWindow).toContain('type: "switch_model"');
|
||||
|
||||
const toolsetAnchor = source.indexOf(
|
||||
"Toolset switch queued – will switch after current task completes",
|
||||
);
|
||||
expect(toolsetAnchor).toBeGreaterThan(-1);
|
||||
const toolsetWindow = source.slice(
|
||||
Math.max(0, toolsetAnchor - 700),
|
||||
toolsetAnchor + 700,
|
||||
);
|
||||
expect(toolsetWindow).toContain("if (isAgentBusy())");
|
||||
expect(toolsetWindow).toContain("setQueuedOverlayAction({");
|
||||
expect(toolsetWindow).toContain('type: "switch_toolset"');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user