Files
cfw-autumn/server/tests/unit/logging/init-logger-env.test.ts

102 lines
2.8 KiB
TypeScript

import { afterEach, describe, expect, test } from "bun:test";
import { readdirSync, readFileSync } from "node:fs";
import { join, relative } from "node:path";
import { initLogger } from "@/utils/logging/initLogger.js";
const makeEnv = (overrides: Partial<Env>): Env => overrides as Env;
const sourceRoot = join(process.cwd(), "src");
const forbiddenSourcePatterns = [
{
name: "Env parameter default",
pattern: /\benv\s*:\s*Env\s*=/,
},
{
name: "optional Env parameter",
pattern: /\benv\?\s*:\s*Env\b/,
},
{
name: "empty Env parameter fallback",
pattern: /\benv\s*=\s*\{\}\s+as\s+Env\b/,
},
{
name: "empty Env nullish fallback",
pattern: /\benv\s*\?\?\s*\(?\s*\{\}\s+as\s+Env\b/,
},
{
name: "initLogger empty Env",
pattern: /\binitLogger\(\s*\{\s*\}\s*,\s*\{\s*\}\s*\)/,
},
{
name: "createLoggerStructure empty Env",
pattern: /\bcreateLoggerStructure\([^;]*,\s*\{\s*\}\s*\)/,
},
{
name: "global logtail logger export",
pattern: /\bexport\s+const\s+logger\b/,
},
{
name: "global logtail logger import",
pattern:
/import\s+\{[^}]*\blogger\b[^}]*\}\s+from\s+["'](?:@\/external\/logtail\/logtailUtils(?:\.js)?|[^"']*external\/logtail\/logtailUtils(?:\.js)?)["']/,
},
{
name: "logger Env typed as Partial",
pattern: /\benv\s*:\s*Partial<Env>\b/,
files: new Set([
"src/utils/logging/initLogger.ts",
"src/external/logtail/logtailUtils.ts",
]),
},
];
const collectTypeScriptFiles = (dir: string): string[] =>
readdirSync(dir, { withFileTypes: true }).flatMap((entry) => {
const path = join(dir, entry.name);
if (entry.isDirectory()) return collectTypeScriptFiles(path);
if (!entry.isFile()) return [];
return /\.(ts|tsx)$/.test(entry.name) ? [path] : [];
});
const findForbiddenSourcePatterns = () =>
collectTypeScriptFiles(sourceRoot).flatMap((file) => {
const relativePath = relative(process.cwd(), file);
const contents = readFileSync(file, "utf8");
return forbiddenSourcePatterns
.filter((rule) => !rule.files || rule.files.has(relativePath))
.filter((rule) => rule.pattern.test(contents))
.map((rule) => `${relativePath}: ${rule.name}`);
});
describe("initLogger env configuration", () => {
const originalNodeEnv = process.env.NODE_ENV;
afterEach(() => {
if (originalNodeEnv === undefined) {
delete (process.env as Record<string, string | undefined>).NODE_ENV;
} else {
process.env.NODE_ENV = originalNodeEnv;
}
});
test("uses the passed Env instead of process.env to resolve dev mode", () => {
process.env.NODE_ENV = "production";
const logger = initLogger(
{},
makeEnv({
NODE_ENV: "development",
AXIOM_TOKEN: "",
}),
);
expect(logger.level).toBe("debug");
});
test("does not allow default Env or global logtail logger usage", () => {
expect(findForbiddenSourcePatterns()).toEqual([]);
});
});