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.complete-autoassi...

87 lines
3.2 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 - complete auto-assign y recientes', () => {
const USER = '34600123456';
const GROUP = 'g-1@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', 'Test Group', 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 ('Hacer algo', ?, ?)`)
.run(GROUP, USER);
taskId = Number(ins.lastInsertRowid);
server = await startWebServer({
port: 19101,
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('completar una tarea sin responsables auto-asigna y aparece en recientes', async () => {
// Completar
const resComplete = await fetch(`${baseUrl}/api/tasks/${taskId}/complete`, { method: 'POST' });
expect(resComplete.status).toBe(200);
const jsonComplete = await resComplete.json();
expect(['updated', 'already']).toContain(jsonComplete?.status);
// Recientes (24h)
const resRecent = await fetch(`${baseUrl}/api/me/tasks?status=recent&limit=50`);
expect(resRecent.status).toBe(200);
const recentBody = await resRecent.json();
const items = Array.isArray(recentBody?.items) ? recentBody.items : [];
const found = items.find((it: any) => Number(it?.id) === taskId);
expect(found).toBeTruthy();
expect(found.completed).toBe(true);
expect(typeof found.completed_at === 'string' && found.completed_at.length > 0).toBe(true);
expect(Array.isArray(found.assignees)).toBe(true);
expect(found.assignees.map(String)).toContain(USER);
// Uncomplete inmediato permitido
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');
// Ya no aparece en recientes tras reabrir
const resRecent2 = await fetch(`${baseUrl}/api/me/tasks?status=recent&limit=50`);
expect(resRecent2.status).toBe(200);
const recentBody2 = await resRecent2.json();
const items2 = Array.isArray(recentBody2?.items) ? recentBody2.items : [];
const found2 = items2.find((it: any) => Number(it?.id) === taskId);
expect(found2).toBeFalsy();
});
});