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.
87 lines
3.2 KiB
TypeScript
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();
|
|
});
|
|
});
|