import { describe, it, beforeAll, afterAll, expect } from 'bun:test'; import { createTempDb } from './helpers/db'; import { startWebServer, type RunningServer } from './helpers/server'; describe('API Web - uncomplete dentro de ventana', () => { const USER = '34600123456'; const GROUP = 'g-2@g.us'; let dbHandle: any; let cleanupDb: () => void; let server: RunningServer; let baseUrl: string; let taskId: number; beforeAll(async () => { const tmp = createTempDb(); dbHandle = tmp.db; cleanupDb = tmp.cleanup; // Semilla mínima dbHandle.prepare(`INSERT INTO users (id) VALUES (?) ON CONFLICT(id) DO NOTHING`).run(USER); dbHandle .prepare(`INSERT INTO groups (id, community_id, name, active) VALUES (?, 'comm-1', 'G2', 1)`) .run(GROUP); dbHandle.prepare(`INSERT INTO allowed_groups (group_id, status) VALUES (?, 'allowed')`).run(GROUP); dbHandle .prepare(`INSERT INTO group_members (group_id, user_id, is_admin, is_active) VALUES (?, ?, 0, 1)`) .run(GROUP, USER); const ins = dbHandle .prepare(`INSERT INTO tasks (description, group_id, created_by) VALUES ('Probar ventana', ?, ?)`) .run(GROUP, USER); taskId = Number(ins.lastInsertRowid); server = await startWebServer({ port: 19102, env: { DB_PATH: tmp.path, DEV_DEFAULT_USER: USER, TZ: 'UTC' } }); baseUrl = server.baseUrl; }); afterAll(async () => { try { await server.stop(); } catch {} try { cleanupDb?.(); } catch {} }); it('uncomplete permitido inmediatamente después de completar y es idempotente', async () => { // Completar const resComplete = await fetch(`${baseUrl}/api/tasks/${taskId}/complete`, { method: 'POST' }); expect(resComplete.status).toBe(200); // Uncomplete (dentro de ventana) const resUncomplete = await fetch(`${baseUrl}/api/tasks/${taskId}/uncomplete`, { method: 'POST' }); expect(resUncomplete.status).toBe(200); const jsonUnc = await resUncomplete.json(); expect(jsonUnc?.status).toBe('updated'); // Uncomplete de nuevo (idempotente → already) const resUncomplete2 = await fetch(`${baseUrl}/api/tasks/${taskId}/uncomplete`, { method: 'POST' }); expect(resUncomplete2.status).toBe(200); const jsonUnc2 = await resUncomplete2.json(); expect(jsonUnc2?.status).toBe('already'); }); });