import { act, renderHook } from '@testing-library/react-native'; import { useAutoConnect } from '../hooks/useAutoConnect'; import * as api from '../services/lmStudioApi'; import { useAppStore } from '../store/useAppStore'; jest.mock('../services/lmStudioApi'); const mockApi = api as jest.Mocked; beforeEach(() => { jest.resetAllMocks(); useAppStore.setState(useAppStore.getInitialState(), true); }); describe('useAutoConnect', () => { it('loads the models once on mount and marks the server connected', async () => { mockApi.getModels.mockResolvedValue([{ id: 'm1', object: 'model', owned_by: 'x' }]); renderHook(() => useAutoConnect()); await act(async () => {}); expect(mockApi.getModels).toHaveBeenCalledTimes(1); expect(useAppStore.getState().isConnected).toBe(true); expect(useAppStore.getState().activeModelId).toBe('m1'); }); it('leaves the app offline when the server does not answer', async () => { mockApi.getModels.mockRejectedValue(new Error('down')); renderHook(() => useAutoConnect()); await act(async () => {}); expect(useAppStore.getState().isConnected).toBe(false); }); it('does not check again on re-render', async () => { mockApi.getModels.mockResolvedValue([]); const { rerender } = renderHook(() => useAutoConnect()); await act(async () => {}); rerender({}); await act(async () => {}); expect(mockApi.getModels).toHaveBeenCalledTimes(1); }); });