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.
taskbot/tests/web/api.tasks.uncomplete-window...

68 lines
2.3 KiB
TypeScript

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');
});
});