import { describe, expect, it, vi } from 'vitest'; import { MediaSyncService } from '../src/services/media-sync.js'; import { createMockLogger } from './mockLogger.js'; describe('MediaSyncService account authentication gate', () => { it('does not touch chat while the global account context is unauthenticated', async () => { const chat = { refreshTopChats: vi.fn(), fetchAllMessages: vi.fn(), }; const auth = { isFullyAuthenticated: vi.fn(() => false) }; const service = new MediaSyncService( chat as never, createMockLogger(), 30 * 60 * 1000, auth, ); await expect(service.triggerSync()).resolves.toBe(false); expect(chat.refreshTopChats).not.toHaveBeenCalled(); expect(chat.fetchAllMessages).not.toHaveBeenCalled(); }); it('reports the actual number of rooms changed by an incremental sync', async () => { const chat = { refreshTopChats: vi.fn().mockResolvedValue(3), fetchAllMessages: vi.fn(), }; const service = new MediaSyncService( chat as never, createMockLogger(), 30 * 60 * 1000, { isFullyAuthenticated: () => true }, ); await expect(service.triggerSync()).resolves.toBe(true); expect(service.getStatus().lastSyncChats).toBe(3); }); it('requires a complete historical backfill for a full media sync', async () => { const chat = { refreshTopChats: vi.fn(), fetchAllMessages: vi.fn().mockResolvedValue([]), }; const service = new MediaSyncService( chat as never, createMockLogger(), 30 * 60 * 1000, { isFullyAuthenticated: () => true }, ); await service.triggerSync(true); expect(chat.fetchAllMessages).toHaveBeenCalledWith({ requireComplete: true }); }); it('returns failure and preserves the operator-visible error when sync work is incomplete', async () => { const chat = { refreshTopChats: vi.fn().mockRejectedValue(new Error('media history incomplete')), fetchAllMessages: vi.fn(), }; const service = new MediaSyncService( chat as never, createMockLogger(), 30 * 60 * 1000, { isFullyAuthenticated: () => true }, ); await expect(service.triggerSync()).resolves.toBe(false); expect(service.getStatus()).toMatchObject({ lastSyncAt: null, lastError: 'media history incomplete', }); }); });