import { workerConnectionOptions, webhookWorkerConcurrency } from './redis-connection'; describe('workerConnectionOptions (webhook Worker connection)', () => { const ORIGINAL_ENV = process.env; afterEach(() => { process.env = ORIGINAL_ENV; }); it('does NOT disable the offline queue — the Worker must tolerate a brief Redis reconnect', () => { // The producer sets enableOfflineQueue:false for fast-fail; the Worker must keep ioredis's default // (true). Asserting it is absent guards against the regression where the Worker inherited the // producer-only fast-fail from the shared connection and threw "Stream isn't writeable" on a blip. const opts = workerConnectionOptions() as unknown as Record; expect(opts.enableOfflineQueue).toBeUndefined(); }); it('reads host/port/username/password/connectTimeout from env with safe defaults', () => { process.env = { ...ORIGINAL_ENV }; delete process.env.REDIS_HOST; delete process.env.REDIS_PORT; delete process.env.REDIS_USERNAME; delete process.env.REDIS_PASSWORD; delete process.env.REDIS_CONNECT_TIMEOUT_MS; expect(workerConnectionOptions()).toEqual({ host: 'localhost', port: 6379, username: undefined, password: undefined, connectTimeout: 5000, }); process.env.REDIS_HOST = 'redis.internal'; process.env.REDIS_PORT = '6380'; process.env.REDIS_USERNAME = 'myuser'; process.env.REDIS_PASSWORD = 'secret'; process.env.REDIS_CONNECT_TIMEOUT_MS = '1234'; expect(workerConnectionOptions()).toEqual({ host: 'redis.internal', port: 6380, username: 'myuser', password: 'secret', connectTimeout: 1234, }); }); it('uses REDIS_URL and REDIS_TLS for managed Redis', () => { process.env = { ...ORIGINAL_ENV, REDIS_URL: 'redis://default:redis-password@redis.example.test:6379', REDIS_TLS: 'true', REDIS_CONNECT_TIMEOUT_MS: '1234', }; delete process.env.REDIS_HOST; delete process.env.REDIS_PORT; delete process.env.REDIS_USERNAME; delete process.env.REDIS_PASSWORD; expect(workerConnectionOptions()).toEqual({ host: 'redis.example.test', port: 6379, username: 'default', password: 'redis-password', connectTimeout: 1234, tls: {}, }); }); }); describe('webhookWorkerConcurrency', () => { const ORIGINAL_ENV = process.env; afterEach(() => { process.env = ORIGINAL_ENV; }); it('defaults to 10 so deliveries do not serialize behind one slow receiver', () => { process.env = { ...ORIGINAL_ENV }; delete process.env.WEBHOOK_WORKER_CONCURRENCY; expect(webhookWorkerConcurrency()).toBe(10); }); it('honors a positive override', () => { process.env = { ...ORIGINAL_ENV, WEBHOOK_WORKER_CONCURRENCY: '25' }; expect(webhookWorkerConcurrency()).toBe(25); }); it('falls back to the default for a non-positive/garbage override', () => { process.env = { ...ORIGINAL_ENV, WEBHOOK_WORKER_CONCURRENCY: '0' }; expect(webhookWorkerConcurrency()).toBe(10); process.env = { ...ORIGINAL_ENV, WEBHOOK_WORKER_CONCURRENCY: 'abc' }; expect(webhookWorkerConcurrency()).toBe(10); }); });