mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-09 18:14:31 +00:00
test: dedupe and optimize test suites
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import { Command } from "commander";
|
||||
import { afterEach, describe, expect, it, vi } from "vitest";
|
||||
import { afterEach, beforeAll, describe, expect, it, vi } from "vitest";
|
||||
import { runRegisteredCli } from "../test-utils/command-runner.js";
|
||||
import { formatLogTimestamp } from "./logs-cli.js";
|
||||
|
||||
const callGatewayFromCli = vi.fn();
|
||||
@@ -12,17 +12,23 @@ vi.mock("./gateway-rpc.js", async () => {
|
||||
};
|
||||
});
|
||||
|
||||
let registerLogsCli: typeof import("./logs-cli.js").registerLogsCli;
|
||||
|
||||
beforeAll(async () => {
|
||||
({ registerLogsCli } = await import("./logs-cli.js"));
|
||||
});
|
||||
|
||||
async function runLogsCli(argv: string[]) {
|
||||
const { registerLogsCli } = await import("./logs-cli.js");
|
||||
const program = new Command();
|
||||
program.exitOverride();
|
||||
registerLogsCli(program);
|
||||
await program.parseAsync(argv, { from: "user" });
|
||||
await runRegisteredCli({
|
||||
register: registerLogsCli as (program: import("commander").Command) => void,
|
||||
argv,
|
||||
});
|
||||
}
|
||||
|
||||
describe("logs cli", () => {
|
||||
afterEach(() => {
|
||||
callGatewayFromCli.mockReset();
|
||||
vi.restoreAllMocks();
|
||||
});
|
||||
|
||||
it("writes output directly to stdout/stderr", async () => {
|
||||
@@ -37,20 +43,17 @@ describe("logs cli", () => {
|
||||
|
||||
const stdoutWrites: string[] = [];
|
||||
const stderrWrites: string[] = [];
|
||||
const stdoutSpy = vi.spyOn(process.stdout, "write").mockImplementation((chunk: unknown) => {
|
||||
vi.spyOn(process.stdout, "write").mockImplementation((chunk: unknown) => {
|
||||
stdoutWrites.push(String(chunk));
|
||||
return true;
|
||||
});
|
||||
const stderrSpy = vi.spyOn(process.stderr, "write").mockImplementation((chunk: unknown) => {
|
||||
vi.spyOn(process.stderr, "write").mockImplementation((chunk: unknown) => {
|
||||
stderrWrites.push(String(chunk));
|
||||
return true;
|
||||
});
|
||||
|
||||
await runLogsCli(["logs"]);
|
||||
|
||||
stdoutSpy.mockRestore();
|
||||
stderrSpy.mockRestore();
|
||||
|
||||
expect(stdoutWrites.join("")).toContain("Log file:");
|
||||
expect(stdoutWrites.join("")).toContain("raw line");
|
||||
expect(stderrWrites.join("")).toContain("Log tail truncated");
|
||||
@@ -70,15 +73,13 @@ describe("logs cli", () => {
|
||||
});
|
||||
|
||||
const stdoutWrites: string[] = [];
|
||||
const stdoutSpy = vi.spyOn(process.stdout, "write").mockImplementation((chunk: unknown) => {
|
||||
vi.spyOn(process.stdout, "write").mockImplementation((chunk: unknown) => {
|
||||
stdoutWrites.push(String(chunk));
|
||||
return true;
|
||||
});
|
||||
|
||||
await runLogsCli(["logs", "--local-time", "--plain"]);
|
||||
|
||||
stdoutSpy.mockRestore();
|
||||
|
||||
const output = stdoutWrites.join("");
|
||||
expect(output).toContain("line one");
|
||||
const timestamp = output.match(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z?/u)?.[0];
|
||||
@@ -93,21 +94,18 @@ describe("logs cli", () => {
|
||||
});
|
||||
|
||||
const stderrWrites: string[] = [];
|
||||
const stdoutSpy = vi.spyOn(process.stdout, "write").mockImplementation(() => {
|
||||
vi.spyOn(process.stdout, "write").mockImplementation(() => {
|
||||
const err = new Error("EPIPE") as NodeJS.ErrnoException;
|
||||
err.code = "EPIPE";
|
||||
throw err;
|
||||
});
|
||||
const stderrSpy = vi.spyOn(process.stderr, "write").mockImplementation((chunk: unknown) => {
|
||||
vi.spyOn(process.stderr, "write").mockImplementation((chunk: unknown) => {
|
||||
stderrWrites.push(String(chunk));
|
||||
return true;
|
||||
});
|
||||
|
||||
await runLogsCli(["logs"]);
|
||||
|
||||
stdoutSpy.mockRestore();
|
||||
stderrSpy.mockRestore();
|
||||
|
||||
expect(stderrWrites.join("")).toContain("output stdout closed");
|
||||
});
|
||||
|
||||
@@ -143,15 +141,13 @@ describe("logs cli", () => {
|
||||
}
|
||||
});
|
||||
|
||||
it("handles empty or invalid timestamps", () => {
|
||||
expect(formatLogTimestamp(undefined)).toBe("");
|
||||
expect(formatLogTimestamp("")).toBe("");
|
||||
expect(formatLogTimestamp("invalid-date")).toBe("invalid-date");
|
||||
});
|
||||
|
||||
it("preserves original value for invalid dates", () => {
|
||||
const result = formatLogTimestamp("not-a-date");
|
||||
expect(result).toBe("not-a-date");
|
||||
it.each([
|
||||
{ input: undefined, expected: "" },
|
||||
{ input: "", expected: "" },
|
||||
{ input: "invalid-date", expected: "invalid-date" },
|
||||
{ input: "not-a-date", expected: "not-a-date" },
|
||||
])("preserves timestamp fallback for $input", ({ input, expected }) => {
|
||||
expect(formatLogTimestamp(input)).toBe(expected);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user