import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import Database from 'better-sqlite3'; import { RedditRecipientAccountStatusRepository } from '../src/database/account-repositories.js'; import { runMigrations } from '../src/database/client.js'; import { RecipientAccountStatusService } from '../src/services/recipient-account-status.js'; import { createMockLogger } from './mockLogger.js'; describe('RecipientAccountStatusService', () => { let db: Database.Database; beforeEach(() => { db = new Database(':memory:'); runMigrations(db); }); afterEach(() => db.close()); it('checks each real username once, persists results, and skips fresh checks', async () => { let now = 10_000; const repository = new RedditRecipientAccountStatusRepository(db); const lookup = { getUserAccountStatus: vi.fn(async (username: string) => username === 'Alice' ? 'deleted' as const : 'active' as const), }; const service = new RecipientAccountStatusService( { getCachedConversations: vi.fn(async () => [ { username: 'Alice' }, { username: 'alice' }, { username: 'Bob' }, { username: 'unknown' }, { username: 't2_abc' }, ]), } as never, lookup, repository, createMockLogger(), { isFullyAuthenticated: () => true, invalidate: () => undefined }, 4_000, () => now, ); await expect(service.checkNow()).resolves.toBe(2); expect(lookup.getUserAccountStatus).toHaveBeenCalledTimes(2); expect(repository.get('alice')).toMatchObject({ status: 'deleted', checkedAt: 10_000 }); now = 12_000; await expect(service.checkNow()).resolves.toBe(0); now = 15_000; await expect(service.checkNow()).resolves.toBe(2); }); it('does no profile work while account authentication is unavailable', async () => { const lookup = { getUserAccountStatus: vi.fn() }; const service = new RecipientAccountStatusService( { getCachedConversations: vi.fn() } as never, lookup, new RedditRecipientAccountStatusRepository(db), createMockLogger(), { isFullyAuthenticated: () => false, invalidate: () => undefined }, ); await expect(service.checkNow()).resolves.toBe(0); expect(lookup.getUserAccountStatus).not.toHaveBeenCalled(); }); });