55 lines
2.0 KiB
JavaScript
55 lines
2.0 KiB
JavaScript
|
|
import { describe, it, expect, beforeEach } from 'vitest';
|
||
|
|
import { addItem, getPending, markStatus, remove, getStats } from '../push/queue.js';
|
||
|
|
|
||
|
|
const DB_NAME = 'inquiry_push';
|
||
|
|
|
||
|
|
describe('queue', () => {
|
||
|
|
beforeEach(async () => {
|
||
|
|
// Each test starts with a clean DB. fake-indexeddb exposes indexedDB
|
||
|
|
// globally via the setupFiles entry. databases() may be missing on
|
||
|
|
// some builds, so fall back to the known DB name we use in queue.js.
|
||
|
|
const dbs = (await indexedDB.databases?.().catch(() => null)) || [];
|
||
|
|
const names = dbs.length ? dbs.map(d => d.name) : [DB_NAME];
|
||
|
|
await Promise.all(names.map(name => new Promise(r => {
|
||
|
|
if (!name) { r(); return; }
|
||
|
|
const req = indexedDB.deleteDatabase(name);
|
||
|
|
req.onsuccess = req.onerror = req.onblocked = () => r();
|
||
|
|
})));
|
||
|
|
});
|
||
|
|
|
||
|
|
it('addItem then getPending returns it', async () => {
|
||
|
|
const id = await addItem({
|
||
|
|
payload: { record: { inquiryId: 'X1' }, messages: [{ messageId: 'm1' }] },
|
||
|
|
inquiryId: 'X1',
|
||
|
|
});
|
||
|
|
const pending = await getPending(5);
|
||
|
|
expect(pending.length).toBe(1);
|
||
|
|
expect(pending[0].id).toBe(id);
|
||
|
|
expect(pending[0].status).toBe('pending');
|
||
|
|
});
|
||
|
|
|
||
|
|
it('markStatus pending->sent then not in pending', async () => {
|
||
|
|
const id = await addItem({
|
||
|
|
payload: { record: {}, messages: [] },
|
||
|
|
inquiryId: 'X',
|
||
|
|
});
|
||
|
|
await markStatus(id, 'sent');
|
||
|
|
expect((await getPending(5)).length).toBe(0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('getStats counts by status', async () => {
|
||
|
|
await addItem({ payload: { record: {}, messages: [] }, inquiryId: 'A' });
|
||
|
|
const id2 = await addItem({ payload: { record: {}, messages: [] }, inquiryId: 'B' });
|
||
|
|
await markStatus(id2, 'failed', { retries: 8 });
|
||
|
|
const stats = await getStats();
|
||
|
|
expect(stats.pending).toBe(1);
|
||
|
|
expect(stats.failed).toBe(1);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('remove deletes item', async () => {
|
||
|
|
const id = await addItem({ payload: { record: {}, messages: [] }, inquiryId: 'A' });
|
||
|
|
await remove(id);
|
||
|
|
expect((await getPending(5)).length).toBe(0);
|
||
|
|
});
|
||
|
|
});
|