


















1+// Qa Lab tests cover WhatsApp live transport cli runtime behavior.
2+import fs from "node:fs/promises";
3+import os from "node:os";
4+import path from "node:path";
5+import { afterEach, describe, expect, it, vi } from "vitest";
6+import { runQaWhatsAppCommand } from "./cli.runtime.js";
7+8+const runWhatsAppQaLiveMock = vi.hoisted(() => vi.fn());
9+10+vi.mock("../shared/live-artifacts.js", () => ({
11+printLiveTransportQaArtifacts: vi.fn(),
12+}));
13+14+vi.mock("../shared/live-transport-cli.runtime.js", () => ({
15+resolveLiveTransportQaRunOptions: (opts: Record<string, unknown>) => ({
16+outputDir: opts.repoRoot,
17+providerMode: "mock-openai",
18+repoRoot: opts.repoRoot,
19+ ...opts,
20+}),
21+}));
22+23+vi.mock("./whatsapp-live.runtime.js", () => ({
24+runWhatsAppQaLive: runWhatsAppQaLiveMock,
25+}));
26+27+const tempDirs: string[] = [];
28+let originalExitCode: string | number | undefined;
29+30+afterEach(async () => {
31+process.exitCode = originalExitCode;
32+runWhatsAppQaLiveMock.mockReset();
33+for (const dir of tempDirs.splice(0)) {
34+await fs.rm(dir, { recursive: true, force: true });
35+}
36+});
37+38+async function writeSummary(summary: unknown) {
39+const outputDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-whatsapp-cli-"));
40+tempDirs.push(outputDir);
41+const summaryPath = path.join(outputDir, "whatsapp-qa-summary.json");
42+await fs.writeFile(summaryPath, `${JSON.stringify(summary, null, 2)}\n`, "utf8");
43+return { outputDir, summaryPath };
44+}
45+46+describe("WhatsApp QA CLI runtime", () => {
47+it("fails when a standard scenario is skipped by default", async () => {
48+originalExitCode = process.exitCode;
49+process.exitCode = undefined;
50+const { outputDir, summaryPath } = await writeSummary({
51+counts: { total: 1, passed: 0, failed: 0, skipped: 1 },
52+scenarios: [
53+{
54+id: "whatsapp-mention-gating",
55+status: "skip",
56+},
57+],
58+});
59+runWhatsAppQaLiveMock.mockResolvedValueOnce({
60+observedMessagesPath: path.join(outputDir, "observed.json"),
61+reportPath: path.join(outputDir, "report.md"),
62+scenarios: [],
63+ summaryPath,
64+});
65+66+await runQaWhatsAppCommand({ repoRoot: outputDir });
67+68+expect(process.exitCode).toBe(1);
69+});
70+71+it("allows skipped scenarios when failures are explicitly allowed", async () => {
72+originalExitCode = process.exitCode;
73+process.exitCode = undefined;
74+const { outputDir, summaryPath } = await writeSummary({
75+counts: { total: 1, passed: 0, failed: 0, skipped: 1 },
76+scenarios: [{ id: "whatsapp-mention-gating", status: "skip" }],
77+});
78+runWhatsAppQaLiveMock.mockResolvedValueOnce({
79+observedMessagesPath: path.join(outputDir, "observed.json"),
80+reportPath: path.join(outputDir, "report.md"),
81+scenarios: [],
82+ summaryPath,
83+});
84+85+await runQaWhatsAppCommand({ allowFailures: true, repoRoot: outputDir });
86+87+expect(process.exitCode).toBeUndefined();
88+});
89+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。