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.
		
		
		
		
		
			
		
			
				
	
	
		
			99 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			99 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			TypeScript
		
	
| import { describe, test, expect, beforeEach, afterEach } from 'bun:test';
 | |
| import { GroupSyncService } from '../../../src/services/group-sync';
 | |
| 
 | |
| const ORIGINAL_FETCH = globalThis.fetch;
 | |
| 
 | |
| describe('GroupSyncService - fetchGroupMembersFromAPI (parsing y fallbacks)', () => {
 | |
|   const envBackup = { ...process.env };
 | |
| 
 | |
|   beforeEach(() => {
 | |
|     process.env = {
 | |
|       ...envBackup,
 | |
|       NODE_ENV: 'development', // evitar early-return de test
 | |
|       EVOLUTION_API_URL: 'http://evolution.test',
 | |
|       EVOLUTION_API_INSTANCE: 'instance-1',
 | |
|       EVOLUTION_API_KEY: 'apikey'
 | |
|     };
 | |
|   });
 | |
| 
 | |
|   afterEach(() => {
 | |
|     process.env = envBackup;
 | |
|     globalThis.fetch = ORIGINAL_FETCH;
 | |
|   });
 | |
| 
 | |
|   test('parsea /group/participants con múltiples formas de payload y roles', async () => {
 | |
|     globalThis.fetch = async (url: RequestInfo | URL) => {
 | |
|       if (String(url).includes('/group/participants/')) {
 | |
|         const body = {
 | |
|           participants: [
 | |
|             { id: '553198296801@s.whatsapp.net', admin: 'superadmin' },
 | |
|             { id: '1234567890@s.whatsapp.net', admin: 'admin' },
 | |
|             { id: '1111111111@s.whatsapp.net', admin: null },
 | |
|             '2222222222@s.whatsapp.net',
 | |
|             { jid: '3333333333@s.whatsapp.net', role: 'member' },
 | |
|             { user: { id: '4444444444@s.whatsapp.net' }, isAdmin: true }
 | |
|           ]
 | |
|         };
 | |
|         return new Response(JSON.stringify(body), { status: 200, headers: { 'Content-Type': 'application/json' } });
 | |
|       }
 | |
|       return new Response('not found', { status: 404 });
 | |
|     };
 | |
| 
 | |
|     const out = await (GroupSyncService as any).fetchGroupMembersFromAPI('123@g.us');
 | |
|     // Debe mapear a IDs normalizados (solo dígitos) y detectar admin correctamente
 | |
|     const ids = out.map((x: any) => x.userId).sort();
 | |
|     expect(ids).toEqual(['1111111111','1234567890','2222222222','3333333333','4444444444','553198296801'].sort());
 | |
| 
 | |
|     const adminMap = new Map(out.map((x: any) => [x.userId, x.isAdmin]));
 | |
|     expect(adminMap.get('553198296801')).toBe(true);
 | |
|     expect(adminMap.get('1234567890')).toBe(true);
 | |
|     expect(adminMap.get('1111111111')).toBe(false);
 | |
|     expect(adminMap.get('2222222222')).toBe(false);
 | |
|     expect(adminMap.get('3333333333')).toBe(false);
 | |
|     expect(adminMap.get('4444444444')).toBe(true);
 | |
|   });
 | |
| 
 | |
|   test('fallback a fetchAllGroups cuando /group/participants no trae participants', async () => {
 | |
|     globalThis.fetch = async (url: RequestInfo | URL) => {
 | |
|       const u = String(url);
 | |
|       if (u.includes('/group/participants/')) {
 | |
|         // OK pero sin campo participants
 | |
|         return new Response(JSON.stringify({ ok: true }), { status: 200 });
 | |
|       }
 | |
|       if (u.includes('/group/fetchAllGroups/')) {
 | |
|         const wrapped = {
 | |
|           response: [
 | |
|             { id: '123@g.us', participants: [{ id: '9999999999@s.whatsapp.net', admin: 'admin' }] }
 | |
|           ]
 | |
|         };
 | |
|         return new Response(JSON.stringify(wrapped), { status: 200, headers: { 'Content-Type': 'application/json' } });
 | |
|       }
 | |
|       return new Response('not found', { status: 404 });
 | |
|     };
 | |
| 
 | |
|     const out = await (GroupSyncService as any).fetchGroupMembersFromAPI('123@g.us');
 | |
|     expect(out).toEqual([{ userId: '9999999999', isAdmin: true }]);
 | |
|   });
 | |
| 
 | |
|   test('fallback devuelve snapshot vacío si el grupo no está presente', async () => {
 | |
|     globalThis.fetch = async (url: RequestInfo | URL) => {
 | |
|       const u = String(url);
 | |
|       if (u.includes('/group/participants/')) {
 | |
|         return new Response(JSON.stringify({ ok: true }), { status: 200 });
 | |
|       }
 | |
|       if (u.includes('/group/fetchAllGroups/')) {
 | |
|         const wrapped = {
 | |
|           response: [
 | |
|             { id: 'other@g.us', participants: [{ id: '9999999999@s.whatsapp.net', admin: 'admin' }] }
 | |
|           ]
 | |
|         };
 | |
|         return new Response(JSON.stringify(wrapped), { status: 200 });
 | |
|       }
 | |
|       return new Response('not found', { status: 404 });
 | |
|     };
 | |
| 
 | |
|     const out = await (GroupSyncService as any).fetchGroupMembersFromAPI('123@g.us');
 | |
|     expect(out).toEqual([]);
 | |
|   });
 | |
| });
 |