/** * Redis Mock for Testing * * Provides mock implementations for Redis operations. */ /** * In-memory store for testing Redis operations */ class MockRedisStore { private store = new Map(); async get(key: string): Promise { const entry = this.store.get(key); if (!entry) return null; if (entry.expiresAt && Date.now() > entry.expiresAt) { this.store.delete(key); return null; } return entry.value; } async setex(key: string, seconds: number, value: string): Promise { this.store.set(key, { value, expiresAt: Date.now() + seconds * 1000, }); return 'OK'; } async set(key: string, value: string): Promise { this.store.set(key, { value, expiresAt: null, }); return 'OK'; } async del(key: string): Promise { const deleted = this.store.delete(key); return deleted ? 1 : 0; } async exists(key: string): Promise { const entry = this.store.get(key); if (!entry) return 0; if (entry.expiresAt && Date.now() > entry.expiresAt) { this.store.delete(key); return 0; } return 1; } async ttl(key: string): Promise { const entry = this.store.get(key); if (!entry) return -2; if (!entry.expiresAt) return -1; const remaining = Math.floor((entry.expiresAt - Date.now()) / 1000); return remaining > 0 ? remaining : -2; } async flushall(): Promise { this.store.clear(); return 'OK'; } async quit(): Promise { this.store.clear(); return 'OK'; } clear() { this.store.clear(); } // For debugging getStore() { return this.store; } } /** * Export singleton instance */ export const mockRedisClient = new MockRedisStore(); /** * Reset mock Redis store */ export const resetRedisMock = () => { mockRedisClient.clear(); };