diff options
| author | Adam Malczewski <[email protected]> | 2026-06-27 01:12:40 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-06-27 01:12:40 +0900 |
| commit | 98b0638838a8e754927d8c030ce8bded18d63e7d (patch) | |
| tree | 0d4e21c3d4792fcd77e1040373b260e38efa34ce /packages/message-queue/src/pure.test.ts | |
| parent | d92a4af6191d7d20acf861adf605ad0227b6b287 (diff) | |
| parent | 61e45e60d699ed1ca46f94a8f181c92a940317c6 (diff) | |
| download | dispatch-98b0638838a8e754927d8c030ce8bded18d63e7d.tar.gz dispatch-98b0638838a8e754927d8c030ce8bded18d63e7d.zip | |
Merge branch 'dev' into feature/heartbeat
# Conflicts:
# packages/host-bin/package.json
# packages/host-bin/src/main.ts
# packages/session-orchestrator/src/orchestrator.ts
# packages/system-prompt/src/service.test.ts
# packages/system-prompt/src/service.ts
# packages/system-prompt/src/types.ts
# packages/transport-contract/package.json
# packages/transport-http/package.json
# packages/transport-http/src/app.test.ts
# packages/transport-http/src/app.ts
# packages/transport-http/src/extension.ts
# packages/transport-http/tsconfig.json
# tsconfig.json
Diffstat (limited to 'packages/message-queue/src/pure.test.ts')
| -rw-r--r-- | packages/message-queue/src/pure.test.ts | 238 |
1 files changed, 119 insertions, 119 deletions
diff --git a/packages/message-queue/src/pure.test.ts b/packages/message-queue/src/pure.test.ts index ff1a08f..3fd6039 100644 --- a/packages/message-queue/src/pure.test.ts +++ b/packages/message-queue/src/pure.test.ts @@ -1,144 +1,144 @@ import type { QueuedMessage } from "@dispatch/wire"; import { describe, expect, it } from "vitest"; import { - buildQueueSpec, - combine, - drain, - enqueue, - getQueue, - MESSAGE_QUEUE_RENDERER_ID, - MESSAGE_QUEUE_SURFACE_ID, - type MessageQueueState, - type QueueDeps, + buildQueueSpec, + combine, + drain, + enqueue, + getQueue, + MESSAGE_QUEUE_RENDERER_ID, + MESSAGE_QUEUE_SURFACE_ID, + type MessageQueueState, + type QueueDeps, } from "./pure.js"; function makeDeps(): QueueDeps { - let idCounter = 0; - let now = 1_000; - return { - id: () => `id-${++idCounter}`, - now: () => (now += 10), - }; + let idCounter = 0; + let now = 1_000; + return { + id: () => `id-${++idCounter}`, + now: () => (now += 10), + }; } describe("enqueue", () => { - it("enqueue appends + returns snapshot with the new message (id unique, queuedAt set)", () => { - const state: MessageQueueState = new Map(); - const deps = makeDeps(); - - const first = enqueue(state, "c1", "first", deps); - expect(first).toHaveLength(1); - const firstMsg = first[0]; - if (firstMsg === undefined) throw new Error("expected a message"); - expect(firstMsg.id).toBe("id-1"); - expect(firstMsg.text).toBe("first"); - expect(firstMsg.queuedAt).toBe(1_010); - - const second = enqueue(state, "c1", "second", deps); - expect(second).toHaveLength(2); - const secondMsg = second[1]; - if (secondMsg === undefined) throw new Error("expected a message"); - expect(secondMsg.id).toBe("id-2"); // unique per message - expect(secondMsg.text).toBe("second"); - expect(secondMsg.queuedAt).toBe(1_020); - - // a separate conversation does not share state - const other = enqueue(state, "c2", "other", deps); - expect(other).toHaveLength(1); - expect(getQueue(state, "c2")).toHaveLength(1); - }); + it("enqueue appends + returns snapshot with the new message (id unique, queuedAt set)", () => { + const state: MessageQueueState = new Map(); + const deps = makeDeps(); + + const first = enqueue(state, "c1", "first", deps); + expect(first).toHaveLength(1); + const firstMsg = first[0]; + if (firstMsg === undefined) throw new Error("expected a message"); + expect(firstMsg.id).toBe("id-1"); + expect(firstMsg.text).toBe("first"); + expect(firstMsg.queuedAt).toBe(1_010); + + const second = enqueue(state, "c1", "second", deps); + expect(second).toHaveLength(2); + const secondMsg = second[1]; + if (secondMsg === undefined) throw new Error("expected a message"); + expect(secondMsg.id).toBe("id-2"); // unique per message + expect(secondMsg.text).toBe("second"); + expect(secondMsg.queuedAt).toBe(1_020); + + // a separate conversation does not share state + const other = enqueue(state, "c2", "other", deps); + expect(other).toHaveLength(1); + expect(getQueue(state, "c2")).toHaveLength(1); + }); }); describe("getQueue", () => { - it("getQueue returns current snapshot; empty array when none", () => { - const state: MessageQueueState = new Map(); - const deps = makeDeps(); + it("getQueue returns current snapshot; empty array when none", () => { + const state: MessageQueueState = new Map(); + const deps = makeDeps(); - expect(getQueue(state, "unknown")).toEqual([]); + expect(getQueue(state, "unknown")).toEqual([]); - enqueue(state, "c1", "x", deps); - enqueue(state, "c1", "y", deps); - const snap = getQueue(state, "c1"); - expect(snap.map((m) => m.text)).toEqual(["x", "y"]); + enqueue(state, "c1", "x", deps); + enqueue(state, "c1", "y", deps); + const snap = getQueue(state, "c1"); + expect(snap.map((m) => m.text)).toEqual(["x", "y"]); - // returns a COPY — mutating it does not affect live state - snap.push({ id: "evil", text: "mutate", queuedAt: 0 }); - expect(getQueue(state, "c1")).toHaveLength(2); - }); + // returns a COPY — mutating it does not affect live state + snap.push({ id: "evil", text: "mutate", queuedAt: 0 }); + expect(getQueue(state, "c1")).toHaveLength(2); + }); }); describe("drain", () => { - it("drain returns all + clears; second drain returns []", () => { - const state: MessageQueueState = new Map(); - const deps = makeDeps(); - enqueue(state, "c1", "a", deps); - enqueue(state, "c1", "b", deps); - - const drained = drain(state, "c1"); - expect(drained.map((m) => m.text)).toEqual(["a", "b"]); - - // cleared - expect(getQueue(state, "c1")).toEqual([]); - expect(drain(state, "c1")).toEqual([]); - }); - - it("drain on an empty queue returns [] and is a no-op", () => { - const state: MessageQueueState = new Map(); - - // never had a queue - expect(drain(state, "c1")).toEqual([]); - expect(getQueue(state, "c1")).toEqual([]); - - // and after a drain that emptied it, draining again is a no-op - const deps = makeDeps(); - enqueue(state, "c1", "once", deps); - drain(state, "c1"); - expect(drain(state, "c1")).toEqual([]); - expect(getQueue(state, "c1")).toEqual([]); - }); + it("drain returns all + clears; second drain returns []", () => { + const state: MessageQueueState = new Map(); + const deps = makeDeps(); + enqueue(state, "c1", "a", deps); + enqueue(state, "c1", "b", deps); + + const drained = drain(state, "c1"); + expect(drained.map((m) => m.text)).toEqual(["a", "b"]); + + // cleared + expect(getQueue(state, "c1")).toEqual([]); + expect(drain(state, "c1")).toEqual([]); + }); + + it("drain on an empty queue returns [] and is a no-op", () => { + const state: MessageQueueState = new Map(); + + // never had a queue + expect(drain(state, "c1")).toEqual([]); + expect(getQueue(state, "c1")).toEqual([]); + + // and after a drain that emptied it, draining again is a no-op + const deps = makeDeps(); + enqueue(state, "c1", "once", deps); + drain(state, "c1"); + expect(drain(state, "c1")).toEqual([]); + expect(getQueue(state, "c1")).toEqual([]); + }); }); describe("combine", () => { - it("combine joins texts with blank-line separator", () => { - const msgs: QueuedMessage[] = [ - { id: "1", text: "alpha", queuedAt: 1 }, - { id: "2", text: "beta", queuedAt: 2 }, - ]; - expect(combine(msgs)).toBe("alpha\n\nbeta"); - expect(combine([])).toBe(""); - expect(combine([{ id: "1", text: "solo", queuedAt: 1 }])).toBe("solo"); - }); + it("combine joins texts with blank-line separator", () => { + const msgs: QueuedMessage[] = [ + { id: "1", text: "alpha", queuedAt: 1 }, + { id: "2", text: "beta", queuedAt: 2 }, + ]; + expect(combine(msgs)).toBe("alpha\n\nbeta"); + expect(combine([])).toBe(""); + expect(combine([{ id: "1", text: "solo", queuedAt: 1 }])).toBe("solo"); + }); }); describe("buildQueueSpec", () => { - it("renders a custom field with the queue snapshot", () => { - const msgs: QueuedMessage[] = [ - { id: "1", text: "a", queuedAt: 1 }, - { id: "2", text: "b", queuedAt: 2 }, - ]; - const spec = buildQueueSpec(msgs); - expect(spec.id).toBe(MESSAGE_QUEUE_SURFACE_ID); - expect(spec.region).toBe("side"); - expect(spec.title).toBe("Message Queue"); - expect(spec.fields).toHaveLength(1); - - const field = spec.fields[0]; - if (field === undefined || field.kind !== "custom") { - throw new Error("expected a custom field"); - } - expect(field.rendererId).toBe(MESSAGE_QUEUE_RENDERER_ID); - const payload = field.payload as { messages: readonly QueuedMessage[] }; - expect(payload.messages).toHaveLength(2); - expect(payload.messages.map((m) => m.text)).toEqual(["a", "b"]); - }); - - it("renders an empty list for an empty queue", () => { - const spec = buildQueueSpec([]); - const field = spec.fields[0]; - if (field === undefined || field.kind !== "custom") { - throw new Error("expected a custom field"); - } - const payload = field.payload as { messages: readonly QueuedMessage[] }; - expect(payload.messages).toEqual([]); - }); + it("renders a custom field with the queue snapshot", () => { + const msgs: QueuedMessage[] = [ + { id: "1", text: "a", queuedAt: 1 }, + { id: "2", text: "b", queuedAt: 2 }, + ]; + const spec = buildQueueSpec(msgs); + expect(spec.id).toBe(MESSAGE_QUEUE_SURFACE_ID); + expect(spec.region).toBe("side"); + expect(spec.title).toBe("Message Queue"); + expect(spec.fields).toHaveLength(1); + + const field = spec.fields[0]; + if (field === undefined || field.kind !== "custom") { + throw new Error("expected a custom field"); + } + expect(field.rendererId).toBe(MESSAGE_QUEUE_RENDERER_ID); + const payload = field.payload as { messages: readonly QueuedMessage[] }; + expect(payload.messages).toHaveLength(2); + expect(payload.messages.map((m) => m.text)).toEqual(["a", "b"]); + }); + + it("renders an empty list for an empty queue", () => { + const spec = buildQueueSpec([]); + const field = spec.fields[0]; + if (field === undefined || field.kind !== "custom") { + throw new Error("expected a custom field"); + } + const payload = field.payload as { messages: readonly QueuedMessage[] }; + expect(payload.messages).toEqual([]); + }); }); |
