feat: notifica a ADMIN_USERS al descubrir grupos (modo discover)
Co-authored-by: aider (openrouter/openai/gpt-5) <aider@aider.chat>pull/1/head
							parent
							
								
									adad0a0609
								
							
						
					
					
						commit
						c51cb3f124
					
				| @ -0,0 +1,91 @@ | |||||||
|  | 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']); | ||||||
|  |   }); | ||||||
|  | }); | ||||||
					Loading…
					
					
				
		Reference in New Issue