import { describe, expect, it, beforeEach } from 'vitest'; import { InMemoryPendingMessageStore } from '../../src/services/PendingMessageStore.ts'; // The Prisma-backed impl is exercised by integration tests. Unit tests here // pin down the semantics of the interface using the in-memory reference impl. describe('InMemoryPendingMessageStore', () => { let store: InMemoryPendingMessageStore; beforeEach(() => { store = new InMemoryPendingMessageStore(); }); it('round-trips set → get', async () => { await store.set('room-1', { roomId: 'room-1', text: 'hello' }); const got = await store.get('room-1'); expect(got?.text).toBe('hello'); expect(got?.roomId).toBe('room-1'); expect(got?.createdAt).toBeInstanceOf(Date); }); it('returns undefined for unknown rooms', async () => { expect(await store.get('nope')).toBeUndefined(); }); it('overwrites on repeated set (same roomId)', async () => { await store.set('room-1', { roomId: 'room-1', text: 'first' }); await store.set('room-1', { roomId: 'room-1', text: 'second' }); expect((await store.get('room-1'))?.text).toBe('second'); }); it('delete is idempotent', async () => { await store.set('room-1', { roomId: 'room-1', text: 'x' }); await store.delete('room-1'); await expect(store.delete('room-1')).resolves.not.toThrow(); expect(await store.get('room-1')).toBeUndefined(); }); it('sweep removes only entries older than maxAge', async () => { await store.set('young', { roomId: 'young', text: 'y' }); await store.set('old', { roomId: 'old', text: 'o' }); // Backdate the 'old' entry beyond the sweep cutoff. const oldEntry = await store.get('old'); if (oldEntry) oldEntry.createdAt = new Date(Date.now() - 1000 * 60 * 60 * 24); const removed = await store.sweep(1000 * 60 * 60); // 1 hour expect(removed).toBe(1); expect(await store.get('young')).toBeDefined(); expect(await store.get('old')).toBeUndefined(); }); });