test: cover complete fake agent flow

This commit is contained in:
Wenxin Duan
2026-09-08 10:35:11 +08:00
parent c4a88e4aae
commit 89ce7973c3
8 changed files with 406 additions and 2 deletions
@@ -129,6 +129,44 @@ describe("HarnessSession", () => {
await expect(session.startRun({ text: "look", attachmentIds: ["att_1"] })).rejects.toMatchObject({ code: "MODEL_DOES_NOT_SUPPORT_IMAGES" });
expect(createAgentPort).not.toHaveBeenCalled();
});
it("serializes async agent events before completing the run", async () => {
const port = new FakePort();
const events = new harness.InMemoryEventStore();
let finishSkillLookup: (() => void) | undefined;
const order: string[] = [];
const session = new harness.HarnessSession({
sessionId: "ses_1",
workspaceRoot: root,
eventStore: events,
modelStore: await configuredModelStore(),
attachmentStore: { toPiImages: () => Promise.resolve([]), removeAll: () => Promise.resolve() },
approvalBroker: { cancelForRun: () => 0, cancelForSession: () => 0 },
createAgentPort: () => Promise.resolve(port),
createSkillInference: () => ({
onReadRequested: () => new Promise<void>((resolve) => {
finishSkillLookup = () => {
order.push("requested");
resolve();
};
}),
onReadCompleted: () => { order.push("completed"); },
}),
});
await session.startRun({ text: "load skill", attachmentIds: [] });
for (const listener of port.listeners) {
listener({ type: "tool_execution_start", toolCallId: "call_1", toolName: "read", args: { path: "/skill/SKILL.md" } });
listener({ type: "tool_execution_end", toolCallId: "call_1", toolName: "read", result: "ok", isError: false });
}
port.resolvePrompt();
await vi.waitFor(() => expect(finishSkillLookup).toBeDefined());
expect(events.listAfter("ses_1").events.at(-1)?.type).not.toBe("run.completed");
finishSkillLookup?.();
await vi.waitFor(() => expect(events.listAfter("ses_1").events.at(-1)?.type).toBe("run.completed"));
expect(order).toEqual(["requested", "completed"]);
});
});
describe("InMemorySessionRegistry", () => {