import { describe, test, expect, beforeEach, afterEach } from 'bun:test'; import { WebhookServer } from '../../src/server'; describe('WebhookServer', () => { const envBackup = process.env; beforeEach(() => { process.env = { ...envBackup, INSTANCE_NAME: 'test-instance', NODE_ENV: 'test' }; }); afterEach(() => { process.env = envBackup; }); const createTestRequest = (payload: any) => new Request('http://localhost:3007', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); test('should reject non-POST requests', async () => { const request = new Request('http://localhost:3007', { method: 'GET' }); const response = await WebhookServer.handleRequest(request); expect(response.status).toBe(405); }); test('should require JSON content type', async () => { const request = new Request('http://localhost:3007', { method: 'POST', headers: { 'Content-Type': 'text/plain' } }); const response = await WebhookServer.handleRequest(request); expect(response.status).toBe(400); }); test('should validate payload structure', async () => { const invalidPayloads = [ {}, { event: null }, { event: 'messages.upsert', instance: null } ]; for (const payload of invalidPayloads) { const request = createTestRequest(payload); const response = await WebhookServer.handleRequest(request); expect(response.status).toBe(400); } }); test('should verify instance name', async () => { const payload = { event: 'messages.upsert', instance: 'wrong-instance', data: {} }; const request = createTestRequest(payload); const response = await WebhookServer.handleRequest(request); expect(response.status).toBe(403); }); test('should handle valid messages.upsert', async () => { const payload = { event: 'messages.upsert', instance: 'test-instance', data: { key: { remoteJid: 'group-id@g.us', participant: 'sender-id@s.whatsapp.net' }, message: { conversation: '/tarea nueva Test' } } }; const request = createTestRequest(payload); const response = await WebhookServer.handleRequest(request); expect(response.status).toBe(200); }); });