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.
		
		
		
		
		
			
		
			
				
	
	
		
			88 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
import { describe, test, expect, beforeEach, afterEach } from 'bun:test';
 | 
						|
import { WebhookServer } from '../../../src/server';
 | 
						|
import { GroupSyncService } from '../../../src/services/group-sync';
 | 
						|
import { makeMemDb, injectAllServices, resetServices } from '../../helpers/db';
 | 
						|
import type { Database as SqliteDatabase } from 'bun:sqlite';
 | 
						|
 | 
						|
describe('WebhookServer - groups.upsert encadena syncGroups y syncMembersForActiveGroups', () => {
 | 
						|
  const envBackup = { ...process.env };
 | 
						|
  let db: SqliteDatabase;
 | 
						|
 | 
						|
  let originalSyncGroups: any;
 | 
						|
  let originalRefresh: any;
 | 
						|
  let originalSyncMembers: any;
 | 
						|
 | 
						|
  let calledSyncGroups = 0;
 | 
						|
  let calledRefresh = 0;
 | 
						|
  let calledSyncMembers = 0;
 | 
						|
 | 
						|
  beforeEach(() => {
 | 
						|
    process.env = {
 | 
						|
      ...envBackup,
 | 
						|
      NODE_ENV: 'production',
 | 
						|
      EVOLUTION_API_INSTANCE: 'inst-1',
 | 
						|
      EVOLUTION_API_URL: 'http://localhost:1234',
 | 
						|
      EVOLUTION_API_KEY: 'dummy',
 | 
						|
      CHATBOT_PHONE_NUMBER: '123456789',
 | 
						|
      WEBHOOK_URL: 'http://localhost:3000/webhook'
 | 
						|
    };
 | 
						|
 | 
						|
    db = makeMemDb();
 | 
						|
    // Inyectar DB en servicios
 | 
						|
    (WebhookServer as any).dbInstance = db;
 | 
						|
    injectAllServices(db);
 | 
						|
 | 
						|
    // Guardar originales y stubear
 | 
						|
    originalSyncGroups = GroupSyncService.syncGroups;
 | 
						|
    originalRefresh = GroupSyncService.refreshActiveGroupsCache;
 | 
						|
    originalSyncMembers = GroupSyncService.syncMembersForActiveGroups;
 | 
						|
 | 
						|
    calledSyncGroups = 0;
 | 
						|
    calledRefresh = 0;
 | 
						|
    calledSyncMembers = 0;
 | 
						|
 | 
						|
    GroupSyncService.syncGroups = async () => {
 | 
						|
      calledSyncGroups++;
 | 
						|
      return { added: 0, updated: 0 };
 | 
						|
    };
 | 
						|
    GroupSyncService.refreshActiveGroupsCache = () => {
 | 
						|
      calledRefresh++;
 | 
						|
    };
 | 
						|
    GroupSyncService.syncMembersForActiveGroups = async () => {
 | 
						|
      calledSyncMembers++;
 | 
						|
      return { groups: 0, added: 0, updated: 0, deactivated: 0 };
 | 
						|
    };
 | 
						|
  });
 | 
						|
 | 
						|
  afterEach(async () => {
 | 
						|
    // Restaurar stubs
 | 
						|
    GroupSyncService.syncGroups = originalSyncGroups;
 | 
						|
    GroupSyncService.refreshActiveGroupsCache = originalRefresh;
 | 
						|
    GroupSyncService.syncMembersForActiveGroups = originalSyncMembers;
 | 
						|
 | 
						|
    resetServices();
 | 
						|
    try { db.close(); } catch {}
 | 
						|
    process.env = envBackup;
 | 
						|
  });
 | 
						|
 | 
						|
  test('dispara syncGroups -> refreshActiveGroupsCache -> syncMembersForActiveGroups y responde 200', async () => {
 | 
						|
    const payload = {
 | 
						|
      event: 'groups.upsert',
 | 
						|
      instance: 'inst-1',
 | 
						|
      data: { any: 'thing' }
 | 
						|
    };
 | 
						|
 | 
						|
    const req = new Request('http://localhost/webhook', {
 | 
						|
      method: 'POST',
 | 
						|
      headers: { 'content-type': 'application/json' },
 | 
						|
      body: JSON.stringify(payload)
 | 
						|
    });
 | 
						|
 | 
						|
    const res = await WebhookServer.handleRequest(req);
 | 
						|
    expect(res.status).toBe(200);
 | 
						|
    expect(calledSyncGroups).toBe(1);
 | 
						|
    expect(calledRefresh).toBe(1);
 | 
						|
    expect(calledSyncMembers).toBe(1);
 | 
						|
  });
 | 
						|
});
 |