diff --git a/server/tests/unit/logging/init-logger-env.test.ts b/server/tests/unit/logging/init-logger-env.test.ts index 6fa3e54f8..46b5df8ce 100644 --- a/server/tests/unit/logging/init-logger-env.test.ts +++ b/server/tests/unit/logging/init-logger-env.test.ts @@ -4,10 +4,51 @@ import { join, relative } from "node:path"; import { initLogger } from "@/utils/logging/initLogger.js"; const makeEnv = (overrides: Partial): Env => overrides as Env; -const forbiddenEnvFallbackPatterns = [ - /\b\w+\s*:\s*Env\s*=/, - /\benv\s*\?\s*:\s*Env\b/, - /\benv\s*\?\?\s*\(?\s*\{\}\s+as\s+Env\b/, + +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\b/, + files: new Set([ + "src/utils/logging/initLogger.ts", + "src/external/logtail/logtailUtils.ts", + ]), + }, ]; const collectTypeScriptFiles = (dir: string): string[] => @@ -18,6 +59,17 @@ const collectTypeScriptFiles = (dir: string): string[] => 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; @@ -43,17 +95,7 @@ describe("initLogger env configuration", () => { expect(logger.level).toBe("debug"); }); - test("does not allow Env parameters to be optional or define fallback defaults", () => { - const sourceRoot = join(process.cwd(), "src"); - const offenders = collectTypeScriptFiles(sourceRoot) - .filter((file) => { - const contents = readFileSync(file, "utf8"); - return forbiddenEnvFallbackPatterns.some((pattern) => - pattern.test(contents), - ); - }) - .map((file) => relative(process.cwd(), file)); - - expect(offenders).toEqual([]); + test("does not allow default Env or global logtail logger usage", () => { + expect(findForbiddenSourcePatterns()).toEqual([]); }); });