diff --git a/node/src/db.ts b/node/src/db.ts index 97ebf20..b51cbab 100644 --- a/node/src/db.ts +++ b/node/src/db.ts @@ -294,6 +294,10 @@ export class MailboxStore { this.waiters.delete(oldName); } + waiterCount(name: string): number { + return this.waiters.get(name)?.size ?? 0; + } + rejectAllWaiters(): void { for (const bucket of this.waiters.values()) { for (const w of bucket) w.resolve({ kind: "aborted" }); diff --git a/node/tests/cli-watch.test.ts b/node/tests/cli-watch.test.ts index b3e5a32..30e4700 100644 --- a/node/tests/cli-watch.test.ts +++ b/node/tests/cli-watch.test.ts @@ -93,13 +93,20 @@ describe("claude-mailbox watch CLI", () => { store.upsertMailbox("oldname"); const child = spawn( process.execPath, - [CLI, "watch", "--block", "--name", "oldname", "--timeout", "3", "--url", baseUrl], + [CLI, "watch", "--block", "--name", "oldname", "--timeout", "5", "--url", baseUrl], { stdio: ["ignore", "pipe", "pipe"] }, ); let stdout = ""; child.stdout.on("data", (d) => { stdout += d.toString(); }); - setTimeout(() => store.rename("oldname", "newname"), 300); + // Wait for the CLI subprocess to register its waiter before renaming. + // A fixed delay is flaky under full-suite load on Windows. + const start = Date.now(); + while (store.waiterCount("oldname") === 0) { + if (Date.now() - start > 4000) throw new Error("CLI never registered a waiter"); + await new Promise((r) => setTimeout(r, 25)); + } + store.rename("oldname", "newname"); const code: number = await new Promise((r) => child.on("exit", (c) => r(c ?? 1))); expect(code).toBe(0); @@ -116,7 +123,7 @@ describe("claude-mailbox watch CLI", () => { it("exits 1 when --name is missing", async () => { const r = await runCli(["watch", "--block", "--timeout", "1", "--url", baseUrl]); - expect(r.status).not.toBe(0); + expect(r.status).toBe(1); expect(r.stderr).toMatch(/required.*name|name.*required/i); }); });