mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-07 20:31:22 +00:00
test: dedupe and optimize test suites
This commit is contained in:
@@ -1,4 +1,7 @@
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
import { logVerbose } from "../../globals.js";
|
||||
import { sleep } from "../../utils.js";
|
||||
import { loadWebMedia } from "../media.js";
|
||||
import { deliverWebReply } from "./deliver-reply.js";
|
||||
import type { WebInboundMsg } from "./types.js";
|
||||
|
||||
@@ -23,10 +26,6 @@ vi.mock("../../utils.js", async (importOriginal) => {
|
||||
};
|
||||
});
|
||||
|
||||
const { loadWebMedia } = await import("../media.js");
|
||||
const { sleep } = await import("../../utils.js");
|
||||
const { logVerbose } = await import("../../globals.js");
|
||||
|
||||
function makeMsg(): WebInboundMsg {
|
||||
return {
|
||||
from: "+10000000000",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import fs from "node:fs/promises";
|
||||
import os from "node:os";
|
||||
import path from "node:path";
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
|
||||
import { saveSessionStore } from "../../config/sessions.js";
|
||||
import { isBotMentionedFromTargets, resolveMentionTargets } from "./mentions.js";
|
||||
import { getSessionSnapshot } from "./session-snapshot.js";
|
||||
@@ -81,42 +81,41 @@ describe("isBotMentionedFromTargets", () => {
|
||||
});
|
||||
|
||||
describe("resolveMentionTargets with @lid mapping", () => {
|
||||
it("resolves mentionedJids via lid reverse mapping in authDir", async () => {
|
||||
const authDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-lid-mapping-"));
|
||||
try {
|
||||
await fs.writeFile(
|
||||
path.join(authDir, "lid-mapping-777_reverse.json"),
|
||||
JSON.stringify("+1777"),
|
||||
);
|
||||
const msg = makeMsg({
|
||||
let authDir = "";
|
||||
|
||||
beforeAll(async () => {
|
||||
authDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-lid-mapping-"));
|
||||
await fs.writeFile(path.join(authDir, "lid-mapping-777_reverse.json"), JSON.stringify("+1777"));
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
if (!authDir) {
|
||||
return;
|
||||
}
|
||||
await fs.rm(authDir, { recursive: true, force: true });
|
||||
authDir = "";
|
||||
});
|
||||
|
||||
it("uses @lid reverse mapping for mentions and self identity", () => {
|
||||
const mentionTargets = resolveMentionTargets(
|
||||
makeMsg({
|
||||
body: "ping",
|
||||
mentionedJids: ["777@lid"],
|
||||
selfE164: "+15551234567",
|
||||
selfJid: "15551234567@s.whatsapp.net",
|
||||
});
|
||||
const targets = resolveMentionTargets(msg, authDir);
|
||||
expect(targets.normalizedMentions).toContain("+1777");
|
||||
} finally {
|
||||
await fs.rm(authDir, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
}),
|
||||
authDir,
|
||||
);
|
||||
expect(mentionTargets.normalizedMentions).toContain("+1777");
|
||||
|
||||
it("derives selfE164 from selfJid when selfJid is @lid and mapping exists", async () => {
|
||||
const authDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-lid-mapping-"));
|
||||
try {
|
||||
await fs.writeFile(
|
||||
path.join(authDir, "lid-mapping-777_reverse.json"),
|
||||
JSON.stringify("+1777"),
|
||||
);
|
||||
const msg = makeMsg({
|
||||
const selfTargets = resolveMentionTargets(
|
||||
makeMsg({
|
||||
body: "ping",
|
||||
selfJid: "777@lid",
|
||||
});
|
||||
const targets = resolveMentionTargets(msg, authDir);
|
||||
expect(targets.selfE164).toBe("+1777");
|
||||
} finally {
|
||||
await fs.rm(authDir, { recursive: true, force: true });
|
||||
}
|
||||
}),
|
||||
authDir,
|
||||
);
|
||||
expect(selfTargets.selfE164).toBe("+1777");
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -87,6 +87,7 @@ vi.mock("./session.js", () => {
|
||||
});
|
||||
|
||||
import { monitorWebInbox, resetWebInboundDedupe } from "./inbound.js";
|
||||
let createWaSocket: typeof import("./session.js").createWaSocket;
|
||||
|
||||
async function waitForMessage(onMessage: ReturnType<typeof vi.fn>) {
|
||||
await vi.waitFor(() => expect(onMessage).toHaveBeenCalledTimes(1), {
|
||||
@@ -97,12 +98,19 @@ async function waitForMessage(onMessage: ReturnType<typeof vi.fn>) {
|
||||
}
|
||||
|
||||
describe("web inbound media saves with extension", () => {
|
||||
async function getMockSocket() {
|
||||
return (await createWaSocket(false, false)) as unknown as {
|
||||
ev: import("node:events").EventEmitter;
|
||||
};
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
saveMediaBufferSpy.mockClear();
|
||||
resetWebInboundDedupe();
|
||||
});
|
||||
|
||||
beforeAll(async () => {
|
||||
({ createWaSocket } = await import("./session.js"));
|
||||
await fs.rm(HOME, { recursive: true, force: true });
|
||||
});
|
||||
|
||||
@@ -118,12 +126,7 @@ describe("web inbound media saves with extension", () => {
|
||||
accountId: "default",
|
||||
authDir: path.join(HOME, "wa-auth"),
|
||||
});
|
||||
const { createWaSocket } = await import("./session.js");
|
||||
const realSock = await (
|
||||
createWaSocket as unknown as () => Promise<{
|
||||
ev: import("node:events").EventEmitter;
|
||||
}>
|
||||
)();
|
||||
const realSock = await getMockSocket();
|
||||
|
||||
realSock.ev.emit("messages.upsert", {
|
||||
type: "notify",
|
||||
@@ -202,12 +205,7 @@ describe("web inbound media saves with extension", () => {
|
||||
accountId: "default",
|
||||
authDir: path.join(HOME, "wa-auth"),
|
||||
});
|
||||
const { createWaSocket } = await import("./session.js");
|
||||
const realSock = await (
|
||||
createWaSocket as unknown as () => Promise<{
|
||||
ev: import("node:events").EventEmitter;
|
||||
}>
|
||||
)();
|
||||
const realSock = await getMockSocket();
|
||||
|
||||
const upsert = {
|
||||
type: "notify",
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import { startWebLoginWithQr, waitForWebLogin } from "./login-qr.js";
|
||||
import { createWaSocket, logoutWeb, waitForWaConnection } from "./session.js";
|
||||
|
||||
vi.mock("./session.js", () => {
|
||||
const createWaSocket = vi.fn(
|
||||
@@ -35,8 +37,6 @@ vi.mock("./qr-image.js", () => ({
|
||||
renderQrPngBase64: vi.fn(async () => "base64"),
|
||||
}));
|
||||
|
||||
const { startWebLoginWithQr, waitForWebLogin } = await import("./login-qr.js");
|
||||
const { createWaSocket, waitForWaConnection, logoutWeb } = await import("./session.js");
|
||||
const createWaSocketMock = vi.mocked(createWaSocket);
|
||||
const waitForWaConnectionMock = vi.mocked(waitForWaConnection);
|
||||
const logoutWebMock = vi.mocked(logoutWeb);
|
||||
|
||||
@@ -3,10 +3,16 @@ import os from "node:os";
|
||||
import path from "node:path";
|
||||
import { DisconnectReason } from "@whiskeysockets/baileys";
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import { loginWeb } from "./login.js";
|
||||
import { createWaSocket, formatError, waitForWaConnection } from "./session.js";
|
||||
|
||||
const rmMock = vi.spyOn(fs, "rm");
|
||||
|
||||
const authDir = path.join(os.tmpdir(), "wa-creds");
|
||||
function resolveTestAuthDir() {
|
||||
return path.join(os.tmpdir(), "wa-creds");
|
||||
}
|
||||
|
||||
const authDir = resolveTestAuthDir();
|
||||
|
||||
vi.mock("../config/config.js", () => ({
|
||||
loadConfig: () =>
|
||||
@@ -14,7 +20,7 @@ vi.mock("../config/config.js", () => ({
|
||||
channels: {
|
||||
whatsapp: {
|
||||
accounts: {
|
||||
default: { enabled: true, authDir },
|
||||
default: { enabled: true, authDir: resolveTestAuthDir() },
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -22,6 +28,7 @@ vi.mock("../config/config.js", () => ({
|
||||
}));
|
||||
|
||||
vi.mock("./session.js", () => {
|
||||
const authDir = resolveTestAuthDir();
|
||||
const sockA = { ws: { close: vi.fn() } };
|
||||
const sockB = { ws: { close: vi.fn() } };
|
||||
let call = 0;
|
||||
@@ -43,11 +50,9 @@ vi.mock("./session.js", () => {
|
||||
};
|
||||
});
|
||||
|
||||
const { createWaSocket, waitForWaConnection, formatError } = await import("./session.js");
|
||||
const createWaSocketMock = vi.mocked(createWaSocket);
|
||||
const waitForWaConnectionMock = vi.mocked(waitForWaConnection);
|
||||
const formatErrorMock = vi.mocked(formatError);
|
||||
const { loginWeb } = await import("./login.js");
|
||||
|
||||
describe("loginWeb coverage", () => {
|
||||
beforeEach(() => {
|
||||
|
||||
@@ -3,6 +3,7 @@ import os from "node:os";
|
||||
import path from "node:path";
|
||||
import sharp from "sharp";
|
||||
import { afterAll, afterEach, beforeAll, describe, expect, it, vi } from "vitest";
|
||||
import { resolveStateDir } from "../config/paths.js";
|
||||
import { sendVoiceMessageDiscord } from "../discord/send.js";
|
||||
import * as ssrf from "../infra/net/ssrf.js";
|
||||
import { optimizeImageToPng } from "../media/image-ops.js";
|
||||
@@ -52,8 +53,8 @@ beforeAll(async () => {
|
||||
fixtureRoot = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-media-test-"));
|
||||
largeJpegBuffer = await sharp({
|
||||
create: {
|
||||
width: 800,
|
||||
height: 800,
|
||||
width: 400,
|
||||
height: 400,
|
||||
channels: 3,
|
||||
background: "#ff0000",
|
||||
},
|
||||
@@ -79,7 +80,8 @@ beforeAll(async () => {
|
||||
.png()
|
||||
.toBuffer();
|
||||
alphaPngFile = await writeTempFile(alphaPngBuffer, ".png");
|
||||
const size = 72;
|
||||
// Keep this small so the alpha-fallback test stays deterministic but fast.
|
||||
const size = 24;
|
||||
const raw = buildDeterministicBytes(size * size * 4);
|
||||
fallbackPngBuffer = await sharp(raw, { raw: { width: size, height: size, channels: 4 } })
|
||||
.png()
|
||||
@@ -132,18 +134,12 @@ describe("web media loading", () => {
|
||||
});
|
||||
});
|
||||
|
||||
it("strips MEDIA: prefix before reading local file", async () => {
|
||||
const result = await loadWebMedia(`MEDIA:${tinyPngFile}`, 1024 * 1024);
|
||||
|
||||
expect(result.kind).toBe("image");
|
||||
expect(result.buffer.length).toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
it("strips MEDIA: prefix with extra whitespace (LLM-friendly)", async () => {
|
||||
const result = await loadWebMedia(` MEDIA : ${tinyPngFile}`, 1024 * 1024);
|
||||
|
||||
expect(result.kind).toBe("image");
|
||||
expect(result.buffer.length).toBeGreaterThan(0);
|
||||
it("strips MEDIA: prefix before reading local file (including whitespace variants)", async () => {
|
||||
for (const input of [`MEDIA:${tinyPngFile}`, ` MEDIA : ${tinyPngFile}`]) {
|
||||
const result = await loadWebMedia(input, 1024 * 1024);
|
||||
expect(result.kind).toBe("image");
|
||||
expect(result.buffer.length).toBeGreaterThan(0);
|
||||
}
|
||||
});
|
||||
|
||||
it("compresses large local images under the provided cap", async () => {
|
||||
@@ -375,7 +371,6 @@ describe("local media root guard", () => {
|
||||
});
|
||||
|
||||
it("allows default OpenClaw state workspace and sandbox roots", async () => {
|
||||
const { resolveStateDir } = await import("../config/paths.js");
|
||||
const stateDir = resolveStateDir();
|
||||
const readFile = vi.fn(async () => Buffer.from("generated-media"));
|
||||
|
||||
@@ -403,7 +398,6 @@ describe("local media root guard", () => {
|
||||
});
|
||||
|
||||
it("rejects default OpenClaw state per-agent workspace-* roots without explicit local roots", async () => {
|
||||
const { resolveStateDir } = await import("../config/paths.js");
|
||||
const stateDir = resolveStateDir();
|
||||
const readFile = vi.fn(async () => Buffer.from("generated-media"));
|
||||
|
||||
@@ -416,7 +410,6 @@ describe("local media root guard", () => {
|
||||
});
|
||||
|
||||
it("allows per-agent workspace-* paths with explicit local roots", async () => {
|
||||
const { resolveStateDir } = await import("../config/paths.js");
|
||||
const stateDir = resolveStateDir();
|
||||
const readFile = vi.fn(async () => Buffer.from("generated-media"));
|
||||
const agentWorkspaceDir = path.join(stateDir, "workspace-clawdy");
|
||||
|
||||
Reference in New Issue
Block a user