summaryrefslogtreecommitdiffhomepage
path: root/packages/message-queue/src/service.test.ts
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-06-27 01:12:40 +0900
committerAdam Malczewski <[email protected]>2026-06-27 01:12:40 +0900
commit98b0638838a8e754927d8c030ce8bded18d63e7d (patch)
tree0d4e21c3d4792fcd77e1040373b260e38efa34ce /packages/message-queue/src/service.test.ts
parentd92a4af6191d7d20acf861adf605ad0227b6b287 (diff)
parent61e45e60d699ed1ca46f94a8f181c92a940317c6 (diff)
downloaddispatch-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/service.test.ts')
-rw-r--r--packages/message-queue/src/service.test.ts148
1 files changed, 74 insertions, 74 deletions
diff --git a/packages/message-queue/src/service.test.ts b/packages/message-queue/src/service.test.ts
index 04cde91..aa59dd3 100644
--- a/packages/message-queue/src/service.test.ts
+++ b/packages/message-queue/src/service.test.ts
@@ -5,97 +5,97 @@ import { buildQueueSpec, combine } from "./pure.js";
import { createMessageQueueService, type MessageQueueDeps } from "./service.js";
interface Recorder extends MessageQueueDeps {
- readonly calls: { value: number };
+ readonly calls: { value: number };
}
function makeDeps(): Recorder {
- let idCounter = 0;
- let now = 1_000;
- const calls = { value: 0 };
- return {
- id: () => `q-${++idCounter}`,
- now: () => (now += 10),
- notify: () => {
- calls.value += 1;
- },
- calls,
- };
+ let idCounter = 0;
+ let now = 1_000;
+ const calls = { value: 0 };
+ return {
+ id: () => `q-${++idCounter}`,
+ now: () => (now += 10),
+ notify: () => {
+ calls.value += 1;
+ },
+ calls,
+ };
}
function queueMessages(spec: SurfaceSpec): readonly QueuedMessage[] {
- const field = spec.fields[0];
- if (field === undefined || field.kind !== "custom") {
- throw new Error("expected a custom field");
- }
- return (field.payload as QueuePayload).messages;
+ const field = spec.fields[0];
+ if (field === undefined || field.kind !== "custom") {
+ throw new Error("expected a custom field");
+ }
+ return (field.payload as QueuePayload).messages;
}
describe("message-queue service", () => {
- it("enqueue pushes a surface update (snapshot grew)", () => {
- const deps = makeDeps();
- const svc = createMessageQueueService(deps);
- expect(deps.calls.value).toBe(0);
+ it("enqueue pushes a surface update (snapshot grew)", () => {
+ const deps = makeDeps();
+ const svc = createMessageQueueService(deps);
+ expect(deps.calls.value).toBe(0);
- const snapshot = svc.enqueue("c1", "hello");
- expect(deps.calls.value).toBe(1); // surface update pushed
- expect(snapshot).toHaveLength(1);
- const first = snapshot[0];
- if (first === undefined) throw new Error("expected a message");
- expect(first.text).toBe("hello");
- expect(typeof first.id).toBe("string");
- expect(first.queuedAt).toBe(1_010);
+ const snapshot = svc.enqueue("c1", "hello");
+ expect(deps.calls.value).toBe(1); // surface update pushed
+ expect(snapshot).toHaveLength(1);
+ const first = snapshot[0];
+ if (first === undefined) throw new Error("expected a message");
+ expect(first.text).toBe("hello");
+ expect(typeof first.id).toBe("string");
+ expect(first.queuedAt).toBe(1_010);
- // the surface spec reflects the grown snapshot
- expect(queueMessages(buildQueueSpec(svc.getQueue("c1")))).toHaveLength(1);
- });
+ // the surface spec reflects the grown snapshot
+ expect(queueMessages(buildQueueSpec(svc.getQueue("c1")))).toHaveLength(1);
+ });
- it("drain pushes a surface update (empty)", () => {
- const deps = makeDeps();
- const svc = createMessageQueueService(deps);
- svc.enqueue("c1", "a");
- svc.enqueue("c1", "b");
- expect(deps.calls.value).toBe(2); // two enqueues notified
+ it("drain pushes a surface update (empty)", () => {
+ const deps = makeDeps();
+ const svc = createMessageQueueService(deps);
+ svc.enqueue("c1", "a");
+ svc.enqueue("c1", "b");
+ expect(deps.calls.value).toBe(2); // two enqueues notified
- const drained = svc.drain("c1");
- expect(deps.calls.value).toBe(3); // drain pushed a surface update
- expect(drained).toHaveLength(2);
- expect(drained.map((m) => m.text)).toEqual(["a", "b"]);
+ const drained = svc.drain("c1");
+ expect(deps.calls.value).toBe(3); // drain pushed a surface update
+ expect(drained).toHaveLength(2);
+ expect(drained.map((m) => m.text)).toEqual(["a", "b"]);
- // cleared + surface now shows empty
- expect(svc.getQueue("c1")).toEqual([]);
- expect(queueMessages(buildQueueSpec(svc.getQueue("c1")))).toEqual([]);
- });
+ // cleared + surface now shows empty
+ expect(svc.getQueue("c1")).toEqual([]);
+ expect(queueMessages(buildQueueSpec(svc.getQueue("c1")))).toEqual([]);
+ });
- it("drain on empty does NOT push a surface update (already empty)", () => {
- const deps = makeDeps();
- const svc = createMessageQueueService(deps);
+ it("drain on empty does NOT push a surface update (already empty)", () => {
+ const deps = makeDeps();
+ const svc = createMessageQueueService(deps);
- expect(svc.drain("c1")).toEqual([]);
- expect(deps.calls.value).toBe(0); // no notify — no change
+ expect(svc.drain("c1")).toEqual([]);
+ expect(deps.calls.value).toBe(0); // no notify — no change
- // after a real drain empties it, a further drain is a no-op (no notify)
- svc.enqueue("c1", "x");
- expect(deps.calls.value).toBe(1);
- svc.drain("c1");
- expect(deps.calls.value).toBe(2);
- svc.drain("c1");
- expect(deps.calls.value).toBe(2); // unchanged — queue was already empty
- });
+ // after a real drain empties it, a further drain is a no-op (no notify)
+ svc.enqueue("c1", "x");
+ expect(deps.calls.value).toBe(1);
+ svc.drain("c1");
+ expect(deps.calls.value).toBe(2);
+ svc.drain("c1");
+ expect(deps.calls.value).toBe(2); // unchanged — queue was already empty
+ });
- it("getQueue returns current snapshot; empty for unknown conversation", () => {
- const deps = makeDeps();
- const svc = createMessageQueueService(deps);
- expect(svc.getQueue("nope")).toEqual([]);
- svc.enqueue("c1", "hi");
- expect(svc.getQueue("c1")).toHaveLength(1);
- });
+ it("getQueue returns current snapshot; empty for unknown conversation", () => {
+ const deps = makeDeps();
+ const svc = createMessageQueueService(deps);
+ expect(svc.getQueue("nope")).toEqual([]);
+ svc.enqueue("c1", "hi");
+ expect(svc.getQueue("c1")).toHaveLength(1);
+ });
- it("drain returns the raw QueuedMessage[] the orchestrator combines", () => {
- const deps = makeDeps();
- const svc = createMessageQueueService(deps);
- svc.enqueue("c1", "alpha");
- svc.enqueue("c1", "beta");
- const drained = svc.drain("c1");
- expect(combine(drained)).toBe("alpha\n\nbeta");
- });
+ it("drain returns the raw QueuedMessage[] the orchestrator combines", () => {
+ const deps = makeDeps();
+ const svc = createMessageQueueService(deps);
+ svc.enqueue("c1", "alpha");
+ svc.enqueue("c1", "beta");
+ const drained = svc.drain("c1");
+ expect(combine(drained)).toBe("alpha\n\nbeta");
+ });
});