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.

97 lines
3.3 KiB
TypeScript

import { describe, test, expect, beforeAll, afterAll, beforeEach } from 'bun:test';
import { Database } from 'bun:sqlite';
import { initializeDatabase } from '../../../src/db';
import { ResponseQueue } from '../../../src/services/response-queue';
let testDb: Database;
let envBackup: NodeJS.ProcessEnv;
let originalDbInstance: Database;
describe('ResponseQueue (persistent add)', () => {
beforeAll(() => {
envBackup = { ...process.env };
testDb = new Database(':memory:');
initializeDatabase(testDb);
// Guardar e inyectar DB de pruebas
originalDbInstance = (ResponseQueue as any).dbInstance;
(ResponseQueue as any).dbInstance = testDb;
});
afterAll(() => {
process.env = envBackup;
(ResponseQueue as any).dbInstance = originalDbInstance;
testDb.close();
});
beforeEach(() => {
// Limpiar tabla entre tests
testDb.exec('DELETE FROM response_queue');
// Valor por defecto del número del bot (se puede cambiar en tests)
process.env.CHATBOT_PHONE_NUMBER = '1234567890';
});
test('should persist queued responses to database', async () => {
const before = testDb.query("SELECT COUNT(*) as count FROM response_queue").get() as any;
expect(before.count).toBe(0);
await ResponseQueue.add([
{ recipient: '111', message: 'hola 1' },
{ recipient: '222', message: 'hola 2' },
]);
const after = testDb.query("SELECT COUNT(*) as count FROM response_queue").get() as any;
expect(after.count).toBe(2);
const rows = testDb.query("SELECT recipient, message, status FROM response_queue ORDER BY id").all() as any[];
expect(rows[0].recipient).toBe('111');
expect(rows[0].message).toBe('hola 1');
expect(rows[0].status).toBe('queued');
expect(rows[1].recipient).toBe('222');
expect(rows[1].message).toBe('hola 2');
expect(rows[1].status).toBe('queued');
});
test('should skip messages addressed to the bot number', async () => {
process.env.CHATBOT_PHONE_NUMBER = '555111222';
await ResponseQueue.add([
{ recipient: '555111222', message: 'no debe encolarse' },
{ recipient: '333', message: 'debe encolarse' },
]);
const count = testDb.query("SELECT COUNT(*) as count FROM response_queue").get() as any;
expect(count.count).toBe(1);
const row = testDb.query("SELECT recipient, message FROM response_queue").get() as any;
expect(row.recipient).toBe('333');
expect(row.message).toBe('debe encolarse');
});
test('should ignore entries without recipient or message', async () => {
await ResponseQueue.add([
// inválidos:
{ recipient: '', message: 'sin destinatario' } as any,
{ recipient: '444', message: '' } as any,
// válido:
{ recipient: '444', message: 'ok' },
]);
const rows = testDb.query("SELECT recipient, message FROM response_queue ORDER BY id").all() as any[];
expect(rows.length).toBe(1);
expect(rows[0].recipient).toBe('444');
expect(rows[0].message).toBe('ok');
});
test('should throw if database error occurs (e.g., missing table)', async () => {
// Provocar error: eliminar tabla
testDb.exec('DROP TABLE response_queue');
await expect(ResponseQueue.add([{ recipient: '999', message: 'x' }]))
.rejects
.toBeTruthy();
// Restaurar esquema para no afectar otros tests
initializeDatabase(testDb);
});
});