summaryrefslogtreecommitdiffhomepage
path: root/packages/api/tests
diff options
context:
space:
mode:
Diffstat (limited to 'packages/api/tests')
-rw-r--r--packages/api/tests/agent-manager.test.ts32
-rw-r--r--packages/api/tests/routes.test.ts13
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", {