You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			71 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
| import { describe, it, beforeEach, afterEach, expect } from 'bun:test';
 | |
| import { Database } from 'bun:sqlite';
 | |
| import { initializeDatabase } from '../../../src/db';
 | |
| import { ResponseQueue } from '../../../src/services/response-queue';
 | |
| import { IdentityService } from '../../../src/services/identity';
 | |
| 
 | |
| const ORIGINAL_FETCH = globalThis.fetch;
 | |
| const envBackup = { ...process.env };
 | |
| 
 | |
| describe('ResponseQueue - resolución de menciones con alias (@lid)', () => {
 | |
|   let memdb: Database;
 | |
|   let captured: { url?: string; payload?: any } = {};
 | |
| 
 | |
|   beforeEach(() => {
 | |
|     process.env = {
 | |
|       ...envBackup,
 | |
|       EVOLUTION_API_URL: 'http://evolution.test',
 | |
|       EVOLUTION_API_INSTANCE: 'instance-1',
 | |
|       EVOLUTION_API_KEY: 'apikey'
 | |
|     };
 | |
| 
 | |
|     memdb = new Database(':memory:');
 | |
|     memdb.exec('PRAGMA foreign_keys = ON;');
 | |
|     initializeDatabase(memdb);
 | |
| 
 | |
|     (IdentityService as any).dbInstance = memdb;
 | |
|     (ResponseQueue as any).dbInstance = memdb;
 | |
| 
 | |
|     // Sembrar alias: userXYZ@lid -> 666777888
 | |
|     IdentityService.upsertAlias('userXYZ@lid', '666777888@s.whatsapp.net', 'test');
 | |
| 
 | |
|     // Stub fetch para capturar el payload enviado
 | |
|     globalThis.fetch = async (url: RequestInfo | URL, init?: RequestInit) => {
 | |
|       captured.url = String(url);
 | |
|       try {
 | |
|         captured.payload = init?.body ? JSON.parse(String(init.body)) : null;
 | |
|       } catch {
 | |
|         captured.payload = null;
 | |
|       }
 | |
|       return new Response(JSON.stringify({ ok: true }), { status: 200, headers: { 'Content-Type': 'application/json' } });
 | |
|     };
 | |
|   });
 | |
| 
 | |
|   afterEach(() => {
 | |
|     globalThis.fetch = ORIGINAL_FETCH;
 | |
|     process.env = envBackup;
 | |
|     memdb.close();
 | |
|   });
 | |
| 
 | |
|   it('construye mentioned con números reales, deduplicados', async () => {
 | |
|     const item = {
 | |
|       id: 1,
 | |
|       recipient: '123456789', // número normalizado
 | |
|       message: 'hola @user',
 | |
|       metadata: JSON.stringify({ mentioned: ['userXYZ@lid', '666777888@s.whatsapp.net'] }),
 | |
|       attempts: 0
 | |
|     };
 | |
| 
 | |
|     const res = await ResponseQueue.sendOne(item as any);
 | |
|     expect(res.ok).toBe(true);
 | |
| 
 | |
|     expect(captured.url?.includes('/message/sendText/instance-1')).toBe(true);
 | |
|     expect(captured.payload).toBeDefined();
 | |
|     expect(captured.payload.number).toBe('123456789');
 | |
|     expect(Array.isArray(captured.payload.mentioned)).toBe(true);
 | |
| 
 | |
|     // Debe contener solo una entrada, resuelta a número real @s.whatsapp.net y sin duplicados
 | |
|     expect(captured.payload.mentioned.sort()).toEqual(['666777888@s.whatsapp.net']);
 | |
|   });
 | |
| });
 |