diff options
Diffstat (limited to 'packages/api/tests')
| -rw-r--r-- | packages/api/tests/agent-manager.test.ts | 32 | ||||
| -rw-r--r-- | packages/api/tests/routes.test.ts | 13 |
2 files changed, 43 insertions, 2 deletions
diff --git a/packages/api/tests/agent-manager.test.ts b/packages/api/tests/agent-manager.test.ts index 6b016db..4415bbb 100644 --- a/packages/api/tests/agent-manager.test.ts +++ b/packages/api/tests/agent-manager.test.ts @@ -340,15 +340,43 @@ describe("AgentManager", () => { await manager.processMessage("tab-1", "test"); expect(events.length).toBeGreaterThan(0); - expect(events[0]).toMatchObject({ type: "status", status: "running" }); + // A turn now opens with `turn-start`, immediately followed by the + // agent's `status: running`. + expect(events[0]).toMatchObject({ type: "turn-start" }); + expect(events[1]).toMatchObject({ type: "status", status: "running" }); + // A turn now closes with `turn-sealed` (emitted after the DB write, which + // is after the agent's final `status: idle`). const lastEvent = events[events.length - 1]; - expect(lastEvent).toMatchObject({ type: "status", status: "idle" }); + expect(lastEvent).toMatchObject({ type: "turn-sealed" }); + expect(events.some((e) => e.type === "status" && e.status === "idle")).toBe(true); const doneEvent = events.find((e) => e.type === "done"); expect(doneEvent).toBeDefined(); }); + it("emits a turn-start with a turnId before any content event", async () => { + const manager = new AgentManager(); + const events: AgentEvent[] = []; + manager.onEvent((event) => { + events.push(event); + }); + + await manager.processMessage("tab-turnstart", "go"); + + const turnStartIdx = events.findIndex((e) => e.type === "turn-start"); + expect(turnStartIdx).toBeGreaterThanOrEqual(0); + const turnStart = events[turnStartIdx] as Extract<AgentEvent, { type: "turn-start" }>; + expect(typeof turnStart.turnId).toBe("string"); + expect(turnStart.turnId.length).toBeGreaterThan(0); + + // Must precede the first content delta. + const firstContentIdx = events.findIndex( + (e) => e.type === "text-delta" || e.type === "reasoning-delta", + ); + expect(firstContentIdx).toBeGreaterThan(turnStartIdx); + }); + it("emits text-delta events during processMessage", async () => { const manager = new AgentManager(); const events: AgentEvent[] = []; diff --git a/packages/api/tests/routes.test.ts b/packages/api/tests/routes.test.ts index f4de845..4b8dd40 100644 --- a/packages/api/tests/routes.test.ts +++ b/packages/api/tests/routes.test.ts @@ -335,6 +335,19 @@ describe("POST /chat", () => { }); }); +describe("GET /tabs/:id/chunks", () => { + it("returns the raw chunk window shape { chunks, total, oldestSeq }", async () => { + const res = await app.request("/tabs/tab-x/chunks?limit=50"); + expect(res.status).toBe(200); + const body = await res.json(); + // Mocked getChunksForTab returns [] → empty window, null cursor. + expect(Array.isArray(body.chunks)).toBe(true); + expect(body.chunks).toEqual([]); + expect(body.total).toBe(0); + expect(body.oldestSeq).toBeNull(); + }); +}); + describe("POST /chat/stop", () => { it("returns 200 with success: true for valid tabId", async () => { const res = await app.request("/chat/stop", { |
