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.
68 lines
2.3 KiB
TypeScript
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');
|
|
});
|
|
});
|