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.
104 lines
3.3 KiB
TypeScript
104 lines
3.3 KiB
TypeScript
import { describe, it, beforeEach, expect } from 'bun:test';
|
|
import { Database } from 'bun:sqlite';
|
|
import { initializeDatabase } from '../../../src/db';
|
|
import { CommandService } from '../../../src/services/command';
|
|
|
|
describe('CommandService - configurar recordatorios', () => {
|
|
let memdb: Database;
|
|
const SENDER = '34600123456';
|
|
|
|
beforeEach(() => {
|
|
process.env.NODE_ENV = 'test';
|
|
process.env.TZ = 'Europe/Madrid';
|
|
|
|
memdb = new Database(':memory:');
|
|
initializeDatabase(memdb);
|
|
|
|
// Inyectar DB
|
|
(CommandService as any).dbInstance = memdb;
|
|
|
|
// Limpiar tablas
|
|
memdb.exec(`DELETE FROM response_queue;`);
|
|
memdb.exec(`DELETE FROM user_preferences;`);
|
|
memdb.exec(`DELETE FROM users;`);
|
|
});
|
|
|
|
async function runCmd(msg: string) {
|
|
return await CommandService.handle({
|
|
sender: SENDER,
|
|
groupId: '123@g.us',
|
|
message: msg,
|
|
mentions: []
|
|
});
|
|
}
|
|
|
|
function getPref(): { freq: string; time: string | null } | null {
|
|
const row = memdb.prepare(`SELECT reminder_freq AS freq, reminder_time AS time FROM user_preferences WHERE user_id = ?`).get(SENDER) as any;
|
|
if (!row) return null;
|
|
return { freq: String(row.freq), time: row.time ? String(row.time) : null };
|
|
}
|
|
|
|
it('configurar daily guarda preferencia y responde confirmación', async () => {
|
|
const res = await runCmd('/t configurar daily');
|
|
expect(res).toHaveLength(1);
|
|
expect(res[0].recipient).toBe(SENDER);
|
|
expect(res[0].message).toContain('✅ Recordatorios: diario');
|
|
|
|
const pref = getPref();
|
|
expect(pref).not.toBeNull();
|
|
expect(pref!.freq).toBe('daily');
|
|
expect(pref!.time).toBe('08:30'); // default
|
|
});
|
|
|
|
it('configurar weekly guarda preferencia y responde confirmación', async () => {
|
|
const res = await runCmd('/t configurar weekly');
|
|
expect(res).toHaveLength(1);
|
|
expect(res[0].message).toContain('semanal (lunes 08:30)');
|
|
|
|
const pref = getPref();
|
|
expect(pref).not.toBeNull();
|
|
expect(pref!.freq).toBe('weekly');
|
|
});
|
|
|
|
it('configurar off guarda preferencia y responde confirmación', async () => {
|
|
const res = await runCmd('/t configurar off');
|
|
expect(res).toHaveLength(1);
|
|
expect(res[0].message).toContain('apagado');
|
|
|
|
const pref = getPref();
|
|
expect(pref).not.toBeNull();
|
|
expect(pref!.freq).toBe('off');
|
|
});
|
|
|
|
it('configurar con opción inválida devuelve uso correcto y no escribe en DB', async () => {
|
|
const res = await runCmd('/t configurar foo');
|
|
expect(res).toHaveLength(1);
|
|
expect(res[0].message).toContain('Uso: `/t configurar diario|l-v|semanal|off [HH:MM]`');
|
|
|
|
const pref = getPref();
|
|
expect(pref).toBeNull();
|
|
});
|
|
|
|
it('upsert idempotente: cambiar de daily a off actualiza la fila existente', async () => {
|
|
await runCmd('/t configurar daily');
|
|
let pref = getPref();
|
|
expect(pref!.freq).toBe('daily');
|
|
|
|
await runCmd('/t configurar off');
|
|
pref = getPref();
|
|
expect(pref!.freq).toBe('off');
|
|
});
|
|
|
|
it('configurar l-v con hora guarda weekdays y respeta hora', async () => {
|
|
const res = await runCmd('/t configurar l-v 8:00');
|
|
expect(res).toHaveLength(1);
|
|
expect(res[0].recipient).toBe(SENDER);
|
|
expect(res[0].message).toContain('laborables');
|
|
|
|
const pref = getPref();
|
|
expect(pref).not.toBeNull();
|
|
expect(pref!.freq).toBe('weekdays');
|
|
expect(pref!.time).toBe('08:00');
|
|
});
|
|
});
|