diff --git a/src/cli/relay.e2e.test.ts b/src/cli/relay.e2e.test.ts index 5a47151cc..a0390a291 100644 --- a/src/cli/relay.e2e.test.ts +++ b/src/cli/relay.e2e.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it, vi, beforeEach } from "vitest"; +import { beforeEach, describe, expect, it, vi } from "vitest"; // Mocks must be defined via vi.hoisted to avoid TDZ with ESM hoisting. const { monitorWebProvider, pickProvider, logWebSelfId, monitorTwilio } = diff --git a/src/config/sessions.test.ts b/src/config/sessions.test.ts index f53ffdbbc..c8ad01c26 100644 --- a/src/config/sessions.test.ts +++ b/src/config/sessions.test.ts @@ -4,9 +4,9 @@ import { deriveSessionKey } from "./sessions.js"; describe("sessions", () => { it("returns normalized per-sender key", () => { - expect( - deriveSessionKey("per-sender", { From: "whatsapp:+1555" }), - ).toBe("+1555"); + expect(deriveSessionKey("per-sender", { From: "whatsapp:+1555" })).toBe( + "+1555", + ); }); it("falls back to unknown when sender missing", () => { @@ -17,4 +17,3 @@ describe("sessions", () => { expect(deriveSessionKey("global", { From: "+1" })).toBe("global"); }); }); - diff --git a/src/index.commands.test.ts b/src/index.commands.test.ts index 5f5a70941..010b04808 100644 --- a/src/index.commands.test.ts +++ b/src/index.commands.test.ts @@ -2,8 +2,8 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { createMockTwilio } from "../test/mocks/twilio.js"; import { statusCommand } from "./commands/status.js"; import { createDefaultDeps } from "./index.js"; -import { defaultRuntime } from "./runtime.js"; import * as providerWeb from "./provider-web.js"; +import { defaultRuntime } from "./runtime.js"; vi.mock("twilio", () => { const { factory } = createMockTwilio(); @@ -67,16 +67,7 @@ describe("CLI commands", () => { const twilio = (await import("twilio")).default; const wait = vi.spyOn(index, "waitForFinalStatus").mockResolvedValue(); await index.program.parseAsync( - [ - "send", - "--to", - "+1555", - "--message", - "hi", - "--wait", - "0", - "--dry-run", - ], + ["send", "--to", "+1555", "--message", "hi", "--wait", "0", "--dry-run"], { from: "user" }, ); expect(twilio._client.messages.create).not.toHaveBeenCalled(); @@ -88,20 +79,11 @@ describe("CLI commands", () => { twilio._client.messages.create.mockResolvedValue({ sid: "SMJSON" }); const logSpy = vi.spyOn(defaultRuntime, "log"); await index.program.parseAsync( - [ - "send", - "--to", - "+1555", - "--message", - "hi", - "--wait", - "0", - "--json", - ], + ["send", "--to", "+1555", "--message", "hi", "--wait", "0", "--json"], { from: "user" }, ); expect(logSpy).toHaveBeenCalledWith( - expect.stringContaining("\"sid\": \"SMJSON\""), + expect.stringContaining('"sid": "SMJSON"'), ); }); diff --git a/src/index.core.test.ts b/src/index.core.test.ts index a22987ac1..820cedb22 100644 --- a/src/index.core.test.ts +++ b/src/index.core.test.ts @@ -341,7 +341,7 @@ describe("config and templating", () => { cfg, runSpy, ); - expect(first?.text).toBe("cmd output"); + expect(first?.text).toBe("cmd output"); const argvFirst = runSpy.mock.calls[0][0]; expect(argvFirst).toEqual([ "echo", @@ -357,7 +357,7 @@ describe("config and templating", () => { cfg, runSpy, ); - expect(second?.text).toBe("cmd output"); + expect(second?.text).toBe("cmd output"); const argvSecond = runSpy.mock.calls[1][0]; expect(argvSecond[2]).toBe("--resume"); }); @@ -420,15 +420,15 @@ describe("config and templating", () => { }, }; - const result = await index.getReplyFromConfig( - { Body: "hi", From: "+1", To: "+2" }, - undefined, - cfg, - runSpy, - ); + const result = await index.getReplyFromConfig( + { Body: "hi", From: "+1", To: "+2" }, + undefined, + cfg, + runSpy, + ); - expect(result?.text).toBe("hello world"); - }); + expect(result?.text).toBe("hello world"); + }); it("parses Claude JSON output even without explicit claudeOutputFormat when using claude bin", async () => { const runSpy = vi.spyOn(index, "runCommandWithTimeout").mockResolvedValue({ @@ -448,17 +448,17 @@ describe("config and templating", () => { }, }; - const result = await index.getReplyFromConfig( - { Body: "hi", From: "+1", To: "+2" }, - undefined, - cfg, - runSpy, - ); + const result = await index.getReplyFromConfig( + { Body: "hi", From: "+1", To: "+2" }, + undefined, + cfg, + runSpy, + ); - expect(result?.text).toBe("Sure! What's up?"); - const argv = runSpy.mock.calls[0][0]; - expect(argv.at(-1)).toContain("You are Clawd (Claude)"); - expect(argv.at(-1)).toContain("/Users/steipete/clawd"); + expect(result?.text).toBe("Sure! What's up?"); + const argv = runSpy.mock.calls[0][0]; + expect(argv.at(-1)).toContain("You are Clawd (Claude)"); + expect(argv.at(-1)).toContain("/Users/steipete/clawd"); }); it("serializes command auto-replies via the queue", async () => { @@ -625,7 +625,11 @@ describe("webhook and messaging", () => { const hostModule = await import("./media/host.js"); const hostSpy = vi .spyOn(hostModule, "ensureMediaHosted") - .mockResolvedValue({ url: "https://ts.net/media/abc", id: "abc", size: 123 }); + .mockResolvedValue({ + url: "https://ts.net/media/abc", + id: "abc", + size: 123, + }); vi.spyOn(replies, "getReplyFromConfig").mockResolvedValue({ text: "Auto", mediaUrl: "/tmp/pic.png", @@ -923,29 +927,29 @@ describe("monitoring", () => { expect(runtime.exit).toHaveBeenCalledWith(1); }); - it("monitorWebProvider triggers replies and stops when asked", async () => { - const replySpy = vi.fn(); - const sendMediaSpy = vi.fn(); - const listenerFactory = vi.fn( - async ( - opts: Parameters[1] extends undefined - ? never - : NonNullable[1]>, - ) => { - await opts.onMessage({ - body: "hello", - from: "+1", - to: "+2", - id: "id1", - sendComposing: vi.fn(), - reply: replySpy, - sendMedia: sendMediaSpy, - }); - return { close: vi.fn() }; - }, - ); - const resolver = vi.fn().mockResolvedValue({ text: "auto" }); - await index.monitorWebProvider(false, listenerFactory, false, resolver); - expect(replySpy).toHaveBeenCalledWith("auto"); - }); + it("monitorWebProvider triggers replies and stops when asked", async () => { + const replySpy = vi.fn(); + const sendMediaSpy = vi.fn(); + const listenerFactory = vi.fn( + async ( + opts: Parameters[1] extends undefined + ? never + : NonNullable[1]>, + ) => { + await opts.onMessage({ + body: "hello", + from: "+1", + to: "+2", + id: "id1", + sendComposing: vi.fn(), + reply: replySpy, + sendMedia: sendMediaSpy, + }); + return { close: vi.fn() }; + }, + ); + const resolver = vi.fn().mockResolvedValue({ text: "auto" }); + await index.monitorWebProvider(false, listenerFactory, false, resolver); + expect(replySpy).toHaveBeenCalledWith("auto"); }); +}); diff --git a/src/infra/ports.test.ts b/src/infra/ports.test.ts index f4c7985ec..c0560ad60 100644 --- a/src/infra/ports.test.ts +++ b/src/infra/ports.test.ts @@ -1,7 +1,11 @@ import net from "node:net"; import { describe, expect, it, vi } from "vitest"; -import { ensurePortAvailable, handlePortError, PortInUseError } from "./ports.js"; +import { + ensurePortAvailable, + handlePortError, + PortInUseError, +} from "./ports.js"; describe("ports helpers", () => { it("ensurePortAvailable rejects when port busy", async () => { diff --git a/src/infra/tailscale.test.ts b/src/infra/tailscale.test.ts index 5be831725..e123c6a06 100644 --- a/src/infra/tailscale.test.ts +++ b/src/infra/tailscale.test.ts @@ -1,9 +1,9 @@ import { describe, expect, it, vi } from "vitest"; import { - getTailnetHostname, ensureGoInstalled, ensureTailscaledInstalled, + getTailnetHostname, } from "./tailscale.js"; describe("tailscale helpers", () => { diff --git a/src/process/command-queue.test.ts b/src/process/command-queue.test.ts index 9cd98edd7..a90de942c 100644 --- a/src/process/command-queue.test.ts +++ b/src/process/command-queue.test.ts @@ -38,21 +38,18 @@ describe("command queue", () => { await new Promise((resolve) => setTimeout(resolve, 30)); }); - const second = enqueueCommand( - async () => {}, - { - warnAfterMs: 5, - onWait: (ms, ahead) => { - waited = ms; - queuedAhead = ahead; - }, + const second = enqueueCommand(async () => {}, { + warnAfterMs: 5, + onWait: (ms, ahead) => { + waited = ms; + queuedAhead = ahead; }, - ); + }); await Promise.all([first, second]); expect(waited).not.toBeNull(); - expect((waited as number)).toBeGreaterThanOrEqual(5); + expect(waited as number).toBeGreaterThanOrEqual(5); expect(queuedAhead).toBe(0); }); }); diff --git a/src/twilio/monitor.test.ts b/src/twilio/monitor.test.ts index 09657bbee..92d36ca4b 100644 --- a/src/twilio/monitor.test.ts +++ b/src/twilio/monitor.test.ts @@ -18,12 +18,24 @@ describe("monitorTwilio", () => { }, ]); const autoReplyIfConfigured = vi.fn().mockResolvedValue(undefined); - const readEnv = vi.fn(() => ({ accountSid: "AC", whatsappFrom: "whatsapp:+1", auth: { accountSid: "AC", authToken: "t" } })); - const createClient = vi.fn(() => ({ messages: { create: vi.fn() } } as never)); + const readEnv = vi.fn(() => ({ + accountSid: "AC", + whatsappFrom: "whatsapp:+1", + auth: { accountSid: "AC", authToken: "t" }, + })); + const createClient = vi.fn( + () => ({ messages: { create: vi.fn() } }) as never, + ); const sleep = vi.fn().mockResolvedValue(undefined); await monitorTwilio(0, 0, { - deps: { autoReplyIfConfigured, listRecentMessages, readEnv, createClient, sleep }, + deps: { + autoReplyIfConfigured, + listRecentMessages, + readEnv, + createClient, + sleep, + }, maxIterations: 1, }); @@ -31,4 +43,3 @@ describe("monitorTwilio", () => { expect(autoReplyIfConfigured).toHaveBeenCalledTimes(1); }); }); - diff --git a/src/twilio/send.test.ts b/src/twilio/send.test.ts index 7c788945f..0ee674a2a 100644 --- a/src/twilio/send.test.ts +++ b/src/twilio/send.test.ts @@ -14,10 +14,19 @@ describe("twilio send helpers", () => { }); it("waitForFinalStatus exits on failure", async () => { - const fetch = vi.fn().mockResolvedValue({ status: "failed", errorMessage: "boom" }); + const fetch = vi + .fn() + .mockResolvedValue({ status: "failed", errorMessage: "boom" }); const client = { messages: vi.fn(() => ({ fetch })) } as never; - const runtime = { log: console.log, error: () => {}, exit: vi.fn(() => { throw new Error("exit"); }) } as never; - await expect(waitForFinalStatus(client, "SM1", 1, 0.01, runtime)).rejects.toBeInstanceOf(Error); + const runtime = { + log: console.log, + error: () => {}, + exit: vi.fn(() => { + throw new Error("exit"); + }), + } as never; + await expect( + waitForFinalStatus(client, "SM1", 1, 0.01, runtime), + ).rejects.toBeInstanceOf(Error); }); }); - diff --git a/src/twilio/update-webhook.test.ts b/src/twilio/update-webhook.test.ts index 06621f622..3b7d15d39 100644 --- a/src/twilio/update-webhook.test.ts +++ b/src/twilio/update-webhook.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it, beforeEach, afterEach } from "vitest"; +import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { findIncomingNumberSid,