import { randomUUID } from 'crypto'; import { ConfigService } from '@nestjs/config'; import { RedisCacheAdapter } from '../../src/infrastructure/cache/redis-cache.adapter'; describe('Redis cache integration', () => { let cache: RedisCacheAdapter; const prefix = `integration:${randomUUID()}:`; const keys = ['value', 'expires'].map(key => `${prefix}${key}`); beforeAll(async () => { cache = new RedisCacheAdapter( new ConfigService({ REDIS_HOST: process.env.REDIS_HOST, REDIS_PORT: Number(process.env.REDIS_PORT), REDIS_PASSWORD: process.env.REDIS_PASSWORD || undefined, REDIS_DB: Number(process.env.REDIS_DB), }) ); await cache.onModuleInit(); }); afterAll(async () => { try { // Delete only this suite's keys; never flush a shared database. await cache.deleteMany(keys); } finally { await cache.onModuleDestroy(); } }); it('round-trips cached application data and invalidates it', async () => { const value = { amount: 125.5, currency: 'EUR', ports: ['FRLEH', 'USNYC'] }; await cache.set(keys[0], value, 60); expect(await cache.get(keys[0])).toEqual(value); await cache.delete(keys[0]); expect(await cache.get(keys[0])).toBeNull(); }); it('expires cached data using the server TTL', async () => { await cache.set(keys[1], { valid: true }, 1); expect(await cache.exists(keys[1])).toBe(true); await new Promise(resolve => setTimeout(resolve, 1200)); expect(await cache.exists(keys[1])).toBe(false); }); });