diff --git a/src/lib/metrics-cache.ts b/src/lib/metrics-cache.ts index f40992bf..565bd60a 100644 --- a/src/lib/metrics-cache.ts +++ b/src/lib/metrics-cache.ts @@ -42,7 +42,7 @@ function isTruthyCacheBypass(value: string | null): boolean { return ["1", "true", "yes", "on"].includes(value.trim().toLowerCase()); } -function getRedisClient(): Redis | null { +export function getRedisClient(): Redis | null { if (redisClient !== undefined) { return redisClient; } diff --git a/test/getRedisClient.test.ts b/test/getRedisClient.test.ts new file mode 100644 index 00000000..e9b01032 --- /dev/null +++ b/test/getRedisClient.test.ts @@ -0,0 +1,50 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; + +vi.mock('@upstash/redis', () => { + const MockRedis = vi.fn(function() { return {}; }); + return { Redis: MockRedis }; +}); + +describe('getRedisClient lazy initialization', () => { + beforeEach(() => { + vi.resetModules(); + }); + + it('returns null when UPSTASH_REDIS_REST_URL is not set', async () => { + delete process.env.UPSTASH_REDIS_REST_URL; + delete process.env.UPSTASH_REDIS_REST_TOKEN; + + const { getRedisClient } = await import('../src/lib/metrics-cache'); + const client = getRedisClient(); + expect(client).toBeNull(); + }); + + it('returns null when UPSTASH_REDIS_REST_TOKEN is not set', async () => { + process.env.UPSTASH_REDIS_REST_URL = 'https://example.upstash.io'; + delete process.env.UPSTASH_REDIS_REST_TOKEN; + + const { getRedisClient } = await import('../src/lib/metrics-cache'); + const client = getRedisClient(); + expect(client).toBeNull(); + }); + + it('returns Redis instance when both env vars are set', async () => { + process.env.UPSTASH_REDIS_REST_URL = 'https://example.upstash.io'; + process.env.UPSTASH_REDIS_REST_TOKEN = 'test-token-123'; + + const { getRedisClient } = await import('../src/lib/metrics-cache'); + const client = getRedisClient(); + expect(client).not.toBeNull(); + expect(client).toBeDefined(); + }); + + it('returns same singleton instance on repeated calls', async () => { + process.env.UPSTASH_REDIS_REST_URL = 'https://example.upstash.io'; + process.env.UPSTASH_REDIS_REST_TOKEN = 'test-token-123'; + + const { getRedisClient } = await import('../src/lib/metrics-cache'); + const client1 = getRedisClient(); + const client2 = getRedisClient(); + expect(client1).toBe(client2); + }); +}); \ No newline at end of file