test: sync updated specs

main
Peter Steinberger 2025-11-25 12:12:29 +01:00
parent 800c7a1e1f
commit 38659f5d3e
10 changed files with 100 additions and 94 deletions

View File

@ -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 } =

View File

@ -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");
});
});

View File

@ -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"'),
);
});

View File

@ -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",

View File

@ -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 () => {

View File

@ -1,9 +1,9 @@
import { describe, expect, it, vi } from "vitest";
import {
getTailnetHostname,
ensureGoInstalled,
ensureTailscaledInstalled,
getTailnetHostname,
} from "./tailscale.js";
describe("tailscale helpers", () => {

View File

@ -38,21 +38,18 @@ describe("command queue", () => {
await new Promise((resolve) => setTimeout(resolve, 30));
});
const second = enqueueCommand(
async () => {},
{
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);
});
});

View File

@ -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);
});
});

View File

@ -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);
});
});

View File

@ -1,4 +1,4 @@
import { describe, expect, it, beforeEach, afterEach } from "vitest";
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import {
findIncomingNumberSid,