From 623d1f28ea2ac12175eac76d9ff6595edccc6a67 Mon Sep 17 00:00:00 2001 From: Sandip Gyawali Date: Mon, 29 Jun 2026 17:56:48 +0545 Subject: [PATCH 1/2] fix(env): fixed zod error changing to preprocess and coercing including it's test case and behaviour --- src/lib/env.ts | 9 ++- tests/unit/env-debug.test.ts | 120 +++++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 tests/unit/env-debug.test.ts diff --git a/src/lib/env.ts b/src/lib/env.ts index 24a65d46f..27407b81e 100644 --- a/src/lib/env.ts +++ b/src/lib/env.ts @@ -35,7 +35,14 @@ export const envSchema: z.ZodType = z.object({ OPENROUTER_APP_TITLE: z.string().optional(), OPENROUTER_APP_CATEGORIES: z.string().optional(), - OPENROUTER_DEBUG: z.coerce.boolean().optional(), + OPENROUTER_DEBUG: z.preprocess( + (v) => { + if(typeof v === "string") { + return !["false", "0", "off", "no", ""].includes(v.toLowerCase().trim()) + } + return v; + }, + z.coerce.boolean().optional()), }); /** diff --git a/tests/unit/env-debug.test.ts b/tests/unit/env-debug.test.ts new file mode 100644 index 000000000..c828c2634 --- /dev/null +++ b/tests/unit/env-debug.test.ts @@ -0,0 +1,120 @@ +import { describe, it, expect } from 'vitest'; +import { envSchema, resetEnv } from '../../src/lib/env.js'; + +describe('OPENROUTER_DEBUG env var parsing', () => { + beforeEach(() => { + resetEnv(); + }); + + describe('explicit falsy values should disable debug logging', () => { + it('should parse OPENROUTER_DEBUG=false as false', () => { + const result = envSchema.parse({ OPENROUTER_DEBUG: 'false' }); + expect(result.OPENROUTER_DEBUG).toBe(false); + }); + + it('should parse OPENROUTER_DEBUG=0 as false', () => { + const result = envSchema.parse({ OPENROUTER_DEBUG: '0' }); + expect(result.OPENROUTER_DEBUG).toBe(false); + }); + + it('should parse OPENROUTER_DEBUG=off as false', () => { + const result = envSchema.parse({ OPENROUTER_DEBUG: 'off' }); + expect(result.OPENROUTER_DEBUG).toBe(false); + }); + + it('should parse OPENROUTER_DEBUG=no as false', () => { + const result = envSchema.parse({ OPENROUTER_DEBUG: 'no' }); + expect(result.OPENROUTER_DEBUG).toBe(false); + }); + + it('should parse OPENROUTER_DEBUG="" as false', () => { + const result = envSchema.parse({ OPENROUTER_DEBUG: '' }); + expect(result.OPENROUTER_DEBUG).toBe(false); + }); + }); + + describe('case-insensitive handling', () => { + it('should parse OPENROUTER_DEBUG=FALSE as false', () => { + const result = envSchema.parse({ OPENROUTER_DEBUG: 'FALSE' }); + expect(result.OPENROUTER_DEBUG).toBe(false); + }); + + it('should parse OPENROUTER_DEBUG=False as false', () => { + const result = envSchema.parse({ OPENROUTER_DEBUG: 'False' }); + expect(result.OPENROUTER_DEBUG).toBe(false); + }); + + it('should parse OPENROUTER_DEBUG=OFF as false', () => { + const result = envSchema.parse({ OPENROUTER_DEBUG: 'OFF' }); + expect(result.OPENROUTER_DEBUG).toBe(false); + }); + }); + + describe('explicit truthy values should enable debug logging', () => { + it('should parse OPENROUTER_DEBUG=true as true', () => { + const result = envSchema.parse({ OPENROUTER_DEBUG: 'true' }); + expect(result.OPENROUTER_DEBUG).toBe(true); + }); + + it('should parse OPENROUTER_DEBUG=1 as true', () => { + const result = envSchema.parse({ OPENROUTER_DEBUG: '1' }); + expect(result.OPENROUTER_DEBUG).toBe(true); + }); + + it('should parse OPENROUTER_DEBUG=on as true', () => { + const result = envSchema.parse({ OPENROUTER_DEBUG: 'on' }); + expect(result.OPENROUTER_DEBUG).toBe(true); + }); + + it('should parse OPENROUTER_DEBUG=yes as true', () => { + const result = envSchema.parse({ OPENROUTER_DEBUG: 'yes' }); + expect(result.OPENROUTER_DEBUG).toBe(true); + }); + }); + + describe('actual boolean values passed programmatically', () => { + it('should accept boolean true', () => { + const result = envSchema.parse({ OPENROUTER_DEBUG: true }); + expect(result.OPENROUTER_DEBUG).toBe(true); + }); + + it('should accept boolean false', () => { + const result = envSchema.parse({ OPENROUTER_DEBUG: false }); + expect(result.OPENROUTER_DEBUG).toBe(false); + }); + }); + + describe('undefined/unset behavior', () => { + it('should be undefined when not set', () => { + const result = envSchema.parse({}); + expect(result.OPENROUTER_DEBUG).toBeUndefined(); + }); + + it('should be undefined when explicitly undefined', () => { + const result = envSchema.parse({ OPENROUTER_DEBUG: undefined }); + expect(result.OPENROUTER_DEBUG).toBeUndefined(); + }); + }); + + describe('regression: any non-empty string without the fix would be truthy', () => { + it('should NOT parse OPENROUTER_DEBUG= as true (empty string edge case)', () => { + const result = envSchema.parse({ OPENROUTER_DEBUG: '' }); + expect(result.OPENROUTER_DEBUG).toBe(false); + }); + + it('should parse OPENROUTER_DEBUG=disabled as true (arbitrary non-empty value)', () => { + const result = envSchema.parse({ OPENROUTER_DEBUG: 'disabled' }); + expect(result.OPENROUTER_DEBUG).toBe(true); + }); + }); + + describe('resetEnv clears cache between tests', () => { + it('should return fresh value after reset', () => { + const result1 = envSchema.parse({ OPENROUTER_DEBUG: 'true' }); + expect(result1.OPENROUTER_DEBUG).toBe(true); + resetEnv(); + const result2 = envSchema.parse({ OPENROUTER_DEBUG: 'false' }); + expect(result2.OPENROUTER_DEBUG).toBe(false); + }); + }); +}); From eed9ad8a300020c7600c9689f44d48b270b5e40b Mon Sep 17 00:00:00 2001 From: Sandip Gyawali Date: Mon, 29 Jun 2026 19:42:46 +0545 Subject: [PATCH 2/2] fix(module): fix import for beforeEach from vietest --- tests/unit/env-debug.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/env-debug.test.ts b/tests/unit/env-debug.test.ts index c828c2634..d51b491c3 100644 --- a/tests/unit/env-debug.test.ts +++ b/tests/unit/env-debug.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect } from 'vitest'; +import { describe, it, expect, beforeEach } from 'vitest'; import { envSchema, resetEnv } from '../../src/lib/env.js'; describe('OPENROUTER_DEBUG env var parsing', () => {