/** * Advanced listing tests. * * Tests the "t ver sin" and "t ver todos" flows through the webhook * handler, covering DM‑only responses, pagination, and unassigned‑task * listings with their instructive notes. */ import { describe, test, expect } from 'bun:test'; import { WebhookServer } from '../../src/server'; import { TaskService } from '../../src/tasks/service'; import { SimulatedResponseQueue } from '../helpers/queue'; import { createTestRequest, registerServerTestLifecycle } from '../helpers/server-test-harness'; const testDb = registerServerTestLifecycle(); // ── Tests ────────────────────────────────────────────────────────────── describe('Advanced listings via WebhookServer', () => { test('should process "t ver sin" in group as DM-only with pagination line', async () => { // 12 unassigned in the active group for (let i = 1; i <= 12; i++) { TaskService.createTask({ description: `Sin dueño ${i}`, due_date: '2025-12-31', group_id: 'group-id@g.us', created_by: '9999999999', }); } // 2 assigned (should not appear in "sin") TaskService.createTask( { description: 'Asignada 1', due_date: '2025-10-10', group_id: 'group-id@g.us', created_by: '1111111111', }, [{ user_id: '1234567890', assigned_by: '1111111111' }], ); TaskService.createTask( { description: 'Asignada 2', due_date: '2025-10-11', group_id: 'group-id@g.us', created_by: '1111111111', }, [{ user_id: '1234567890', assigned_by: '1111111111' }], ); const payload = { event: 'messages.upsert', instance: 'test-instance', data: { key: { remoteJid: 'group-id@g.us', participant: '1234567890@s.whatsapp.net', }, message: { conversation: 't ver sin' }, }, }; const response = await WebhookServer.handleRequest(createTestRequest(payload)); expect(response.status).toBe(200); const out = SimulatedResponseQueue.get(); expect(out.length).toBeGreaterThan(0); for (const r of out) { expect(r.recipient.endsWith('@g.us')).toBe(false); } const msg = out.map(x => x.message).join('\n'); expect(msg).toContain('No respondo en grupos.'); }); test('should process "t ver sin" in DM returning instruction', async () => { const payload = { event: 'messages.upsert', instance: 'test-instance', data: { key: { remoteJid: '1234567890@s.whatsapp.net', participant: '1234567890@s.whatsapp.net', }, message: { conversation: 't ver sin' }, }, }; const response = await WebhookServer.handleRequest(createTestRequest(payload)); expect(response.status).toBe(200); const out = SimulatedResponseQueue.get(); expect(out.length).toBeGreaterThan(0); const msg = out.map(x => x.message).join('\n'); expect(msg).toContain('No tienes tareas pendientes.'); }); test('should process "t ver todos" in group showing "Tus tareas" + "Sin dueño" with pagination', async () => { // User's tasks (2 assigned) TaskService.createTask( { description: 'Mi Tarea 1', due_date: '2025-10-10', group_id: 'group-id@g.us', created_by: '2222222222', }, [{ user_id: '1234567890', assigned_by: '2222222222' }], ); TaskService.createTask( { description: 'Mi Tarea 2', due_date: '2025-10-11', group_id: 'group-id@g.us', created_by: '2222222222', }, [{ user_id: '1234567890', assigned_by: '2222222222' }], ); // 12 unassigned to trigger pagination for (let i = 1; i <= 12; i++) { TaskService.createTask({ description: `Sin dueño ${i}`, due_date: '2025-12-31', group_id: 'group-id@g.us', created_by: '9999999999', }); } const payload = { event: 'messages.upsert', instance: 'test-instance', data: { key: { remoteJid: 'group-id@g.us', participant: '1234567890@s.whatsapp.net', }, message: { conversation: 't ver todos' }, }, }; const response = await WebhookServer.handleRequest(createTestRequest(payload)); expect(response.status).toBe(200); const out = SimulatedResponseQueue.get(); expect(out.length).toBeGreaterThan(0); const msg = out.map(x => x.message).join('\n'); expect(msg).toContain('No respondo en grupos.'); }); test('should process "t ver todos" in DM showing "Tus tareas" + instructive note', async () => { TaskService.createTask( { description: 'Mi Tarea A', due_date: '2025-11-20', group_id: 'group-2@g.us', created_by: '1111111111', }, [{ user_id: '1234567890', assigned_by: '1111111111' }], ); const payload = { event: 'messages.upsert', instance: 'test-instance', data: { key: { remoteJid: '1234567890@s.whatsapp.net', participant: '1234567890@s.whatsapp.net', }, message: { conversation: 't ver todos' }, }, }; const response = await WebhookServer.handleRequest(createTestRequest(payload)); expect(response.status).toBe(200); const out = SimulatedResponseQueue.get(); expect(out.length).toBeGreaterThan(0); const msg = out.map(x => x.message).join('\n'); expect(msg).toContain('Tus tareas'); expect(msg).toContain('ℹ️ Para ver tareas sin responsable'); }); });