Files
cfw-autumn/server/tests/unit/logging/log-caught-error.test.ts
2026-05-25 17:32:27 +01:00

107 lines
2.5 KiB
TypeScript

import { describe, expect, test } from "bun:test";
import type { Logger } from "@/external/logtail/logtailUtils.js";
import {
caughtErrorToLogFields,
logCaughtError,
} from "@/utils/logging/logCaughtError.js";
const createTestLogger = ({
onError,
onWarn,
}: {
onError?: (...args: unknown[]) => void;
onWarn?: (...args: unknown[]) => void;
}): Logger => ({
debug: () => {},
info: () => {},
warn: (...args: unknown[]) => onWarn?.(...args),
error: (...args: unknown[]) => onError?.(...args),
child: () => createTestLogger({ onError, onWarn }),
});
describe("logCaughtError", () => {
test("logs Error objects to console and logger with stack fields", () => {
const originalConsoleError = console.error;
const consoleCalls: unknown[][] = [];
const loggerCalls: unknown[][] = [];
const error = new Error("boom");
const logger = createTestLogger({
onError: (...args: unknown[]) => loggerCalls.push(args),
});
console.error = (...args: unknown[]) => {
consoleCalls.push(args);
};
try {
logCaughtError({
logger,
message: "failed",
error,
data: { invoiceId: "in_123" },
});
} finally {
console.error = originalConsoleError;
}
expect(consoleCalls).toEqual([["failed", error]]);
expect(loggerCalls).toHaveLength(1);
expect(loggerCalls[0][0]).toBe("failed");
expect(loggerCalls[0][1]).toMatchObject({
errorName: "Error",
errorMessage: "boom",
errorString: "Error: boom",
data: { invoiceId: "in_123" },
});
expect((loggerCalls[0][1] as { errorStack?: string }).errorStack).toContain(
"Error: boom",
);
});
test("logs non-Error throws through warn", () => {
const originalConsoleWarn = console.warn;
const consoleCalls: unknown[][] = [];
const loggerCalls: unknown[][] = [];
const logger = createTestLogger({
onWarn: (...args: unknown[]) => loggerCalls.push(args),
});
console.warn = (...args: unknown[]) => {
consoleCalls.push(args);
};
try {
logCaughtError({
logger,
message: "warned",
error: "bad",
level: "warn",
});
} finally {
console.warn = originalConsoleWarn;
}
expect(consoleCalls).toEqual([["warned", "bad"]]);
expect(loggerCalls).toEqual([
[
"warned",
{
errorName: "string",
errorMessage: "bad",
errorStack: undefined,
errorString: "bad",
},
],
]);
});
test("normalizes caught values without requiring a logger", () => {
expect(caughtErrorToLogFields(null)).toEqual({
errorName: "object",
errorMessage: "null",
errorStack: undefined,
errorString: "null",
});
});
});