openclaw/src/infra/warning-filter.test.ts

98 lines
3.0 KiB
TypeScript

import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { installProcessWarningFilter, shouldIgnoreWarning } from "./warning-filter.js";
const warningFilterKey = Symbol.for("openclaw.warning-filter");
const baseEmitWarning = process.emitWarning.bind(process);
function resetWarningFilterInstallState(): void {
const globalState = globalThis as typeof globalThis & {
[warningFilterKey]?: { installed: boolean };
};
delete globalState[warningFilterKey];
process.emitWarning = baseEmitWarning;
}
describe("warning filter", () => {
beforeEach(() => {
resetWarningFilterInstallState();
});
afterEach(() => {
resetWarningFilterInstallState();
vi.restoreAllMocks();
});
it("suppresses known deprecation and experimental warning signatures", () => {
expect(
shouldIgnoreWarning({
name: "DeprecationWarning",
code: "DEP0040",
message: "The punycode module is deprecated.",
}),
).toBe(true);
expect(
shouldIgnoreWarning({
name: "DeprecationWarning",
code: "DEP0060",
message: "The `util._extend` API is deprecated.",
}),
).toBe(true);
expect(
shouldIgnoreWarning({
name: "ExperimentalWarning",
message: "SQLite is an experimental feature and might change at any time",
}),
).toBe(true);
});
it("keeps unknown warnings visible", () => {
expect(
shouldIgnoreWarning({
name: "DeprecationWarning",
code: "DEP9999",
message: "Totally new warning",
}),
).toBe(false);
});
it("installs once and suppresses known warnings at emit time", async () => {
const seenWarnings: Array<{ code?: string; name: string; message: string }> = [];
const onWarning = (warning: Error & { code?: string }) => {
seenWarnings.push({
code: warning.code,
name: warning.name,
message: warning.message,
});
};
process.on("warning", onWarning);
try {
installProcessWarningFilter();
installProcessWarningFilter();
installProcessWarningFilter();
const emitWarning = (...args: unknown[]) =>
(process.emitWarning as unknown as (...warningArgs: unknown[]) => void)(...args);
emitWarning(
"The `util._extend` API is deprecated. Please use Object.assign() instead.",
"DeprecationWarning",
"DEP0060",
);
emitWarning("The `util._extend` API is deprecated. Please use Object.assign() instead.", {
type: "DeprecationWarning",
code: "DEP0060",
});
await new Promise((resolve) => setImmediate(resolve));
expect(seenWarnings.find((warning) => warning.code === "DEP0060")).toBeUndefined();
emitWarning("Visible warning", { type: "Warning", code: "OPENCLAW_TEST_WARNING" });
await new Promise((resolve) => setImmediate(resolve));
expect(
seenWarnings.find((warning) => warning.code === "OPENCLAW_TEST_WARNING"),
).toBeDefined();
} finally {
process.off("warning", onWarning);
}
});
});