import { act, cleanup, renderHook } from '@testing-library/react' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { $changeEventsAvailable, $cronChangeTick, $sessionsChangeTick } from '@/store/live-sync' import { $activeSessionId } from '@/store/session' import { useBackgroundSync } from './use-background-sync' const noop = () => undefined const requestGateway = async () => ({ sessions: [] }) function render(activeGatewayProfile: string, activeConnectionId: string, refreshSessions: () => Promise) { return renderHook( ({ connectionId, profile }: { connectionId: string; profile: string }) => { useBackgroundSync({ activeConnectionId: connectionId, activeGatewayProfile: profile, activeIsMessaging: false, activeSessionId: null, activeStoredSessionId: null, freshDraftReady: false, gatewayState: 'open', refreshActiveTranscript: noop, refreshCronJobs: noop, refreshCurrentModel: noop, refreshHermesConfig: noop, refreshMessagingSessions: noop, refreshSessions, requestGateway }) }, { initialProps: { connectionId: activeConnectionId, profile: activeGatewayProfile } } ) } describe('useBackgroundSync profile-scoped session refresh', () => { beforeEach(() => { vi.useFakeTimers() $activeSessionId.set(null) $changeEventsAvailable.set(false) $cronChangeTick.set(0) $sessionsChangeTick.set(0) }) afterEach(() => { cleanup() vi.useRealTimers() }) it('refreshes the session list after the active gateway profile changes', async () => { const refreshSessions = vi.fn(async () => undefined) const hook = render('default', 'local', refreshSessions) await act(async () => undefined) expect(refreshSessions).toHaveBeenCalledTimes(1) refreshSessions.mockClear() hook.rerender({ connectionId: 'local', profile: 'nova' }) await act(async () => undefined) expect(refreshSessions).toHaveBeenCalledTimes(1) }) it('refreshes the session list when the backend changes but the profile name does not', async () => { const refreshSessions = vi.fn(async () => undefined) const hook = render('default', 'work', refreshSessions) await act(async () => undefined) refreshSessions.mockClear() hook.rerender({ connectionId: 'homelab', profile: 'default' }) await act(async () => undefined) expect(refreshSessions).toHaveBeenCalledTimes(1) }) })