import { describe, test, expect, beforeAll, afterAll, beforeEach, afterEach } from 'bun:test'; import { Database } from 'bun:sqlite'; import { WebhookServer } from '../../../src/server'; import { initializeDatabase } from '../../../src/db'; import { ResponseQueue } from '../../../src/services/response-queue'; let testDb: Database; let originalAdd: any; let simulatedQueue: any[] = []; const SimulatedResponseQueue = { async add(responses: any[]) { simulatedQueue.push(...responses); }, clear() { simulatedQueue = []; }, get() { return simulatedQueue; } }; const createTestRequest = (payload: any) => new Request('http://localhost:3007', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); describe('WebhookServer - notifica a ADMIN_USERS en descubrimiento (modo discover)', () => { const envBackup = process.env; beforeAll(() => { testDb = new Database(':memory:'); initializeDatabase(testDb); originalAdd = (ResponseQueue as any).add; }); afterAll(() => { (ResponseQueue as any).add = originalAdd; testDb.close(); }); beforeEach(() => { process.env = { ...envBackup, NODE_ENV: 'test', GROUP_GATING_MODE: 'discover', NOTIFY_ADMINS_ON_DISCOVERY: 'true', ADMIN_USERS: '1234567890, 5555555555' }; SimulatedResponseQueue.clear(); (ResponseQueue as any).add = SimulatedResponseQueue.add; WebhookServer.dbInstance = testDb; // Limpiar tablas relevantes testDb.exec('DELETE FROM response_queue'); testDb.exec('DELETE FROM allowed_groups'); testDb.exec('DELETE FROM users'); }); afterEach(() => { process.env = envBackup; }); test('registra pending y envía DMs a todos los admins', async () => { const payload = { event: 'messages.upsert', instance: 'test-instance', data: { key: { remoteJid: 'notify-group@g.us', participant: '9999999999@s.whatsapp.net' }, message: { conversation: '/t n hola' } } }; const res = await WebhookServer.handleRequest(createTestRequest(payload)); expect(res.status).toBe(200); // allowed_groups debe tener el grupo en pending const row = testDb .query(`SELECT status FROM allowed_groups WHERE group_id = 'notify-group@g.us'`) .get() as any; expect(row).toBeDefined(); expect(String(row.status)).toBe('pending'); // Debe haberse encolado una notificación por cada admin const out = SimulatedResponseQueue.get(); const recipients = out.map((r: any) => r.recipient).sort(); expect(out.length).toBe(2); expect(recipients).toEqual(['1234567890', '5555555555']); }); });